前几天妹子送了个生日礼物——树莓派,想到公司门禁还是指纹解锁,随即说干就干,开始折腾个人脸门禁顺便入门吧。

0x00 思路

最开始我的想法是由树莓派独立完成摄像头图像捕捉、人脸检测、比对;转念一想,后期这玩意可以迎合公司项目,放到政企专网内部运作,还是 C/S 比较合适(更新方便、统一管理、Client 端平台无限制);后来受到公司另一个小伙伴的启发,既然采用 C/S 架构,那服务器端肯定是 x64 的 CPU,可以调用虹软人脸 SDK,避免使用开源算法头疼优化问题,所以最终的结构基本是这样的:

(凑合看吧……毕竟是自己整理思路的时候随手画的)

0x01 准备

硬件

  • 树莓派 3B
  • 罗技 C170 摄像头(街边电脑店买的)
  • Linux 服务器一台(with x64 CPU)

软件

0x02 折腾

树莓派: 安装系统

树莓派: USB 摄像头支持列表

树莓派: 连接摄像头

树莓派: Node.js 连接摄像头

服务器(C): 编译虹软 SDK 例程

没错, 玩 C++ 最难的, 就是编译… 2333

服务器(C): 封装并编译动态链接库

服务器(Node): 调用动态链接库

服务器(Bash): 图片转 YUV 通道原始数据

服务器(Node): 实现人脸 HTTP API

树莓派: 调用人脸 API

其它

0x03 成果

实时刷新:

单线程基本上每秒 2-3 帧, 因为识别在服务器, 所以几乎不存在性能问题, 只要带宽够, 有多少 frames 就能识别多少.

全家福:

原谅我不是个专业硬件工程师, 只会简洁的连线风格, lol.

0x04 后记

没有后记, 祝自己生日快乐的同时, 也希望 2018 大吉大利, 妹子到手 (正经脸).