suntianwu 3 роки тому
батько
коміт
8ea60ff7c1
1 змінених файлів з 138 додано та 0 видалено
  1. 138 0
      src/test/java/com/face/FaceTest.java

+ 138 - 0
src/test/java/com/face/FaceTest.java

@@ -0,0 +1,138 @@
+package com.face;
+
+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); //1代表最后一次,0代表中间结果
+
+        //访客的结果,分值比较低的
+        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[1]);
+        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);
+            }
+        }
+    }
+}