曹郁辉,谢宽志
(湖北工业职业技术学院 图文信息中心,湖北 十堰 442000)
在人才招聘及考试的网上报名过程中,报名人员上传的照片要用于打印报名表、打印准考证、办理合格证,因此对照片有一定的要求,比如水平与垂直像素的多少、背景颜色、头部比例,都要满足相应的要求。中国人事考试网专门提供了“照片处理工具”,为报名人员提供照片的审核和处理,以保证报名人员上传的照片合乎报名要求。但我们在实际报名工作中发现,由于报名人员素质参差不齐,很多报名人员上传的照片并没有用“照片处理工具”进行审核和处理,上传的照片千奇百怪,相当比例的照片不符合要求,给后台审核人员的工作造成了一定的负担。
为减轻后台审核人员的工作负担,我们在为某单位制作的基于Java Web的报名系统中,设计了一个照片审核功能,当报名人员上传的照片不符合报名要求时,会向报名用户发出警告信息,拒绝上传,直到报名人员上传的照片合格。该功能使用图像识别技术,识别照片中的头像;使用图像处理技术,分辨背景颜色;使用ajax技术,将后台审核结果反馈给报名人员。通过该功能的使用,大大地减轻了后台审核人员人工审核的负担,提高了工作效率。
我们根据几次报名情况,对报名人员上传照片进行了分析,招聘类别不同,上传照片的合格率也不同,最差的情况下,约有百分之八十的照片不合格。虽然网站上醒目地告知了上传照片的要求,但很多报名人员基本无视。我们要求的照片是标准证件照,尺寸是水平方向295像素、垂直方向413像素,背景颜色为红、蓝、白三种颜色之一。不合格的照片中百分之九十是尺寸不符合要求。剩余不合格的情况,一部分是头部比例不合适,另一部分是背景颜色不合格。非证件照可能同时存在头部比例和背景颜色不合适的情况。
图1 上传照片的部分实例
针对这些情况,我们采用开源软件库OpenCV,设计一个照片审核功能。利用OpenCV人脸检测的功能,审核照片是否是证件照及人脸比例是否合适;利用OpenCV的图像处理功能,审核照片尺寸和背景颜色是否合乎要求。OpenCV是一个人工智能领域广泛使用的开源计算机视觉和机器学习软件库,该软件库提供了大量图像处理和计算机视觉的通用算法,而且可以跨平台使用,操作系统平台支持windows、linux、Mac OS,处理器硬件支持intel处理器、ARM处理器等。因此,我们的设计方法不仅可以用于基于Java Web的报名系统,对于.net、php甚至python的报名系统都有参考价值[1]。
OpenCV在windows操作系统下的安装十分简单,直接从OpenCV官网上下载安装即可。但我们制作的Java Web的报名系统是在linux操作系统下部署的,需要在linux操作系统下安装OpenCV。linux操作系统安装OpenCV的过程比较繁琐,耗时也比较长,而且还有失败的几率,需要先安装相应的依赖库,再安装编译器对OpenCV源码进行编译。不同的linux操作系统,安装依赖库的方法可能会有不同,不同版本的OpenCV,使用的编译器的版本也不尽相同。如果每次部署报名系统网站都要进行这样的操作,会使照片审核功能的实用性大打折扣。为此,我们使用Docker技术,利用Docker可以快速交付的特点,将报名网站和OpenCV同时部署在Docker容器中,打包成Docker镜像,这样就可以很方便地进行重用了,解决了每次部署报名系统网站都要安装OpenCV的问题[2]。
Docker操作系统基础镜像,建议选择CentOS7或最新版的Ubuntu,OpenCV针对这两种操作系统有比较详细的安装指南。编译的时候要注意,cmake指令要带参数-DBUILD_TESTS=OFF,这样才能编译出Java Web所需要的jar包。
(1)照片大小的审核。使用imread方法读取照片,程序举例如下:
Mat image = Imgcodecs.imread(src);
然后使用方法image.height()、image.width()就可以得到照片的水平像素和垂直像素,如果不满足要求,说明照片尺寸不合格。
(2)人脸检测与审核。OpenCV提供了四个经过大数据集训练好的人脸分类器,其中的haarcascade_frontalface_alt2.xml比较适合本项目。
我们在上一步的基础上,首先使用haarcascade_frontalface_alt2.xml分类器初始化一个级联分类器CascadeClassifier对象faceDetector,再使用detectMultiScale方法。程序举例如下:
String resourcePath = getClass().getResource("/haarcascade_frontalface_alt2.xml").getPath().substring(1);
CascadeClassifier faceDetector = new CascadeClassifier(resourcePath);
MatOfRect faceDetections = new MatOfRect();
faceDetector.detectMultiScale(image, faceDetections);
根据faceDetections结果进行判断,如果faceDetections为空,说明没有检测到人脸,照片不是证件照;如果faceDetections不为空,则对faceDetections进行枚举,如果faceDetections枚举的数量大于1,说明可能有误检测的情况,选择人脸框图最大的一个来进行判断。
图2 出现误检测的情况
枚举方式:
for (Rect rect : faceDetections.toArray())
rect为人脸矩形框,属性rect.x、rect.y为矩形框左上角坐标,属性rect.height、rect.width为矩形框的高和宽。通过这四个属性就可以判断人脸比例是否合适了。
根据我们的网上报名系统对照片的要求,设定审核参数如下:
rect.y为人脸矩形框的上基线,该值大于50,小于150。
rect.x和rect.x+rect.width分别为人脸矩形框的左基线和右基线,rect.x大于30,rect.x+rect.width小于265。
rect.y+rect.height为人脸矩形框的下基线,大于220,小于340。
rect.width为人脸矩形框的宽度,大于110,小于235。
如果照片的背景不是纯色的,很难抠出一个完整的背景来。因此我们采用对背景进行抽样的方式。这种方式虽然不是很完善,但还是可以审核掉一大批背景颜色不合格的照片。抽样的区域,我们选择左上角和右上角两个同为水平30像素、垂直100像素的矩形区域,逐点进行遍历。颜色参考以点(2, 2)的颜色为基准,如果该点的颜色在红、蓝、白这三种颜色的范围内,并且其他抽样点的颜色与该点的颜色在一个容差范围内,则可以认为照片背景是合格的。
报名人员上传的照片都是以红、绿、蓝三原色作为色彩空间的。为了能够判断照片上像素点的颜色范围,我们需要将红、绿、蓝的色彩空间(即RGB色彩空间)转换为色度、饱和度、亮度的色彩空间(即HSV色彩空间)[3]。
图3 RGB色彩空间和HSV色彩空间
在OpenCV中可以进行多种色彩空间转换,用来表示HSV的三个数值的范围都是0到255。而实际使用当中,H(色度)的范围是0到360,S(饱合度)和V(亮度)的范围都是0到100,因此需要对OpenCV的HSV三个数值进行换算。
将RGB色彩空间转换为HSV色彩空间,并获取点(x, y)的HSV颜色值的程序举例如下:
Mat image_hsv = new Mat(image.rows(), image.cols(), image.type());
Imgproc.cvtColor(image, image_hsv, Imgproc.COLOR_BGR2HSV);
double[] point_hsv = image_hsv.get(x, y);
Int point_h = (int) point_hsv[0]*2;
Int point_s = (int) point_hsv[1]*100/255;
Int point_v = (int) point_hsv[2]*100/255;
考虑到照片的色差,我们设定的用于审核照片的红、蓝、白三种颜色的范围值见表1:
表1 用于审核照片的红、蓝、白三种颜色的范围值
OpenCV使用非常广泛,在安防、车辆管理、智能驾驶等与图像及视觉相关的人工智能领域都能看到它的身影,但在Java Web中应用的例子还不多。我们通过这个案例可以看到,引入人工智能可以大大提高工作效率。OpenCV丰富而完善的图像识别功能和图像处理功能,为我们开发照片审核功能提供了极大的方便。使用该功能大大降低了后台审核人员的工作量,同时也提高了报名人员认真对待报名工作的意识,保证了招聘人才的质量。