123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207 |
- 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<byte[]> 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<byte[]> 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<String> 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);
- }
- }
- }
- }
|