虹软人脸识别

简介

最近公司项目新需求需要做视频监控+陌生人告警,产品经理和项目经理商量了一周,敲定试用海康威视摄像头+虹软人脸识别进行开发。

刚刚接手需求的时候,都不知道这两个大神是啥东西,百度了一上午,了解了一下两家公司和自己需要的一些技术文档。

首先,这篇文章我们先讲讲虹软人脸识别吧。

虹软科技股份有限公司提供计算机视觉行业算法服务及解决方案,致力于视觉技术的研发和应用,坚持以原创技术为核心驱动力,在全球范围内为智能手机、智能汽车、物联网等智能设备提供一站式视觉解决方案。

准备工作

注册用户

首先,我们要注册一个虹软的账号,申请一个应用。

创建应用

创建应用成功之后,我们需要添加SDK,这里我们已免费版的为例,后续介绍付费版

添加SDK

因为我们的开发环境是windows,服务器环境也是windows,所以这里我选择的是windows平台,这里可以自行进行选择,应该只是库文件的不同。

到这里,我们就能看到 APP_IDSDK_KEY 两个值,后续需要这两个值进行虹软激活

SDK文档

SDK文档:https://ai.arcsoft.com.cn/product/arcface.html

我们下载SDK文档和Java案例之后能看到如下文件

libs目录文件:

  • doc目录里面存放着虹软sdk的接口文档,我们在调用SDK时方便查阅
  • libs目录存放了SDK jar包还有依赖的必要库文件
  • samplecode目录存放了简单的示例代码

添加库文件

对windows操作系统熟悉的朋友,就知道其他程序依赖第三方库文件,需要配置到系统环境变量中。

在Path变量中添加库文件的路径即可

到这里,我们前期工作就差不多完成了

开发环境搭建

引入SDK

首先我们要引入虹软的jar包,因为他是第三方的jar包,没有存放到共有的Maven库中,我们需要手动导入到项目中去。

在Maven中引用

        <!--虹软人脸识别sdk--><dependency><groupId>com.arcsoft.face</groupId><artifactId>arcsoft-sdk-face</artifactId><version>3.0.0.0</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/arcsoft-sdk-face-3.0.0.0.jar</systemPath></dependency>

虹软配置类

@Configuration
public class FaceEngineConfig {@Value("${config.freesdk.app-id}")private String appId;@Value("${config.freesdk.sdk-key}")private String sdkKey;@Beanpublic FaceEngine getFaceEngineInstance() {FaceEngine mFaceEngine = new FaceEngine();// 激活引擎//在线激活int activeCode = mFaceEngine.activeOnline(appId, sdkKey);System.out.println("code======>" + activeCode);if (activeCode != ErrorInfo.MOK.getValue() && activeCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("引擎激活失败");} else {System.out.println("引擎激活成功");}// 引擎配置EngineConfiguration engineConfiguration = new EngineConfiguration();engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_0_ONLY);// 功能配置,这些配置可以查阅SDK文档,根据自己的需要进行修改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 = mFaceEngine.init(engineConfiguration);if (initCode != ErrorInfo.MOK.getValue()) {System.out.println("000000=-----初始化引擎失败");}return mFaceEngine;}}

这里我们使用的是在线激活人脸引擎的方式,这里需要我们把刚刚申请到的appId和sdkKey输入进去

int activeCode = mFaceEngine.activeOnline(appId, sdkKey)

我们也可以查阅SDK文档,这里我们就已激活SDK为例。

到这里,我们就已经把虹软SDK 的bean导入进行了,方便我们后续的操作。

简单使用接口->单个人脸信息

我的需求是拿到海康威视的视频流然后逐帧拿到图片,获取到图片中人脸的信息,这里我们就以获取单个人脸特征信息为例

