林宛杨
(福建船政交通职业学院信息与智慧交通学院,福州 350007)
新冠病毒的防疫常态化需要强化公共卫生体系"软件"和"硬件"建设[1]。目前,我国大多数主要公共场所和重要交通枢纽出入口的在线测温技术已配备完善,但由于防控意识淡薄,仍然存在部分人员不带口罩出入这些节点的情况。随着机器视觉技术的不断发展,基于机器视觉的目标检测技术逐渐走进人们的视野。目标检测作为机器视觉一个重要研究分支热点,通过对目标场景对象进行分类和定位的应用十分广泛[2-3]。基于深度学习的目标检测技术的发展迅速[4],对人脸口罩检测还主要集中在算法方面[5],为将基于机器视觉的目标检测技术融入到疫情防控中,开发出实用成本低[6]的基于机器视觉的目标检测测试装置提供的基础。该装置以检测人体有无佩戴口罩作为实施目标,为将基于机器视觉的目标检测技术、图像分类、图像降噪和嵌入式应用技术和等专业融入到实际的工程项目中,将所学的知识在工程项目中实现,具有实际应用意义[7]。
本项目是基于机器视觉和嵌入式系统检测人脸是否佩戴口罩的检测装置,该装置由下位机和上位机2部分组成,如图1所示。下位机的组成主要包括嵌入式主控单元(Exynos4412核心板)、LCD显示、以太网通信和图像采集4大模块;上位机为1台服务器,用于接收图像和检测目标。检测装置的下位机如图2所示,首先通过USB摄像头采集图像,在LCD显示屏上显示图像,并通过以太网将图像传输到上位机中,上位机对图像进行实时处理,检测出人体是否佩戴口罩。
图2 检测装置下位机图Fig.2 Lower position machine system of the detection device
本检测装置主控核心版的模块组成如图3所示。采用三星Exynos4412芯片作为CPU,Cortex-A9四核架构,运行主频最大可高达1.6 GHz,配备2 GB的DDR3内存,8GB的EMMC闪存。Exynos4412内部集成了Mail-400 MP高性能图形处理器,其主频高达400 MHz,支持H.264/H.263、MPEG-4/MPEG2等视频编解码及支持2D、3D图形加速[8-9]。采用低功耗电源管理芯片S5M8767,耗电量极小,续航时间长,高效节能。
图3 检测装置核心板模块Fig.3 Core board module of the detection device
本检测装置使用23.33 cm(7寸)的RGB高清屏作为显示图像的部分,具有1 024×600的分辨率,支持多点触摸的电容屏,可用于显示QT图形界面。其接口电路图如图4所示。
图4 检测装置的LCD模块连接Fig.4 LCD module connection of the detection device
检测装置的以太网模块采用DM9621ANP芯片,该芯片具有USB接口、以太网、EEPROM接口、时钟、电源输入等功能[10],此外,具有超低功耗的特点。在作为以太网时,可支持IEEE802.3u及IEEE802.3标准的10/100 Mb·s-1以太网LAN功能,支持RMII接口或8PIN的GPIO,对链接状态变更、唤醒帧及Magic包的支持,支持offload检查和生成TCP/UDP/IP校验码,可用于网络通信,本装置使用以太网进行图像传输。。
检测装置的图像采集模块采用的是USB免驱摄像头,使用的是130万高清工业芯片,1 280×720的 分 辨 率,可 达30帧/s的 图 像 输 出,支 持MJPG、YUV22种国际标准UVC协议输出,兼容Windows、Linux、Android等三大主流系统,可在这些系统上直接使用[11]。直接将该摄像头接入嵌入式板的USB接口即可使用,支持USB2.0接口协议,不需要额外安装驱动。其接口电路图如图5所示。
图5 检测装置的USB接口引脚Fig.5 USBport pin of the detection device
本检测装置的开发环境搭建是基于Ubuntu16.04系统下,先将所需要用到的文件在该系统下交叉编译再移植到ARM板中。嵌入式Linux主要由内核引导程序Bootloader、内核参数区(Kernel parameters)、Linux内核、Linux根文件系统4部分组成。Bootloader是系统上电的后运行的第一个程序,主要用来初始化外设和处理器,依赖于硬件;Bootloader最后调用Linux内核,将Linux内核拷贝到RAM里面去,最后安装目标文件系统。
OpenCV是一个计算机视觉开源库,可以运行在Linux、Windows、Android等系统上,OpenCV用C++语言编写,但具有C++,Python,Java和MATLAB接口。该装置在上位机对图像进行处理,因此需要在上位机Ubuntu16.04系统下安装OpenCV库,本装置安装的版本为OpenCV3.4.1。在嵌入式Linux系统中,没有类似于通用计算机的图形用户接口,不能直接使用OpenCV库显示图像。在嵌入式系统端需引入可移植性高、高性能和高可靠性的图形用户界面。
QT是一种可跨平台开发的C++图形面向对象的框架,满足嵌入式系统的要求,便于开发图形用户界面,QT编写的程序可移植到不同的平台而不需要修改代码,移植性高[7]。可利用QT作为中间媒介,因此引入QT/E库,显示图像信息。开发应用程序之前,需在宿主机配置QT的开发环境,再将QT库进行交叉编译并移植到开发板上,使用QT5.7版本开发应用程序。
本装置分为下位机和上位机2部分,由下位机采集实时图像,通过以太网传输图像视频到上位机中。使用Socket套接字作为通信接口,这就需要用下位机作为客户端,上位机作为服务端。Socket作为应用层与TCP/IP协议通信的中间软件抽象层的一组接口,将复杂的TCP/IP协议隐藏在Socket接口后面,无需深入了解TCP/UDP协议,使用简单的Socket接口编程,就可以传输图像数据。
Socket的工作流程如图6所示,在服务器端,先初始化Socket,再与端口绑定(bind),接着对端口进行监听(listen),再调用accept阻塞,服务端等待客户端连接。当客户端初始化Socket时,客户端连接服务端(connect),与服务器端建立连接,客户端请求发送数据,服务端接收请求并处理,并回应数据给客户端,客户端读取数据后关闭连接,一次交互结束。
图6 Socket的工作流程图Fig.6 Work flow chart of Socket
V4L2是为Linux操作系统设计的编程接口,是Linux系统中关于视频设备的内核驱动,通过V4L2视频内核驱动,可以像访问普通文件一样访问视频设备。V4L2是针对UVC免驱USB设备的编程框架,主要用于采集USB摄像头,可用于多媒体的开发,如音频等。
V4L2有内存映射(mmap)和直接读取(read)2种视频采集的方式,前者主要用于对连续视频数据的采集,后者主要用于静态图片数据的采集。在该装置中,需要实时采集图像信息,因此,在下位机中使用内存映射的方式采集图像。利用V4L2接口采集视频的流程图如图7所示,首先需打开摄像头设备,设置帧率、制式(PAL或NTSC)、存储格式(YUV或RGB)以及窗口大小(宽、高和横纵坐标)等参数,向驱动申请帧缓冲,并将申请到的帧缓冲映射到用户空间中(mmap),将缓冲区加入队列中后开始视频的采集,从队列中取出获得图像的缓冲区[12],然后将缓冲区重新加入到队列中实现连续循环采集,到最后关闭采集视频的设备[13]。
图7 V4L2接口采集视频流程图Fig.7 Flowchart for V4L2 interface video collection
由于需要检测人体有无佩戴口罩,属于二分类的问题,可利用图像的级联分类器,对检测对象进行检测。基本原理:首先使用OpenCV的Haar,绘制人脸的区域,包括正脸或是侧脸;其次在通过HSV阈值提取人脸的肤色;最终通过肤色轮廓面积与人脸ROI面积比值判断是否佩戴口罩。
采用Haar基于通过大量人脸图像样本构造人脸模式空间的统计方法,将人脸作为一个整体模式的二维像素矩阵,根据相似度量来判断人脸是否存在。由于这是一种基于树的目标检测技术,利用大量样本的Haar特征进行分类器训练。主要方式:将1个矩形放到人脸区域上,通过白色区域的像素和减去黑色区域的像素和,得到的值为人脸特征值,如果这个矩形放到1个非人脸区域,那么计算出的特征值应该和人脸特征值是不一样的,通过方块的目的就是把人脸特征量化,区分人脸和非人脸。由于人与摄像头的远近和人脸的大小问题,还需要适当改变初始化矩形框的大小及矩形框大小的合并。以同时为了增加区分度,采用Adaboost强分类算法级联分类器。将若干个强分类器由简单到复杂排列,通过训练每层强分类器的检测率值和误识率值达到指定要求经过训练使每个强分类器都有较高检测率。最后采用积分图
就达到只遍历一次图像就可以求出图像中所有区域像素和的快速算法,加快识别的速度。
当有部分人脸遮挡和侧脸情况,需要进一步识别人脸位置,建议使用OpenCV自带的opencv_face_detector_uint8.pb改进。
同理采用Haar的Adaboost算法获得人脸的肤色HSV值、肤色轮廓面积、脸ROI面积。训练出数据样本。当准备好需准备正负样本,设置好相关内容,利用OpenCV的训练文件即可训练特征,结果得出一个.xml的分类器,加载此文件,就可以在程序中检测对象。
该检测装置需使用2个级联分类器,先使用人脸分类器,判断图像有无人脸,当检测到人脸时,再使用口罩的分类器,判断有无佩戴口罩。
整体软件设计如图8所示,首先,在下位机部分(客户端),使用USB摄像头作为采集视频的设备,通过V4L2接口采集图像信息,并且利用QT图形用户程序,将图像显示在LCD屏上,接着下位机使用Socket套接字对视频进行传输到上位机中。上位机接收到视频,使用已经训练好的人脸检测器和口罩检测器对视频进行检测,并把检测结果通过Socket通信返回到下位机中。
图8 系统工作流程图Fig.8 Flowchart for thesystem
服务器端(上位机)程序流程图如图9所示,先初始化Socket通信,然后对端口进行监听,并判断与客户端(下位机)是否已连接,若未连接,需继续监听。
图9 上位机程序设计流程图Fig.9 Flowchart for upper position machine system program design
当已连接到客户端,则接收从客户端发送的视频数据;接收到图像数据后,进行机器视觉的识别。利用人脸检测器对图像进行检测,为输入图片输出大量的子窗口图像,这些子窗口图像经过筛选式级联分类器会不断地被每一个节点筛选,抛弃或通过。OpenCV的分类算法判断人脸或是非人脸,判断有无人脸,若图像中未出现人脸,则产生结果输出:“NO People!!!”;若图像中可检测到人脸。
进入下一级分类器,再利用口罩检测器检测有无佩戴口罩,即通过肤色轮廓面积与人脸ROI面积比值的训练样本进行测试,若检测到有佩戴口罩,则结果输出:“YES!!Please Access!!”,代表已戴口罩,可以通行;若人脸中未检测到口罩,则结果输出:“NO Mask!!NO Way”,代表未佩戴口罩,不能通行。
最后把结果返回到客户端中,在下位机中,当返 回 的 结 果 为“NO People!!!”和“YES!!Please Access!!”,蜂鸣器不报警,可以通行,当返回的结果为“NO Mask!!NO Way”,则蜂鸣器报警,提示需佩戴好口罩。如果有特殊情况未正确标注则进行人工干预及将错误样本标注存档,以便进行下一次产品升级。
上位机界面如图10所示,左边是用于接收图像的显示框,右边可设置端口号,下方有个显示框,可显示识别检测后的信息。在上位机点击“侦听”按钮,表示正在等待客户端的连接,当客户端连接成功之后,上位机即可接收到图像,并显示在QT的界面上,并不断识别检测人脸有无佩戴口罩。
图10 上位机界面Fig.10 Upper computer interface
(1)未佩戴口罩。图11所示为下位机显示部分。在上位机中,当界面有人脸出现时,但未佩戴口罩,会在人脸的位置出现一个红色的矩形框,另外右边下方的消息框中显示:“NO,Mask!!NO Way”,表示未佩戴口罩。在下位机中,消息框也会显示同样的消息:“NO Mask!!NO Way”,并且在下位机中蜂鸣器报警。
图11 检测到未佩戴口罩时Fig.11 When no mask is detected
(2)已佩戴口罩。如图12所示,当人体佩戴好口罩时,在上位机中绘制一个蓝色的矩形框,并在右边的消息框中显示:“YES!!Please Access!!”,表示已佩戴好口罩,可以进入施工现场。在下位机部分的消息框中,也显示:“YES!!Please Access!!”,同上位机同步,并且蜂鸣器不报警。
图12 检测到已佩戴口罩时Fig.12 When a mask is detected
(3)无人通过时。如图13所示,当没有人通过时,下位机的消息框会显示:“NO People!!!”,表示无人通过,蜂鸣器不报警。
图13 无人通过时Fig.13 When no one passes
该装置的底层平台是基于嵌入式Linux搭建而成的,操作人员只需烧写相应的内核文件即可配置完成底层环境。该装置的程序设计是基于QT实现的,该图形用户界面具有良好的移植性和阅读性,操作人员可轻松上手该编程环境,不仅可以在该平台上实现图像识别,还可利用其实现音频播放、云服务器智能家居及智能网关等功能,利用LCD屏作为可视界面。
该测试装置上位机引入了OpenCV机器视觉开源库,可做更多有关图像处理的项目[14]。在此装置的基础上,可以实现更多有关目标检测技术,例如行人检测、人体口罩佩戴检测等;此外,还可实现其他与图像处理有关的实践项目,例如人脸识别门禁系统,提取人脸特征进行识别;还可以利用其作为视频监控、停车场车牌识别门禁系统等[15]。该测试装置为操作人员提供了可以发挥创新力和实践能力的平台。
本测试装置是结合机器视觉及嵌入式应用技术,开发了基于机器视觉检测人体有无佩戴口罩的检测系统,下位机完成了对图像的采集和传输,上位机完成了检测有佩戴口罩、无佩戴口罩及无人的3种结果,并把该结果返回给下位机。在智能制造等产业中,基于机器视觉的检测技术具有准确度高、实效性好的优点,在实际生活中应用十分广泛。