1、人脸模块:人脸查询支持 向量数据库Milvus 和 SQLite

2、人脸模块:FaceNet人脸模型也支持人脸注册,查询等功能
3、人脸模块:Seetaface6 自动下载人脸库
4、人脸模块:Seetaface6解决依赖库重复下载问题
5、人脸模块:支持手动加载人脸库
6、人脸模块:人脸识别相关功能支持更多参数
This commit is contained in:
dengwenjie
2025-06-09 12:12:10 +08:00
parent ad6706f559
commit bca9462331
67 changed files with 4170 additions and 1438 deletions

View File

@@ -6,9 +6,10 @@
<parent>
<groupId>cn.smartjavaai</groupId>
<artifactId>smartjavaai-parent</artifactId>
<version>1.0.15</version>
<version>1.0.16</version>
</parent>
<name>smartjavaai-common</name>
<artifactId>smartjavaai-common</artifactId>
<description>SmartJavaAI</description>
<url>https://github.com/geekwenjie/SmartJavaAI</url>

View File

@@ -14,6 +14,7 @@ public class DetectionResponse {
private List<DetectionInfo> detectionInfoList;
public DetectionResponse() {
}

View File

@@ -28,6 +28,16 @@ public class FaceInfo {
*/
private LivenessStatus livenessStatus;
/**
* 人脸查询结果
*/
private List<FaceSearchResult> faceSearchResults;
/**
* 人脸特征
*/
private float[] feature;
public FaceInfo() {
}

View File

@@ -0,0 +1,37 @@
package cn.smartjavaai.common.entity;
import lombok.Data;
/**
* 人脸向量搜索结果
* @author dwj
*/
@Data
public class FaceSearchResult {
/**
* 向量ID
*/
private String id;
/**
* 相似度分数
*/
private float similarity;
/**
* 元数据
*/
private String metadata;
/**
* 构造函数
* @param id 向量ID
* @param similarity 相似度分数
* @param metadata 元数据
*/
public FaceSearchResult(String id, float similarity, String metadata) {
this.id = id;
this.similarity = similarity;
this.metadata = metadata;
}
}

View File

@@ -0,0 +1,84 @@
package cn.smartjavaai.common.entity;
import lombok.Data;
import java.util.Arrays;
import java.util.Optional;
/**
* 通用响应封装类,用于统一接口返回结构
* @author dwj
* @date 2025/6/4
*/
@Data
public class R<T> {
private Integer code;
private String message;
private T data;
public static <T> R<T> ok(T data) {
R<T> r = new R<>();
r.code = 0;
r.message = "成功";
r.data = data;
return r;
}
public static <T> R<T> fail(Integer code, String message) {
R<T> r = new R<>();
r.code = code;
r.message = message;
r.data = null;
return r;
}
public static <T> R<T> fail(Status status) {
R<T> r = new R<>();
r.code = status.code;
r.message = status.message;
r.data = null;
return r;
}
public enum Status {
SUCCESS(0, "成功"),
INVALID_IMAGE(1, "图像无效"),
FILE_NOT_FOUND(2, "图像文件不存在"),
NO_FACE_DETECTED(3, "未检测到人脸"),
Unknown(-1, "未知错误");
private final int code;
private final String message;
Status(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
public static Status valueOf(int val) {
Optional<Status> search = Arrays.stream(values()).filter((status) -> {
return status.code == val;
}).findFirst();
return (Status)search.orElse(Unknown);
}
}
public boolean isSuccess() {
return code != null && code.equals(Status.SUCCESS.code);
}
}