package com.face.monitor; import com.face.monitor.model.FaceModel; import com.face.monitor.model.FaceRecogRetrieveResult; import com.face.monitor.model.Image; import com.face.monitor.model.RecogResult; import java.io.*; import java.util.ArrayList; import java.util.List; public class FaceIdenTool { /** * 初始化引擎,加载图像人脸特征库 * @param idenRoot * @param imgFiles * @return */ public static FaceMonitor initFaceMonitor(String idenRoot, File[] imgFiles) { //初始化引擎 FaceMonitor faceMonitor = new FaceMonitor(); faceMonitor.init(idenRoot + "face/model", 0); List faceTestImageList = new ArrayList<>(); if(imgFiles != null && imgFiles.length > 0){ for(File imgFile : imgFiles) { if(imgFile!= null && imgFile.isFile()) faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath())); } } FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList); //加载人脸特征库 if (faceModels != null && faceModels.length > 0) { faceMonitor.loadFaceDataset(faceModels); } return faceMonitor; } /** * 批量获取人脸特征码结构体 * @param idenRoot * @param imgFiles * @return */ public static FaceModel[] extractFeature(String idenRoot, File[] imgFiles){ //初始化引擎 FaceMonitor faceMonitor = new FaceMonitor(); faceMonitor.init(idenRoot + "face/model", 0); List faceTestImageList = new ArrayList<>(); if(imgFiles != null && imgFiles.length > 0){ for(File imgFile : imgFiles) { faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath())); } } FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList); //释放人脸引擎 faceMonitor.releaseEngine(); return faceModels; } /** * 得到单个特征码 * @param idenRoot * @param imgFile * @return */ public static String getFeatPtr(String idenRoot, File imgFile) { if(imgFile == null || !imgFile.isFile()){ return null; } File[] imgFiles = new File[]{imgFile}; FaceModel[] faceModels = extractFeature(idenRoot,imgFiles); if(faceModels != null && faceModels.length > 0) { FaceModel faceModel = faceModels[0]; return ByteUtil.byte2Hex(faceModel.getFeatValue()); } return null; } /** * faceModel在faceMonitor的人脸特征库中检索命中的index * @param faceMonitor * @param faceModel * @return */ public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor, FaceModel faceModel) { if (faceMonitor == null){ return null; } //topN建议使用10,传入范围(根据底库大小) int topN = 2; FaceRecogRetrieveResult faceRecogRetrieveResult = faceMonitor.faceRecogRetrieveFaceDataset(faceModel,topN); if(faceRecogRetrieveResult != null) { int index = faceRecogRetrieveResult.getOnePredictIds()[0]; float score = faceRecogRetrieveResult.getOnePredictScores()[0]; System.out.println("score888888==" + score); if (score >= 65) { FaceRetrieveResultVO faceRetrieveResultVO = new FaceRetrieveResultVO(); faceRetrieveResultVO.setIndex(index); faceRetrieveResultVO.setScore(score); return faceRetrieveResultVO; } } return null; } public static boolean isHit(String idenRoot, String featPtrVisitor, List featPtrList){ //初始化引擎 FaceMonitor faceMonitor = new FaceMonitor(); faceMonitor.init(idenRoot + "face/model", 0); FaceModel[] dataset = new FaceModel[featPtrList.size()]; for (int i = 0; i < featPtrList.size(); i++) { String featPtr = featPtrList.get(i); FaceModel faceModel = new FaceModel(); faceModel.setName(String.valueOf(i)); faceModel.setPersonId(i); faceModel.setFeatValue(ByteUtil.hex2Byte(featPtr)); } faceMonitor.loadFaceDataset(dataset); FaceModel faceModelPtrVisitor = new FaceModel(); faceModelPtrVisitor.setName(String.valueOf(0)); faceModelPtrVisitor.setPersonId(0); faceModelPtrVisitor.setFeatValue(ByteUtil.hex2Byte(featPtrVisitor)); FaceRetrieveResultVO vo = getHitResult(faceMonitor,faceModelPtrVisitor); if(vo != null) { return true; } else { return false; } } // /** // * 使用dataPath的图片去库里查找,返回命中结果 // * @param idenRoot // * @param dataPath // * @return // */ // public static RecogResult watchFrame(String idenRoot, String dataPath) { // //初始化引擎 // FaceMonitor faceMonitor = new FaceMonitor(); // faceMonitor.init(idenRoot + "face/model", 0); // Image image = faceMonitor.readImage(dataPath); // return faceMonitor.faceRecogMonitor(image); // } //释放人脸引擎 public static void releaseEngine(FaceMonitor faceMonitor) { if(faceMonitor != null){ faceMonitor.releaseEngine(); } } /** * 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 */ private 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); } } private static void close(Closeable closeable) { if (closeable != null) { try { closeable.close(); } catch (IOException e) { throw new RuntimeException("IOException occurred. ", e); } } } }