基于arm9和百度AI的视频监控与人脸识别

2018-01-04 10:59高熊孙先松
电脑知识与技术 2018年28期
关键词:视频监控嵌入式系统人脸识别

高熊 孙先松

摘要:为了实现对某一地点的实时监控,并对相关人员进行人脸识别,以满足特定场合的工作需求,该文对实时图像的采集和人脸识别做了相应的研究。该研究的硬件系统采用JZ2440开发板作为嵌入式硬件开发平台,将USB摄像头采集到的图像数据通过UDP网络传输协议传输给在Ubuntu上搭建的服务器,以实现实时监控,在检测到人脸时,服务器便通过百度AI提供的人脸识别SDK进行人脸识别,并将人脸识别结果返回给服务器。该研究实现了图像的采集,传输,解码,显示及人脸识别,在局域网内进行了软件的调试和验证。

关键词:视频监控;人工智能;人脸识别;嵌入式系统;网络编程;arm

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2018)28-0182-03

随着社会的不断进步,科学技术的迅猛发展,视频监控已经出现在社会的各个角落,在短短的几十年的时间里,视频技术已经发生了天翻地覆的变化,从早期的模拟监控到数字监控再到如今的远距离视频监控,可以通过网络传将图像数据传输到世界的各个角落。但这已经不能满足某些特定工作的场合的需求,如:交通、金融、医疗、小区门禁等场所都提出了人脸识别的要求,要求系统能够自动检测到图像画面中的人脸,并与图片库中的人脸进行对比,得到最有可能的身份信息。如今自动人脸识别因为其高可接受性受到社会各个部门的青睐,所以此研究的实用价值较高。

1 系统组成介绍

此系统的组成方式如图1所示。此设计主要由三个部分组成,分别为图像数据采集端、本地Linux服务器和百度AI服务器。各个部分的详细分析如下:

1)图像数据采集端是一个JZ2440开发板,该开发板的主控芯片是S3C2440,是一款由Samsung半导体公司推出的高性能、低功耗、高集成度并具有工业级温度范围和性能的微处理器,该芯片的主频高达533MHZ,具有较低的内核电压。此芯片运行速度较快,功耗较低,非常适合此系统设计。摄像头采用的是UVC摄像头,该摄像头输出是jepg格式的图片帧对摄像头的初始化后,开发板就不断地采集图像数据,并将采集的图片数据通过UDP网络传输给本地Linux服务器,同时将采集到的jpeg格式的图片帧通过libjpeg解码成RGB565的图片数据显示在LCD上。并在进行了人脸识别之后,将人脸识别的结果显示在LCD上。

2)本地Linux服务器是搭建在Ubuntu16.04上,使用Qt5.5搭建。Qt的良好封装机制使得Qt的模块化程度非常高,可重用性较好,对于用户开发来说是非常方便的,可以快速地搭建起服务器。并且,Qt使用第三方开源库非常方便,能够轻松的加入OpenCV库和使用百度AI的人脸识别的SDK需要的第三方库:lcurl、lcrypto、ljsoncpp。

此部分主要负责接收开发板传输过来的jpeg格式的图像数据,并通过OpenCV视觉库将jpeg格式的图片解码成RGB888格式的数据并显示出来。当OpenCV检测到图像中有人脸之后便将当前的图片帧传给百度AI服务器,百度AI然后将人脸识别的结果返回给本地Linux服务器并显示,本地Linux服务器同时将人脸识别的结果通过tcp/ip协议传送给开发板。

3)百度AI提供了一套开放的人脸识别的算法,并提供了SDK,方便开发人员开发。开发人员首先在百度AI创建一个应用,百度AI会提供一个API Key和Secret Key关联此应用。在进行人脸识别之前首先往这个应用上传一组人脸库,在进行人脸识别时便将采集到的人脸和人脸库中的人脸对比,返回相似度最高的人脸,可以通过返回值中的“scores”来判断是否为一个人,此值得变化范围为0到100。

2 系统软件设计

