超简单的搭建自己的人脸识别服务,离线使用,不同方位的识别率高~

<2020.5.10更新>

分享一下简单的nodered流


需要更改这两个节点
第一个修改为自己获取摄像头图片的url
1589103623(1)

第二个更改为自己人脸识别服务器的url

1589103708(1)

flows.json (3.4 KB)

======================================================================

对比了较多的人脸识别,用过 ageitgey/ face_recognition的发现识别率低。
这个sdk用的是虹软科技的,除了第一次启动需要联网激活一下之外,之后都可以离线使用,可以保护隐私。
本教程使用代码为官方demo改造的
下面开始本教程(仅测试于x86架构,其他的没条件测试)。
1、首先需要去虹软开放平台申请一个sdk和key:

2、拉去docker镜像: docker pull c794103684/face_recognition

3、在群晖配置docker镜像


需要挂载这2个文件夹和1个配置文件

image
/app/lib 对于的是在开放平台下载的lib文件
image
/app/know_faces对于的是照片的分类,每一个文件夹一个人的人脸图片,文件名为识别出的名字

/app/application.yaml对于的是配置文件,配置文件如下(注意缩进)
image
image
config:
freesdk:
app-id: xxxxx
sdk-key: xxxx
thread-pool-size: 5
face-file-path: /app/know_faces
lib-path: /app/lib

4、设置端口

5、 完成

<注意第一次运行必须联网激活>
6、 运行之后,查看日志看是否加载你的人脸信息,ERROR的图片为识别不出的人脸(无关紧要)(一个文件夹可以放多几张图片,提高识别率)

7、通过node red接入人脸识别服务(大家可以使用之前萝卜的流程,只需要把请求方式改一下就可以;了), 这里就给大家演示一下postman去请求
请求路径为 http://url:9090/faceSearch
请求体为 base64
请求头为json: application/json
code为0的时候则表示识别成功,具体code对应的问题可看文章最后。
返回格式如下:
{
“code”: 0,
“success”: true,
“message”: “success”,
“data”: {
“faceId”: “8xwfk1oszk”,
“name”: “”,
“similarValue”: 100,
“age”: 29,
“gender”: “男”,
“image”: “”
}
}


大致的接入nodered方法如图:
获取图片,转base64,post请求(header为json)
image
image

github地址: https://github.com/ck003/face_recognition.git

