背景
聆思CSK6 提供一套关于面部识别(人脸边界框、人脸标定点、头部姿态角度、人脸识别特征等功能)的sdk,基于此基础进行面部解锁应用的简单开发。
实现原理
拉取代码
lisa zep create --from-git [https://cloud.listenai.com/zephyr/applications/app_algo_fd_sample_for_csk6.git](https://cloud.listenai.com/zephyr/applications/app_algo_fd_sample_for_csk6.git)
修改配置
打开PC端图像预览功能
打开 项目的根目录下找到 的 prj.conf 文件,将 CONFIG_WEBUSB=n 改为CONFIG_WEBUSB=y
编译代码 lisa zep build -b csk6011a_nano
此处出现过一次编译后的固件电脑报摄像头错误,此时通过运行以下命令重新编译后烧录修复: lisa zep update
lisa zep build -b csk6001a_nano -p
烧录固件
lisa zep flash
烧录资源文件
板卡在我电脑上识别到的是/dev/ttyACM0,因此命令中使用的是/dev/ttyACM0
lisa zep exec cskburn -s /dev/ttyACM0 -C 6 0x400000 ./resource/cp.bin -b 748800
lisa zep exec cskburn -s /dev/ttyACM0 -C 6 0x500000 ./resource/res.bin -b 748800
电脑下载摄像头查看工具
git clone https://cloud.listenai.com/zephyr/applications/csk_view_finder_spd.git
安装驱动
在windows环境中需要安装相对应的驱动来进行识别和使用:
https://tool.listenai.com/csk-view-finder-spd/driver.html
进入该网址,按照示意进行安装。
void compare_start()
{
if (fr.get_new_feature) {
uint16_t cnt = 0;
uint8_t done = 0;
fr.get_new_feature = false;
fd_cmd_compare_feature_data_t data;
fd_cmd_compare_feature_result_t result;
data.feature_dim = FD_MAX_FEATURE_DIMS;
data.feature_src = fr.feature_nvs;
data.feature_dst = fr.feature;
// 获取存储的数据数量
storage_get_data_cnt(&cnt);
// 遍历存储的数据
for (uint32_t i = 0; i < cnt; i++) {
// 读取存储的数据
storage_read_data(i, (void *)fr.feature_nvs, sizeof(fr.feature));
// 比较人脸特征
ret = fd_control(fr.fd, FD_CMD_COMPARE_FEATURE, &data, &result);
if (ret != 0) {
LOG_ERR("检测未通过,或建议重新录入");
}
// 如果相似度大于0.95,设置done为1
if (result.score > 0.95) {
done = 1;
}
}
// 如果done为1,发送成功消息;否则发送失败消息
if (done) {
webusb_send_message("通过检测");
} else {
webusb_send_message("检测未通过,或建议重新录入");
}
} else {
// 未检测到人脸特征,发送失败消息并打印日志
webusb_send_message("检测未通过,或建议重新录入");
LOG_INF("未检测到人脸");
}
}
void add_new()
{
// 如果检测到新的人脸特征
if (fr.get_new_feature) {
uint16_t cnt = 0;
fr.get_new_feature = false;
char *txt = csk_malloc(64);
// 将新的人脸特征写入存储区
storage_write((void *)fr.feature, sizeof(fr.feature));
// 获取存储的数据数量
storage_get_data_cnt(&cnt);
// 格式化消息并发送成功消息
sprintf(txt, "面部数据注册成功, 数量:%d", cnt);
webusb_send_message(txt);
csk_free(txt);
LOG_INF("face feature save success"); // 打印日志
} else {
webusb_send_message("face_recognize: fail"); // 发送消息
LOG_INF("not detected face feature"); // 打印日志
}
}
效果验证
原有代码已经有对应逻辑代码,只需要对原有代码进行简单的修改和增加打印语句来完成功能:
如果面部识别结果不存在对应的面部信息则提示不存在对应面部信息,可在录入后重新识别,如果存在对因面部信息则提示通过识别
实际修改代码不多。
实现效果
录入面部信息后,进行验证返回验证成功.使用查看工具(使用ie浏览器打开),进行注册和对比:
从日志可看出,注册和比对成功,可通过日志打印处进行引脚io控制器件或者通过传输协议控制远端器件进行控制,来达到面部解锁的功能使用。
另一方面,对于面部的三轴数据还可用于颈椎病、坐姿等的监控和警报,对于打工人的日常办公健康是很有好处的。
遇到问题
使用firefox和360浏览器无法使用预览和烧录
使用的是ie浏览器进行操作
在linux环境下烧录和预览工具也无法使用
建议
本来想对关键点进行人脸部的情绪判断,发现很多部分接口没有更详细的介绍或者就没有介绍,如果能把一些数据的必要接口全部给出来,开发就会更自由方便了。再一个是如果预览工具和网页烧录工具在linux环境也能使用就更方便了。