raspberry pi代码如何实现人脸识别开锁应用

62次阅读
没有评论

共计 4702 个字符,预计需要花费 12 分钟才能阅读完成。

这篇文章将为大家详细讲解有关 raspberry pi 代码如何实现人脸识别开锁应用,文章内容质量较高,因此丸趣 TV 小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

一、案例概述

1. 背景

帮朋友实现了一个人脸识别进行开锁的功能,用在他的真人实景游戏业务中。几个月来运行稳定,体验良好,借着此次宅家的时间,整理一下这个应用的实现过程。

总的来说需求描述简单,但由于约束比较多,在架构与选型上还是花了些心思。2. 部署效果由于该游戏还在线上服务中,此处就不放出具体操作的视频了。部署效果如下图所示:

玩家发现并进入空间后,在显示屏看到自己在当前场景出镜的实时画面。

玩家靠近观察时,捕获当前帧进行人脸识别,实时画面中出现水印字幕“认证中”

人脸认证失败时,实时画面水印字幕变更为“认证失败”,字幕维持 2 秒后消失,恢复初始状态。玩家继续寻找游戏线索,重新进行认证。

人脸认证成功时,实时画面水印字幕变更为“认证成功”,并弹开保险箱门。进入后续游戏环节。

二、产品要求 1. 需求说明

需求提出时比较明确,核心逻辑不复杂。

人脸识别:通过人脸识别进行鉴权。

开锁管理:通过鉴权则打开箱门,未通过则保持锁定。

反馈提示:需要有实时视频反馈,指引明确,便于优化玩家体验。

2. 约束说明

毕竟是生意,所以在商言商,对实用性和成本要求很高,关键是不要影响游戏过程,同时保证玩家体验。

低成本:需要低建设成本,低维护成本。

易维护:对维护人员技术水平要求低,出现软硬件故障时,任意店员可以快速恢复。

高可靠:识别准确率高,容错能力强,系统持续运行中故障率低。

有限空间:整套系统在去除显示屏、电磁锁、保险箱后,其它结构实施空间不能超过 20cm*15cm*15cm 体积。

采光不足:实景空间小,有顶光无侧光,曝光时间较长。

通用供电:只提供 5V、12V 两种直流电接口。

并行处理:鉴权流程与反馈流程并行,鉴权过程中,反馈系统不能出现中断、阻塞等情况,使玩家有明显的中断、卡死体验。

弱网络环境:由于房间隔断多,网络共用,所以网速有限,有突发延迟情况。

3. 功能设计

可能的架构方案有多种(不同方案间的比较,在文末进行),下面展开说明一下最终上线的方案。

(1)设定流程

流程与效果,请参考前文“玩家体验”部分内容。

(2)可配置内容

a. 腾讯云密钥对

修改配置文件,用于适配腾讯云账号切换功能(测试账号 / 正式账号)。

b. 人员库 ID

修改配置文件,用于指定不同人员库(测试库 / 正式库)。

c. 水印提示

更换对应图片,实现更换水印。使用图片管理,而不是文字配置的原因,是由于图片配置模式无需字库支持,无需配置显示大小,易于图案嵌入。由于所见即所得,对维护人员要求低。

d. 关机选项

可配置任务完成后,是否自动关机。用于游戏环境复位准备,减少复位工作量。

(3)运营与维护

a. 系统运营管理

场景启动时,统一上电。认证通过后,自动关机,完成复位。

b. 故障处理

软硬件故障:无法开机、可开机无显示、可开机显示系统异常,可开机未知异常等等,更换树莓派或其它硬件。网络故障:正常运行,无法认证,可查网络 + 查云日志,解决网络问题;云产品异常:运行 4 个月,未发生过,可以忽略,如发生则联系云售后;

(4)成本分析

硬件成本:500~600 元。

备件成本:按 1:1 备件,500~600 元。

运行成本:云端 0 元,使用免费额度;电费网费,忽略不计。

二、技术实现 1. 系统架构

(1)硬件组成

树莓派:终端主控摄像头:视频输入传感器:超声波测距显示屏:视频输出继电器:控制电磁锁电磁锁:控制保险箱门

(2)关键特性

图片识别:使用图片识别,而非视频流,减少对网络带宽要求。识别要求低:欠曝光照片也有高识别率。触发识别:玩家在场景内活动时间长,触发模式避免了高频认证、误开锁情况,同时降低认证成本。测距选型:超声波传感器技术成熟,成本低(3 元);激光传感器成本高(30 元)多进程:视频处理与监测鉴权由两个进程实现,避免了阻塞等情况,同时使用进程间通信,实现可靠交互。

2. 系统搭建

(1)腾讯云配置

a. 注册账号

按文档指引,获取 API 密钥

b. 配置人脸识别

访问官网控制台,通过“新建人员库 - 创建人员 - 上传照片”,建立认证基础。其中所使用的“人员库 ID”是关键信息,用于后续 API 调用识别时,指定认证动作匹配的人员库。注:由于此案例只识别一个人员,无需对人员 ID 进行匹配,故不用指定人员 ID。

(2)树莓派配置

a. 安装系统访问  http://www.raspberrypi.org  获取镜像,并进行安装。注意必须安装桌面版,否则需要单独管理 HDMI 输出。

b. 配置网络进入命令行,执行 raspi-config,选择 Network Options,配置 WiFi 接入点。为了固定 IP,编辑 /etc/dhcpcd.conf 文件,添加配置信息。

