FaceIdenTool.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package com.face.monitor;
  2. import com.face.monitor.model.FaceModel;
  3. import com.face.monitor.model.FaceRecogRetrieveResult;
  4. import com.face.monitor.model.Image;
  5. import com.face.monitor.model.RecogResult;
  6. import java.io.*;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. public class FaceIdenTool {
  10. /**
  11. * 初始化引擎,加载图像人脸特征库
  12. * @param idenRoot
  13. * @param imgFiles
  14. * @return
  15. */
  16. public static FaceMonitor initFaceMonitor(String idenRoot, File[] imgFiles) {
  17. //初始化引擎
  18. FaceMonitor faceMonitor = new FaceMonitor();
  19. faceMonitor.init(idenRoot + "face/model", 0);
  20. List<byte[]> faceTestImageList = new ArrayList<>();
  21. if(imgFiles != null && imgFiles.length > 0){
  22. for(File imgFile : imgFiles) {
  23. if(imgFile!= null && imgFile.isFile())
  24. faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
  25. }
  26. }
  27. FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList);
  28. //加载人脸特征库
  29. if (faceModels != null && faceModels.length > 0) {
  30. faceMonitor.loadFaceDataset(faceModels);
  31. }
  32. return faceMonitor;
  33. }
  34. /**
  35. * 批量获取人脸特征码结构体
  36. * @param idenRoot
  37. * @param imgFiles
  38. * @return
  39. */
  40. public static FaceModel[] extractFeature(String idenRoot, File[] imgFiles){
  41. //初始化引擎
  42. FaceMonitor faceMonitor = new FaceMonitor();
  43. faceMonitor.init(idenRoot + "face/model", 0);
  44. List<byte[]> faceTestImageList = new ArrayList<>();
  45. if(imgFiles != null && imgFiles.length > 0){
  46. for(File imgFile : imgFiles) {
  47. faceTestImageList.add(readFileBytes(imgFile.getAbsolutePath()));
  48. }
  49. }
  50. FaceModel[] faceModels = faceMonitor.extractFeature(faceTestImageList);
  51. //释放人脸引擎
  52. faceMonitor.releaseEngine();
  53. return faceModels;
  54. }
  55. /**
  56. * 得到单个特征码
  57. * @param idenRoot
  58. * @param imgFile
  59. * @return
  60. */
  61. public static String getFeatPtr(String idenRoot, File imgFile) {
  62. if(imgFile == null || !imgFile.isFile()){
  63. return null;
  64. }
  65. File[] imgFiles = new File[]{imgFile};
  66. FaceModel[] faceModels = extractFeature(idenRoot,imgFiles);
  67. if(faceModels != null && faceModels.length > 0) {
  68. FaceModel faceModel = faceModels[0];
  69. return ByteUtil.byte2Hex(faceModel.getFeatValue());
  70. }
  71. return null;
  72. }
  73. /**
  74. * faceModel在faceMonitor的人脸特征库中检索命中的index
  75. * @param faceMonitor
  76. * @param faceModel
  77. * @return
  78. */
  79. public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor, FaceModel faceModel) {
  80. if (faceMonitor == null){
  81. return null;
  82. }
  83. //topN建议使用10,传入范围(根据底库大小)
  84. int topN = 2;
  85. FaceRecogRetrieveResult faceRecogRetrieveResult = faceMonitor.faceRecogRetrieveFaceDataset(faceModel,topN);
  86. if(faceRecogRetrieveResult != null) {
  87. int index = faceRecogRetrieveResult.getOnePredictIds()[0];
  88. float score = faceRecogRetrieveResult.getOnePredictScores()[0];
  89. System.out.println("score888888==" + score);
  90. if (score >= 65) {
  91. FaceRetrieveResultVO faceRetrieveResultVO = new FaceRetrieveResultVO();
  92. faceRetrieveResultVO.setIndex(index);
  93. faceRetrieveResultVO.setScore(score);
  94. return faceRetrieveResultVO;
  95. }
  96. }
  97. return null;
  98. }
  99. public static boolean isHit(String idenRoot, String featPtrVisitor, List<String> featPtrList){
  100. //初始化引擎
  101. FaceMonitor faceMonitor = new FaceMonitor();
  102. faceMonitor.init(idenRoot + "face/model", 0);
  103. FaceModel[] dataset = new FaceModel[featPtrList.size()];
  104. for (int i = 0; i < featPtrList.size(); i++) {
  105. String featPtr = featPtrList.get(i);
  106. FaceModel faceModel = new FaceModel();
  107. faceModel.setName(String.valueOf(i));
  108. faceModel.setPersonId(i);
  109. faceModel.setFeatValue(ByteUtil.hex2Byte(featPtr));
  110. }
  111. faceMonitor.loadFaceDataset(dataset);
  112. FaceModel faceModelPtrVisitor = new FaceModel();
  113. faceModelPtrVisitor.setName(String.valueOf(0));
  114. faceModelPtrVisitor.setPersonId(0);
  115. faceModelPtrVisitor.setFeatValue(ByteUtil.hex2Byte(featPtrVisitor));
  116. FaceRetrieveResultVO vo = getHitResult(faceMonitor,faceModelPtrVisitor);
  117. if(vo != null) {
  118. return true;
  119. } else {
  120. return false;
  121. }
  122. }
  123. // /**
  124. // * 使用dataPath的图片去库里查找,返回命中结果
  125. // * @param idenRoot
  126. // * @param dataPath
  127. // * @return
  128. // */
  129. // public static RecogResult watchFrame(String idenRoot, String dataPath) {
  130. // //初始化引擎
  131. // FaceMonitor faceMonitor = new FaceMonitor();
  132. // faceMonitor.init(idenRoot + "face/model", 0);
  133. // Image image = faceMonitor.readImage(dataPath);
  134. // return faceMonitor.faceRecogMonitor(image);
  135. // }
  136. //释放人脸引擎
  137. public static void releaseEngine(FaceMonitor faceMonitor) {
  138. if(faceMonitor != null){
  139. faceMonitor.releaseEngine();
  140. }
  141. }
  142. /**
  143. * read file
  144. *
  145. * @param filePath
  146. * @return if file not exist, return null, else return content of file
  147. * @throws RuntimeException if an error occurs while operator BufferedReader
  148. */
  149. private static byte[] readFileBytes(String filePath) {
  150. File file = new File(filePath);
  151. if (file == null || !file.isFile()) {
  152. return null;
  153. }
  154. InputStream inputStream = null;
  155. ByteArrayOutputStream baos = null;
  156. try {
  157. inputStream = new FileInputStream(file);
  158. baos = new ByteArrayOutputStream();
  159. byte[] buffer = new byte[1024];
  160. int byteCount = 0;
  161. while ((byteCount = inputStream.read(buffer)) != -1) {// 循环从输入流读取
  162. // buffer字节
  163. baos.write(buffer, 0, byteCount);// 将读取的输入流写入到输出流
  164. }
  165. baos.flush();// 刷新缓冲区
  166. return baos.toByteArray();
  167. } catch (IOException e) {
  168. return null;
  169. //throw new RuntimeException("IOException occurred. ", e);
  170. } finally {
  171. close(inputStream);
  172. close(baos);
  173. }
  174. }
  175. private static void close(Closeable closeable) {
  176. if (closeable != null) {
  177. try {
  178. closeable.close();
  179. } catch (IOException e) {
  180. throw new RuntimeException("IOException occurred. ", e);
  181. }
  182. }
  183. }
  184. }