|
@@ -0,0 +1,134 @@
|
|
|
|
+package com.iden;
|
|
|
|
+
|
|
|
|
+import com.face.monitor.FaceMonitor;
|
|
|
|
+import com.face.monitor.model.FaceModel;
|
|
|
|
+import com.face.monitor.model.FaceRecogRetrieveResult;
|
|
|
|
+import com.face.monitor.model.Image;
|
|
|
|
+import com.face.monitor.model.RecogInfo;
|
|
|
|
+import com.face.monitor.model.RecogResult;
|
|
|
|
+
|
|
|
|
+import java.io.ByteArrayOutputStream;
|
|
|
|
+import java.io.Closeable;
|
|
|
|
+import java.io.File;
|
|
|
|
+import java.io.FileInputStream;
|
|
|
|
+import java.io.IOException;
|
|
|
|
+import java.io.InputStream;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Locale;
|
|
|
|
+
|
|
|
|
+public class FaceTest {
|
|
|
|
+ public static void main(String[] args) {
|
|
|
|
+ //初始化引擎
|
|
|
|
+ FaceMonitor faceMonitor = new FaceMonitor();
|
|
|
|
+ faceMonitor.init("./model", 0);
|
|
|
|
+ //提取人脸特征,并保存为注册人员库demo-test.cpp
|
|
|
|
+ FaceModel[] dataset = extractFeature(faceMonitor);
|
|
|
|
+ System.out.printf(Locale.CHINA, "succeed extract size:%d\n", dataset.length);
|
|
|
|
+ //加载人脸特征库
|
|
|
|
+ faceMonitor.loadFaceDataset(dataset);
|
|
|
|
+ //获取库的大小
|
|
|
|
+ int databaseSize = faceMonitor.getDatabaseSize();
|
|
|
|
+ System.out.printf(Locale.CHINA, "java data num:%d\n", databaseSize);
|
|
|
|
+ //追加特征库
|
|
|
|
+ faceMonitor.appendFaceDataset(dataset);
|
|
|
|
+ databaseSize = faceMonitor.getDatabaseSize();
|
|
|
|
+ System.out.printf(Locale.CHINA, "java append after data num:%d\n", databaseSize);
|
|
|
|
+ //每次加载特征库会清空当前内存中存储的特征库
|
|
|
|
+ faceMonitor.loadFaceDataset(dataset);
|
|
|
|
+ databaseSize = faceMonitor.getDatabaseSize();
|
|
|
|
+ System.out.printf(Locale.CHINA, "new data num: :%d\n", databaseSize);
|
|
|
|
+ //监控视频帧,这里为了简单演示,传入静态图片
|
|
|
|
+ //target
|
|
|
|
+ String registerData = "./data/0.jpg";
|
|
|
|
+ watchFrame(faceMonitor, registerData);
|
|
|
|
+ //vistor
|
|
|
|
+ registerData = "./data/5.jpg";
|
|
|
|
+ watchFrame(faceMonitor, registerData);
|
|
|
|
+ //获取目标人识别结果
|
|
|
|
+ RecogResult recogResult = faceMonitor.finishMonitorWithRes(1);
|
|
|
|
+
|
|
|
|
+ RecogResult curVisitorResResult = faceMonitor.faceRecogGetCurVisitorRes();
|
|
|
|
+
|
|
|
|
+ for (int i = 0; i < curVisitorResResult.getInfoNum(); i++) {
|
|
|
|
+ RecogInfo recogInfo = curVisitorResResult.getRecogInfos()[i];
|
|
|
|
+ System.out.printf(Locale.CHINA, "vistor hit top getRecogInfos length: %d\n",
|
|
|
|
+ curVisitorResResult.getRecogInfos().length);
|
|
|
|
+ System.out.printf(Locale.CHINA, "vistor hit top person name: %s\n",
|
|
|
|
+ recogInfo.getName());
|
|
|
|
+ System.out.printf(Locale.CHINA, "vistor hit top person id: %d score: %f\n",
|
|
|
|
+ recogInfo.getPersonId(), recogInfo.getFaceRecogScore());
|
|
|
|
+ System.out.printf(Locale.CHINA, "vistor hit second person id: %d score: %f\n",
|
|
|
|
+ recogInfo.getPersonIdOther()[0], recogInfo.getFaceRecogScoreOther()[0]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ FaceRecogRetrieveResult faceRecogRetrieveResult = faceMonitor.faceRecogRetrieveFaceDataset(dataset);
|
|
|
|
+ System.out.printf(Locale.CHINA, "query hit top person id: : %d score: %f\n",
|
|
|
|
+ faceRecogRetrieveResult.getOnePredictIds()[0], faceRecogRetrieveResult.getOnePredictScores()[0]);
|
|
|
|
+ System.out.printf(Locale.CHINA, "query hit top person id: : %d score: %f\n",
|
|
|
|
+ faceRecogRetrieveResult.getOnePredictIds()[1], faceRecogRetrieveResult.getOnePredictScores()[1]);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static FaceModel[] extractFeature(FaceMonitor faceMonitor) {
|
|
|
|
+ //简单演示,提取5张人脸
|
|
|
|
+ String faceTestDir = "./data/";
|
|
|
|
+ List<byte[]> faceTestImageList = new ArrayList<>();
|
|
|
|
+ for (int i = 0; i < 5; i++) {
|
|
|
|
+ String faceFilePath = String.format(Locale.CHINA, "%s%d.jpg", faceTestDir, i);
|
|
|
|
+ faceTestImageList.add(readFileBytes(faceFilePath));
|
|
|
|
+ }
|
|
|
|
+ return faceMonitor.extractFeature(faceTestImageList);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static RecogResult watchFrame(FaceMonitor faceMonitor, String dataPath) {
|
|
|
|
+ Image image = faceMonitor.readImage(dataPath);
|
|
|
|
+ return faceMonitor.faceRecogMonitor(image);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * read file
|
|
|
|
+ *
|
|
|
|
+ * @param filePath
|
|
|
|
+ * @return if file not exist, return null, else return content of file
|
|
|
|
+ * @throws RuntimeException if an error occurs while operator BufferedReader
|
|
|
|
+ */
|
|
|
|
+ public static byte[] readFileBytes(String filePath) {
|
|
|
|
+ File file = new File(filePath);
|
|
|
|
+ if (file == null || !file.isFile()) {
|
|
|
|
+ return null;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ InputStream inputStream = null;
|
|
|
|
+ ByteArrayOutputStream baos = null;
|
|
|
|
+ try {
|
|
|
|
+ inputStream = new FileInputStream(file);
|
|
|
|
+ baos = new ByteArrayOutputStream();
|
|
|
|
+
|
|
|
|
+ byte[] buffer = new byte[1024];
|
|
|
|
+ int byteCount = 0;
|
|
|
|
+ while ((byteCount = inputStream.read(buffer)) != -1) {// 循环从输入流读取
|
|
|
|
+ // buffer字节
|
|
|
|
+ baos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流
|
|
|
|
+ }
|
|
|
|
+ baos.flush();// 刷新缓冲区
|
|
|
|
+ return baos.toByteArray();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ return null;
|
|
|
|
+ //throw new RuntimeException("IOException occurred. ", e);
|
|
|
|
+ } finally {
|
|
|
|
+ close(inputStream);
|
|
|
|
+ close(baos);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ public static void close(Closeable closeable) {
|
|
|
|
+ if (closeable != null) {
|
|
|
|
+ try {
|
|
|
|
+ closeable.close();
|
|
|
|
+ } catch (IOException e) {
|
|
|
|
+ throw new RuntimeException("IOException occurred. ", e);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|