基于树莓派的人脸识别智能车锁
2018-01-04任环宇武坤玉李道全
任环宇 武坤玉 李道全
摘要:随着生活节奏的加快,以及人们手中钥匙数量的增大,自行车机械锁结构越来越无法满足人们高效率生活需求。本文设计了一种基于树莓派为上位机、arduino单片机为下位机的人脸识别智能自行车锁的方案。其中树莓派用于人脸识别并通过串口通信向arduino单片机发送驱动信号,人脸识别算法使用经典的人脸识别算法——Eigenfaces算法。Arduino单片机作为驱动板,接收到识别的信号之后,该板驱动锁结构开启。测试表明,本设计可实现通过人脸识别进行开锁的功能。
关键词:树莓派;上位机;Eigenfaces算法;串口通信;人脸识别
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2018)29-0214-04
Abstract:With the acceleration of life rhythm and the increase of the number of keys in the hands of people, the bicycle mechanical lock structure can not meet the needs of people with high efficiency. In this paper, an intelligent bicycle lock for face recognition is designed,in which raspberry pie is used as upper computer, arduino single chip computer is used as lower computer. Raspberry is used for face recognition and sends driving signal to arduino single chip computer through serial communication. The face recognition algorithm uses the classical face recognition algorithm--Eigenfaces algorithm. Arduino single chip computer as the driving board, after receiving the recognition signal, The plate drives the lock structure to open. The test shows that this design can realize the function of unlocking by face recognition.
Key words: raspberry pie; upper computer; Eigenfaces algorithm; serial communication;face recognition
1 引言
伴隨着人们生活节奏的加快、城市的交通堵塞,人们对自行车出行需求仍然很大。但是由于生活节奏的加快,以及人们手中钥匙数量的增大,自行车机械锁结构越来越无法满足人们高效率生活需求,因此需要一种更加便捷的方式来进行自行车锁具的开关。为此我们开发了基于树莓派上位机的人脸识别智能车锁。本项目整体上是一个嵌在自行车上的嵌入式装置,其主要完成扫描人脸并进行识别判断进而开锁的过程。
斯坦福教授李菲菲举办的ImageNet国际视觉识别竞赛中,第一名的识别度就已经高达99%以上[1],也就是说,业界对于图像识别已经有非常成熟的算法,因此从实践项目的角度,这一点是十分有利于本项目的成功的。同时,业界中对于视觉项目的开发,集成了成熟的视觉开源库opencv,这也大大的降低的编码难度,提高了项目开发的技术可行性。
2 系统设计与硬件选择
本项目整体上是一个嵌在自行车上的嵌入式装置,其主要完成扫描人脸并进行识别判断进而开锁的过程。所用到的技术主要有基于opencv视觉开源库的人脸识别技术、Linux环境下的编程、arduino单片机编码电机的驱动编程、上下位机之间的通信等技术。整个系统的功能可以分为如下的几个模块:图像的采集与预处理工作、离线人脸识别模型的训练、人脸识别、树莓派3b与电机驱动板arduinomega2560的串口通信、驱动板arduinomega2560驱动电机开锁等,如图1所示。
2.1 树莓派数据简介
Raspberry Pi简称树莓派,是为学习计算机编程教育而设计,只有信用卡大小的微型计算机,系统基于Linux。“麻雀虽小,五脏俱全”来形容树莓派再贴切不过。它是一款基于ARM的微型电脑主板以SD/MicroSD卡为内存硬盘,卡片主板周围有1/2/4个USB接口和一个10/100 以太网接口(A型没有网口),可连接键盘、鼠标和网线,同时拥有视频模拟信号的电视输出接口和HDMI高清视频输出接口,以上部件全部整合在一张仅比信用卡稍大的主板上[2][3]。正是其微小型、全面性,成为了本项目开发的最佳芯片选型。图2是树莓派简易图。
2.2 Arduinomega2560简介
Arduino是一款便捷灵活、容易入门的开源电子平台,如图3所示。包含硬件(各种型号的Arduino板)和软件(Arduino IDE)。Arduino能通过各种各样的传感器来感知环境,通在本系统中主要用来控制锁的电机转动。板子上的微控制器可以通过Arduino的编程语言来编写程序,编译成二进制文件,烧录进微控制器。同时其软件平台的高级设计语言是基于c语言开发的,非常利于开发者快速学习和开发。同时其开源平台丰富的库,也极大的便利的编程的难度并提高了项目可行性[4]。
2.3 串口通信、上位机、下位机简介
简单来理解串口通信的概念,即多个处理器之间通过串行口进行数据的按位传输[5]。通过调研我们发现,尽管树莓派3b功能齐全、计算性能相对一般单片机高,但是如果将编码电机直接连接到树莓派的pin口,是容易烧坏板子的。因此这里本项目采用树莓派3b作为上位机、arduinomega2560作为下位机的整体构造,如图4所示。上位机的概念是进行高级的图像处理和识别相关的计算,并根据计算结果得到通过串口通信发送给下位机。而下位机的功能是接收到信号之后,驱动电机运动完成开锁功能。这样上、下位机结合的设计思路,能够提高系统的安全性和健壮性。
2.4 人脸识别算法Eigenfaces简介
计算机视觉中成熟的人脸识别算法有很多,这里选用opencv集成好的算法Eigenfaces。其算法步骤如下[6]:
Step1: 采集人脸数据库和待识别的人脸图像,基于其像素矩阵将其化成一维向量。
Step2: 基于所有数据向量,计算所有向量的平均值,即计算“平均脸”。
Step3: 将所有人脸向量减去“平均脸”向量,得到插值向量矩阵。
Step4: 计算协方差矩阵,提取特征向量和特征值,并截取前K个高贡献度的影响因子。
以上部分基于机器学习中经典的算法PCA主成分分析,即将高维度的图像参数映射到了低维空间,抽取出数据的主要成分[7]。这便完成的模型的离线训练。在接收新的待探测的人脸后,按照训练的结果(特征向量、特征值),对图像做相同的映射处理,然后进行聚类识别计算。
3 模块化设计
对照上文给出的模块功能的分类,下面依次进行模块化的逻辑过程设计。
3.1 基于树莓派的人脸识别模块
这里采用的技术是基于经典的开源视觉库opencv,对预先收集好的人脸数据库以及采集到的正确人脸,进行人脸识别模型的离线训练。人脸识别采用的主要方法是特征脸算法(Eigenface),通过训练后得到的离线模型以.xml形式存储,在主系统运行时调用模型即可。即图5所示。
3.2 基于arduino mega2560的锁驱动模块
本系统采用arduino mega2560单片处理机控制开锁电机。锁的分为三个状态:开锁可关锁、关锁、开锁不可关锁。这三个状态必须按照一定的状态转移顺序,否则系统将会出现故障。锁的三种状态之间的转移情况如图6所示。
同时,根据锁的机械结构和电机单位时间内旋转的角度,通过实验,测量出从一个状态到另一个状态的时间参数。基于时间参数,得到该子模块的运行流程,如图7所示。
3.3 串口通信逻辑
系统需要基于树莓派的图形采集和计算的结果,来为单片机控制舵机发出相应的指令。因此,不得不解决的问题就是树莓派和单片机之间的通信问题。树莓派的通信方式手段较多,有蓝牙、usb串口以及wifi等方式,单片机支持usb串口和蓝牙方式,考虑通信的稳定性,本系统采用处理器之间的串口通信。流程如图8所示。
这里注意,考虑上位机的识别过程,在较好的识别条件下,可能会多次识别到正确的人脸,就会多次往串口发送数据,这就会导致电机的多余运动进而导致功耗上升。上位机一旦检测到正确人脸,就往串口发送数据。这其中会发送较多的坠余数据。这里采取的解决策略是,下位机一旦接收到串口信号,驱动电机开锁的同时,采取10秒的延时来屏蔽串口发来的多余数据,这里就成功的解决上面的坠余串口信号增加的多余能耗。
4 系统实现
4.1 基于树莓派的人脸识别模块
对应于图5流程中step1、2,本系统要进行识别人脸的采集以及识别模型的训练。直接给树莓派3b的usb端口连接常用的摄像头,就可以调用开源的opencv库来采集待识别人脸的图像。picture.cpp就是这样一个专门调用摄像头采集视频流的程序。篇幅限制,这里不呈现源代码。运行效果如图9所示。
采集成功之后(这里程序中采集了30帧图像),进入对应的人脸数据库目录中,在30张图像中选取10张比较典型的照片,用于后面的识别模型的训练。
完成训练之后,使用的三种人脸识别算法对生成对应的.xml文件,也就是经过上述采集的数据和训练程序得到的模型,将三个.xml文件复制到上位机进行人脸识别开锁的主程序(下文会给出,result.cpp)中,便可以在实时的图像采集中使用该模型进行人脸识别判断。
4.2 基于arduinouno2560的锁驱动模块
这一模块主要涉及驱动板驱动电机旋转来达到开锁的目的,基于实际的锁结构,测量出具体的旋转参数,在开锁逻辑流程图中已经给出,按照其呈现的流程编写arduino锁驱动程序即可。这里直接将串口通讯模块给呈现出来,驱动板从串口缓冲器中读数据,如果是字符3,则执行开锁逻辑,如果是1或者2,用于调整电机的角度。
4.3 上下位机之间的串口通信模块
刚刚本文提到,驱动板在串口中接受到字符3之后,开始执行开锁逻辑,对应的,上位机树莓派在识别成功之后,使用c语言的串口通信函数[8],向串口发送一个字符3.上位机树莓派3b最终的执行程序result.cpp,完成实时人脸采集、识别与控制信号的发送。
4.4 系统实现结果
系统整体完成情况:最上面是单片机和树莓派的组合,中间是电池组,这里使用移动电源供电即可,满足树莓派的供电标准。右侧是图像采集模块,最下面是锁模块,锁中的编码电机与单片机的电机控制模块通过杜邦线进行连接,如图10所示。
系统功能测试:
由于本系统考虑成本因素,在最终的实物中并未添加显示器等外设。系统的调试工作,通过树莓派的HDMI借口连接显示屏来完成。当采集图像之后匹配成功,摄像头的监控窗口捕捉到的人脸旁边会显示”Right People”的字样,如图11所示。否则,匹配失败(显示“Mismatching People”字样)显示如图12。
5 结束语
本项目的灵感源于互联网+浪潮的掀起,人工智能相關领域的兴起,让人们从视觉、图像、声音等多个感知层面,对日常生活中的设备进行智能化的设计。本文从视觉的角度,以方便人们出行方便为目的,开发了这款基于人脸识别的智能自行车锁,并达到了良好的效果。当然目前系统还有待进一步改进,如整个嵌入式的系统还是不够简洁精炼,外部缠绕的线太多可考虑进行芯片和外设的个性化定制,真正达到嵌入式开发“量身定做”的需要,将电池、芯片、摄像头、电机集成到一个精简的装置当中。
参考文献:
[1] 孙玉兰.数字图像处理技术的应用现状与发展研究[J].电脑知识与技术,2014,10(26):6228-6230.
[2] 苏祥林,陈文艺,闫洒洒.基于树莓派的物联网开放平台[J].电子科技,2015,28(09):35-37+41.
[3] 朱轶,曹清华,单田华,等.基于Android、树莓派、Arduino、机器人的创客技能教育探索与实践[J].实验技术与管理,2016,33(06):172-176+206.
[4] 凯姆·卡尔文,泰勒·卡尔文,庞明珠.Arduino与电子制作[J].电子制作,2012(08):68-73.
[5] 蒋萍花,张楠.数据采集系统串口通信的设计与实现[J].电子测量技术,2015,38(06):139-142.
[6] 陈勇,林颖.基于特征脸的主成分分析人脸识别[J].计算技术与自动化,2017,36(02):122-124.
[7] 张勇,黄杰,徐科宇.基于PCA-LSSVR算法的WLAN室内定位方法[J].仪器仪表学报,2015,36(02):408-414.
[8] 王坤,高贇.基于VC++实现串口通信的方法[J].信息化研究,2010,36(10):52-54.
【通联编辑:梁书】