欢迎大佬提意见
V2版本,把特征值,存到缓存中,然后获取缓存中的数据进行对比,速度超级快,200张对比 毫秒级别
byte[] b = (byte[]) redisTemplate.opsForValue().get(s);
if (b != null) {
FaceSimilar faceSimilar = new FaceSimilar();
FaceFeature faceFeature2 = new FaceFeature();
faceFeature2.setFeatureData(b);
int compareCode = faceEngine.compareFaceFeature(faceFeature, faceFeature2, faceSimilar);
log.info("相似度缓存中对比:" + faceSimilar.getScore() + "图片路径1" + facePath + "图片路径2" + s);
if (faceSimilar.getScore() > SCORE) {
obj.add(path.get(s));
}
} else {
//代码省略
redisTemplate.opsForValue().set(s, faceFeature2.getFeatureData());
}
/**
* 对比两个人脸是否为同一人1:N
*
* @param facePath 人脸1 路径
* @param path 人脸N 文件路径:身份证号码
* @return 相似度大于SCORE就返回True
*/
public static Object comparisonList(String facePath, Map<String, Object> path) throws Exception {
FaceEngine faceEngine = faceEngine();
FaceFeature faceFeature = new FaceFeature();
ImageInfo imageInfo = null;
List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();
try {
if (Base64.isBase64(facePath)) {
//人脸检测
imageInfo = getRGBData(Base64.decodeBase64(facePath));
} else {
facePath = Global.getDir() + facePath;
//人脸检测
imageInfo = getRGBData(new File(facePath));
}
faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList);
System.out.println(faceInfoList);
//特征提取
faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList.get(0), faceFeature);
System.out.println("特征值大小:" + faceFeature.getFeatureData().length);
faceInfoList.clear();
imageInfo = null;
} catch (Exception e) {
e.printStackTrace();
throw new Exception("头像解析错误");
}
try {
for (String s : path.keySet()) {
try {
//人脸检测2
imageInfo = getRGBData(new File(s));
} catch (Exception e) {
System.out.println("头像不存在");
continue;
}
if (null != imageInfo) {
int detectCode2 = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList);
System.out.println(faceInfoList);
if (faceInfoList.size() == 0)
continue;
//特征提取2
FaceFeature faceFeature2 = new FaceFeature();
int extractCode2 = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList.get(0), faceFeature2);
System.out.println("特征值2大小:" + faceFeature2.getFeatureData());
//特征比对
faceFeature.setFeatureData(faceFeature.getFeatureData());
faceFeature2.setFeatureData(faceFeature2.getFeatureData());
FaceSimilar faceSimilar = new FaceSimilar();
int compareCode = faceEngine.compareFaceFeature(faceFeature, faceFeature2, faceSimilar);
System.out.println("相似度:" + faceSimilar.getScore());
if (faceSimilar.getScore() > SCORE) {
return path.get(s);
}
faceInfoList.clear();
imageInfo = null;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (faceEngine != null) {
//引擎卸载
faceEngine.unInit();
}
}
return null;
}