编辑 | blame | 历史 | 原始文档

face recognize

使用VideoPipe做人脸识别。

提前准备

  1. 已准备好 VideoPipe 编译/运行环境(参见视频教程)
  2. 已准备好本案例所需的测试模型和测试数据(即 vp_data,具体参见视频教程)
  3. 已安装好本案例中 Python3 所需的依赖库(主要是numpy,pandas,opencv,flask,faiss等,其余按需安装即可)

主要文件

  1. face_recognize_pipeline.cpp 运行VideoPipe管道读取人脸视频,提取人脸特征,并将特征通过Socket/UDP发送给人脸识别后台服务。
  2. face_recognize_server.py 后台服务接收人脸特征数据,并基于 faiss 框架完成人脸识别任务,将识别结果存入数据库,并提供一个基于 flask 的Web UI界面供数据查询。
  3. clean.sh 帮助清空当前workspace下面的所有缓存数据。

![](./docs/1.png)

如何使用

  1. CMake编译 face_recognize_pipeline.cpp 生成二进制可执行程序并运行,它会实时提取人脸特征。(编译之前请先修改代码中 des_iprtmp推流地址)
  2. 运行 python3 face_recognize_server.py 脚本,完成人脸识别任务, 然后打开浏览器访问 http://server-ip:5656 查看识别记录。 (运行前,先修改脚本中 bind_iplive_stream_0 的值)

数据流向

  1. [load registered users -> create faiss Index]
  2. [pipeline -> face embeddings -> send via socket]
  3. [receive face embeddings -> recognize -> display results from web]
please run `sh clean.sh` if you want to restart sample from scratch.

VideoPipe管道介绍

![](./vp_analysis_board.png)

  1. layer_1 模拟获取人脸视频数据,实际可以换成rtsp/udp/或者直接从摄像机Sensor抓图。
  2. layer_2 完成人脸检测,从大图中定位人脸位置及其5个关键点,创建 vp_frame_face_target 对象。
  3. layer_3 完成人脸特征提取,基于前面检测到的人脸,提取特征,更新 vp_frame_face_targetembeddings
  4. layer_4 完成人脸跟踪(SORT),更新 vp_frame_face_targettrack_idtracks, 避免重复提交的问题。
  5. layer_5 完成人脸数据转发,将管道中的人脸特征(embeddings)人脸抠图路径按自定义格式,使用Socket/UDP的方式发送给后台Python服务。
  6. layer_6 完成结果绘制,主要将当前画面中检测到的人脸(vp_frame_face_target)显示出来。
  7. layer_7
    • screen_des_0 负责GUI输出显示,显示基本无延时。
    • rtmp_des_0 负责rtmp编码推流,Web UI通过rtmp地址可以实时播放,有若干秒延时。

重要知识点

  1. vp_analysis_board 类型,管道可视化原理。
  2. VideoPipe 管道自动拆分的原理。
  3. vp_rtmp_des_node 工作的原理。
  4. vp_frame_face_target 类型。
  5. faiss 相似度检索库的使用。
  6. 如何避免人脸数据重复提交?
  7. 如何减少人脸特征提取的次数,提高管道运行性能?

Sample运行截图

![](../../doc/p51.png)