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