全部的error code信息:
MOK(0, “成功”),
UNKNOWN(1, “未知错误”),
INVALID_PARAM(2, “无效参数”),
UNSUPPORTED(3, “引擎不支持”),
NO_MEMORY(4, “内存不足”),
BAD_STATE(5, “状态错误”),
USER_CANCEL(6, “用户取消相关操作”),
EXPIRED(7, “操作时间过期”),
USER_PAUSE(8, “用户暂停操作”),
BUFFER_OVERFLOW(9, “缓冲上溢”),
BUFFER_UNDERFLOW(10, “缓冲下溢”),
NO_DISKSPACE(11, “存贮空间不足”),
COMPONENT_NOT_EXIST(12, “组件不存在”),
GLOBAL_DATA_NOT_EXIST(13, “全局数据不存在”),
NO_FACE_DETECTED(14, “未检出到人脸”),
FACE_DOES_NOT_MATCH(15, “人脸不匹配”),
INVALID_APP_ID(28673, “无效的AppId”),
INVALID_SDK_ID(28674, “无效的SdkKey”),
INVALID_ID_PAIR(28675, “AppId和SdkKey不匹配”),
MISMATCH_ID_AND_SDK(28676, “SdkKey 和使用的SDK 不匹配”),
SYSTEM_VERSION_UNSUPPORTED(28677, “系统版本不被当前SDK所支持”),
LICENCE_EXPIRED(28678, “SDK有效期过期,需要重新下载更新”),
APS_ENGINE_HANDLE(69633, “引擎句柄非法”),
APS_MEMMGR_HANDLE(69634, “内存句柄非法”),
APS_DEVICEID_INVALID(69635, " Device ID 非法"),
APS_DEVICEID_UNSUPPORTED(69636, “Device ID 不支持”),
APS_MODEL_HANDLE(69637, “模板数据指针非法”),
APS_MODEL_SIZE(69638, “模板数据长度非法”),
APS_IMAGE_HANDLE(69639, “图像结构体指针非法”),
APS_IMAGE_FORMAT_UNSUPPORTED(69640, “图像格式不支持”),
APS_IMAGE_PARAM(69641, “图像参数非法”),
APS_IMAGE_SIZE(69642, “图像尺寸大小超过支持范围”),
APS_DEVICE_AVX2_UNSUPPORTED(69643, “处理器不支持AVX2指令”),
FR_INVALID_MEMORY_INFO(73729, “无效的输入内存”),
FR_INVALID_IMAGE_INFO(73730, “无效的输入图像参数”),
FR_INVALID_FACE_INFO(73731, “无效的脸部信息”),
FR_NO_GPU_AVAILABLE(73732, “当前设备无GPU可用”),
FR_MISMATCHED_FEATURE_LEVEL(73733, “待比较的两个人脸特征的版本不一致”),
FACEFEATURE_UNKNOWN(81921, “人脸特征检测错误未知”),
FACEFEATURE_MEMORY(81922, “人脸特征检测内存错误”),
FACEFEATURE_INVALID_FORMAT(81923, “人脸特征检测格式错误”),
FACEFEATURE_INVALID_PARAM(81924, “人脸特征检测参数错误”),
FACEFEATURE_LOW_CONFIDENCE_LEVEL(81925, “人脸特征检测结果置信度低”),
ASF_EX_BASE_FEATURE_UNSUPPORTED_ON_INIT(86017, “Engine不支持的检测属性”),
ASF_EX_BASE_FEATURE_UNINITED(86018, “需要检测的属性未初始化”),
ASF_EX_BASE_FEATURE_UNPROCESSED(86019, “待获取的属性未在process中处理过”),
ASF_EX_BASE_FEATURE_UNSUPPORTED_ON_PROCESS(86020, “PROCESS不支持的检测属性,例如FR,有自己独立的处理函数”),
ASF_EX_BASE_INVALID_IMAGE_INFO(86021, “无效的输入图像”),
ASF_EX_BASE_INVALID_FACE_INFO(86022, “无效的脸部信息”),
ASF_BASE_ACTIVATION_FAIL(90113, “人脸比对SDK激活失败,请打开读写权限”),
ASF_BASE_ALREADY_ACTIVATED(90114, “人脸比对SDK已激活”),
ASF_BASE_NOT_ACTIVATED(90115, “人脸比对SDK未激活”),
ASF_BASE_SCALE_NOT_SUPPORT(90116, “detectFaceScaleVal 不支持”),
ASF_BASE_VERION_MISMATCH(90117, “SDK版本不匹配”),
ASF_BASE_DEVICE_MISMATCH(90118, “设备不匹配”),
ASF_BASE_UNIQUE_IDENTIFIER_MISMATCH(90119, “唯一标识不匹配”),
ASF_BASE_PARAM_NULL(90120, “参数为空”),
ASF_BASE_SDK_EXPIRED(90121, “SDK已过期”),
ASF_BASE_VERSION_NOT_SUPPORT(90122, “版本不支持”),
ASF_BASE_SIGN_ERROR(90123, “签名错误”),
ASF_BASE_DATABASE_ERROR(90124, “数据库插入错误”),
ASF_BASE_UNIQUE_CHECKOUT_FAIL(90125, “唯一标识符校验失败”),
ASF_BASE_COLOR_SPACE_NOT_SUPPORT(90126, “输入的颜色空间不支持”),
ASF_BASE_IMAGE_WIDTH_NOT_SUPPORT(90127, “输入图像的byte数据长度不正确”),
ASF_NETWORK_BASE_COULDNT_RESOLVE_HOST(94209, “无法解析主机地址”),
ASF_NETWORK_BASE_COULDNT_CONNECT_SERVER(94210, “无法连接服务器”),
ASF_NETWORK_BASE_CONNECT_TIMEOUT(94211, “网络连接超时”),
ASF_NETWORK_BASE_UNKNOWN_ERROR(94212, “未知错误”);

感谢分享新玩法,好东西


是这个么

不是,我不知道为什么还搜不到我的镜像,你要用命令行pull
docker pull c794103684/face_recognition

好的呢 :grinning:

能实现视频识别就好了

不支持N1 arm64的吗。

暂时还没研究~~~~

运行就意外停止,不知道哪里设置不对。
image

错啦,你这里挂载错了,挂载文件,不是文件夹

嗯 你帮我看下,我修改了启动提示API失败呢


我感觉是不是application.yaml文件不对,你有模板文件方便发我一个嘛 我修改KEY导入看下

你这个路径是不是没配对啊,我看你application.yaml是放在application文件夹下的呀
image
image

我两者都试过了 都是api错误。application文件下 和 face_recognition文件下放application.yaml。

有没有更详细的log

Start container c794103684-face_recognition1 failed: {“message”:“OCI runtime create failed: container_linux.go:345: starting container process caused “process_linux.go:430: container init caused \“rootfs_linux.go:59: mounting \\\”/volume1/docker/face_recognition/application/application.yaml\\\” to rootfs \\\”/volume1/@docker/btrfs/subvolumes/e5798ca29540204da04e3944af452dfc7ba28ce2105f8b56f511f0d1bc2d79b5\\\" at \\\"/volume1/@docker/btrfs/subvolumes/e5798ca29540204da04e3944af452dfc7ba28ce2105f8b56f511f0d1bc2d79b5/app/application.yaml\\\" caused \\\“not a directory\\\”\"": unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type"}

这个是docker里面的日志

挂载application.yaml的时候选择文件试试?
image

我现在选择挂载就是用这个添加文件 然后选择application.yaml的