此系统的软件设计主要包括两个部分的软件设计:数据采集端的软件设计和本地Linux服务器端的软件设计。为了实现人机交互界面数据采集端和本地Linux服务器端的软件设计都是基于Qt编写的。

2.1 数据采集端的软件设计

数据采集端的软件流程如图2所示,开发板上电后首先便是启动嵌入式Linux系统,为了能使UVC摄像头能够正常运行我们要将UVC驱动编译进内核,内核版本选用的是linux-3.4.2。为了能够解码jpeg格式的图像数据,我们事先需要交叉编译libjpeg并移植到开发板上,libjpeg的版本是libjpeg-turbo-1.2.1,交叉编译工具的版本为arm-linux-gcc4.4.3,移植到开发板的Qt版本为qt-everywhere-opensource-src-5.6.0。

程序执行后,首先便进行了UDP发送端和TCP/IP客户端的设置,UDP用来发送图像数据,TCP/IP用来接收本地Linux服务器传来的人脸识别的结果信息。UDP不提供可靠性的传输,但它传输速度很快,对于图像的传输来说,传输数据量大,对于可靠性要求不严,所以我们选用UDP来传送图像数据。TCP/IP提供的是可靠的数据传输,对于识别结果来说,我们需要其传输可靠,所以我们选用TCP/IP传输结果信息。

接下来是对摄像头的初始化工作,为了能减小图像传输占用的带宽,我们设置摄像头的输出的图片帧大小为320*240,但开发板的LCD大小为270*272,所以还需要将采集大的图片进行放大处理以实现LCD的全屏显示,该设计采用的图像缩放算法为近邻取样插值法。

最后便是对图像的采集、传输、解码、显示。对于采集到的每一幀图片,先通过UDP传输给本地Linux服务器,然后对这帧图片进行解码并显示在开发板的LCD上。使用开源库libjpeg对图片帧进行解码,需要注意的是,对于从内存中读取jpeg图片数据和从文件中读取jpeg图片数据使用的是libjpeg库里两个不同的函数,分别为jpeg_mem_src()和jpeg_stdio_src(),在此设计中,直接使用的是内存中的数据,所以使用jpeg_mem_src()对图片进行解码。

当开发板接收到本地Linux服务器发送的人脸识别的结果时,便暂停在LCD上显示摄像头采集的数据,将接收到的结果显示在LCD上,显示结果5秒钟之后便继续显示摄像头采集到的数据。

2.2 本地Linux服务器软件设计

本地Linux服务器端的软件流程如图3所示,此设计中服务器端的软件需要用到opencv库和百度AI提供的人脸识别的c++的SDK,而SDK又需要用到另外三个开源库lcurl、lcrypto、ljsoncpp,所以我们在Linux平台上安装好这四个库,其版本分别为opencv-3.2.0、curl_7.47.0-1ubuntu2.5、OpenSSL_1.0.2g-1ubuntu4.10、jsoncpp-1.6.5。

程序运行时,首先便设置了UDP接收端和TCP/IP服务器端,分别负责接收图像数据和发送人脸识别的结果。

接下来便是接收来着开发板的图片帧数据,通过opencv来对jpeg格式的图片帧进行解码,解码成RGB888格式的数据,然后显示在Qt的QLbale控件上,对于直接从内存中获得图片数据,在该设计中使用的是imdecode()函数。

在本程序中有两种人脸识别的模式,分别是手动操作和自动检测。程序运行时,Linux服务器端显示的是某处的实时监控,如果运行在手动模式,当需要进行人脸识别时,由操作者手动操作,调用百度AI人脸识别的SDK来进行人脸识别;当运行在自动模式时,通过opencv来检测画面中是否有人脸,如果发现人脸,则自动调用SDK来进行人脸识别,在本设计中使用的是Haar特征分类器来检测画面中是否含有人脸,在opencv3中此特征分类器已经被训练好,可以方便的使用它。为了节约系统资源,提高软件运行效率,运行在自动模式时并不是对每一帧图片进行人脸检测,在此设计中是隔2秒检测一下图像中是否含有人脸。

