曹郁輝,謝寬志
(湖北工業(yè)職業(yè)技術學院 圖文信息中心,湖北 十堰 442000)
在人才招聘及考試的網(wǎng)上報名過程中,報名人員上傳的照片要用于打印報名表、打印準考證、辦理合格證,因此對照片有一定的要求,比如水平與垂直像素的多少、背景顏色、頭部比例,都要滿足相應的要求。中國人事考試網(wǎng)專門提供了“照片處理工具”,為報名人員提供照片的審核和處理,以保證報名人員上傳的照片合乎報名要求。但我們在實際報名工作中發(fā)現(xiàn),由于報名人員素質參差不齊,很多報名人員上傳的照片并沒有用“照片處理工具”進行審核和處理,上傳的照片千奇百怪,相當比例的照片不符合要求,給后臺審核人員的工作造成了一定的負擔。
為減輕后臺審核人員的工作負擔,我們在為某單位制作的基于Java Web的報名系統(tǒng)中,設計了一個照片審核功能,當報名人員上傳的照片不符合報名要求時,會向報名用戶發(fā)出警告信息,拒絕上傳,直到報名人員上傳的照片合格。該功能使用圖像識別技術,識別照片中的頭像;使用圖像處理技術,分辨背景顏色;使用ajax技術,將后臺審核結果反饋給報名人員。通過該功能的使用,大大地減輕了后臺審核人員人工審核的負擔,提高了工作效率。
我們根據(jù)幾次報名情況,對報名人員上傳照片進行了分析,招聘類別不同,上傳照片的合格率也不同,最差的情況下,約有百分之八十的照片不合格。雖然網(wǎng)站上醒目地告知了上傳照片的要求,但很多報名人員基本無視。我們要求的照片是標準證件照,尺寸是水平方向295像素、垂直方向413像素,背景顏色為紅、藍、白三種顏色之一。不合格的照片中百分之九十是尺寸不符合要求。剩余不合格的情況,一部分是頭部比例不合適,另一部分是背景顏色不合格。非證件照可能同時存在頭部比例和背景顏色不合適的情況。
圖1 上傳照片的部分實例
針對這些情況,我們采用開源軟件庫OpenCV,設計一個照片審核功能。利用OpenCV人臉檢測的功能,審核照片是否是證件照及人臉比例是否合適;利用OpenCV的圖像處理功能,審核照片尺寸和背景顏色是否合乎要求。OpenCV是一個人工智能領域廣泛使用的開源計算機視覺和機器學習軟件庫,該軟件庫提供了大量圖像處理和計算機視覺的通用算法,而且可以跨平臺使用,操作系統(tǒng)平臺支持windows、linux、Mac OS,處理器硬件支持intel處理器、ARM處理器等。因此,我們的設計方法不僅可以用于基于Java Web的報名系統(tǒng),對于.net、php甚至python的報名系統(tǒng)都有參考價值[1]。
OpenCV在windows操作系統(tǒng)下的安裝十分簡單,直接從OpenCV官網(wǎng)上下載安裝即可。但我們制作的Java Web的報名系統(tǒng)是在linux操作系統(tǒng)下部署的,需要在linux操作系統(tǒng)下安裝OpenCV。linux操作系統(tǒng)安裝OpenCV的過程比較繁瑣,耗時也比較長,而且還有失敗的幾率,需要先安裝相應的依賴庫,再安裝編譯器對OpenCV源碼進行編譯。不同的linux操作系統(tǒng),安裝依賴庫的方法可能會有不同,不同版本的OpenCV,使用的編譯器的版本也不盡相同。如果每次部署報名系統(tǒng)網(wǎng)站都要進行這樣的操作,會使照片審核功能的實用性大打折扣。為此,我們使用Docker技術,利用Docker可以快速交付的特點,將報名網(wǎng)站和OpenCV同時部署在Docker容器中,打包成Docker鏡像,這樣就可以很方便地進行重用了,解決了每次部署報名系統(tǒng)網(wǎng)站都要安裝OpenCV的問題[2]。
Docker操作系統(tǒng)基礎鏡像,建議選擇CentOS7或最新版的Ubuntu,OpenCV針對這兩種操作系統(tǒng)有比較詳細的安裝指南。編譯的時候要注意,cmake指令要帶參數(shù)-DBUILD_TESTS=OFF,這樣才能編譯出Java Web所需要的jar包。
(1)照片大小的審核。使用imread方法讀取照片,程序舉例如下:
Mat image = Imgcodecs.imread(src);
然后使用方法image.height()、image.width()就可以得到照片的水平像素和垂直像素,如果不滿足要求,說明照片尺寸不合格。
(2)人臉檢測與審核。OpenCV提供了四個經(jīng)過大數(shù)據(jù)集訓練好的人臉分類器,其中的haarcascade_frontalface_alt2.xml比較適合本項目。
我們在上一步的基礎上,首先使用haarcascade_frontalface_alt2.xml分類器初始化一個級聯(lián)分類器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);
根據(jù)faceDetections結果進行判斷,如果faceDetections為空,說明沒有檢測到人臉,照片不是證件照;如果faceDetections不為空,則對faceDetections進行枚舉,如果faceDetections枚舉的數(shù)量大于1,說明可能有誤檢測的情況,選擇人臉框圖最大的一個來進行判斷。
圖2 出現(xiàn)誤檢測的情況
枚舉方式:
for (Rect rect : faceDetections.toArray())
rect為人臉矩形框,屬性rect.x、rect.y為矩形框左上角坐標,屬性rect.height、rect.width為矩形框的高和寬。通過這四個屬性就可以判斷人臉比例是否合適了。
根據(jù)我們的網(wǎng)上報名系統(tǒng)對照片的要求,設定審核參數(shù)如下:
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。
如果照片的背景不是純色的,很難摳出一個完整的背景來。因此我們采用對背景進行抽樣的方式。這種方式雖然不是很完善,但還是可以審核掉一大批背景顏色不合格的照片。抽樣的區(qū)域,我們選擇左上角和右上角兩個同為水平30像素、垂直100像素的矩形區(qū)域,逐點進行遍歷。顏色參考以點(2, 2)的顏色為基準,如果該點的顏色在紅、藍、白這三種顏色的范圍內,并且其他抽樣點的顏色與該點的顏色在一個容差范圍內,則可以認為照片背景是合格的。
報名人員上傳的照片都是以紅、綠、藍三原色作為色彩空間的。為了能夠判斷照片上像素點的顏色范圍,我們需要將紅、綠、藍的色彩空間(即RGB色彩空間)轉換為色度、飽和度、亮度的色彩空間(即HSV色彩空間)[3]。
圖3 RGB色彩空間和HSV色彩空間
在OpenCV中可以進行多種色彩空間轉換,用來表示HSV的三個數(shù)值的范圍都是0到255。而實際使用當中,H(色度)的范圍是0到360,S(飽合度)和V(亮度)的范圍都是0到100,因此需要對OpenCV的HSV三個數(shù)值進行換算。
將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豐富而完善的圖像識別功能和圖像處理功能,為我們開發(fā)照片審核功能提供了極大的方便。使用該功能大大降低了后臺審核人員的工作量,同時也提高了報名人員認真對待報名工作的意識,保證了招聘人才的質量。