人脸识别
人脸识别技术采用虹软开放平台实现(免费使用)。官网:https://www.arcsoft.com.cn/ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
1.2.1、使用说明
使用虹软平台需要先注册开发者账号:https://ai.arcsoft.com.cn/ucenter/user/userlogin
注册完成后进行登录,然后进行创建应用:
创建完成后,需要进行实名认证,否则相关的SDK是不能使用的。
实名认证后即可下载对应平台的SDk,我们需要下载windows以及linux平台。
打开解压包,可以看到有提供相应的jar包以及示例代码:
1.2.2、安装jar到本地仓库
进入到libs目录,需要将arcsoft-sdk-face-2.2.0.1.jar安装到本地仓库:
mvn install:install-file -DgroupId=com.arcsoft.face -DartifactId=arcsoft-sdk-face -Dversion=2.2.0.1 -Dpackaging=jar -Dfile=arcsoft-sdk-face-2.2.0.1.jar mvn install:install-file -DgroupId=com.arcsoft.face -DartifactId=arcsoft-sdk-face -Dversion=3.0.0.0 -Dpackaging=jar -Dfile=arcsoft-sdk-face-3.0.0.0.jar
安装成功后,即可通过maven坐标引用了:
<!--2.0已经废弃--> <dependency> <groupId>com.arcsoft.face</groupId> <artifactId>arcsoft-sdk-face</artifactId> <version>2.2.0.1</version> </dependency> <!--建议使用3.0版本--> <dependency> <groupId>com.arcsoft.face</groupId> <artifactId>arcsoft-sdk-face</artifactId> <version>3.0.0.0</version> <scope>system</scope> <!--如果没有安装到本地仓库,可以将jar包拷贝到工程的lib下面下,直接引用--> <systemPath>${project.basedir}/lib/arcsoft-sdk-face-3.0.0.0.jar</systemPath> </dependency>
1.2.3、开始使用
说明:虹软的SDK是免费使用的,但是首次使用时需要联网激活,激活后可离线使用。使用周期为1年,1年后需要联网再次激活。
配置:application.properties
#虹软相关配置(在虹软应用中找到对应的参数) arcsoft.appid=****************** arcsoft.sdkKey=***************** arcsoft.libPath=F:\\code\\WIN64
FaceEngineService:
package com.tanhua.sso.service; import com.arcsoft.face.EngineConfiguration; import com.arcsoft.face.FaceEngine; import com.arcsoft.face.FaceInfo; import com.arcsoft.face.FunctionConfiguration; import com.arcsoft.face.enums.DetectMode; import com.arcsoft.face.enums.DetectOrient; import com.arcsoft.face.enums.ErrorInfo; import com.arcsoft.face.enums.ImageFormat; import com.arcsoft.face.toolkit.ImageFactory; import com.arcsoft.face.toolkit.ImageInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.PostConstruct; import java.io.File; import java.util.ArrayList; import java.util.List; @Service public class FaceEngineService { private static final Logger LOGGER = LoggerFactory.getLogger(FaceEngineService.class); @Value("${arcsoft.appid}") private String appid; @Value("${arcsoft.sdkKey}") private String sdkKey; @Value("${arcsoft.libPath}") private String libPath; private FaceEngine faceEngine; @PostConstruct public void init() { // 激活并且初始化引擎 FaceEngine faceEngine = new FaceEngine(libPath); int activeCode = faceEngine.activeOnline(appid, sdkKey); if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) { LOGGER.error("引擎激活失败"); throw new RuntimeException("引擎激活失败"); } //引擎配置 EngineConfiguration engineConfiguration = new EngineConfiguration(); //IMAGE检测模式,用于处理单张的图像数据 engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE); //人脸检测角度,逆时针0度 engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY); //功能配置 FunctionConfiguration functionConfiguration = new FunctionConfiguration(); functionConfiguration.setSupportAge(true); functionConfiguration.setSupportFace3dAngle(true); functionConfiguration.setSupportFaceDetect(true); functionConfiguration.setSupportFaceRecognition(true); functionConfiguration.setSupportGender(true); functionConfiguration.setSupportLiveness(true); functionConfiguration.setSupportIRLiveness(true); engineConfiguration.setFunctionConfiguration(functionConfiguration); //初始化引擎 int initCode = faceEngine.init(engineConfiguration); if (initCode != ErrorInfo.MOK.getValue()) { LOGGER.error("初始化引擎出错!"); throw new RuntimeException("初始化引擎出错!"); } this.faceEngine = faceEngine; } /** * 检测图片是否为人像 * * @param imageInfo 图像对象 * @return true:人像,false:非人像 */ public boolean checkIsPortrait(ImageInfo imageInfo) { // 定义人脸列表 List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>(); faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), ImageFormat.CP_PAF_BGR24, faceInfoList); return !faceInfoList.isEmpty(); } public boolean checkIsPortrait(byte[] imageData) { return this.checkIsPortrait(ImageFactory.getRGBData(imageData)); } public boolean checkIsPortrait(File file) { return this.checkIsPortrait(ImageFactory.getRGBData(file)); } }
1.2.4、测试
package com.tanhua.sso.service; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.io.File; @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class TestFaceEngineService { @Autowired private FaceEngineService faceEngineService; @Test public void testCheckIsPortrait(){ File file = new File("F:\\1.jpg"); boolean checkIsPortrait = this.faceEngineService.checkIsPortrait(file); System.out.println(checkIsPortrait); // true|false } }