diff --git a/face-search-client/pom.xml b/face-search-client/pom.xml old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/FaceCompare.java b/face-search-client/src/main/java/com/visual/face/search/FaceCompare.java new file mode 100644 index 0000000..200a4e3 --- /dev/null +++ b/face-search-client/src/main/java/com/visual/face/search/FaceCompare.java @@ -0,0 +1,47 @@ +package com.visual.face.search; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import com.visual.face.search.handle.CompareHandler; + +public class FaceCompare { + /**服务地址**/ + private String serverHost; + /**实例对象**/ + private final static Map ins = new ConcurrentHashMap<>(); + + /** + * 构建集合对象 + * @param serverHost 服务地址 + * @return + */ + private FaceCompare(String serverHost){ + this.serverHost = serverHost; + } + + /** + * 构建集合对象 + * @param serverHost 服务地址 + * @return + */ + public static FaceCompare build (String serverHost){ + String key = serverHost; + if(!ins.containsKey(key)){ + synchronized (FaceCompare.class){ + if(!ins.containsKey(key)){ + ins.put(key, new FaceCompare(serverHost)); + } + } + } + return ins.get(key); + } + /** + * 人脸比对操作对象 + * @return CollectHandler + */ + public CompareHandler compare(){ + return CompareHandler.build(serverHost); + } + + +} diff --git a/face-search-client/src/main/java/com/visual/face/search/FaceSearch.java b/face-search-client/src/main/java/com/visual/face/search/FaceSearch.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/common/Api.java b/face-search-client/src/main/java/com/visual/face/search/common/Api.java old mode 100644 new mode 100755 index 4f7f9c6..8b2c983 --- a/face-search-client/src/main/java/com/visual/face/search/common/Api.java +++ b/face-search-client/src/main/java/com/visual/face/search/common/Api.java @@ -17,6 +17,7 @@ public class Api { public static final String face_create = "/visual/face/create"; public static final String visual_search = "/visual/search/do"; + public static final String visual_compare = "/visual/compare/do"; public static String getUrl(String host, String uri){ host = host.replaceAll ("/+$", ""); diff --git a/face-search-client/src/main/java/com/visual/face/search/handle/BaseHandler.java b/face-search-client/src/main/java/com/visual/face/search/handle/BaseHandler.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/handle/CollectHandler.java b/face-search-client/src/main/java/com/visual/face/search/handle/CollectHandler.java old mode 100644 new mode 100755 index 9a77119..4648707 --- a/face-search-client/src/main/java/com/visual/face/search/handle/CollectHandler.java +++ b/face-search-client/src/main/java/com/visual/face/search/handle/CollectHandler.java @@ -47,7 +47,9 @@ public class CollectHandler extends BaseHandler{ .setSampleColumns(collect.getSampleColumns()) .setFaceColumns(collect.getFaceColumns()) .setSyncBinLog(collect.isSyncBinLog()) - .setShardsNum(collect.getShardsNum()); + .setShardsNum(collect.getShardsNum()) + .setStorageFaceInfo(collect.getStorageFaceInfo()) + .setStorageEngine(collect.getStorageEngine()); return HttpClient.post(Api.getUrl(this.serverHost, Api.collect_create), collectReq); } diff --git a/face-search-client/src/main/java/com/visual/face/search/handle/CompareHandler.java b/face-search-client/src/main/java/com/visual/face/search/handle/CompareHandler.java new file mode 100644 index 0000000..a1c3216 --- /dev/null +++ b/face-search-client/src/main/java/com/visual/face/search/handle/CompareHandler.java @@ -0,0 +1,58 @@ +package com.visual.face.search.handle; + +import com.alibaba.fastjson.TypeReference; +import com.visual.face.search.common.Api; +import com.visual.face.search.http.HttpClient; +import com.visual.face.search.model.*; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class CompareHandler { + + /**服务地址**/ + protected String serverHost; + /**实例对象**/ + private final static Map ins = new ConcurrentHashMap<>(); + + public String getServerHost() { + return serverHost; + } + + public CompareHandler setServerHost(String serverHost) { + this.serverHost = serverHost; + return this; + } + + /** + * 构建集合对象 + * @param serverHost 服务地址 + * @return + */ + public static CompareHandler build(String serverHost){ + String key = serverHost; + if(!ins.containsKey(key)){ + synchronized (CollectHandler.class){ + if(!ins.containsKey(key)){ + ins.put(key, new CompareHandler().setServerHost(serverHost)); + } + } + } + return ins.get(key); + } + + /** + * 人脸比对 + * @param compare 集合的定义信息 + * @return 是否创建成功 + */ + public Response faceCompare(Compare compare){ + CompareReq compareReq = CompareReq.build() + .setImageBase64A(compare.getImageBase64A()) + .setImageBase64B(compare.getImageBase64B()) + .setFaceScoreThreshold(compare.getFaceScoreThreshold()) + .setNeedFaceInfo(compare.getNeedFaceInfo()); + return HttpClient.post(Api.getUrl(this.serverHost, Api.visual_compare), compareReq, new TypeReference>() {}); + } + +} diff --git a/face-search-client/src/main/java/com/visual/face/search/handle/FaceHandler.java b/face-search-client/src/main/java/com/visual/face/search/handle/FaceHandler.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/handle/SampleHandler.java b/face-search-client/src/main/java/com/visual/face/search/handle/SampleHandler.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/handle/SearchHandler.java b/face-search-client/src/main/java/com/visual/face/search/handle/SearchHandler.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/http/HttpClient.java b/face-search-client/src/main/java/com/visual/face/search/http/HttpClient.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/http/HttpClientResult.java b/face-search-client/src/main/java/com/visual/face/search/http/HttpClientResult.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/http/HttpClientUtils.java b/face-search-client/src/main/java/com/visual/face/search/http/HttpClientUtils.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/Collect.java b/face-search-client/src/main/java/com/visual/face/search/model/Collect.java old mode 100644 new mode 100755 index da6b9c7..d2e9f02 --- a/face-search-client/src/main/java/com/visual/face/search/model/Collect.java +++ b/face-search-client/src/main/java/com/visual/face/search/model/Collect.java @@ -20,6 +20,10 @@ public class Collect> implements Serializab private List faceColumns = new ArrayList<>(); /**启用binlog同步**/ private Boolean syncBinLog = false; + /**是否保留图片及人脸信息**/ + private Boolean storageFaceInfo = false; + /**保留图片及人脸信息的存储组件**/ + private StorageEngine storageEngine; /** * 构建集合对象 @@ -92,4 +96,26 @@ public class Collect> implements Serializab } return (ExtendsVo) this; } + + public boolean getStorageFaceInfo() { + return null == storageFaceInfo ? false : storageFaceInfo; + } + + public ExtendsVo setStorageFaceInfo(Boolean storageFaceInfo) { + if(null != storageFaceInfo){ + this.storageFaceInfo = storageFaceInfo; + } + return (ExtendsVo) this; + } + + public StorageEngine getStorageEngine() { + return storageEngine; + } + + public ExtendsVo setStorageEngine(StorageEngine storageEngine) { + if(null != storageEngine){ + this.storageEngine = storageEngine; + } + return (ExtendsVo) this; + } } diff --git a/face-search-client/src/main/java/com/visual/face/search/model/CollectRep.java b/face-search-client/src/main/java/com/visual/face/search/model/CollectRep.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/CollectReq.java b/face-search-client/src/main/java/com/visual/face/search/model/CollectReq.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/Compare.java b/face-search-client/src/main/java/com/visual/face/search/model/Compare.java new file mode 100644 index 0000000..ff8fa0d --- /dev/null +++ b/face-search-client/src/main/java/com/visual/face/search/model/Compare.java @@ -0,0 +1,67 @@ +package com.visual.face.search.model; + +import java.io.Serializable; + +public class Compare > implements Serializable { + + /**图像Base64编码值**/ + private String imageBase64A; + + /**图像Base64编码值**/ + private String imageBase64B; + + /**人脸质量分数阈值:人脸质量分数阈值,范围:[0,100]:默认0。当设置为0时,会默认使用当前模型的默认值,该方法为推荐使用方式**/ + private Float faceScoreThreshold = 0f; + + /**是否需要人脸信息**/ + private Boolean needFaceInfo = true; + + /** + * 构建比对对象 + * @return + */ + public static Compare build(){ + return new Compare(); + } + + + public String getImageBase64A() { + return imageBase64A; + } + + public ExtendsVo setImageBase64A(String imageBase64A) { + this.imageBase64A = imageBase64A; + return (ExtendsVo) this; + } + + public String getImageBase64B() { + return imageBase64B; + } + + public ExtendsVo setImageBase64B(String imageBase64B) { + this.imageBase64B = imageBase64B; + return (ExtendsVo) this; + } + + public Float getFaceScoreThreshold() { + return faceScoreThreshold; + } + + public ExtendsVo setFaceScoreThreshold(Float faceScoreThreshold) { + if(null != faceScoreThreshold && faceScoreThreshold >= 0 && faceScoreThreshold <= 100){ + this.faceScoreThreshold = faceScoreThreshold; + } + return (ExtendsVo) this; + } + + public Boolean getNeedFaceInfo() { + return needFaceInfo; + } + + public ExtendsVo setNeedFaceInfo(Boolean needFaceInfo) { + if(null != needFaceInfo){ + this.needFaceInfo = needFaceInfo; + } + return (ExtendsVo) this; + } +} diff --git a/face-search-client/src/main/java/com/visual/face/search/model/CompareFace.java b/face-search-client/src/main/java/com/visual/face/search/model/CompareFace.java new file mode 100755 index 0000000..ac355c3 --- /dev/null +++ b/face-search-client/src/main/java/com/visual/face/search/model/CompareFace.java @@ -0,0 +1,47 @@ +package com.visual.face.search.model; + +public class CompareFace { + + /**A图片人脸分数:[0,100]**/ + private Float faceScoreA; + /**B图片人脸分数:[0,100]**/ + private Float faceScoreB; + + /**A图片人脸位置信息**/ + private FaceLocation locationA; + /**B图片人脸位置信息**/ + private FaceLocation locationB; + + + public Float getFaceScoreA() { + return faceScoreA; + } + + public void setFaceScoreA(Float faceScoreA) { + this.faceScoreA = faceScoreA; + } + + public FaceLocation getLocationA() { + return locationA; + } + + public void setLocationA(FaceLocation locationA) { + this.locationA = locationA; + } + + public Float getFaceScoreB() { + return faceScoreB; + } + + public void setFaceScoreB(Float faceScoreB) { + this.faceScoreB = faceScoreB; + } + + public FaceLocation getLocationB() { + return locationB; + } + + public void setLocationB(FaceLocation locationB) { + this.locationB = locationB; + } +} diff --git a/face-search-client/src/main/java/com/visual/face/search/model/CompareRep.java b/face-search-client/src/main/java/com/visual/face/search/model/CompareRep.java new file mode 100755 index 0000000..af514db --- /dev/null +++ b/face-search-client/src/main/java/com/visual/face/search/model/CompareRep.java @@ -0,0 +1,40 @@ +package com.visual.face.search.model; + +import java.io.Serializable; + +public class CompareRep implements Serializable { + /**向量欧式距离:>=0**/ + private Float distance; + /**余弦距离转换后的置信度:[-100,100],值越大,相似度越高。**/ + private Float confidence; + /**人脸信息,参数needFaceInfo=false时,值为null**/ + private CompareFace faceInfo; + + public Float getDistance() { + return distance; + } + + public CompareRep setDistance(Float distance) { + this.distance = distance; + return this; + } + + public Float getConfidence() { + return confidence; + } + + public CompareRep setConfidence(Float confidence) { + this.confidence = confidence; + return this; + } + + public CompareFace getFaceInfo() { + return faceInfo; + } + + public CompareRep setFaceInfo(CompareFace faceInfo) { + this.faceInfo = faceInfo; + return this; + } + +} diff --git a/face-search-client/src/main/java/com/visual/face/search/model/CompareReq.java b/face-search-client/src/main/java/com/visual/face/search/model/CompareReq.java new file mode 100755 index 0000000..d5f528b --- /dev/null +++ b/face-search-client/src/main/java/com/visual/face/search/model/CompareReq.java @@ -0,0 +1,13 @@ +package com.visual.face.search.model; + +public class CompareReq extends Compare { + + /** + * 构建比对对象 + * @return + */ + public static CompareReq build(){ + return new CompareReq(); + } + +} diff --git a/face-search-client/src/main/java/com/visual/face/search/model/Face.java b/face-search-client/src/main/java/com/visual/face/search/model/Face.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/FaceLocation.java b/face-search-client/src/main/java/com/visual/face/search/model/FaceLocation.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/FaceRep.java b/face-search-client/src/main/java/com/visual/face/search/model/FaceRep.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/FaceReq.java b/face-search-client/src/main/java/com/visual/face/search/model/FaceReq.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/FiledColumn.java b/face-search-client/src/main/java/com/visual/face/search/model/FiledColumn.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/FiledDataType.java b/face-search-client/src/main/java/com/visual/face/search/model/FiledDataType.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/KeyValue.java b/face-search-client/src/main/java/com/visual/face/search/model/KeyValue.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/KeyValues.java b/face-search-client/src/main/java/com/visual/face/search/model/KeyValues.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/MapParam.java b/face-search-client/src/main/java/com/visual/face/search/model/MapParam.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/Order.java b/face-search-client/src/main/java/com/visual/face/search/model/Order.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/Response.java b/face-search-client/src/main/java/com/visual/face/search/model/Response.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/Sample.java b/face-search-client/src/main/java/com/visual/face/search/model/Sample.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/SampleFace.java b/face-search-client/src/main/java/com/visual/face/search/model/SampleFace.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/SampleRep.java b/face-search-client/src/main/java/com/visual/face/search/model/SampleRep.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/SampleReq.java b/face-search-client/src/main/java/com/visual/face/search/model/SampleReq.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/Search.java b/face-search-client/src/main/java/com/visual/face/search/model/Search.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/SearchRep.java b/face-search-client/src/main/java/com/visual/face/search/model/SearchRep.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/SearchReq.java b/face-search-client/src/main/java/com/visual/face/search/model/SearchReq.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/SimpleFace.java b/face-search-client/src/main/java/com/visual/face/search/model/SimpleFace.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/model/StorageEngine.java b/face-search-client/src/main/java/com/visual/face/search/model/StorageEngine.java new file mode 100755 index 0000000..0e98846 --- /dev/null +++ b/face-search-client/src/main/java/com/visual/face/search/model/StorageEngine.java @@ -0,0 +1,8 @@ +package com.visual.face.search.model; + +public enum StorageEngine { + CURR_DB, + ALI_OSS, + TCE_COS, + MIN_IO +} diff --git a/face-search-client/src/main/java/com/visual/face/search/utils/Base64Util.java b/face-search-client/src/main/java/com/visual/face/search/utils/Base64Util.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/main/java/com/visual/face/search/utils/JsonUtil.java b/face-search-client/src/main/java/com/visual/face/search/utils/JsonUtil.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/test/java/com/visual/face/search/base/BaseTest.java b/face-search-client/src/test/java/com/visual/face/search/base/BaseTest.java old mode 100644 new mode 100755 diff --git a/face-search-client/src/test/java/com/visual/face/search/unit/FaceSearchTest.java b/face-search-client/src/test/java/com/visual/face/search/unit/FaceSearchTest.java old mode 100644 new mode 100755 diff --git a/face-search-core/pom.xml b/face-search-core/pom.xml old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/base/BaseOnnxInfer.java b/face-search-core/src/main/java/com/visual/face/search/core/base/BaseOnnxInfer.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/base/FaceAlignment.java b/face-search-core/src/main/java/com/visual/face/search/core/base/FaceAlignment.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/base/FaceDetection.java b/face-search-core/src/main/java/com/visual/face/search/core/base/FaceDetection.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/base/FaceKeyPoint.java b/face-search-core/src/main/java/com/visual/face/search/core/base/FaceKeyPoint.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/base/FaceRecognition.java b/face-search-core/src/main/java/com/visual/face/search/core/base/FaceRecognition.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/base/OpenCVLoader.java b/face-search-core/src/main/java/com/visual/face/search/core/base/OpenCVLoader.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/common/annotation/DataSource.java b/face-search-core/src/main/java/com/visual/face/search/core/common/annotation/DataSource.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/common/enums/CollectionStatue.java b/face-search-core/src/main/java/com/visual/face/search/core/common/enums/CollectionStatue.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/common/enums/DataSourceType.java b/face-search-core/src/main/java/com/visual/face/search/core/common/enums/DataSourceType.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/domain/ExtParam.java b/face-search-core/src/main/java/com/visual/face/search/core/domain/ExtParam.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/domain/FaceImage.java b/face-search-core/src/main/java/com/visual/face/search/core/domain/FaceImage.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/domain/FaceInfo.java b/face-search-core/src/main/java/com/visual/face/search/core/domain/FaceInfo.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/domain/ImageMat.java b/face-search-core/src/main/java/com/visual/face/search/core/domain/ImageMat.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/extract/FaceFeatureExtractor.java b/face-search-core/src/main/java/com/visual/face/search/core/extract/FaceFeatureExtractor.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/extract/FaceFeatureExtractorImpl.java b/face-search-core/src/main/java/com/visual/face/search/core/extract/FaceFeatureExtractorImpl.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/models/InsightArcFaceRecognition.java b/face-search-core/src/main/java/com/visual/face/search/core/models/InsightArcFaceRecognition.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/models/InsightCoordFaceKeyPoint.java b/face-search-core/src/main/java/com/visual/face/search/core/models/InsightCoordFaceKeyPoint.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/models/InsightScrfdFaceDetection.java b/face-search-core/src/main/java/com/visual/face/search/core/models/InsightScrfdFaceDetection.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/models/PcnNetworkFaceDetection.java b/face-search-core/src/main/java/com/visual/face/search/core/models/PcnNetworkFaceDetection.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/models/Simple005pFaceAlignment.java b/face-search-core/src/main/java/com/visual/face/search/core/models/Simple005pFaceAlignment.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/models/Simple106pFaceAlignment.java b/face-search-core/src/main/java/com/visual/face/search/core/models/Simple106pFaceAlignment.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/AlignUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/AlignUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/ArrayUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/ArrayUtil.java new file mode 100644 index 0000000..b719582 --- /dev/null +++ b/face-search-core/src/main/java/com/visual/face/search/core/utils/ArrayUtil.java @@ -0,0 +1,37 @@ +package com.visual.face.search.core.utils; + +public class ArrayUtil { + + public static double [] floatToDouble(float[] input){ + if (input == null){ + return null; + } + double[] output = new double[input.length]; + for (int i = 0; i < input.length; i++){ + output[i] = input[i]; + } + return output; + } + + public static float [] doubleToFloat(double[] input){ + if (input == null){ + return null; + } + float[] output = new float[input.length]; + for (int i = 0; i < input.length; i++){ + output[i] = Double.valueOf(input[i]).floatValue(); + } + return output; + } + + public static double matrixNorm(double[][] matrix){ + double sum=0.0; + for(double[] temp1:matrix){ + for(double temp2:temp1){ + sum+=Math.pow(temp2,2); + } + } + return Math.sqrt(sum); + } + +} diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/CropUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/CropUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/JsonUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/JsonUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/MaskUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/MaskUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/MatUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/MatUtil.java old mode 100644 new mode 100755 index a43672d..be2e456 --- a/face-search-core/src/main/java/com/visual/face/search/core/utils/MatUtil.java +++ b/face-search-core/src/main/java/com/visual/face/search/core/utils/MatUtil.java @@ -1,6 +1,8 @@ package com.visual.face.search.core.utils; import org.opencv.core.Mat; +import org.opencv.core.Range; + import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; @@ -42,9 +44,6 @@ public class MatUtil { byteArrayOutputStream = new ByteArrayOutputStream(); ImageIO.write(matToBufferedImage(mat), "jpg", byteArrayOutputStream); byte[] bytes = byteArrayOutputStream.toByteArray(); - // 新版本JDK被移除,替换为Base64.Encoder -// BASE64Encoder encoder = new BASE64Encoder(); -// return encoder.encodeBuffer(Objects.requireNonNull(bytes)); Base64.Encoder encoder = Base64.getMimeEncoder(); return encoder.encodeToString(Objects.requireNonNull(bytes)); }catch (Exception e){ @@ -58,4 +57,41 @@ public class MatUtil { } } + /** + * 横向拼接两个图像的数据(Mat),该两个图像的类型必须是相同的类型,如:均为CvType.CV_8UC3类型 + * @author bailichun + * @since 2020.02.20 15:00 + * @param m1 要合并的图像1(左图) + * @param m2 要合并的图像2(右图) + * @return 拼接好的Mat图像数据集。其高度等于两个图像中高度较大者的高度;其宽度等于两个图像的宽度之和。类型与两个输入图像相同。 + * @throws Exception 当两个图像数据的类型不同时,抛出异常 + */ + public static Mat concat(Mat m1, Mat m2){ + if(m1.type() != m2.type()){ + throw new RuntimeException("concat:两个图像数据的类型不同!"); + } + long time = System.currentTimeMillis(); + //宽度为两图的宽度之和 + double w = m1.size().width + m2.size().width; + //高度取两个矩阵中的较大者的高度 + double h = m1.size().height > m2.size().height ? m1.size().height : m2.size().height; + //创建一个大矩阵对象 + Mat des = Mat.zeros((int)h, (int)w, m1.type()); + //在最终的大图上标记一块区域,用于存放复制图1(左图)的数据,大小为从第0列到m1.cols()列 + Mat rectForM1 = des.colRange(new Range(0, m1.cols())); + //标记出位于rectForM1的垂直方向上中间位置的区域,高度为图1的高度,此时该区域的大小已经和图1的大小相同。(用于存放复制图1(左图)的数据) + int rowOffset1 = (int)(rectForM1.size().height-m1.rows())/2; + rectForM1 = rectForM1.rowRange(rowOffset1, rowOffset1 + m1.rows()); + //在最终的大图上标记一块区域,用于存放复制图2(右图)的数据 + Mat rectForM2 = des.colRange(new Range(m1.cols(), des.cols())); + //标记出位于rectForM2的垂直方向上中间位置的区域,高度为图2的高度,此时该区域的大小已经和图2的大小相同。(用于存放复制图2(右图)的数据) + int rowOffset2 = (int)(rectForM2.size().height-m2.rows())/2; + rectForM2 = rectForM2.rowRange(rowOffset2, rowOffset2 + m2.rows()); + //将图1拷贝到des的指定区域 rectForM1 + m1.copyTo(rectForM1); + //将图2拷贝到des的指定区域 rectForM2 + m2.copyTo(rectForM2); + return des; + } + } diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/MathUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/MathUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/PointUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/PointUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/SigmoidUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/SigmoidUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/Similarity.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/Similarity.java index b8a0e23..98dcbc7 100644 --- a/face-search-core/src/main/java/com/visual/face/search/core/utils/Similarity.java +++ b/face-search-core/src/main/java/com/visual/face/search/core/utils/Similarity.java @@ -1,5 +1,8 @@ package com.visual.face.search.core.utils; +import org.apache.commons.math3.linear.RealMatrix; +import static com.visual.face.search.core.utils.ArrayUtil.matrixNorm; + public class Similarity { /** @@ -52,4 +55,25 @@ public class Similarity { return (float) distance; } + /** + * 向量余弦相似度,加入了norm变换 + * @param leftVector + * @param rightVector + * @return + */ + public static float cosineSimilarityNorm(float[] leftVector, float[] rightVector) { + RealMatrix rm1 = MathUtil.createMatrix(1, ArrayUtil.floatToDouble(leftVector)); + RealMatrix rm2 = MathUtil.createMatrix(1, ArrayUtil.floatToDouble(rightVector)); + RealMatrix num = rm1.multiply(rm2.transpose()); + double deco = matrixNorm(rm1.getData()) * matrixNorm(rm2.getData()); + double cos = num.getEntry(0, 0) / deco; + double sim = cos; + if(cos >= 0.5){ + sim = cos + 2 * (cos - 0.5) * (1 - cos); + }else if(cos >= 0){ + sim = cos - 2 * (cos - 0.5) * (0 - cos); + } + return Double.valueOf(sim).floatValue(); + } + } diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/SoftMaxUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/SoftMaxUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/java/com/visual/face/search/core/utils/ThreadUtil.java b/face-search-core/src/main/java/com/visual/face/search/core/utils/ThreadUtil.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/resources/model/onnx/detection_face_pcn/pcn1_sd.onnx b/face-search-core/src/main/resources/model/onnx/detection_face_pcn/pcn1_sd.onnx old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/resources/model/onnx/detection_face_pcn/pcn2_sd.onnx b/face-search-core/src/main/resources/model/onnx/detection_face_pcn/pcn2_sd.onnx old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/resources/model/onnx/detection_face_pcn/pcn3_sd.onnx b/face-search-core/src/main/resources/model/onnx/detection_face_pcn/pcn3_sd.onnx old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/resources/model/onnx/detection_face_scrfd/scrfd_500m_bnkps.onnx b/face-search-core/src/main/resources/model/onnx/detection_face_scrfd/scrfd_500m_bnkps.onnx old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/resources/model/onnx/keypoint_coordinate/coordinate_106_mobilenet_05.onnx b/face-search-core/src/main/resources/model/onnx/keypoint_coordinate/coordinate_106_mobilenet_05.onnx old mode 100644 new mode 100755 diff --git a/face-search-core/src/main/resources/model/onnx/recognition_face_arc/glint360k_cosface_r18_fp16_0.1.onnx b/face-search-core/src/main/resources/model/onnx/recognition_face_arc/glint360k_cosface_r18_fp16_0.1.onnx old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/java/com/visual/face/search/core/test/base/BaseTest.java b/face-search-core/src/test/java/com/visual/face/search/core/test/base/BaseTest.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/java/com/visual/face/search/core/test/extract/FaceFeatureExtractOOMTest.java b/face-search-core/src/test/java/com/visual/face/search/core/test/extract/FaceFeatureExtractOOMTest.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/java/com/visual/face/search/core/test/extract/FaceFeatureExtractTest.java b/face-search-core/src/test/java/com/visual/face/search/core/test/extract/FaceFeatureExtractTest.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/java/com/visual/face/search/core/test/models/InsightCoordFaceKeyPointTest.java b/face-search-core/src/test/java/com/visual/face/search/core/test/models/InsightCoordFaceKeyPointTest.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/java/com/visual/face/search/core/test/models/InsightScrfdFaceDetectionTest.java b/face-search-core/src/test/java/com/visual/face/search/core/test/models/InsightScrfdFaceDetectionTest.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/java/com/visual/face/search/core/test/models/PcnNetworkFaceDetectionTest.java b/face-search-core/src/test/java/com/visual/face/search/core/test/models/PcnNetworkFaceDetectionTest.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/java/com/visual/face/search/core/test/other/TestCvFillPoly.java b/face-search-core/src/test/java/com/visual/face/search/core/test/other/TestCvFillPoly.java old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/resources/images/faces/debug/debug_0001.jpg b/face-search-core/src/test/resources/images/faces/debug/debug_0001.jpg old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/resources/images/faces/debug/debug_0002.jpg b/face-search-core/src/test/resources/images/faces/debug/debug_0002.jpg old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/resources/images/faces/debug/debug_0003.jpg b/face-search-core/src/test/resources/images/faces/debug/debug_0003.jpg old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/resources/images/faces/debug/debug_0004.jpeg b/face-search-core/src/test/resources/images/faces/debug/debug_0004.jpeg old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/resources/images/faces/rotate/rotate_0001.jpg b/face-search-core/src/test/resources/images/faces/rotate/rotate_0001.jpg old mode 100644 new mode 100755 diff --git a/face-search-core/src/test/resources/images/faces/rotate/rotate_0002.jpg b/face-search-core/src/test/resources/images/faces/rotate/rotate_0002.jpg old mode 100644 new mode 100755 diff --git a/face-search-engine/libs/milvus-java-sdk-2.0.0.jar b/face-search-engine/libs/milvus-java-sdk-2.0.0.jar old mode 100644 new mode 100755 diff --git a/face-search-engine/libs/milvus-java-sdk-2.0.4.jar b/face-search-engine/libs/milvus-java-sdk-2.0.4.jar new file mode 100755 index 0000000..fbc2259 Binary files /dev/null and b/face-search-engine/libs/milvus-java-sdk-2.0.4.jar differ diff --git a/face-search-engine/libs/proxima-be-java-sdk-0.2.0.jar b/face-search-engine/libs/proxima-be-java-sdk-0.2.0.jar old mode 100644 new mode 100755 diff --git a/face-search-engine/pom.xml b/face-search-engine/pom.xml old mode 100644 new mode 100755 index 3897032..c2420f0 --- a/face-search-engine/pom.xml +++ b/face-search-engine/pom.xml @@ -77,9 +77,9 @@ io.milvus milvus-java-sdk - 2.0.0 + 2.0.4 system - ${project.basedir}/libs/milvus-java-sdk-2.0.0.jar + ${project.basedir}/libs/milvus-java-sdk-2.0.4.jar diff --git a/face-search-server/pom.xml b/face-search-server/pom.xml old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/FaceSearchApplication.java b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/FaceSearchApplication.java old mode 100644 new mode 100755 index 8cc2f4a..d9835e7 --- a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/FaceSearchApplication.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/FaceSearchApplication.java @@ -1,9 +1,11 @@ package com.visual.face.search.server.bootstrap; import org.springframework.boot.SpringApplication; +import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +@EnableScheduling @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class }) public class FaceSearchApplication { diff --git a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/EngineConfig.java b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/EngineConfig.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ModelConfig.java b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ModelConfig.java old mode 100644 new mode 100755 index b6afe52..c054eaa --- a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ModelConfig.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ModelConfig.java @@ -169,7 +169,7 @@ public class ModelConfig { } if((null == modelPath || modelPath.length != 1) && "InsightArcFaceRecognition".equalsIgnoreCase(modelName)){ - return new String[]{basePath + "model/onnx/recognition_face_arc/glint360k_cosface_r18_fp16_0.1.onnx"}; + return new String[]{basePath + "model/onnx/recognition_face_arc/glint360k_cosface_r50_fp16_0.1.onnx"}; } return modelPath; diff --git a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ServerConfig.java b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ServerConfig.java old mode 100644 new mode 100755 index 80acfe1..8563939 --- a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ServerConfig.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/ServerConfig.java @@ -13,6 +13,10 @@ public class ServerConfig { @MapperScan("com.visual.face.search.server.mapper") public static class MapperConfig {} + @Configuration + @ComponentScan("com.visual.face.search.server.utils") + public static class SearchUtils {} + @Configuration @ComponentScan("com.visual.face.search.server.config") public static class SearchConfig {} @@ -25,4 +29,7 @@ public class ServerConfig { @ComponentScan({"com.visual.face.search.server.controller"}) public static class ControllerConfig {} + @Configuration + @ComponentScan({"com.visual.face.search.server.scheduler"}) + public static class SchedulerConfig {} } diff --git a/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/SwaggerConfig.java b/face-search-server/src/main/java/com/visual/face/search/server/bootstrap/conf/SwaggerConfig.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/config/DruidConfig.java b/face-search-server/src/main/java/com/visual/face/search/server/config/DruidConfig.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/config/aspectj/DataSourceAspect.java b/face-search-server/src/main/java/com/visual/face/search/server/config/aspectj/DataSourceAspect.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/config/datainit/DataSourceInitializer.java b/face-search-server/src/main/java/com/visual/face/search/server/config/datainit/DataSourceInitializer.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/config/datasource/DynamicDataSource.java b/face-search-server/src/main/java/com/visual/face/search/server/config/datasource/DynamicDataSource.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/config/datasource/DynamicDataSourceContextHolder.java b/face-search-server/src/main/java/com/visual/face/search/server/config/datasource/DynamicDataSourceContextHolder.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/config/properties/DruidProperties.java b/face-search-server/src/main/java/com/visual/face/search/server/config/properties/DruidProperties.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/base/BaseController.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/base/BaseController.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/base/GlobalExceptionHandler.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/base/GlobalExceptionHandler.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/health/HealthController.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/health/HealthController.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/CollectControllerApi.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/CollectControllerApi.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/FaceCompareControllerApi.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/FaceCompareControllerApi.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/FaceDataControllerApi.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/FaceDataControllerApi.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/FaceSearchControllerApi.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/FaceSearchControllerApi.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/SampleDataControllerApi.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/api/SampleDataControllerApi.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/CollectControllerImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/CollectControllerImpl.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/FaceCompareControllerImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/FaceCompareControllerImpl.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/FaceDataControllerImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/FaceDataControllerImpl.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/FaceSearchControllerImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/FaceSearchControllerImpl.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/SampleDataControllerImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/impl/SampleDataControllerImpl.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/CollectController.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/CollectController.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/FaceCompareController.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/FaceCompareController.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/FaceDataController.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/FaceDataController.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/FaceSearchController.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/FaceSearchController.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/SampleDataController.java b/face-search-server/src/main/java/com/visual/face/search/server/controller/server/restful/SampleDataController.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/base/BaseVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/base/BaseVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/base/CollectVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/base/CollectVo.java old mode 100644 new mode 100755 index ccd5c15..f5cd99b --- a/face-search-server/src/main/java/com/visual/face/search/server/domain/base/CollectVo.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/domain/base/CollectVo.java @@ -1,5 +1,6 @@ package com.visual.face.search.server.domain.base; +import com.visual.face.search.server.domain.storage.StorageEngine; import com.visual.face.search.server.domain.extend.FiledColumn; import io.swagger.annotations.ApiModelProperty; import org.hibernate.validator.constraints.Length; @@ -39,8 +40,14 @@ public class CollectVo> extends BaseVo { @ApiModelProperty(value="自定义的人脸属性字段", position = 6,required = false) private List faceColumns = new ArrayList<>(); /**启用binlog同步**/ - @ApiModelProperty(value="启用binlog同步。扩展字段,暂不支持该功能。", position = 7,required = false) + @ApiModelProperty(value="启用binlog同步。扩展字段,暂不支持该功能", position = 7,required = false) private Boolean syncBinLog; + /**是否保留图片及人脸信息**/ + @ApiModelProperty(value="是否保留图片及人脸信息", position = 8,required = false) + private Boolean storageFaceInfo; + /**保留图片及人脸信息的存储组件**/ + @ApiModelProperty(value="保留图片及人脸信息的存储组件", position = 9,required = false) + private StorageEngine storageEngine; /** * 构建集合对象 @@ -127,4 +134,26 @@ public class CollectVo> extends BaseVo { this.syncBinLog = syncBinLog; return (ExtendsVo) this; } + + public boolean getStorageFaceInfo() { + return null == storageFaceInfo ? false : storageFaceInfo; + } + + public ExtendsVo setStorageFaceInfo(Boolean storageFaceInfo) { + if(null != storageFaceInfo){ + this.storageFaceInfo = storageFaceInfo; + } + return (ExtendsVo) this; + } + + public StorageEngine getStorageEngine() { + return storageEngine; + } + + public ExtendsVo setStorageEngine(StorageEngine storageEngine) { + if(null != storageEngine){ + this.storageEngine = storageEngine; + } + return (ExtendsVo) this; + } } diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/base/FaceDataVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/base/FaceDataVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/base/SampleDataVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/base/SampleDataVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/common/BaseEntity.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/common/BaseEntity.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/common/ResponseInfo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/common/ResponseInfo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/CompareFace.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/CompareFace.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FaceLocation.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FaceLocation.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FieldKeyValue.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FieldKeyValue.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FieldKeyValues.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FieldKeyValues.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FiledColumn.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FiledColumn.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FiledDataType.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/FiledDataType.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/SampleFaceVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/SampleFaceVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/SimpleFaceVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/extend/SimpleFaceVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/request/CollectReqVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/request/CollectReqVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/request/FaceCompareReqVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/request/FaceCompareReqVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/request/FaceDataReqVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/request/FaceDataReqVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/request/FaceSearchReqVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/request/FaceSearchReqVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/request/SampleDataReqVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/request/SampleDataReqVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/response/CollectRepVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/response/CollectRepVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/response/FaceCompareRepVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/response/FaceCompareRepVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/response/FaceDataRepVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/response/FaceDataRepVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/response/FaceSearchRepVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/response/FaceSearchRepVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/response/SampleDataRepVo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/response/SampleDataRepVo.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageDataInfo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageDataInfo.java new file mode 100755 index 0000000..3549a9f --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageDataInfo.java @@ -0,0 +1,51 @@ +package com.visual.face.search.server.domain.storage; + +import java.io.Serializable; + +public class StorageDataInfo implements Serializable { + private String imageRawInfo; + private String imageEbdInfo; + private String imageFaceInfo; + private StorageEngine storageEngine; + + public StorageDataInfo(){} + + public StorageDataInfo(StorageEngine storageEngine, String imageRawInfo, String imageEbdInfo, String imageFaceInfo) { + this.storageEngine = storageEngine; + this.imageRawInfo = imageRawInfo; + this.imageEbdInfo = imageEbdInfo; + this.imageFaceInfo = imageFaceInfo; + } + + public StorageEngine getStorageEngine() { + return storageEngine; + } + + public void setStorageEngine(StorageEngine storageEngine) { + this.storageEngine = storageEngine; + } + + public String getImageRawInfo() { + return imageRawInfo; + } + + public void setImageRawInfo(String imageRawInfo) { + this.imageRawInfo = imageRawInfo; + } + + public String getImageEbdInfo() { + return imageEbdInfo; + } + + public void setImageEbdInfo(String imageEbdInfo) { + this.imageEbdInfo = imageEbdInfo; + } + + public String getImageFaceInfo() { + return imageFaceInfo; + } + + public void setImageFaceInfo(String imageFaceInfo) { + this.imageFaceInfo = imageFaceInfo; + } +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageEngine.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageEngine.java new file mode 100755 index 0000000..19aefa0 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageEngine.java @@ -0,0 +1,8 @@ +package com.visual.face.search.server.domain.storage; + +public enum StorageEngine { + CURR_DB, + ALI_OSS, + TCE_COS, + MIN_IO +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageImageInfo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageImageInfo.java new file mode 100755 index 0000000..b583125 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageImageInfo.java @@ -0,0 +1,51 @@ +package com.visual.face.search.server.domain.storage; + +import java.io.Serializable; + +public class StorageImageInfo implements Serializable { + private String imageRawInfo; + private String imageEbdInfo; + private String imageFaceInfo; + private StorageEngine storageEngine; + + public StorageImageInfo(){} + + public StorageImageInfo(StorageEngine storageEngine, String imageRawInfo, String imageEbdInfo, String imageFaceInfo) { + this.storageEngine = storageEngine; + this.imageRawInfo = imageRawInfo; + this.imageEbdInfo = imageEbdInfo; + this.imageFaceInfo = imageFaceInfo; + } + + public StorageEngine getStorageEngine() { + return storageEngine; + } + + public void setStorageEngine(StorageEngine storageEngine) { + this.storageEngine = storageEngine; + } + + public String getImageRawInfo() { + return imageRawInfo; + } + + public void setImageRawInfo(String imageRawInfo) { + this.imageRawInfo = imageRawInfo; + } + + public String getImageEbdInfo() { + return imageEbdInfo; + } + + public void setImageEbdInfo(String imageEbdInfo) { + this.imageEbdInfo = imageEbdInfo; + } + + public String getImageFaceInfo() { + return imageFaceInfo; + } + + public void setImageFaceInfo(String imageFaceInfo) { + this.imageFaceInfo = imageFaceInfo; + } +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageInfo.java b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageInfo.java new file mode 100755 index 0000000..ac23651 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/domain/storage/StorageInfo.java @@ -0,0 +1,27 @@ +package com.visual.face.search.server.domain.storage; + +import java.io.Serializable; + +public class StorageInfo implements Serializable { + + private boolean storageFaceInfo; + private StorageEngine storageEngine; + + public boolean isStorageFaceInfo() { + return storageFaceInfo; + } + + public void setStorageFaceInfo(Boolean storageFaceInfo) { + if(null != storageFaceInfo){ + this.storageFaceInfo = storageFaceInfo; + } + } + + public StorageEngine getStorageEngine() { + return storageEngine; + } + + public void setStorageEngine(StorageEngine storageEngine) { + this.storageEngine = storageEngine; + } +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/api/SearchEngine.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/api/SearchEngine.java old mode 100644 new mode 100755 index 9aafe90..9674681 --- a/face-search-server/src/main/java/com/visual/face/search/server/engine/api/SearchEngine.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/engine/api/SearchEngine.java @@ -7,6 +7,8 @@ import java.util.List; public interface SearchEngine { + public Object getEngine(); + public boolean exist(String collectionName); public boolean dropCollection(String collectionName); diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/conf/Constant.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/conf/Constant.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/MilvusSearchEngine.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/MilvusSearchEngine.java old mode 100644 new mode 100755 index f917d3a..fb43aff --- a/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/MilvusSearchEngine.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/MilvusSearchEngine.java @@ -4,7 +4,7 @@ import com.visual.face.search.server.engine.api.SearchEngine; import com.visual.face.search.server.engine.conf.Constant; import com.visual.face.search.server.engine.model.*; import com.visual.face.search.server.engine.utils.VectorUtils; -import io.milvus.Response.SearchResultsWrapper; +import io.milvus.response.SearchResultsWrapper; import io.milvus.client.MilvusServiceClient; import io.milvus.grpc.*; import io.milvus.param.*; @@ -13,6 +13,7 @@ import io.milvus.param.dml.DeleteParam; import io.milvus.param.dml.InsertParam; import io.milvus.param.dml.SearchParam; import io.milvus.param.index.CreateIndexParam; + import java.util.*; public class MilvusSearchEngine implements SearchEngine { @@ -25,6 +26,11 @@ public class MilvusSearchEngine implements SearchEngine { this.client = client; } + @Override + public Object getEngine(){ + return this.client; + } + @Override public boolean exist(String collectionName) { HasCollectionParam param = HasCollectionParam.newBuilder().withCollectionName(collectionName).build(); @@ -161,12 +167,12 @@ public class MilvusSearchEngine implements SearchEngine { SearchParam searchParam = SearchParam.newBuilder() .withCollectionName(collectionName) .withMetricType(MetricType.L2) + .withParams("{\"nprobe\": 128}") .withOutFields(Collections.singletonList(Constant.ColumnPrimaryKey)) .withTopK(topK) .withVectors(VectorUtils.convertVector(features)) .withVectorFieldName(Constant.ColumnNameFaceIndex) .build(); - R response = this.client.search(searchParam); if(SUCCESS_STATUE.equals(response.getStatus())){ SearchStatus status = SearchStatus.build(0, "success"); diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/ProximaSearchEngine.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/ProximaSearchEngine.java old mode 100644 new mode 100755 index ac58339..c71de68 --- a/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/ProximaSearchEngine.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/engine/impl/ProximaSearchEngine.java @@ -19,6 +19,11 @@ public class ProximaSearchEngine implements SearchEngine { this.client = client; } + @Override + public Object getEngine(){ + return this.client; + } + @Override public boolean exist(String collectionName) { DescribeCollectionResponse response = client.describeCollection(collectionName); diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/model/MapParam.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/model/MapParam.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchDocument.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchDocument.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchResponse.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchResponse.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchResult.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchResult.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchStatus.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/model/SearchStatus.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/engine/utils/VectorUtils.java b/face-search-server/src/main/java/com/visual/face/search/server/engine/utils/VectorUtils.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/mapper/CollectMapper.java b/face-search-server/src/main/java/com/visual/face/search/server/mapper/CollectMapper.java old mode 100644 new mode 100755 index 0903c7f..9feaa7c --- a/face-search-server/src/main/java/com/visual/face/search/server/mapper/CollectMapper.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/mapper/CollectMapper.java @@ -18,6 +18,7 @@ public interface CollectMapper { "statue,", "sample_table,", "face_table,", + "image_table,", "vector_table,", "schema_info", ")", @@ -25,8 +26,8 @@ public interface CollectMapper { "#{uuid,jdbcType=VARCHAR}, #{namespace,jdbcType=VARCHAR}, ", "#{collection,jdbcType=VARCHAR}, #{describe,jdbcType=VARCHAR}, ", "#{statue,jdbcType=INTEGER}, #{sampleTable,jdbcType=VARCHAR}, ", - "#{faceTable,jdbcType=VARCHAR}, #{vectorTable,jdbcType=VARCHAR}, ", - "#{schemaInfo,jdbcType=VARCHAR}", + "#{faceTable,jdbcType=VARCHAR}, #{imageTable,jdbcType=VARCHAR},", + "#{vectorTable,jdbcType=VARCHAR},#{schemaInfo,jdbcType=VARCHAR}", ")" }) @SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=Long.class) @@ -47,7 +48,7 @@ public interface CollectMapper { @Select({ "select", - "id, uuid, namespace, `collection`, `describe`, statue, sample_table, face_table, ", + "id, uuid, namespace, `collection`, `describe`, statue, sample_table, face_table, image_table, ", "vector_table, schema_info, create_time, update_time, deleted", "from visual_collection", "where 1=1 ", @@ -64,6 +65,7 @@ public interface CollectMapper { @Result(column="statue", property="statue", jdbcType=JdbcType.INTEGER), @Result(column="sample_table", property="sampleTable", jdbcType=JdbcType.VARCHAR), @Result(column="face_table", property="faceTable", jdbcType=JdbcType.VARCHAR), + @Result(column="image_table", property="imageTable", jdbcType=JdbcType.VARCHAR), @Result(column="vector_table", property="vectorTable", jdbcType=JdbcType.VARCHAR), @Result(column="schema_info", property="schemaInfo", jdbcType=JdbcType.VARCHAR), @Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP), @@ -74,7 +76,7 @@ public interface CollectMapper { @Select({ "select", - "id, uuid, namespace, `collection`, `describe`, statue, sample_table, face_table, ", + "id, uuid, namespace, `collection`, `describe`, statue, sample_table, face_table, image_table, ", "vector_table, schema_info, create_time, update_time, deleted", "from visual_collection", "where 1=1 ", @@ -89,6 +91,7 @@ public interface CollectMapper { @Result(column="statue", property="statue", jdbcType=JdbcType.INTEGER), @Result(column="sample_table", property="sampleTable", jdbcType=JdbcType.VARCHAR), @Result(column="face_table", property="faceTable", jdbcType=JdbcType.VARCHAR), + @Result(column="image_table", property="imageTable", jdbcType=JdbcType.VARCHAR), @Result(column="vector_table", property="vectorTable", jdbcType=JdbcType.VARCHAR), @Result(column="schema_info", property="schemaInfo", jdbcType=JdbcType.VARCHAR), @Result(column="create_time", property="createTime", jdbcType=JdbcType.TIMESTAMP), diff --git a/face-search-server/src/main/java/com/visual/face/search/server/mapper/FaceDataMapper.java b/face-search-server/src/main/java/com/visual/face/search/server/mapper/FaceDataMapper.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/mapper/ImageDataMapper.java b/face-search-server/src/main/java/com/visual/face/search/server/mapper/ImageDataMapper.java new file mode 100755 index 0000000..a0d15e5 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/mapper/ImageDataMapper.java @@ -0,0 +1,23 @@ +package com.visual.face.search.server.mapper; + +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.SelectKey; +import com.visual.face.search.server.model.ImageData; + +public interface ImageDataMapper { + + @Insert({ + "insert into ${table} (sample_id, face_id, ", + "storage_type, image_raw_info, ", + "image_ebd_info, image_face_info, ", + "create_time, modify_time)", + "values (#{image.sampleId,jdbcType=VARCHAR}, #{image.faceId,jdbcType=VARCHAR}, ", + "#{image.storageType,jdbcType=VARCHAR}, #{image.imageRawInfo,jdbcType=VARCHAR}, ", + "#{image.imageEbdInfo,jdbcType=VARCHAR}, #{image.imageFaceInfo,jdbcType=VARCHAR}, ", + "#{image.createTime,jdbcType=TIMESTAMP}, #{image.modifyTime,jdbcType=TIMESTAMP})" + }) + @SelectKey(statement="SELECT LAST_INSERT_ID()", keyProperty="id", before=false, resultType=Long.class) + int insert(@Param("table")String table, @Param("image")ImageData record); + +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/mapper/OperateTableMapper.java b/face-search-server/src/main/java/com/visual/face/search/server/mapper/OperateTableMapper.java old mode 100644 new mode 100755 index 926483b..277c2d7 --- a/face-search-server/src/main/java/com/visual/face/search/server/mapper/OperateTableMapper.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/mapper/OperateTableMapper.java @@ -93,4 +93,27 @@ public interface OperateTableMapper { }) int createFaceTable(@Param("table") String table, @Param("columns") List columns); + @Update({ + "" + }) + int createImageTable(@Param("table") String table); } diff --git a/face-search-server/src/main/java/com/visual/face/search/server/mapper/SampleDataMapper.java b/face-search-server/src/main/java/com/visual/face/search/server/mapper/SampleDataMapper.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/model/Collection.java b/face-search-server/src/main/java/com/visual/face/search/server/model/Collection.java old mode 100644 new mode 100755 index 31f0909..97bd089 --- a/face-search-server/src/main/java/com/visual/face/search/server/model/Collection.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/model/Collection.java @@ -43,6 +43,11 @@ public class Collection { */ private String faceTable; + /** + * 图片数据表 + */ + private String imageTable; + /** * 人脸向量库 */ @@ -196,6 +201,22 @@ public class Collection { this.faceTable = faceTable == null ? null : faceTable.trim(); } + /** + * 图片数据表 + * @return image_table 图片数据表 + */ + public String getImageTable() { + return imageTable; + } + + /** + * 图片数据表 + * @param imageTable 图片数据表 + */ + public void setImageTable(String imageTable) { + this.imageTable = imageTable == null ? null : imageTable.trim(); + } + /** * 人脸向量库 * @return vector_table 人脸向量库 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/model/ColumnValue.java b/face-search-server/src/main/java/com/visual/face/search/server/model/ColumnValue.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/model/FaceData.java b/face-search-server/src/main/java/com/visual/face/search/server/model/FaceData.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/model/ImageData.java b/face-search-server/src/main/java/com/visual/face/search/server/model/ImageData.java new file mode 100755 index 0000000..973e6a8 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/model/ImageData.java @@ -0,0 +1,194 @@ +package com.visual.face.search.server.model; + +import java.util.Date; + +public class ImageData { + /** + * 主键、自增、无意 + */ + private Long id; + + /** + * 样本ID + */ + private String sampleId; + + /** + * 人脸ID + */ + private String faceId; + + /** + * 数据存储类型 + */ + private String storageType; + + /** + * 原始图片数据 + */ + private String imageRawInfo; + + /** + * 用于提取特征的人脸图片 + */ + private String imageEbdInfo; + + /** + * 图片人脸检测信息 + */ + private String imageFaceInfo; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date modifyTime; + + /** + * 主键、自增、无意 + * @return id 主键、自增、无意 + */ + public Long getId() { + return id; + } + + /** + * 主键、自增、无意 + * @param id 主键、自增、无意 + */ + public void setId(Long id) { + this.id = id; + } + + /** + * 样本ID + * @return sample_id 样本ID + */ + public String getSampleId() { + return sampleId; + } + + /** + * 样本ID + * @param sampleId 样本ID + */ + public void setSampleId(String sampleId) { + this.sampleId = sampleId == null ? null : sampleId.trim(); + } + + /** + * 人脸ID + * @return face_id 人脸ID + */ + public String getFaceId() { + return faceId; + } + + /** + * 人脸ID + * @param faceId 人脸ID + */ + public void setFaceId(String faceId) { + this.faceId = faceId == null ? null : faceId.trim(); + } + + /** + * 数据存储类型 + * @return storage_type 数据存储类型 + */ + public String getStorageType() { + return storageType; + } + + /** + * 数据存储类型 + * @param storageType 数据存储类型 + */ + public void setStorageType(String storageType) { + this.storageType = storageType == null ? null : storageType.trim(); + } + + /** + * 原始图片数据 + * @return image_raw_info 原始图片数据 + */ + public String getImageRawInfo() { + return imageRawInfo; + } + + /** + * 原始图片数据 + * @param imageRawInfo 原始图片数据 + */ + public void setImageRawInfo(String imageRawInfo) { + this.imageRawInfo = imageRawInfo == null ? null : imageRawInfo.trim(); + } + + /** + * 用于提取特征的人脸图片 + * @return image_ebd_info 用于提取特征的人脸图片 + */ + public String getImageEbdInfo() { + return imageEbdInfo; + } + + /** + * 用于提取特征的人脸图片 + * @param imageEbdInfo 用于提取特征的人脸图片 + */ + public void setImageEbdInfo(String imageEbdInfo) { + this.imageEbdInfo = imageEbdInfo == null ? null : imageEbdInfo.trim(); + } + + /** + * 图片人脸检测信息 + * @return image_face_info 图片人脸检测信息 + */ + public String getImageFaceInfo() { + return imageFaceInfo; + } + + /** + * 图片人脸检测信息 + * @param imageFaceInfo 图片人脸检测信息 + */ + public void setImageFaceInfo(String imageFaceInfo) { + this.imageFaceInfo = imageFaceInfo == null ? null : imageFaceInfo.trim(); + } + + /** + * 创建时间 + * @return create_time 创建时间 + */ + public Date getCreateTime() { + return createTime; + } + + /** + * 创建时间 + * @param createTime 创建时间 + */ + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + /** + * 更新时间 + * @return modify_time 更新时间 + */ + public Date getModifyTime() { + return modifyTime; + } + + /** + * 更新时间 + * @param modifyTime 更新时间 + */ + public void setModifyTime(Date modifyTime) { + this.modifyTime = modifyTime; + } +} \ No newline at end of file diff --git a/face-search-server/src/main/java/com/visual/face/search/server/model/SampleData.java b/face-search-server/src/main/java/com/visual/face/search/server/model/SampleData.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/model/TableColumn.java b/face-search-server/src/main/java/com/visual/face/search/server/model/TableColumn.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/scheduler/FlushScheduler.java b/face-search-server/src/main/java/com/visual/face/search/server/scheduler/FlushScheduler.java new file mode 100755 index 0000000..8e5ff48 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/scheduler/FlushScheduler.java @@ -0,0 +1,79 @@ +package com.visual.face.search.server.scheduler; + +import io.milvus.param.R; +import io.milvus.grpc.FlushResponse; +import io.milvus.client.MilvusServiceClient; +import io.milvus.param.collection.FlushParam; +import io.milvus.param.collection.HasCollectionParam; +import com.visual.face.search.server.utils.VTableCache; +import com.alibaba.proxima.be.client.ProximaSearchClient; +import com.visual.face.search.server.engine.api.SearchEngine; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import javax.annotation.Resource; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; +import org.springframework.scheduling.annotation.Scheduled; + +/** + * 用于刷新数据,Milvus不刷新数据可能导致数据丢失 + */ +@Component +public class FlushScheduler { + + private static final Integer SUCCESS_STATUE = 0; + public Logger logger = LoggerFactory.getLogger(getClass()); + + @Resource + private SearchEngine searchEngine; + @Value("${visual.scheduler.flush.enable:true}") + private boolean enable; + + @Scheduled(fixedDelayString = "${visual.scheduler.flush.interval:300000}") + public void flush(){ + if(enable){ + Object client = searchEngine.getEngine(); + if(client instanceof MilvusServiceClient){ + this.flushMilvus((MilvusServiceClient) client); + }else if(client instanceof ProximaSearchClient){ + this.flushProxima((ProximaSearchClient) client); + } + } + } + + /** + * 刷新数据到数据库中 + * @param client + */ + private void flushMilvus(MilvusServiceClient client){ + VTableCache.getVectorTables().forEach((vectorTable) -> { + try { + HasCollectionParam requestParam = HasCollectionParam.newBuilder().withCollectionName(vectorTable).build(); + boolean exist = client.hasCollection(requestParam).getData(); + if(exist){ + FlushParam flushParam = FlushParam.newBuilder().addCollectionName(vectorTable).build(); + R response = client.flush(flushParam); + if(SUCCESS_STATUE.equals(response.getStatus())){ + VTableCache.remove(vectorTable); + logger.info("flushMilvus success: table is {}", vectorTable); + }else{ + throw new RuntimeException("FlushResponse Error"); + } + } + }catch (Exception e){ + logger.error("flushMilvus error:", e); + } + }); + } + + /** + * 刷新数据到数据库中 + * @param client + */ + private void flushProxima(ProximaSearchClient client){ + + } + +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/CollectService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/CollectService.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/FaceCompareService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/FaceCompareService.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/FaceDataService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/FaceDataService.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/FaceSearchService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/FaceSearchService.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/ImageDataService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/ImageDataService.java new file mode 100755 index 0000000..c3e304a --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/api/ImageDataService.java @@ -0,0 +1,9 @@ +package com.visual.face.search.server.service.api; + +import com.visual.face.search.server.model.ImageData; + +public interface ImageDataService { + + public Boolean insert(String table, ImageData record); + +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/OperateTableService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/OperateTableService.java old mode 100644 new mode 100755 index 1a4d9ea..b18eea1 --- a/face-search-server/src/main/java/com/visual/face/search/server/service/api/OperateTableService.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/api/OperateTableService.java @@ -11,6 +11,8 @@ public interface OperateTableService { boolean dropTable(String table); + boolean createImageTable(String table); + boolean createSampleTable(String table, List columns); boolean createFaceTable(String table, List columns); diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/SampleDataService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/SampleDataService.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/api/StorageImageService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/api/StorageImageService.java new file mode 100755 index 0000000..ca17fec --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/api/StorageImageService.java @@ -0,0 +1,29 @@ +package com.visual.face.search.server.service.api; + +import com.visual.face.search.server.domain.storage.StorageDataInfo; +import com.visual.face.search.server.domain.storage.StorageEngine; +import com.visual.face.search.server.domain.storage.StorageImageInfo; +import com.visual.face.search.server.service.impl.StorageImageServiceDataBaseImpl; +import com.visual.face.search.server.utils.SpringUtils; + +public interface StorageImageService { + + public StorageDataInfo create(StorageImageInfo storageImageInfo); + + public static class Factory{ + + private static StorageImageService get(StorageEngine storageEngine){ + switch (storageEngine){ + case CURR_DB: + return SpringUtils.getBean(StorageImageServiceDataBaseImpl.class); + default: + return null; + } + } + + public static StorageDataInfo create(StorageImageInfo storageImageInfo){ + return get(storageImageInfo.getStorageEngine()).create(storageImageInfo); + } + + } +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/base/BaseService.java b/face-search-server/src/main/java/com/visual/face/search/server/service/base/BaseService.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/CollectServiceImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/CollectServiceImpl.java old mode 100644 new mode 100755 index 11425f4..45b4283 --- a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/CollectServiceImpl.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/CollectServiceImpl.java @@ -57,6 +57,7 @@ public class CollectServiceImpl extends BaseService implements CollectService { //表名称 String sampleTableName = StringUtils.join(prefixName, CHAR_UNDERLINE, "sample"); String faceTableName = StringUtils.join(prefixName, CHAR_UNDERLINE, "face"); + String imageTableName = StringUtils.join(prefixName, CHAR_UNDERLINE, "image"); String vectorTableName = StringUtils.join(prefixName, CHAR_UNDERLINE, "vector"); //判断表是否存在 if(operateTableService.exist(sampleTableName)){ @@ -65,6 +66,9 @@ public class CollectServiceImpl extends BaseService implements CollectService { if(operateTableService.exist(faceTableName)){ throw new RuntimeException("face table is exist"); } + if(operateTableService.exist(imageTableName)){ + throw new RuntimeException("image table is exist"); + } if(searchEngine.exist(vectorTableName)){ throw new RuntimeException("vector table is exist"); } @@ -80,6 +84,11 @@ public class CollectServiceImpl extends BaseService implements CollectService { if(!createFaceFlag){ throw new RuntimeException("create face table error"); } + //创建图像数据表 + boolean createImageFlag = operateTableService.createImageTable(imageTableName); + if(!createImageFlag){ + throw new RuntimeException("create image table error"); + } //创建人脸向量库 MapParam param = MapParam.build() .put(Constant.ParamKeyShardsNum, collect.getShardsNum()) @@ -92,6 +101,7 @@ public class CollectServiceImpl extends BaseService implements CollectService { //删除创建的表 operateTableService.dropTable(sampleTableName); operateTableService.dropTable(faceTableName); + operateTableService.dropTable(imageTableName); searchEngine.dropCollection(vectorTableName); throw new RuntimeException(e); } @@ -108,6 +118,7 @@ public class CollectServiceImpl extends BaseService implements CollectService { insertCollection.setStatue(CollectionStatue.NORMAL.getValue()); insertCollection.setSampleTable(sampleTableName); insertCollection.setFaceTable(faceTableName); + insertCollection.setImageTable(imageTableName); insertCollection.setVectorTable(vectorTableName); insertCollection.setSchemaInfo(JsonUtil.toSimpleString(collect)); int flag = collectMapper.insert(insertCollection); @@ -122,6 +133,7 @@ public class CollectServiceImpl extends BaseService implements CollectService { if(hasError){ operateTableService.dropTable(sampleTableName); operateTableService.dropTable(faceTableName); + operateTableService.dropTable(imageTableName); searchEngine.dropCollection(vectorTableName); } } @@ -141,6 +153,9 @@ public class CollectServiceImpl extends BaseService implements CollectService { ThreadUtil.run(() -> { operateTableService.dropTable(collection.getSampleTable()); operateTableService.dropTable(collection.getFaceTable()); + if(StringUtils.isNotEmpty(collection.getImageTable())){ + operateTableService.dropTable(collection.getImageTable()); + } searchEngine.dropCollection(collection.getVectorTable()); }); //返回 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceCompareServiceImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceCompareServiceImpl.java old mode 100644 new mode 100755 index 9f060da..cb3d0ca --- a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceCompareServiceImpl.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceCompareServiceImpl.java @@ -11,6 +11,7 @@ import com.visual.face.search.server.domain.extend.FaceLocation; import com.visual.face.search.server.domain.request.FaceCompareReqVo; import com.visual.face.search.server.domain.response.FaceCompareRepVo; import com.visual.face.search.server.service.api.FaceCompareService; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -20,6 +21,9 @@ import java.util.List; @Service("visualFaceCompareServiceImpl") public class FaceCompareServiceImpl implements FaceCompareService { + @Value("${visual.face-mask.face-compare:false}") + private boolean faceMask; + @Resource private FaceFeatureExtractor faceFeatureExtractor; @@ -35,7 +39,7 @@ public class FaceCompareServiceImpl implements FaceCompareService { throw new RuntimeException("Image B is not face"); } //计算余弦相似度 - float simVal = Similarity.cosineSimilarity(faceInfoA.embedding.embeds, faceInfoB.embedding.embeds); + float simVal = Similarity.cosineSimilarityNorm(faceInfoA.embedding.embeds, faceInfoB.embedding.embeds); float confidence = (float) Math.floor(simVal * 1000000)/10000; //欧式距离 float euclideanDistance = Similarity.euclideanDistance(faceInfoA.embedding.embeds, faceInfoB.embedding.embeds); @@ -70,7 +74,7 @@ public class FaceCompareServiceImpl implements FaceCompareService { faceScoreThreshold = faceScoreThreshold > 100 ? 100 : faceScoreThreshold; faceScoreThreshold = faceScoreThreshold > 1 ? faceScoreThreshold / 100 : faceScoreThreshold; - ExtParam extParam = ExtParam.build().setMask(true).setScoreTh(faceScoreThreshold).setIouTh(0).setTopK(1); + ExtParam extParam = ExtParam.build().setMask(faceMask).setScoreTh(faceScoreThreshold).setIouTh(0).setTopK(1); ImageMat imageMat = null; FaceImage faceImage = null; try { diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceDataServiceImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceDataServiceImpl.java old mode 100644 new mode 100755 index 7bb0a16..0fc53af --- a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceDataServiceImpl.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceDataServiceImpl.java @@ -7,6 +7,9 @@ import com.visual.face.search.core.domain.ImageMat; import com.visual.face.search.core.extract.FaceFeatureExtractor; import com.visual.face.search.core.utils.JsonUtil; import com.visual.face.search.core.utils.Similarity; +import com.visual.face.search.server.domain.storage.StorageDataInfo; +import com.visual.face.search.server.domain.storage.StorageImageInfo; +import com.visual.face.search.server.domain.storage.StorageInfo; import com.visual.face.search.server.domain.extend.FieldKeyValue; import com.visual.face.search.server.domain.extend.FieldKeyValues; import com.visual.face.search.server.domain.request.FaceDataReqVo; @@ -22,11 +25,17 @@ import com.visual.face.search.server.mapper.SampleDataMapper; import com.visual.face.search.server.model.Collection; import com.visual.face.search.server.model.ColumnValue; import com.visual.face.search.server.model.FaceData; +import com.visual.face.search.server.model.ImageData; import com.visual.face.search.server.service.api.FaceDataService; +import com.visual.face.search.server.service.api.ImageDataService; +import com.visual.face.search.server.service.api.StorageImageService; import com.visual.face.search.server.service.base.BaseService; +import com.visual.face.search.server.utils.CollectionUtil; import com.visual.face.search.server.utils.TableUtils; +import com.visual.face.search.server.utils.VTableCache; import com.visual.face.search.server.utils.ValueUtil; import org.apache.commons.collections4.MapUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; @@ -36,7 +45,8 @@ import java.util.*; @Service("visualFaceDataService") public class FaceDataServiceImpl extends BaseService implements FaceDataService { - + @Value("${visual.face-mask.face-search:false}") + private boolean faceMask; @Resource private SearchEngine searchEngine; @Resource @@ -46,6 +56,8 @@ public class FaceDataServiceImpl extends BaseService implements FaceDataService @Resource private SampleDataMapper sampleDataMapper; @Resource + private ImageDataService imageDataService; + @Resource private FaceFeatureExtractor faceFeatureExtractor; @Override @@ -67,7 +79,7 @@ public class FaceDataServiceImpl extends BaseService implements FaceDataService throw new RuntimeException("sample_id is not exist"); } //获取特征向量 - ExtParam extParam = ExtParam.build().setMask(true).setScoreTh(face.getFaceScoreThreshold() / 100).setIouTh(0); + ExtParam extParam = ExtParam.build().setMask(faceMask).setScoreTh(face.getFaceScoreThreshold() / 100).setIouTh(0); ImageMat imageMat = null; FaceImage faceImage = null; try { @@ -93,7 +105,7 @@ public class FaceDataServiceImpl extends BaseService implements FaceDataService for(Map item : faces){ String faceVectorStr = MapUtils.getString(item, Constant.ColumnNameFaceVector); float[] faceVector = ValueUtil.convertVector(faceVectorStr); - float simVal = Similarity.cosineSimilarity(embeds, faceVector); + float simVal = Similarity.cosineSimilarityNorm(embeds, faceVector); float confidence = (float) Math.floor(simVal * 10000)/100; if(confidence < face.getMinConfidenceThresholdWithThisSample()){ throw new RuntimeException("this face confidence is less than minConfidenceThresholdWithThisSample,confidence="+confidence+",threshold="+face.getMinConfidenceThresholdWithThisSample()); @@ -122,7 +134,7 @@ public class FaceDataServiceImpl extends BaseService implements FaceDataService for(Map item : faces){ String faceVectorStr = MapUtils.getString(item, Constant.ColumnNameFaceVector); float[] faceVector = ValueUtil.convertVector(faceVectorStr); - float simVal = Similarity.cosineSimilarity(embeds, faceVector); + float simVal = Similarity.cosineSimilarityNorm(embeds, faceVector); float confidence = (float) Math.floor(simVal * 10000)/100; if(confidence > face.getMaxConfidenceThresholdWithOtherSample()){ throw new RuntimeException("this face confidence is gather than maxConfidenceThresholdWithOtherSample,confidence="+confidence+",threshold="+face.getMaxConfidenceThresholdWithOtherSample()); @@ -130,6 +142,27 @@ public class FaceDataServiceImpl extends BaseService implements FaceDataService } } } + //保存图片信息并获取图片存储 + StorageInfo storageInfo = CollectionUtil.getStorageInfo(collection.getSchemaInfo()); + if(storageInfo.isStorageFaceInfo()){ + //将数据保存到指定的数据引擎中 + StorageImageInfo storageImageInfo = new StorageImageInfo(storageInfo.getStorageEngine(), face.getImageBase64(), faceInfo.embedding.image, JsonUtil.toString(faceInfo)); + StorageDataInfo storageDataInfo = StorageImageService.Factory.create(storageImageInfo); + //插入数据记录 + ImageData imageData = new ImageData(); + imageData.setSampleId(face.getSampleId()); + imageData.setFaceId(faceId); + imageData.setStorageType(storageInfo.getStorageEngine().name()); + imageData.setImageRawInfo(storageDataInfo.getImageRawInfo()); + imageData.setImageEbdInfo(storageDataInfo.getImageEbdInfo()); + imageData.setImageFaceInfo(storageDataInfo.getImageFaceInfo()); + imageData.setCreateTime(new Date()); + imageData.setModifyTime(new Date()); + boolean flag = imageDataService.insert(collection.getImageTable(), imageData); + if(!flag){ + throw new RuntimeException("save face image data error"); + } + } //获取数据类型 Map filedTypeMap = TableUtils.getFaceFiledTypeMap(collection.getSchemaInfo()); //插入数据 @@ -159,6 +192,8 @@ public class FaceDataServiceImpl extends BaseService implements FaceDataService if(!flag1){ throw new RuntimeException("create face vector error"); } + //将队列写入到队列中 + VTableCache.put(collection.getVectorTable()); //构造返回 FaceDataRepVo vo = FaceDataRepVo.build(face.getNamespace(), face.getCollectionName(), face.getSampleId(), faceId); vo.setFaceScore(faceInfo.score * 100); @@ -187,6 +222,8 @@ public class FaceDataServiceImpl extends BaseService implements FaceDataService if(!delete){ throw new RuntimeException("delete face vector error"); } + //将队列写入到队列中 + VTableCache.put(collection.getVectorTable()); //删除数据 int flag = faceDataMapper.deleteByFaceId(collection.getFaceTable(), sampleId, faceId); return flag > 0; diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceSearchServiceImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceSearchServiceImpl.java old mode 100644 new mode 100755 index 016d23b..aaca9d8 --- a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceSearchServiceImpl.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/FaceSearchServiceImpl.java @@ -26,13 +26,15 @@ import com.visual.face.search.server.service.api.FaceSearchService; import com.visual.face.search.server.service.base.BaseService; import com.visual.face.search.server.utils.ValueUtil; import org.apache.commons.collections4.MapUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; @Service("visualFaceSearchService") public class FaceSearchServiceImpl extends BaseService implements FaceSearchService { - + @Value("${visual.face-mask.face-search:false}") + private boolean faceMask; @Resource private SearchEngine searchEngine; @Resource @@ -56,7 +58,7 @@ public class FaceSearchServiceImpl extends BaseService implements FaceSearchServ } //获取特征向量 int maxFaceNum = (null == search.getMaxFaceNum() || search.getMaxFaceNum() <= 0) ? 5 : search.getMaxFaceNum(); - ExtParam extParam = ExtParam.build().setMask(true).setScoreTh(search.getFaceScoreThreshold() / 100).setIouTh(0).setTopK(maxFaceNum); + ExtParam extParam = ExtParam.build().setMask(faceMask).setScoreTh(search.getFaceScoreThreshold() / 100).setIouTh(0).setTopK(maxFaceNum); ImageMat imageMat = null; FaceImage faceImage = null; try { @@ -148,7 +150,7 @@ public class FaceSearchServiceImpl extends BaseService implements FaceSearchServ String sampleId = MapUtils.getString(face, Constant.ColumnNameSampleId); String faceVectorStr = MapUtils.getString(face, Constant.ColumnNameFaceVector); float[] faceVector = ValueUtil.convertVector(faceVectorStr); - float simVal = Similarity.cosineSimilarity(faceInfos.get(i).embedding.embeds, faceVector); + float simVal = Similarity.cosineSimilarityNorm(faceInfos.get(i).embedding.embeds, faceVector); float confidence = (float) Math.floor(simVal * 1000000)/10000; if(null != sampleId && sampleMapping.containsKey(sampleId) && confidence >= search.getConfidenceThreshold()){ Map sample = sampleMapping.get(sampleId); diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/ImageDataServiceImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/ImageDataServiceImpl.java new file mode 100755 index 0000000..588b0f7 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/ImageDataServiceImpl.java @@ -0,0 +1,20 @@ +package com.visual.face.search.server.service.impl; + +import com.visual.face.search.server.mapper.ImageDataMapper; +import com.visual.face.search.server.model.ImageData; +import com.visual.face.search.server.service.api.ImageDataService; +import javax.annotation.Resource; +import org.springframework.stereotype.Service; + + +@Service("visualImageDataService") +public class ImageDataServiceImpl implements ImageDataService { + + @Resource + private ImageDataMapper imageDataMapper; + + @Override + public Boolean insert(String table, ImageData record) { + return imageDataMapper.insert(table, record) > 0; + } +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/OperateTableServiceImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/OperateTableServiceImpl.java old mode 100644 new mode 100755 index a8395ca..1bf4a38 --- a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/OperateTableServiceImpl.java +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/OperateTableServiceImpl.java @@ -29,6 +29,11 @@ public class OperateTableServiceImpl implements OperateTableService { return operateTableMapper.dropTable(table) > 0; } + @Override + public boolean createImageTable(String table) { + return operateTableMapper.createImageTable(table) >= 0; + } + @Override @Transactional(propagation = Propagation.REQUIRED) public boolean createSampleTable(String table, List columns) { diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/SampleDataServiceImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/SampleDataServiceImpl.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/service/impl/StorageImageServiceDataBaseImpl.java b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/StorageImageServiceDataBaseImpl.java new file mode 100755 index 0000000..8e74ea8 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/service/impl/StorageImageServiceDataBaseImpl.java @@ -0,0 +1,21 @@ +package com.visual.face.search.server.service.impl; + +import com.visual.face.search.server.domain.storage.StorageDataInfo; +import com.visual.face.search.server.domain.storage.StorageImageInfo; +import com.visual.face.search.server.service.api.StorageImageService; +import org.springframework.stereotype.Service; + +@Service("visualStorageImageServiceDataBase") +public class StorageImageServiceDataBaseImpl implements StorageImageService { + + @Override + public StorageDataInfo create(StorageImageInfo storageImageInfo) { + return new StorageDataInfo( + storageImageInfo.getStorageEngine(), + storageImageInfo.getImageRawInfo(), + storageImageInfo.getImageEbdInfo(), + storageImageInfo.getImageFaceInfo() + ); + } + +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/CollectionUtil.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/CollectionUtil.java new file mode 100755 index 0000000..8eaf444 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/utils/CollectionUtil.java @@ -0,0 +1,27 @@ +package com.visual.face.search.server.utils; + +import com.alibaba.fastjson.JSONObject; +import com.visual.face.search.core.utils.JsonUtil; +import com.visual.face.search.server.domain.storage.StorageEngine; +import com.visual.face.search.server.domain.storage.StorageInfo; + +public class CollectionUtil { + + public static StorageInfo getStorageInfo(String schemaInfo){ + StorageInfo storageInfo = new StorageInfo(); + try { + JSONObject json = JsonUtil.toJsonObject(schemaInfo); + storageInfo.setStorageFaceInfo(json.getBooleanValue("storageFaceInfo")); + String storageEngineStr = json.getString("storageEngine"); + if(StringUtils.isNotEmpty(storageEngineStr)){ + storageInfo.setStorageEngine(StorageEngine.valueOf(storageEngineStr)); + } + }catch (Exception e){ + e.printStackTrace(); + } + if(storageInfo.isStorageFaceInfo() && null == storageInfo.getStorageEngine()){ + storageInfo.setStorageEngine(StorageEngine.CURR_DB); + } + return storageInfo; + } +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/ImageDataUtil.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/ImageDataUtil.java new file mode 100755 index 0000000..8ff6829 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/utils/ImageDataUtil.java @@ -0,0 +1,4 @@ +package com.visual.face.search.server.utils; + +public class ImageDataUtil { +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/ResponseBuilder.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/ResponseBuilder.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/SpringUtils.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/SpringUtils.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/StringUtils.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/StringUtils.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/TableUtils.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/TableUtils.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/VTableCache.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/VTableCache.java new file mode 100755 index 0000000..fb15886 --- /dev/null +++ b/face-search-server/src/main/java/com/visual/face/search/server/utils/VTableCache.java @@ -0,0 +1,35 @@ +package com.visual.face.search.server.utils; + +import java.util.List; +import java.util.ArrayList; +import java.util.concurrent.*; + +public class VTableCache { + + private static ConcurrentMap vectorTables = new ConcurrentHashMap<>(); + + //超过10分钟的就清除了 + static { + ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); + executor.scheduleAtFixedRate(() -> { + vectorTables.entrySet().removeIf(entry -> System.currentTimeMillis() - entry.getValue() > 10 * 60 * 1000); + }, 0, 60, TimeUnit.SECONDS); + } + + public static void put(String vectorTable){ + vectorTables.put(vectorTable, System.currentTimeMillis()); + } + + public static boolean remove(String vectorTable){ + if(vectorTables.containsKey(vectorTable)){ + return null != vectorTables.remove(vectorTable); + }else{ + return false; + } + } + + public static List getVectorTables(){ + return new ArrayList<>(vectorTables.keySet()); + } + +} diff --git a/face-search-server/src/main/java/com/visual/face/search/server/utils/ValueUtil.java b/face-search-server/src/main/java/com/visual/face/search/server/utils/ValueUtil.java old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/resources/application-dev.yml b/face-search-server/src/main/resources/application-dev.yml old mode 100644 new mode 100755 index e9760fe..c69bc55 --- a/face-search-server/src/main/resources/application-dev.yml +++ b/face-search-server/src/main/resources/application-dev.yml @@ -16,18 +16,18 @@ server: # 日志配置 logging: level: - com.visual.face.search: debug + com.visual.face.search: info org.springframework: warn # 模型配置 visual: model: faceDetection: - name: PcnNetworkFaceDetection + name: InsightScrfdFaceDetection modelPath: thread: 1 backup: - name: InsightScrfdFaceDetection + name: PcnNetworkFaceDetection modelPath: thread: 1 faceKeyPoint: @@ -35,7 +35,7 @@ visual: modelPath: thread: 1 faceAlignment: - name: Simple106pFaceAlignment + name: Simple005pFaceAlignment modelPath: thread: 1 faceRecognition: @@ -50,6 +50,13 @@ visual: milvus: host: visual-face-search-milvus port: 19530 + scheduler: + flush: + enable: true + interval: 60000 + face-mask: + face-search: false + face-compare: false swagger: enable: true diff --git a/face-search-server/src/main/resources/application-docker.yml b/face-search-server/src/main/resources/application-docker.yml old mode 100644 new mode 100755 index b3c184d..82b57c7 --- a/face-search-server/src/main/resources/application-docker.yml +++ b/face-search-server/src/main/resources/application-docker.yml @@ -23,11 +23,11 @@ logging: visual: model: faceDetection: - name: PcnNetworkFaceDetection + name: InsightScrfdFaceDetection modelPath: thread: 4 backup: - name: InsightScrfdFaceDetection + name: PcnNetworkFaceDetection modelPath: thread: 4 faceKeyPoint: @@ -35,7 +35,7 @@ visual: modelPath: thread: 4 faceAlignment: - name: Simple106pFaceAlignment + name: Simple005pFaceAlignment modelPath: thread: 4 faceRecognition: @@ -50,6 +50,13 @@ visual: milvus: host: port: 19530 + scheduler: + flush: + enable: true + interval: 60000 + face-mask: + face-search: false + face-compare: false swagger: enable: true diff --git a/face-search-server/src/main/resources/application.yml b/face-search-server/src/main/resources/application.yml old mode 100644 new mode 100755 diff --git a/face-search-server/src/main/resources/logback-spring.xml b/face-search-server/src/main/resources/logback-spring.xml old mode 100644 new mode 100755 index efc3c23..fc1e655 --- a/face-search-server/src/main/resources/logback-spring.xml +++ b/face-search-server/src/main/resources/logback-spring.xml @@ -10,7 +10,7 @@ - ./logs/mobile-face-info.log + ./logs/face-search-info.log %d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n @@ -19,7 +19,7 @@ - ./logs/mobile-face-info.%d{yyyy-MM-dd}.log + ./logs/face-search-info.%d{yyyy-MM-dd}.log 7 @@ -27,7 +27,7 @@ - ./logs/mobile-face-error.log + ./logs/face-search-error.log %d{yyyy-MM-dd HH:mm:ss} [%class:%line] - %m%n @@ -44,7 +44,7 @@ - ./logs/mobile-face-error.%d{yyyy-MM-dd}.log + ./logs/face-search-error.%d{yyyy-MM-dd}.log 7 diff --git a/face-search-server/src/main/resources/sqls/schema-init.sql b/face-search-server/src/main/resources/sqls/schema-init.sql old mode 100644 new mode 100755 index da2eb10..3062cb0 --- a/face-search-server/src/main/resources/sqls/schema-init.sql +++ b/face-search-server/src/main/resources/sqls/schema-init.sql @@ -9,6 +9,7 @@ CREATE TABLE IF NOT EXISTS `visual_collection` ( `statue` int DEFAULT NULL COMMENT '集合状态', `sample_table` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '样本数据表', `face_table` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '人脸数据表', + `image_table` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '图片数据信息', `vector_table` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '人脸向量库', `schema_info` longtext CHARACTER SET utf8 COLLATE utf8_general_ci COMMENT '集合元数据信息', `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', diff --git a/face-search-test/src/main/java/com/visual/face/search/valid/exps/FaceCompareExample.java b/face-search-test/src/main/java/com/visual/face/search/valid/exps/FaceCompareExample.java new file mode 100755 index 0000000..89b946a --- /dev/null +++ b/face-search-test/src/main/java/com/visual/face/search/valid/exps/FaceCompareExample.java @@ -0,0 +1,72 @@ +package com.visual.face.search.valid.exps; + +import com.visual.face.search.FaceCompare; +import com.visual.face.search.model.Compare; +import com.visual.face.search.model.CompareRep; +import com.visual.face.search.model.FaceLocation; +import com.visual.face.search.model.Response; +import com.visual.face.search.utils.Base64Util; +import com.visual.face.search.valid.utils.DrawImage; +import com.visual.face.search.valid.utils.MatUtil; +import org.opencv.core.Mat; +import org.opencv.highgui.HighGui; + +import java.awt.*; +import java.io.File; +import java.util.Objects; + +public class FaceCompareExample { + + static{ nu.pattern.OpenCV.loadShared(); } + //本地开发模式 + public static String serverHost = "http://127.0.0.1:8080"; + //docker部署模式 + //public static String serverHost = "http://127.0.0.1:56789"; + public static FaceCompare faceSearch = FaceCompare.build(serverHost); + + /**搜索*/ + public static void compare() { + String searchPath = "face-search-test/src/main/resources/image/compare"; + File [] files = Objects.requireNonNull(new File(searchPath).listFiles()); + for(int i=0; i< files.length-1; i++){ + for(int j=i+1; j< files.length; j++){ + File imageA = files[i]; + File imageB = files[j]; + String imageABase64 = Base64Util.encode(imageA.getAbsolutePath()); + String imageBBase64 = Base64Util.encode(imageB.getAbsolutePath()); + + Response compareRepResponse = faceSearch.compare().faceCompare(Compare.build() + .setImageBase64A(imageABase64) + .setImageBase64B(imageBBase64) + .setFaceScoreThreshold(0f) + .setNeedFaceInfo(true) + ); + + int distance = compareRepResponse.getData().getDistance().intValue(); + int confidence = compareRepResponse.getData().getConfidence().intValue(); + + FaceLocation locationA = compareRepResponse.getData().getFaceInfo().getLocationA(); + FaceLocation locationB = compareRepResponse.getData().getFaceInfo().getLocationB(); + Mat image1 = DrawImage.build(imageA.getAbsolutePath()).drawRect(new DrawImage.Rect(locationA.getX(), locationA.getY(), locationA.getW(), locationA.getH()), 2, Color.RED).toMat(); + Mat image2 = DrawImage.build(imageB.getAbsolutePath()).drawRect(new DrawImage.Rect(locationB.getX(), locationB.getY(), locationB.getW(), locationB.getH()), 2, Color.RED).toMat(); + DrawImage drawImage = DrawImage.build(MatUtil.matToBufferedImage(MatUtil.concat(image1, image2))); + + int cx = (locationA.getX() + locationB.getX() + image1.width()) / 2 ; + int cy = (locationA.getY() + locationB.getY()) / 2; + drawImage.drawText("人脸比对结果", new DrawImage.Point(cx+5, cy+25), 14, Color.RED); + drawImage.drawText("分数:" + confidence, new DrawImage.Point(cx+5, cy+50), 14, Color.RED); + drawImage.drawText("距离:" + distance, new DrawImage.Point(cx+5, cy+75), 14, Color.RED); + HighGui.imshow("image", drawImage.toMat()); + HighGui.waitKey(); + } + } + //退出程序 + System.exit(1); + } + + /**main**/ + public static void main(String[] args) { + compare(); + } + +} diff --git a/face-search-test/src/main/java/com/visual/face/search/valid/utils/MatUtil.java b/face-search-test/src/main/java/com/visual/face/search/valid/utils/MatUtil.java new file mode 100755 index 0000000..9448ed4 --- /dev/null +++ b/face-search-test/src/main/java/com/visual/face/search/valid/utils/MatUtil.java @@ -0,0 +1,107 @@ +package com.visual.face.search.valid.utils; + +import org.opencv.core.Mat; +import org.opencv.core.Range; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.util.Base64; +import java.util.Objects; + +public class MatUtil { + + /** + * 将Mat转换为BufferedImage + * @param mat + * @return BufferedImage + */ + public static BufferedImage matToBufferedImage(Mat mat) { + int dataSize = mat.cols() * mat.rows() * (int) mat.elemSize(); + byte[] data = new byte[dataSize]; + mat.get(0, 0, data); + int type = mat.channels() == 1 ? BufferedImage.TYPE_BYTE_GRAY : BufferedImage.TYPE_3BYTE_BGR; + if (type == BufferedImage.TYPE_3BYTE_BGR) { + for (int i = 0; i < dataSize; i += 3) { + byte blue = data[i + 0]; + data[i + 0] = data[i + 2]; + data[i + 2] = blue; + } + } + BufferedImage image = new BufferedImage(mat.cols(), mat.rows(), type); + image.getRaster().setDataElements(0, 0, mat.cols(), mat.rows(), data); + return image; + } + + /** + * 将Mat转换为 Base64 + * @param mat + * @return Base64 + */ + public static String matToBase64(Mat mat) { + ByteArrayOutputStream byteArrayOutputStream = null; + try { + byteArrayOutputStream = new ByteArrayOutputStream(); + ImageIO.write(matToBufferedImage(mat), "jpg", byteArrayOutputStream); + byte[] bytes = byteArrayOutputStream.toByteArray(); + Base64.Encoder encoder = Base64.getMimeEncoder(); + return encoder.encodeToString(Objects.requireNonNull(bytes)); + }catch (Exception e){ + throw new RuntimeException(e); + }finally { + if(null != byteArrayOutputStream){ + try { + byteArrayOutputStream.close(); + } catch (Exception e) {} + } + } + } + + public static Mat concat(Mat m1, Mat ...m2){ + Mat mat = m1; + if(null != m2){ + for(Mat m : m2){ + mat = concat(mat, m1); + } + } + return mat; + } + + /** + * 横向拼接两个图像的数据(Mat),该两个图像的类型必须是相同的类型,如:均为CvType.CV_8UC3类型 + * @author bailichun + * @since 2020.02.20 15:00 + * @param m1 要合并的图像1(左图) + * @param m2 要合并的图像2(右图) + * @return 拼接好的Mat图像数据集。其高度等于两个图像中高度较大者的高度;其宽度等于两个图像的宽度之和。类型与两个输入图像相同。 + * @throws Exception 当两个图像数据的类型不同时,抛出异常 + */ + public static Mat concat(Mat m1, Mat m2){ + if(m1.type() != m2.type()){ + throw new RuntimeException("concat:两个图像数据的类型不同!"); + } + long time = System.currentTimeMillis(); + //宽度为两图的宽度之和 + double w = m1.size().width + m2.size().width; + //高度取两个矩阵中的较大者的高度 + double h = m1.size().height > m2.size().height ? m1.size().height : m2.size().height; + //创建一个大矩阵对象 + Mat des = Mat.zeros((int)h, (int)w, m1.type()); + //在最终的大图上标记一块区域,用于存放复制图1(左图)的数据,大小为从第0列到m1.cols()列 + Mat rectForM1 = des.colRange(new Range(0, m1.cols())); + //标记出位于rectForM1的垂直方向上中间位置的区域,高度为图1的高度,此时该区域的大小已经和图1的大小相同。(用于存放复制图1(左图)的数据) + int rowOffset1 = (int)(rectForM1.size().height-m1.rows())/2; + rectForM1 = rectForM1.rowRange(rowOffset1, rowOffset1 + m1.rows()); + //在最终的大图上标记一块区域,用于存放复制图2(右图)的数据 + Mat rectForM2 = des.colRange(new Range(m1.cols(), des.cols())); + //标记出位于rectForM2的垂直方向上中间位置的区域,高度为图2的高度,此时该区域的大小已经和图2的大小相同。(用于存放复制图2(右图)的数据) + int rowOffset2 = (int)(rectForM2.size().height-m2.rows())/2; + rectForM2 = rectForM2.rowRange(rowOffset2, rowOffset2 + m2.rows()); + //将图1拷贝到des的指定区域 rectForM1 + m1.copyTo(rectForM1); + //将图2拷贝到des的指定区域 rectForM2 + m2.copyTo(rectForM2); + return des; + } + +} diff --git a/face-search-test/src/main/resources/image/compare/1c7abcaf2dabdd2bc08e90c224d4c381.jpeg b/face-search-test/src/main/resources/image/compare/1c7abcaf2dabdd2bc08e90c224d4c381.jpeg new file mode 100755 index 0000000..1778e89 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/1c7abcaf2dabdd2bc08e90c224d4c381.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/26f8c755ff0a33363b9f716e4e465831.jpeg b/face-search-test/src/main/resources/image/compare/26f8c755ff0a33363b9f716e4e465831.jpeg new file mode 100755 index 0000000..a59dde4 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/26f8c755ff0a33363b9f716e4e465831.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/2a453f25ef95ec02e4ea8c21bdd2b237.jpeg b/face-search-test/src/main/resources/image/compare/2a453f25ef95ec02e4ea8c21bdd2b237.jpeg new file mode 100755 index 0000000..d0d2a1c Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/2a453f25ef95ec02e4ea8c21bdd2b237.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/38740eb40766f8af7d69d3d755830aaf.jpeg b/face-search-test/src/main/resources/image/compare/38740eb40766f8af7d69d3d755830aaf.jpeg new file mode 100755 index 0000000..b1f0a35 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/38740eb40766f8af7d69d3d755830aaf.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/63193f35936cfb5897eb8d24ea100433.jpeg b/face-search-test/src/main/resources/image/compare/63193f35936cfb5897eb8d24ea100433.jpeg new file mode 100755 index 0000000..febd767 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/63193f35936cfb5897eb8d24ea100433.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/6dd18d254f3fb69766d57eed4175fb89.jpeg b/face-search-test/src/main/resources/image/compare/6dd18d254f3fb69766d57eed4175fb89.jpeg new file mode 100755 index 0000000..d1a1244 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/6dd18d254f3fb69766d57eed4175fb89.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/71a9ce7b2babbaf50a15e3e1ef92a753.jpeg b/face-search-test/src/main/resources/image/compare/71a9ce7b2babbaf50a15e3e1ef92a753.jpeg new file mode 100755 index 0000000..afb6185 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/71a9ce7b2babbaf50a15e3e1ef92a753.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/8b2b1ebeb551e0b97327eee86f3c8b9a.jpeg b/face-search-test/src/main/resources/image/compare/8b2b1ebeb551e0b97327eee86f3c8b9a.jpeg new file mode 100755 index 0000000..e898888 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/8b2b1ebeb551e0b97327eee86f3c8b9a.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/9e70f673fd134984be876988c9acf93e.jpeg b/face-search-test/src/main/resources/image/compare/9e70f673fd134984be876988c9acf93e.jpeg new file mode 100755 index 0000000..62e2c50 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/9e70f673fd134984be876988c9acf93e.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/a33d2de4e385ad3ce0f9f437a3e400ae.jpeg b/face-search-test/src/main/resources/image/compare/a33d2de4e385ad3ce0f9f437a3e400ae.jpeg new file mode 100755 index 0000000..c92f6cc Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/a33d2de4e385ad3ce0f9f437a3e400ae.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/ab60fdbd981c5be17335608a008c9752.jpeg b/face-search-test/src/main/resources/image/compare/ab60fdbd981c5be17335608a008c9752.jpeg new file mode 100755 index 0000000..a29b6ad Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/ab60fdbd981c5be17335608a008c9752.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/c36b119d2a1e55b600ed639cc8989a96.jpeg b/face-search-test/src/main/resources/image/compare/c36b119d2a1e55b600ed639cc8989a96.jpeg new file mode 100755 index 0000000..3fd9943 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/c36b119d2a1e55b600ed639cc8989a96.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/e1902a6cc5cec36abf0832b58a672738.jpeg b/face-search-test/src/main/resources/image/compare/e1902a6cc5cec36abf0832b58a672738.jpeg new file mode 100755 index 0000000..b6e723d Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/e1902a6cc5cec36abf0832b58a672738.jpeg differ diff --git a/face-search-test/src/main/resources/image/compare/e70a3f27540457ebcc7aa42a0c4e109f.jpeg b/face-search-test/src/main/resources/image/compare/e70a3f27540457ebcc7aa42a0c4e109f.jpeg new file mode 100755 index 0000000..e75a747 Binary files /dev/null and b/face-search-test/src/main/resources/image/compare/e70a3f27540457ebcc7aa42a0c4e109f.jpeg differ