智慧人脸识别系统中间件的实现和优化
来源:用户上传
作者:
摘要:针对车道安检场景,实现了智慧人脸识别系统中间件子系统,起到了从前端硬件采集到调用人脸比对引擎比对接口的一个桥梁作用。该中间件结合多线程技术、内存缓存技术,极大提高了安检的效率。
关键词:智慧人脸识别系统中间件;人脸识别;终端程序;比对程序;人脸识别引擎;人脸相机
中图分类号:TP18 文献标识码:A
文章编号:1009-3044(2019)36-0184-03
1背景
人脸识别技术已经非常成熟,现在已经可以非常容易得实现在14亿人口库中毫秒级识别出相似度最高的多张人脸,市面上提供人脸识别引擎的公司有很多家,比如商汤、依图。这些公司通过提供API接口让用户直接调用实现人脸去重和人脸识别能力。尽管通过购买人脸识别引擎可以拥有人脸识别能力,但是针对不同的使用场景,需要实现不同业务逻辑的人脸中间件。人脸中间件的作用是从前端获取人脸数据、处理重复人脸、调用人脸引擎实现人脸识别,由此可以看卅人脸中间件起到“承上启下”的作用。人脸中间件如果实现不好,会成为整个系统的木桶短板,影响整个智慧人脸识别系统的性能和用户体验。因此,如何更好地实现人脸中间件,是一个值得考虑的问题。本文将以车辆人员安检为例,叙述如何更好地实现人脸中间件。
2智慧人脸识别系统整体架构
2.1系统架构
智慧人脸识别系统由前端采集子系统、中间件子系统和人脸比对引擎子系统三部分组成。其中前端采集子系统由车辆停车区安装的四台人脸相机组成,完成车辆乘客人脸的采集;中间件子系统由终端程序和比对程序组成,终端程序负责接管人脸相机,获取人脸相机采集的人脸图片,将人脸图片作为参数调用比对程序接口,根据比对程序返回的人脸状态和人脸身份信息显示到人脸显示终端上;人脸比对程序完成同一辆车的人脸去重和人脸比对功能,通过调用第三方提供的人脸比对引擎获得人脸图片的状态和身份信息。人脸比对引擎子系统是指第三方提供的人脸比对服务器,通过调用给定API可以完成人脸图片毫秒级比对。
三个子系统的组成关系如图l所示。
2.2系统功能模块
如图2所示,智慧人脸识别系统分为13个功能模块,每个模块完成一个具体功能。其中前端采集模块完成人脸、车牌的采集,人脸调优模块用来提高人脸相机输出的人脸图片质量,以达到第三方接口需提出的人脸图片质量的最低要求。
终端程序由获取人脸模块、调用比对程序模块、终端显示模块三大模块组成。完成从人脸相机获取人脸图片、调用比对程序获取人脸状态和身份信息、在显示终端显示出来最终人脸结果三个功能。
比对程序由人脸去重模块、人脸比对模块、入库缓存模块、定时删除人脸库模块组成。人脸去重用来将一辆车上的人脸进行去重,同一张人脸只显示一次,只调用一次人脸比对模块;人脸比对模块用来调用人脸比对引擎,返回人脸的具体状态;入库缓存用来存储每辆车去重时的中间结果,定时删除;定时删除人脸库模块用来定时删除超过一定时间的人脸库,用来防止人脸比对引擎人脸库数量无休止增加。
人脸识别引擎子系统由人脸库相关接口和人脸比对相关接口组成。其中人脸库接口由建立人脸库、删除指定人脸库、向人脸库添加不重复人脸三个接口组成,完成人脸的去重功能。人脸比对接口包含人脸比对接口和获取人脸对应信息接口,完成人脸状态和身份信息获取。
2.3系统数据流
智慧人脸识别系统有人脸图片、车牌号码两种类型的数据。终端程序通过调用前端人脸相机和车牌相机获取车牌号码和对应的人脸图片,将此数据作为参数调用比对程序接口,比对程序接口会借助Redis数据库作为临时缓存,判断此车牌号对应的人脸图片是否重复,不重复就调用人脸比对引擎的人脸库接口,建立人脸库,将人脸存入刚建立的人脸库,并将人脸库唯一id存入车牌号为key的redis数据库中;如果重复直接返回人脸重复的结果给终端程序让其不显示此人脸。人脸不重复的话会继续调用人脸比对接口,判断此人脸状态和身份信息,并将结果返回给终端程序。终端程序获得数据后,直接在人脸终端程序上显示出来。
系统数据流程如图3所示。
3智慧人脸识别系统中间件的实现及存在问题
3.1中间件一终端程序的实现
终端程序逻辑实现如图4所示。终端程序通过相机SDK初始化人脸和车牌相机,获取到人脸和车牌数据,将这两个数据封装成JSON数据作为参数调用人脸比对程序。
值得注意的是终端程序得到人脸后会串行去请求人脸比对接口,后一张人脸需要等待上一张人脸返回比对结果后才能调用比对接口。如果并行请求人脸比对程序,会造成人脸去重效果特别差。因为现在市面上的人脸相机只能够保证进入相机视野范围内瞳距变化不大情况下只拍摄一张人脸,但没有具有去重效果的人脸相机,因此去重只能够通过人脸比对程序实现,并且人脸相机会拍摄到一个人多个不同角度的人脸图片发送给终端程序。同一张人脸不同角度的照片发送给终端程序,终端程序如果并发调用比对接口,会导致比对程序的去重功能失效,此时终端显示人脸去重效果会特别差。因此,终端程序只能够通过串行调用比对程序接口来保证去重的效果。
终端程序串行调用比对程序接口造成一个问题是显示终端显示人脸比对结果特别慢,显示也是串行一个个顺序显示,用户体验很差。
3.2中間件一比对程序的实现
图5所示是比对程序的流程图。
比对程序通过提供接口供终端程序调用,终端程序发送车牌号和base64的人脸图片调用此接口。
首先比对程序判断车牌号是否在redis数据库已建立对应的key,如果未建立说明此车牌号第一次调用此接口,不需要人脸去重,直接去建立一个新的此车牌号唯一对应的人脸库并将人脸库对应的id存入redis数据库中缓存,继续调用人脸比对引擎提供的人脸比对接口,如果比对接口调用正常,那么将此人脸加入到人脸库当中并返回给前端人脸状态和身份信息(之所以放在比对接口返回之后再添加,是因为之前添加,如果比对接口报错,此时会不让前端显示,那么此人脸下次再抓拍到调用接口会因为已经加入到了人脸库视为重复人脸不让前端显示,就会得不到此人脸对应的信息);如果人脸比对接口调用失败,直接返回给前端结果不让前端显示调用接口失败的人脸图片。 如果已建立,取出此车牌存储的对应人脸库id,判断此id对应的人脸库中此人脸是否重复,不重复的话,调用人脸比对引擎提供的比对接口;重复的话,直接返回给前端结果不让前端显示此重复人脸图片。
3.3存在问题
按照3.1 3.2逻辑实现的人脸中间件会存在一个很严重的问题是,比对程序只有一个对外接口,终端程序只能获取到图片之后串行调用比对程序接口。由于人脸相机是四个同时抓拍人脸,并且每个相机会抓拍同一个人的多张人脸,这就会造成相机上报照片堵塞在终端程序的消息队列。最明显的表现就是终端程序显示结果需要一张张人脸串行显示出来,用户体验差。
如果直接让终端程序每接收到一张人脸图片就开启一个线程调用比对程序接口,此时会发生同一个人的多张人脸没法去重,导致终端显示程序显示多张重复人脸。
4智慧人脸识别系统中间件的优化
4.1终端程序的优化
图6所示是优化后终端程序流程图。
第2章节中实现的中间件,限制终端程序并行调用比对程序的关键是人脸去重需要多线程共享人脸图片。实际上人脸去重时间相较于人脸比对引擎的比对接口返回结果时间是很短的,因此人脸去重串行并不会影响整个中间件的效率。因此图六的终端程序流程图调用的比对程序对外开放了去重和比对两个接口,终端程序串行调用去重接口,并行调用比对接口。
4.2比对程序的优化
图7是优化后比对程序流程图。
比对程序提供去重和比对两个接口。终端程序串行调用去重接口,并行调用比对接口。通过终端程序并行调用和比对程序分为两个接口这两种方式,让人脸中间件速度显著提升。
4.3优化效果
假设一辆小客车有4个乘客,每个人脸相机拍摄3张照片,那么一辆车共上报12张人脸照片;每张人脸图片去重时间大概0.2s,比对时间大概2s。如果按照第2章节的程序来调用,每张照片需要2.2s,共计需要26.4s;如果按照第3章节程序来调用,共计需要4.6s(12*0.2+2.2=4.6s)。效率提升接近6倍。
5结束语
在車辆安检场景下,通过使用智慧人脸识别系统中间件,可以极大提升车辆安检效率,降低用户劳动强度,保证车辆安检时不会造成车辆拥堵情况的发生。
该文叙述的人脸中间件已经通过实践优化过,具有实际的使用价值,并且其对于各个场景下的人脸识别系统中间件的开发都有一定的参考价值和借鉴意义。
参考文献:
[1]王文峰.人脸识别原理与实战[M].北京:电子工业出版社,2018.
[2]王映辉.人脸识别[M].北京:科学出版社,2010.
[3]邱城铨,罗回彬,陈汕,等.智慧校同人脸识别系统的设计与实现[J].现代计算机,2019(7).
【通联编辑:谢媛媛】
收稿日期:2019-10-29
作者简介:李国防,男,山东泰安人,助理工程师,南京邮电大学研究生,研究方向为物联网、大数据;阙中强,男,任职于公安部第一研究所。
转载注明来源:https://www.xzbu.com/8/view-15123540.htm