 /*** 抽取单个人脸特征** @param f         人脸信息* @param imageInfo 人脸图片信息* @return 人脸特征*/public byte[] extractFaceFeatureList(FaceInfo f, ImageInfo imageInfo) {FaceEngine faceEngine = null;try {// 获取引擎对象faceEngine = imgFaceObjectPool.borrowObject();FaceFeature faceFeature = new FaceFeature();// 提取人脸特征int code = faceEngine.extractFaceFeature(imageInfo.getRgbData(), imageInfo.getWidth(), imageInfo.getHeight(),ImageFormat.CP_PAF_BGR24, f, faceFeature);if (code != 0) {logger.error("FACE:" + f.getFaceId() + "人脸特征抽取结果不可信" + code);//return null;}return faceFeature.getFeatureData();} catch (Exception e) {logger.error("人脸特征抽取异常", e);} finally {if (faceEngine != null) {// 释放引擎对象imgFaceObjectPool.returnObject(faceEngine);}}return null;}

此接口获取到的人脸信息是一个二进制流的形式,我后续是把他存到数据库,项目启动的时候读到缓存中,方便进行人脸比对

faceFeature.getFeatureData()

int code = faceEngine.extractFaceFeature(imageInfo.getRgbData(), imageInfo.getWidth(), imageInfo.getHeight(),ImageFormat.CP_PAF_BGR24, f, faceFeature);

示例代码

在正式开发前也可以用示例代码进行一些简单的测试,看看满不满足你的需求

import com.arcsoft.face.*;
import com.arcsoft.face.enums.*;
import com.arcsoft.face.toolkit.ImageInfo;import java.io.File;
import java.util.ArrayList;
import java.util.List;import com.arcsoft.face.toolkit.ImageInfoEx;import static com.arcsoft.face.toolkit.ImageFactory.getGrayData;
import static com.arcsoft.face.toolkit.ImageFactory.getRGBData;public class FaceEngineTest {public static void main(String[] args) {//从官网获取String appId = "";String sdkKey = "";FaceEngine faceEngine = new FaceEngine("D:\\arcsoft_lib");//激活引擎int errorCode = faceEngine.activeOnline(appId, sdkKey);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("引擎激活失败");}ActiveFileInfo activeFileInfo=new ActiveFileInfo();errorCode = faceEngine.getActiveFileInfo(activeFileInfo);if (errorCode != ErrorInfo.MOK.getValue() && errorCode != ErrorInfo.MERR_ASF_ALREADY_ACTIVATED.getValue()) {System.out.println("获取激活文件信息失败");}//引擎配置EngineConfiguration engineConfiguration = new EngineConfiguration();engineConfiguration.setDetectMode(DetectMode.ASF_DETECT_MODE_IMAGE);engineConfiguration.setDetectFaceOrientPriority(DetectOrient.ASF_OP_ALL_OUT);engineConfiguration.setDetectFaceMaxNum(10);engineConfiguration.setDetectFaceScaleVal(16);//功能配置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);//初始化引擎errorCode = faceEngine.init(engineConfiguration);if (errorCode != ErrorInfo.MOK.getValue()) {System.out.println("初始化引擎失败");}//人脸检测ImageInfo imageInfo = getRGBData(new File("d:\\aaa.jpg"));List<FaceInfo> faceInfoList = new ArrayList<FaceInfo>();errorCode = faceEngine.detectFaces(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList);System.out.println(faceInfoList);//特征提取FaceFeature faceFeature = new FaceFeature();errorCode = faceEngine.extractFaceFeature(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList.get(0), faceFeature);System.out.println("特征值大小:" + faceFeature.getFeatureData().length);//人脸检测2ImageInfo imageInfo2 = getRGBData(new File("d:\\ccc.jpg"));List<FaceInfo> faceInfoList2 = new ArrayList<FaceInfo>();errorCode = faceEngine.detectFaces(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(),imageInfo.getImageFormat(), faceInfoList2);System.out.println(faceInfoList);//特征提取2FaceFeature faceFeature2 = new FaceFeature();errorCode = faceEngine.extractFaceFeature(imageInfo2.getImageData(), imageInfo2.getWidth(), imageInfo2.getHeight(), imageInfo.getImageFormat(), faceInfoList2.get(0), faceFeature2);System.out.println("特征值大小:" + faceFeature.getFeatureData().length);//特征比对FaceFeature targetFaceFeature = new FaceFeature();targetFaceFeature.setFeatureData(faceFeature.getFeatureData());FaceFeature sourceFaceFeature = new FaceFeature();sourceFaceFeature.setFeatureData(faceFeature2.getFeatureData());FaceSimilar faceSimilar = new FaceSimilar();errorCode = faceEngine.compareFaceFeature(targetFaceFeature, sourceFaceFeature, faceSimilar);System.out.println("相似度:" + faceSimilar.getScore());//设置活体测试errorCode = faceEngine.setLivenessParam(0.5f, 0.7f);//人脸属性检测FunctionConfiguration configuration = new FunctionConfiguration();configuration.setSupportAge(true);configuration.setSupportFace3dAngle(true);configuration.setSupportGender(true);configuration.setSupportLiveness(true);errorCode = faceEngine.process(imageInfo.getImageData(), imageInfo.getWidth(), imageInfo.getHeight(), imageInfo.getImageFormat(), faceInfoList, configuration);//性别检测List<GenderInfo> genderInfoList = new ArrayList<GenderInfo>();errorCode = faceEngine.getGender(genderInfoList);System.out.println("性别:" + genderInfoList.get(0).getGender());//年龄检测List<AgeInfo> ageInfoList = new ArrayList<AgeInfo>();errorCode = faceEngine.getAge(ageInfoList);System.out.println("年龄:" + ageInfoList.get(0).getAge());//3D信息检测List<Face3DAngle> face3DAngleList = new ArrayList<Face3DAngle>();errorCode = faceEngine.getFace3DAngle(face3DAngleList);System.out.println("3D角度:" + face3DAngleList.get(0).getPitch() + "," + face3DAngleList.get(0).getRoll() + "," + face3DAngleList.get(0).getYaw());//活体检测List<LivenessInfo> livenessInfoList = new ArrayList<LivenessInfo>();errorCode = faceEngine.getLiveness(livenessInfoList);System.out.println("活体:" + livenessInfoList.get(0).getLiveness());//IR属性处理ImageInfo imageInfoGray = getGrayData(new File("d:\\IR_480p.jpg"));List<FaceInfo> faceInfoListGray = new ArrayList<FaceInfo>();errorCode = faceEngine.detectFaces(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray);FunctionConfiguration configuration2 = new FunctionConfiguration();configuration2.setSupportIRLiveness(true);errorCode = faceEngine.processIr(imageInfoGray.getImageData(), imageInfoGray.getWidth(), imageInfoGray.getHeight(), imageInfoGray.getImageFormat(), faceInfoListGray, configuration2);//IR活体检测List<IrLivenessInfo> irLivenessInfo = new ArrayList<>();errorCode = faceEngine.getLivenessIr(irLivenessInfo);System.out.println("IR活体:" + irLivenessInfo.get(0).getLiveness());ImageInfoEx imageInfoEx = new ImageInfoEx();imageInfoEx.setHeight(imageInfo.getHeight());imageInfoEx.setWidth(imageInfo.getWidth());imageInfoEx.setImageFormat(imageInfo.getImageFormat());imageInfoEx.setImageDataPlanes(new byte[][]{imageInfo.getImageData()});imageInfoEx.setImageStrides(new int[]{imageInfo.getWidth() * 3});List<FaceInfo> faceInfoList1 = new ArrayList<>();errorCode = faceEngine.detectFaces(imageInfoEx, DetectModel.ASF_DETECT_MODEL_RGB, faceInfoList1);FunctionConfiguration fun = new FunctionConfiguration();fun.setSupportAge(true);errorCode = faceEngine.process(imageInfoEx, faceInfoList1, functionConfiguration);List<AgeInfo> ageInfoList1 = new ArrayList<>();int age = faceEngine.getAge(ageInfoList1);System.out.println("年龄:" + ageInfoList1.get(0).getAge());FaceFeature feature = new FaceFeature();errorCode = faceEngine.extractFaceFeature(imageInfoEx, faceInfoList1.get(0), feature);//引擎卸载errorCode = faceEngine.unInit();}
}

碰到的问题

在开发及上线过程中,碰到一些问题进行一些汇总

  1. 添加库文件的问题,在开发中,把代码提交到git上之后,同小组的开发人员拉代码之后因为没有添加库文件的原因报错,这时候添加了库文件没有重启idea,编译器没有及时生效,导致还是会继续报错。解决方案:重启idea
  2. 这里我们使用的是在线激活SDK的方法,查看SDK文档我们知道,在线激活需要服务器能够正常连接公网才行,但是有些项目的生产环境是无法连接公网的,这里我们就需要使用离线增值版的SDK,而虹软官网一般是100个SDK起卖的,一般的公司或者个人开发者是不需要这么大的量的。这里我解决方案就不在文档里说了,有需求的可以私聊我,我可以给你解决方案。

离线增值版激活

你在购买了之后,一般会教你怎么去激活,具体的激活是我买的那个老哥操作的,我说说我怎么配合进行操作吧

  1. 首先他会发一个生产机器激活文件的.exe文件给你,你执行之后就会生成一个文件,虹软后台会需要这个文件生成激活文档。特别注意,这个文件不要在自己的开发环境浪费了
  2. 之后他就会把这个激活文件发给你,在线的SDK和离线增值版的SDK是不一样的,我们需要把jar包进行替换,这里我是直接问那个老哥要的,没去官网找了。(毕竟我花了钱,能不干的事咱就不干),激活文件放到服务器一般不会去看的文件夹里,防止有人手痒给删了。
  3. 之后就是修改激活SDK的方式了,方法就是把激活文件的路径给它就好,如下:
String filePath = "F:\\86111149K3RK689A.dat";
int activeCode = mFaceEngine.activeOffline(filePath);

海康威视+虹软人脸识别相关推荐

  1. wrs-arcface虹软人脸识别

    前言 虹软人脸识别组件,支持活体识别.离线识别.图片人脸特征识别.图片是否同一人对比.相机人脸识别或对比,虹软免费版请使https://ext.dcloud.net.cn/plugin?id=6084 ...

  2. 虹软java接摄像头_虹软人脸识别SDK(java+linux/window) 初试

    虹软人脸识别全平台demo调用-快速上手之服务端Windows篇 demo名称:ArcFace 2.2 Windows(86) Demo [C++] 一 环境配置: 1) 安装VS2013环境安装包( ...

  3. 基于虹软人脸识别,实现RTMP直播推流追踪视频中所有人脸信息(C#)

    大家应该都知道几个很常见的例子,比如在张学友的演唱会,在安检通道检票时,通过人像识别系统成功识别捉了好多在逃人员,被称为逃犯克星:人行横道不遵守交通规则闯红灯的路人被人脸识别系统抓拍放在大屏上以示警告 ...

  4. linux中人脸识别不了,虹软人脸识别在 linux中so文件加载不到的问题

    其实是可以加载到的,不过是so文件放的位置不一对,最简单的方式是放在 /usr/lib64 目录下,也可自己设置. so文件加载不到会报这个错误: .lang.UnsatisfiedLinkError ...

  5. Android自定义人脸识别框,android自定义虹软人脸识别框/人脸抓拍框/人脸追踪框...

    有一两个月没有更新博客了,最近一直在忙人脸识别的项目,先将项目中更改虹软人脸框的方法抽取出来,希望对大家有所帮助. 尊重原创,转载请注明出处: http://blog..net/qq137722697 ...

  6. Android相机预览,指定区域显示预览框,在区域内出现人脸进行人脸识别,并抓拍人脸照片存在本地,CameraX,虹软人脸识别

    效果图: 第一种是使用camerax进行预览,android camerax预览官方文档,主要通过imageAnalysis,抓帧进行图片处理,然后通过android自带的图片人脸识别FaceDete ...

  7. 虹软人脸识别SDK接入Milvus实现海量人脸快速检索

    虹软人脸识别SDK接入Milvus实现海量人脸快速检索 背景 虹软SDK及Milvus简介 开发环境 虹软人脸识别SDK使用简介 Milvus环境搭建 快速检索实现 人脸识别流程简介 快速检索 虹软S ...

  8. 基于RTSP视频流的Java后台服务端虹软人脸识别

    1 概述       人脸识别技术是随着技术发展而产生的生物识别技术,目前已广泛应用于安防领域,主要用于身份验证和身份识别.视频监控是安防系统常见的一种表现形式,需要部署各种摄像头,包括网络摄像头IP ...

  9. 虹软人脸识别 - 人脸特征数据的存取

    虹软人脸识别 - 人脸特征数据的存取 文章目录 虹软人脸识别 - 人脸特征数据的存取 一.简介 二.数据库应用 1. 连接数据库 2. 建表 3. 注册人脸并保存其特征值到数据库 4. 获取人脸特征数 ...

  10. Android 虹软人脸识别获取数据的方法

    前言 最近app要上一个新的功能 在客户点击购买的时候 记录客户的基本信息 比如年龄和性别 为后期做大数据分析做铺垫 在网上找第三方 找到了虹软人脸识别 在这里吐槽一下 免费的虹软 真是很坑 客服没人 ...

最新文章

  1. Dungeon Master(三维bfs)java
  2. 全志 增加强制横屏标志 Patch
  3. 【面试必备!Mac版本】一文打通Git教程!史上最硬核解析!——双非上岸阿里巴巴系列
  4. 阿里云Maven镜像配置
  5. (二十)WebGIS中图层树功能的设计和实现
  6. ZooKeeper 概念讲的好
  7. Java基于CountDownLatch的并发测试工具
  8. 中国工程院院士李德毅:认知的三次革命,类脑的五条启发!
  9. stm32f7699遇到的犯二问题
  10. 从安卓/linux固件反编译出dtb和dts
  11. 《正见——佛陀的证悟》读后感
  12. 初中数学分几个模块_初中数学所有概念! 初中数学一共可以分为几个模块,分别是什么?...
  13. 向量范数与矩阵范数矩阵模的平方-函数和几何以及映射的关系-数学
  14. 十五天学会Autodesk Inventor,看完这一系列就够了(二),软件界面
  15. 化学公式编辑器怎么画聚合物?
  16. amcharts嵌入到flex中
  17. (一)Fixed ThreadPool
  18. vuex4 极速入门到上手
  19. 数据标注这份工作,不是你想做就能做
  20. 牛客网-Java专项练习11

热门文章

  1. 嵌入式软件工程师学习路线
  2. 菜鸟教程 linux ubuntu,菜鸟教程 Ubuntu 11.0下搭建Web服务器
  3. 微信表情包储服务器,微信表情包不用收藏,只需打开这个设置,再也不担心斗图了...
  4. Web前端开发常用9个开源框架
  5. python播放音频文件——playsound
  6. 【总结】计算机网络常用协议总结------结合cpri
  7. python 爬取地址的经度和纬度,并在地图画出散点图/热力图
  8. python numpy计算任意底数的对数 log
  9. 小程序API可以实现哪些功能
  10. 手机投屏到电视的5种方法 看完才知道原来这么简单!