#  具体内容请参考你的本地网络规划
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

c. 安装腾讯云 SDK

参考指引文档,安装调用腾讯云 API 的依赖库。

sudo apt-get install python-pip -y
pip install tencentcloud-sdk-python

d. 安装图像处理库系统默认安装 python2.7,但没有 opencv 库,需要安装。(下载包体积较大,默认源为国外站,比较慢。树莓派改国内源方法,请自行百度,并挑选离自己近的源站)

sudo apt-get install libopencv-dev -y
sudo apt-get install python-opencv -y

e. 部署代码

访问 github 获取源码,将 src 文件夹内容,复制到 /home/pi/faceid 下。更改 /home/pi/faceid/config.json 中的配置信息,必须改为你的 云 API 密钥 (sid/skey)、人员库 ID(facegroupid),其它配置按需调整。

f. 配置自启动需要配置图形界面自启动,保证视频输出由 HDMI 接口输出至显示屏,编辑 /home/pi/.config/autostart/faceid.desktop 写入如下内容

Type=Application
Exec=python /home/pi/faceid/main.py

(3)硬件接线

树莓派 GPIO 图示:

CSI 接口

b. 超声波传感器

TrigPin:BCM-24 / GPIO24

EchoPin:BCM-23 / GPIO23

VCC:接 5V

GND:接 GND

c. 继电器 4 引脚侧 接 树莓派 GPIO 引脚

VCC:接 5V

GND/RGND:接 GND

CH1 : BCM-12 / GPIO12

3 端口侧 接 电磁锁

初始状态为电磁锁接常闭端。

继电器原理请参考 3.3.4 硬件相关 部分。

(3)测试运行

完成上述工作后,接电启动系统,本地反馈查看显示屏,云端识别结果可查看系统日志。

3. 代码逻辑与涉及技术(1)流程伪代码

#  监测鉴权进程 - 主进程
获取应用配置(API ID/Key  等)初始化 GPIO 引脚(准备控制   传感器、继电器)启动视频管理进程(辅进程)循环开始: if not  测距达到触发标准:
 continue
  与辅进程通信(捕获当前帧,并存入指定路径,并添加“认证中”水印)  调用云 API,使用该帧图片人脸识别
 if  识别成功:
  与辅进程通信(变更水印为“认证成功”)  等待 5 秒
  关机   或   继续运行(由 config.json 中  su2halt  字段指定) else:  与辅进程通信(变更水印为“认证失败”)  等待 2 秒
  与辅进程通信(清除水印)#  视频管理进程 - 辅进程
初始化摄像头
循环开始:  取帧
  取进程间共享队列
  按消息进行不同操作(帧图像保存 / 加不同水印 / 不处理)  输出帧 

(2)视频与识别

a. 实时视频如上文伪代码所示,通过逐帧处理,并连续输出,显示实时视频。

b. 触发识别

测距传感器确认物体靠近,且 0.3 秒内距离变化小于 2cm,确认为待认证状态。再延时 0.3 秒,进行图像帧捕获。再次延时的原因是物体停止时,会有扭转、微调等动作,若直接取帧,会由于采光不足(上文提到的约束)出现模糊情况,所以再次延时,确保捕获稳定图像。

c. 人脸识别

请参考文档介绍。

(3)图像水印

a. 水印原理

opencv 中,提供了多种图像处理函数,如:图文处理(图加字)、图图处理(图间加 / 减 / 乘 / 除 / 位运算)等等。通过不同的处理方式,可以实现 底图加字、底图加图、掩膜处理等等多种效果。本案例中使用的是基于位运算的掩膜处理方式。

b. 水印图片

为了便于维护和更新,本案例中使用图片做为水印来源,避免字库约束,也增大了灵活性,易于在水印中增加图形,并以分辨率直接定义水印大小,所见即所得。默认水印图片为白底黑字。

c. 水印处理逻辑

为突出水印的浮动效果,将水印图片中的黑色区域透明化后,叠加到原始图片中。由于字体透明效果,水印字体颜色随基础视频变化,效果比较明显。源码说明

# 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

(4)硬件相关

a. 超声波测距

超声波传感器(4 引脚:VCC、Trig、Echo、GND),Trig 端输出一个大于 10μs 的高电平,激活发出超声波,并在收到反射波后,Echo 端会输出一个持续高电平,持续时间就是“发波至收波”的时间。即:测距结果 (米)=Echo 端高电平时长 *340 米 /2

b. 继电器

使用的 5V 继电器模块有双侧接线,一侧为供电与信号(4 引脚,兼容 3.3V 信号),一侧为通路开闭管理(3 端口)。继电器在“通路管理侧”实现了一个“单刀双开关”的模式,通过“供电与信号”侧“CH1 引脚”的高低电平,控制单刀的方向。在安装过程中,电磁锁供电默认接继电器常闭端,对继电器给出信号后,继电器切换到常开端,则电磁锁断电开锁.

c. GPIO

GPIO(General-purpose input/output 通用输入输出),以引脚方式提供硬件间的联系能力。树莓派 3B+,有 40 个 GPIO 引脚(请参考 3.2.3 硬件接线 中的参考图示),树莓派官方操作系统 Raspbian 下,可以使用系统默认安装的 python 中 RPi.GPIO 库,进行操作。

关于 raspberry pi 代码如何实现人脸识别开锁应用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-17发表,共计4702字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)