当操作者发现图像中有人脸或者是opencv检测到图片中有人脸掉用了SDK后,本地Linux服务器会接收来自百度AI服务器返回来的消息并显示出来,同时也会将检测见过通过TCP/IP协议发送给开发板,供其显示。

除此主要功能外,服务器端还有对图像的拍照、录像功能,对百度AI的人脸库有增加、删除、查询等功能。在百度AI服务端,人脸库是由“组”组成,“组”又是由各个“人脸”组成,“人脸”又包含“uid”和“user_info”两个信息。在同一“组”中,是允许两个同样“uid”的“人脸”存在的,为了方便的管理人脸库中的人员信息,防止此种情况的发生,在此设计中将人脸库的人员信息同样储存了一份在本地数据库中,当要添加人脸库中的人员时首先查询本地数据库是否还有此“uid”,若有,则拒绝添加,同样,当删除某一个人员时,若本地数据库中没有此“uid”时则拒绝删除,这里使用的数据库为sqlite3。

3 结果测试

3.1 当没有进行人脸识别时,采集端和Linux服务器的显示

采集端显示如图4所示:

本地Linux服务器端的显示如图5所示:

在此情况下采集端和本地Linux服务器显示的是监控处的实时画面。

3.2 当采集到人脸并进行了人脸识别的显示如下所示

采集端的显示如图6所示:

调用百度AI人脸识别的SDK之后,百度AI会返回人脸库中与识别人脸相似度最高的人脸信息。在结果中,“log_id”表示每次识别的日志id,每次识别的“log_id”都不一样;“faceliveness”活体分数,主要用于判断是否为二次翻拍,限制用户用翻拍照片来进行识别,百度AI提供的参考阈值为0.393241,当“faceliveness”的值大于此阈值时,则表明检测到的是活体;“group_id”表示返回的人脸储存在百度AI人脸库的哪个组中,在该设计中,将人脸都储存在组名为“group_1”的组中;“scores”表示返回的人脸和被检测的人脸的相似程度,此结果的变化范围为0到100,在实际使用时,到分数高于85时则可判断为同一个人;“uid”和“user_info”则分别表示,在进行人脸注册时所填写的人员id和人员信息。

4 结论与展望

本文主要研究了图像的传输和百度AI人脸识别的相关技术,基本实现了视频监控和人脸识别的相关功能。但也有不足之处,jpeg格式的图片数据与rgb格式的图片数据相比虽然占用更少的空间,不断传输jpeg格式的图片帧来实现视频监控依然占用了较大的网络带宽,在今后的研究中可以将图片帧编码成H.264格式来传输视频流,则会使系统占用更少的带宽和更加的稳定可靠。

参考文献:

[1] 余金遥.基于GPRS的图像数据无线传输系统研究[J].电脑知识与技术,2017,13(28):201-203.

[2] 王宝珠,程杰.基于ARM11的视频监控系统的设计[J].电子与设计工程,2013(3).

[3] 塔娜.基于ARM的人脸识别系统设计与实现[D].长春:东北师范大学,2009.

[4] 刘恒洋,王森.基于ARM的视频监控系统的设计与实现[J].微计算机信息,2007,23(7).

[5] (美)理查德·史蒂文斯,(美)拉戈.UNIX環境高级编程[M].北京:人民邮电出版社,2015.

[6] 杨树青,王欢.Linux环境下C编程指南[M].北京:清华大学出版社,2008.

[7] (美)福达.SQL必知必会[M].北京:人民邮电出版社,2013.

[8] 霍亚飞.Qt Creator快速入门[M].北京:北京航空航天大学出版社,2016.

【通联编辑:唐一东】

猜你喜欢
视频监控嵌入式系统人脸识别
人脸识别 等
揭开人脸识别的神秘面纱
嵌入式系统课程“中断、异常与事件”教学实践及启示
面向实践创新人才培养的嵌入式系统教学研究
基于类独立核稀疏表示的鲁棒人脸识别
基于K-L变换和平均近邻法的人脸识别