来源:腾讯技术工程1.案例概述1.1 背景
作者:eckygao,腾讯 CSIG 云产品部
实现一个人脸识别进行开锁的功能,用在他的真人实景游戏业务中。总的来说,需求描述简单,但由于约束比较多,在架构与选型上需要花些心思。
1.2 部署效果
由于该游戏还在线上服务中,此处就不放出具体操作的视频了。
1.3 玩家体验
- 玩家发现并进入空间后,在显示屏看到自己在当前场景出镜的实时画面。
- 玩家靠近观察时,捕获当前帧进行人脸识别,实时画面中出现水印字幕“认证中”
- 人脸认证失败时,实时画面水印字幕变更为“认证失败”,字幕维持 2 秒后消失,恢复初始状态。玩家继续寻找游戏线索,重新进行认证。
- 人脸认证成功时,实时画面水印字幕变更为“认证成功”,并弹开保险箱门。进入后续游戏环节。
2.产品要求2.1 需求说明
需求提出时比较明确,核心逻辑不复杂。
- 人脸识别:通过人脸识别进行鉴权。
- 开锁管理:通过鉴权则打开箱门,未通过则保持锁定。
- 反馈提示:需要有实时视频反馈,指引明确,便于优化玩家体验。
2.2 约束说明
毕竟是生意,所以在商言商,对实用性和成本要求很高,关键是不要影响游戏过程,同时保证玩家体验。
- 低成本:需要低建设成本,低维护成本。
- 易维护:对维护人员技术水平要求低,出现软硬件故障时,任意店员可以快速恢复。
- 高可靠:识别准确率高,容错能力强,系统持续运行中故障率低。
- 有限空间:整套系统在去除显示屏、电磁锁、保险箱后,其它结构实施空间不能超过 20cm*15cm*15cm 体积。
- 采光不足:实景空间小,有顶光无侧光,曝光时间较长。
- 通用供电:只提供 5V、12V 两种直流电接口。
- 并行处理:鉴权流程与反馈流程并行,鉴权过程中,反馈系统不能出现中断、阻塞等情况,使玩家有明显的中断、卡死体验。
- 弱网络环境:由于房间隔断多,网络共用,所以网速有限,有突发延迟情况。
2.3 功能设计
可能的架构方案有多种(不同方案间的比较,在文末进行),下面展开说明一下最终上线的方案。
2.3.1 设定流程
流程与效果,请参考 1.3 玩家体验 部分
2.3.2 可配置内容
- 腾讯云密钥对
- 人员库 ID
- 水印提示
- 关机选项
2.3.3 运营与维护
- 系统运营管理
- 故障处理
网络故障:正常运行,无法认证,可查网络+查云日志,解决网络问题;
云产品异常:运行 4 个月,未发生过,可以忽略,如发生则联系云售后;
2.3.4 成本分析
- 硬件成本:500 ~ 600 元。
- 备件成本:按 1:1 备件,500 ~ 600 元。
- 运行成本:云端 0 元,使用免费额度;电费网费,忽略不计。
3.技术实现3.1 系统架构
3.1.1 硬件组成:
- 树莓派:终端主控
- 摄像头:视频输入
- 传感器:超声波测距
- 显示屏:视频输出
- 继电器:控制电磁锁
- 电磁锁:控制保险箱门
3.1.2 关键特性
- 图片识别:使用图片识别,而非视频流,减少对网络带宽要求。
- 识别要求低:欠曝光照片也有高识别率。
- 触发识别:玩家在场景内活动时间长,触发模式避免了高频认证、误开锁情况,同时降低认证成本。
- 测距选型:超声波传感器技术成熟,成本低(3 元);激光传感器成本高(30 元)
- 多进程:视频处理与监测鉴权由两个进程实现,避免了阻塞等情况,同时使用进程间通信,实现可靠交互。
3.2 系统搭建
3.2.1 腾讯云配置
- 注册账号
- 配置人脸识别
其中所使用的“人员库 ID”是关键信息,用于后续 API 调用识别时,指定认证动作匹配的人员库。
注:由于此案例只识别一个人员,无需对人员 ID 进行匹配,故不用指定人员 ID。
3.2.2 树莓派配置
- 安装系统
- 配置网络
- # 具体内容请参考你的本地网络规划
- interface wlan0
- static ip_address=192.168.0.xx/24
- static routers=192.168.0.1
- static domain_name_servers=192.168.0.1 192.168.0.2
- 安装腾讯云 SDK
- sudo apt-get install python-pip -y
- pip install tencentcloud-sdk-python
- 安装图像处理库
- sudo apt-get install libopencv-dev -y
- sudo apt-get install python-opencv -y
- 部署代码
更改 /home/pi/faceid/config.json 中的配置信息,必须改为你的云 API 密钥(sid/skey)、人员库 ID(facegroupid),其它配置按需调整。
- 配置自启动
- Type=Application
- Exec=python /home/pi/faceid/main.py
树莓派 GPIO 图示
摄像头
- CSI 接口
超声波传感器
- TrigPin:BCM-24 / GPIO24
- EchoPin:BCM-23 / GPIO23
- VCC :接 5V
- GND :接 GND
4 引脚侧 接 树莓派 GPIO 引脚
- VCC :接 5V
- GND/RGND :接 GND
- CH1 : BCM-12 / GPIO12
- 初始状态为电磁锁接常闭端。
- 继电器原理请参考 3.3.4 硬件相关 部分。
3.2.4 测试运行
完成上述工作后,接电启动系统,本地反馈查看显示屏,云端识别结果可查看系统日志。
3.3 代码逻辑与涉及技术
3.3.1 流程伪代码
- # 监测鉴权进程-主进程
- 获取应用配置(API ID/Key 等)
- 初始化GPIO引脚(准备控制 传感器、继电器)
- 启动视频管理进程(辅进程)
- 循环开始:
- if not 测距达到触发标准:
- continue
- 与辅进程通信(捕获当前帧,并存入指定路径,并添加“认证中”水印)
- 调用云API,使用该帧图片人脸识别
- if 识别成功:
- 与辅进程通信(变更水印为“认证成功”)
- 等待5秒
- 关机 或 继续运行(由config.json中 su2halt 字段指定)
- else:
- 与辅进程通信(变更水印为“认证失败”)
- 等待2秒
- 与辅进程通信(清除水印)
- # 视频管理进程-辅进程
- 初始化摄像头
- 循环开始:
- 取帧
- 取进程间共享队列
- 按消息进行不同操作(帧图像保存/加不同水印/不处理)
- 输出帧
- 实时视频
- 触发识别
- 人脸识别
请参考文档介绍(https://cloud.tencent.com/product/facerecognition)。
3.3.3 图像水印
- 水印原理
- 水印图片
默认水印图片为白底黑字。
- 水印处理逻辑
源码说明
- # img1为当前视频帧(底图),img2为已读取水印图
- def addpic(img1,img2):
- # 关注区域ROI-取底图中将被水印图编辑的图像
- rows, cols = img2.shape[:2]
- roi = img1[:rows, :cols]
- # 图片灰化-避免水印图非纯黑纯白情况
- img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
- # 生成掩膜-过滤浅色,位运算取非
- ret, mask = cv2.threshold(img2gray, 220, 255, 3) #cv2.THRESH_BINARY
- mask_inv = cv2.bitwise_not(mask)
- # 生成水印区图像-底图裁出字体部分,生成水印区最终图像,替换原图水印区
- img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
- dst = cv2.add(img1_bg, img2)
- img1[:rows, :cols] = dst
- return img1
3.3.4 硬件相关
- 超声波测距
即:测距结果(米)=Echo 端高电平时长*340 米/2
- 继电器
继电器在“通路管理侧”实现了一个“单刀双开关”的模式,通过“供电与信号”侧“CH1 引脚”的高低电平,控制单刀的方向。
在安装过程中,电磁锁供电默认接继电器常闭端,对继电器给出信号后,继电器切换到常开端,则电磁锁断电开锁.
- GPIO
4.其它4.1 方案选型对比
设计的核心在于人脸鉴权模块,这里直接影响成本和稳定性,最后选择了上文方案(平衡成本、维护性及可靠性)。曾经的其它几种备选人脸识别方案:
4.1.1 本地识别 A 方案:
使用 ESP-EYE 芯片,均由芯片完成,依赖 ESP-IDF、ESP—WHO,使用 C 进行开发。
低硬件成本(模块成本 189*2),高开发维护成本(C 开发)。
问题:难于更新配置与故障分析处理。适用于大量部署场景。
4.1.2 本地识别 B 方案:
使用树莓派直接进行人脸识别,方案成熟,开源代码丰富。
中硬件成本,低开发成本,高维护成本。
问题:树莓派负载高,即使用间隔帧算法,也仅维持在 20fps 以下,卡顿明显。如进一步调优,受限于个人经验问题,恐难以保持长期稳定运行。
4.1.3 本地识别 C 方案:
使用 BM1880 边缘计算开发板 或其它图像处理板,社区口碑不错,有框架支持。
问题:高硬件成本(模块成本 1000*2),高开发维护成本(C 开发)。如果使用算力棒,需要 X86_64 做基础平台,成本降低有限,复杂度不变。适用于扩展能力场景。
4.1.4 云端识别 A 方案:
使用腾讯云的视频智能分析产品(https://aivideo.cloud.tencent.com/list.html),简化终端架构,使用树莓派 zero 推流上云(后续放出实现方案),即可获取识别结果,且支持高频多次检索等特性。
部署成本低(终端视频相关模块 150 元),运营成本低(当前 0.28 元/分钟,按该场景下单次运行 20 分钟计算,单次游戏成本 5.6 元)
问题:对网络稳定性依赖大,断流等情况影响体验。在本案例的网络约束下,影响使用效果,更适于网络条件较好、高频检索的应用场景。