同步操作将从 cnsugar/Seetaface6JNI 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
交流QQ群:891670629(已满)、694350800
注意:jdk版本要1.8.0_261以上
基于中科院seetaface6进行封装的JAVA人脸识别算法库,支持人脸检测、人脸提取、1:1比对、1:N比对、静默图片活体检测。 seetaface6:https://github.com/seetafaceengine/SeetaFace6
1、下载model( 链接:https://pan.baidu.com/s/1FYz4muY3X4tOKIKhb5kBVA , 提取码:b6o4 ) 文件到本地,并解压出来;
2、下载build/lib目录中对应的库文件到本地:Windows(64位)环境下载win-x64;
3、将build中的faces-data.db下载到本地;(PS:如果不需要使用1:N人脸搜索,不需要此文件,需要将seetafce.properties中的sqlite.db.file配置注释掉);
4、将src/main/resources/中的seetaface.properties文件放到项目的resources根目录中;
#依赖的lib名称,注意依赖关系顺序,用逗号隔开
#windows os
libs=tennis,tennis_haswell,tennis_pentium,tennis_sandy_bridge,SeetaAuthorize,SeetaFaceAntiSpoofingX600,\
SeetaFaceDetector600,SeetaFaceLandmarker600,SeetaFaceRecognizer610,SeetaFace6JNI
#依赖的lib存放目录, 等同于-Djava.library.path=
#windows os
libs.path=E:\\Projects\\java\\cnsugar\\seetaface6JNI-sample\\lib\\win-x64
#seetaface6 model目录
bindata.dir=E:/ai-face/SeetaFace6JNI/models/sf3.0_models
#sqlite config
sqlite.db.file=./faces-data.db
sqlite.conn.maxTotal=50
sqlite.conn.maxIdle=5
sqlite.conn.minIdle=0
sqlite.conn.maxWaitMillis=60000
5、将build目录下的seetaface6JNI-1.0.0.jar和依赖包导入到项目中,pom如下:
<properties>
<spring.version>4.2.8.RELEASE</spring.version>
<log4j.version>2.8.2</log4j.version>
<slf4j.version>1.7.25</slf4j.version>
</properties>
<dependencies>
<dependency>
<groupId>com.cnsugar.ai</groupId>
<artifactId>seetaface6JNI</artifactId>
<version>1.0.0</version>
<scope>system</scope>
<systemPath>${project.basedir}/lib/seetaface6JNI-1.0.0.jar</systemPath>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.version}</version>
</dependency>
<!-- log4j2 -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- log4j to slf4j bridge -->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-slf4j-impl</artifactId>
<version>${log4j.version}</version>
</dependency>
<!-- sqlite -->
<dependency>
<groupId>org.xerial</groupId>
<artifactId>sqlite-jdbc</artifactId>
<version>3.25.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
6、调用FaceHelper中的方法。
所有方法都封装到了FaceHelper工具类中
/**
* 人脸比对
*
* @param img1
* @param img2
* @return 相似度 (-1:第一张图无人脸; -2:第二张图无人脸)
*/
float compare(File img1, File img2);
float compare(byte[] img1, byte[] img2);
float compare(BufferedImage image1, BufferedImage image2);
/**
* 注册人脸(会对人脸进行裁剪)
*
* @param key 人脸照片唯一标识
* @param image 人脸照片
* @return
*/
boolean register(String key, BufferedImage image);
boolean register(String key, byte[] img);
/**
* 注册人脸
*
* @param image 人脸照片
* @return
*/
long register(BufferedImage image);
long registerCroppedFace(byte[] croppedFace);
/**
* 搜索人脸
*
* @param img 人脸照片
* @return
*/
Result search(byte[] img);
Result search(BufferedImage image);
/**
* 用裁剪后的人脸搜索
* @param croppedFace
* @return
*/
Result searchByCroppedFace(byte[] croppedFace);
/**
* 人脸提取(裁剪)
*
* @param image
* @return return cropped face
*/
byte[][] cropFace(BufferedImage image);
byte[][] cropFace(byte[] img);
/**
* 人脸提取(裁剪)
*
* @param image
* @return return cropped face
*/
BufferedImage[] crop(BufferedImage image);\
BufferedImage[] crop(byte[] img);
/**
* 人脸识别
*
* @param img
* @return
*/
SeetaRect[] detect(byte[] img);
SeetaRect[] detect(BufferedImage image);
/**
* 人脸特征识别
*
* @param image
* @return
*/
FaceLandmark[] detectLandmark(BufferedImage image);
/**
* 提取人脸区域特性
*
* @param face
* @return
*/
float[] extractCroppedFace(byte[] face);
/**
* 提取一个图像中最大人脸的特征
*
* @param image
* @return
*/
float[] extractMaxFace(BufferedImage image);
/**
* 计算两个特性的相似度
*
* @param features1
* @param features2
* @return
*/
float calculateSimilarity(float[] features1, float[] features2);
/**
* 静默图片活体检测
* REAL = 0, ///< 真实人脸
* SPOOF = 1, ///< 攻击人脸(假人脸)
* FUZZY = 2, ///< 无法判断(人脸成像质量不好)
* DETECTING = 3, ///< 正在检测
* @param img
* @return
*/
FaceAntiSpoofingStatus predictImage(byte[] img);
FaceAntiSpoofingStatus predictImage(BufferedImage image);
/**
* 删除已注册的人脸
*
* @param keys
*/
long removeRegister(String... keys);
/**
* 清除人脸库数据
*/
void clear();
@org.junit.Test
public void testCompare() throws Exception {
String img1 = "F:\\ai\\demo-pic39.jpg";
String img2 = "F:\\ai\\left_pic_one.jpg";
System.out.println("result:"+FaceHelper.compare(new File(img1), new File(img2)));
}
@org.junit.Test
public void testRegister() throws IOException {
//将F:\ai\star目录下的jpg、png图片都注册到人脸库中,以文件名为key
Collection<File> files = FileUtils.listFiles(new File("F:\\ai\\star"), new String[]{"jpg", "png"}, false);
for (File file : files) {
String key = file.getName();
try {
FaceHelper.register(key, FileUtils.readFileToByteArray(file));
} catch (Exception e) {
e.printStackTrace();
}
}
}
@org.junit.Test
public void testSearch() throws IOException {
SeetafaceBuilder.build();//系统启动时先调用初始化方法
//等待初始化完成
while (SeetafaceBuilder.getFaceDbStatus() == SeetafaceBuilder.FacedbStatus.LOADING || SeetafaceBuilder.getFaceDbStatus() == SeetafaceBuilder.FacedbStatus.READY) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
long l = System.currentTimeMillis();
Result result = FaceHelper.search(FileUtils.readFileToByteArray(new File("F:\\ai\\gtl.jpg")));
System.out.println("搜索结果:" + result + ", 耗时:" + (System.currentTimeMillis() - l));
}
@org.junit.Test
public void testPredictImage() throws IOException {
FaceAntiSpoofingStatus status = FaceHelper.predictImage(FileUtils.readFileToByteArray(new File("D:\\face\\gtl.png")));
System.out.println(status);
}
如果对您有帮助,欢迎点Star或捐赠
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。