馬啟瑋,韓慧妍,韓 燮,張增一
(1.中北大學(xué) 大數(shù)據(jù)學(xué)院,山西 太原 030051;2.西安電子科技大學(xué) 通信工程學(xué)院,陜西 西安 710100)
目前,瞳孔中心定位的方法一般分為兩類:基于特征提取的方法和基于統(tǒng)計學(xué)習(xí)的方法[1-5]?;谔卣魈崛〉姆椒ǎ饕抢猛讌^(qū)域的灰度特性來檢測瞳孔中心。臧晶等[7]通過hough變換檢測圓的方法和混合投影法定位瞳孔中心,但是由于hough變換在整個眼部圖象上,計算量大,時間復(fù)雜度高,難以滿足實時性的要求。而且隨著人眼注視的位置不同,瞳孔會呈現(xiàn)出一種近似于圓的橢圓形狀,因此該方法定位精度較低。余羅等[8]通過提取圖像輪廓像素,隨機選取6個點進行橢圓擬合得到瞳孔中心,但是該方法容易受到噪聲影響,且其計算量大,難以滿足實時性的要求。李擎等[9]提出了一種等距離補償瞳孔的方法,提高了瞳孔中心定位的精度,但是當(dāng)瞳孔遮擋過大時,無法精準(zhǔn)定位。
基于統(tǒng)計學(xué)習(xí)的方法,將眼部圖像作為輸入數(shù)據(jù),由訓(xùn)練好的模型直接檢測得到瞳孔中心點坐標(biāo)。Su Yeong Gwon等[10]基于SVM算法可以檢測出某人戴眼鏡情況下的瞳孔中心。張婉綺等[11]通過改進的SVM算法,對低質(zhì)量的眼動圖像也能產(chǎn)生較好的瞳孔中心定位效果。
由于眼部圖像存在眼瞼遮擋、睫毛遮擋以及角膜反射引起的白斑干擾等情況,使其提取難度增加。鑒于此,本文提出了由粗及精的瞳孔中心定位算法:首先通過YoloV3粗略定位瞳孔中心點,進而剔除瞳孔邊緣點中的偽邊緣點,逐步精確瞳孔中心。實驗結(jié)果表明,本文提出的算法有較高的精度,能夠滿足實時性和魯棒性的要求。
本文的算法流程如圖1所示。
圖1 算法流程
(1)首先通過紅外攝像頭采集眼動視頻數(shù)據(jù),灰度化并且通過中值濾波進行圖像的平滑性處理,通過YoloV3[12]深度學(xué)習(xí)模型定位瞳孔區(qū)域(長方形或正方形),提取正方形或長方形的對角線交點作為瞳孔中心的粗略位置;
(2)通過迭代法,求取合適的二值化閾值,將眼部圖像二值化。利用中值濾波平滑二值化后的瞳孔邊緣,再通過掃描線算法按序填充瞳孔內(nèi)部的空洞區(qū)域;
(3)從粗略估計的瞳孔中心出發(fā)每15°向外發(fā)出一條射線,通過星射線法提取瞳孔的邊緣點;通過計算相鄰兩點間連線的斜率,剔除遮擋條件下的偽邊緣點。
(4)最后利用最小二乘法將剩余的邊緣點進行橢圓擬合,通過計算擬合后的橢圓與真正邊緣點之間的距離,對瞳孔中心的位置進行修正。
紅外攝像頭采集到的眼部圖像為RGB彩色圖像,RGB彩色圖像是由3種不同的顏色成分組合而成,分別為紅色、綠色和藍色?;叶葓D像,也稱為灰階圖像,圖像中每個像素可以通過從0(黑色)到255(白色)的亮度值表示。不同的亮度值表示不同的灰度級。為了方便后續(xù)的處理,需要將RGB圖像轉(zhuǎn)化為灰度圖像。本文采用式(1),將RGB圖像轉(zhuǎn)化為灰度圖像
Gray(i,j)=R(i,j)*0.299+
G(i,j)*0.587+B(i.j)*0.114
(1)
式中:Gray(i,j) 為像素(i,j)的灰度值;R(i,j),G(i,j),B(i,j) 分別為像素(i,j)的紅色、綠色和藍色的像素值。
拍攝的眼動圖像中,不可避免存在睫毛的干擾,為此選用中值濾波減弱睫毛的影響[13]。中值濾波是一種非線性濾波,將每一個像素點的灰度值設(shè)置為該點某鄰域窗口內(nèi)的所有像素點灰度值的中值。當(dāng)中值濾波模板過大時,會增加系統(tǒng)運行時間,當(dāng)模板過小時,濾波效果不明顯。本文采用1*7的中值濾波模板,如圖2所示。
圖2 中值濾波模板
近年來,基于目標(biāo)檢測的深度學(xué)習(xí)模型成功應(yīng)用于各個領(lǐng)域。本文采用YoloV3深度學(xué)習(xí)模型檢測瞳孔區(qū)域,與R-CNN[14]、Fast-R-CNN[15]、Faster-R-CNN[16]、YoloV2[17]相比,YoloV3在檢測速度與檢測精度方面具有較好的綜合性能。YoloV3是一種端到端的開源目標(biāo)檢測算法,它的核心思想是將目標(biāo)識別問題轉(zhuǎn)化為回歸問題,在保證準(zhǔn)確率較高的前提下實現(xiàn)了目標(biāo)的快速識別。YoloV3采用基于ResNet網(wǎng)絡(luò)進行改進的DarkNet-53網(wǎng)絡(luò)作為特征提取器,使其可以檢測較小的目標(biāo)物體。
本文通過遷移學(xué)習(xí)的方法,使用預(yù)訓(xùn)練模型作為基礎(chǔ)特征提取網(wǎng)絡(luò),學(xué)習(xí)過程包括以下步驟:
(1)制作數(shù)據(jù)集;首先通過紅外攝像頭采集了3000張包含瞳孔的眼睛圖像,作為數(shù)據(jù)集并按照8∶1∶1的比例將數(shù)據(jù)集分成訓(xùn)練集、驗證集、測試集,分別用于模型的訓(xùn)練、驗證和測試過程。
(2)網(wǎng)絡(luò)參數(shù)的設(shè)置;整個過程一共進行了10 000次迭代,其中批處理大小(batch)和分組(subdivision)分別設(shè)置為64和16,動量(momentum)設(shè)置為0.9,初始學(xué)習(xí)率(learning rate)為0.001,并且在迭代次數(shù)達到6000和8000次時,學(xué)習(xí)率為0.0001和0.000 01。
迭代次數(shù)與損失函數(shù)的關(guān)系如圖3所示,圖3可以看出,在迭代至7000次左右的時候,損失函數(shù)在0.1上下浮動,即達到理想效果。
圖3 平均損失變化曲線
本文通過YoloV3檢測到的瞳孔為一正方形或長方形區(qū)域,當(dāng)瞳孔位于人眼不同的位置時,將呈現(xiàn)圓形或橢圓形,導(dǎo)致檢測到的區(qū)域為正方形或長方形。如圖4所示,其中圖4(a)、圖4(b)、圖4(c)和圖4(d)中的方框分別為瞳孔中間、偏右、偏左遮擋和無遮擋情況下YoloV3檢測出來的區(qū)域框。圖4中的圖4(e)和圖4(f)分別為白斑在瞳孔邊緣處和瞳孔內(nèi)部的檢測結(jié)果。
圖4 基于YoloV3的人眼瞳孔區(qū)域檢測結(jié)果
瞳孔區(qū)域的像素值相對于其它區(qū)域的像素值較低,本文采用迭代法對眼部區(qū)域進行二值化處理,通過選擇合適的閾值將瞳孔區(qū)域與其它區(qū)域分開,算法步驟如下:
(1)求出瞳孔區(qū)域內(nèi)灰度的平均值,記為a,a為二值化的初始閾值;
(2)統(tǒng)計大于閾值a的像素平均值記為b,小于閾值a的像素平均值記為c;
(3)求出新閾值a=(b+c)/2;
(4)若第k+1次迭代時ak+1=ak, 則ak+1即為最終閾值;否則繼續(xù)執(zhí)行步驟(2)的操作。
通過迭代法可以得到圖像二值化的自適應(yīng)閾值,將圖4(e) 和圖4(f)進行二值化,結(jié)果如圖5(a)和圖5(b) 所示。從圖5可以看出,二值化后的瞳孔區(qū)域,在邊緣處存在許多毛刺,而且在瞳孔內(nèi)部和邊緣存在由角膜反射引起的白斑(區(qū)域A),圖5(a)為白斑在瞳孔邊緣處的二值化圖像,圖5(b)為白斑在瞳孔內(nèi)部的二值化圖像。本文通過中值濾波平滑瞳孔邊緣,并通過掃描線算法,填充瞳孔內(nèi)部的反射光斑。掃描線算法如下:
圖5 瞳孔區(qū)域二值化
(1)行填充:從左邊第一行開始,記錄點pi1和點pi2, (i=1,2,3…n,n為圖片行數(shù))。其中點pi1為第i行第一個左邊像素值為255(白色),右邊像素值為0(黑色)的記錄點;點pi2為第i行最后一個左邊像素值為0(黑色),右邊的像素值為255(白色)。對兩點之間的白色區(qū)域進行填充。
(2)列填充:從左邊第一列開始,記錄點Li1和點Li2, (i=1,2,3…m,m為圖片列數(shù))。其中點Li1為第i列第一個上面像素值為255(白色),下面像素值為0(黑色);點Li2為第i列最后一個上面邊像素值為0(黑色),下面的像素值為255(白色)。對兩點之間的白色區(qū)域進行填充。
對圖5(a)、圖5(b)兩幅圖像分別用中值濾波和掃描線算法進行處理,其二值圖像如圖6(a)、圖6(b)所示。圖6可以看出,瞳孔邊緣處的毛刺通過中值濾波后得到了有效的平滑。瞳孔內(nèi)部和邊緣處的反射光斑得到了填充。本文將在此基礎(chǔ)上進行瞳孔邊緣點的提取。
圖6 平滑及孔洞填充后的瞳孔圖像
本文采用星射線算法的思想提取瞳孔邊緣點,YoloV3檢測的瞳孔區(qū)域中心點為瞳孔粗定位的中心點C,以角度θ(0≤θ≤2π), 每隔15°向外發(fā)出一條射線。設(shè)在射線上瞳孔邊緣點上的坐標(biāo)為pi(xi,yi), 則點pi的坐標(biāo)如式(2)所示,其中xc和yc分別為C的橫坐標(biāo)和縱坐標(biāo),li為點C與邊緣點pi之間的長度。從圖6可知,瞳孔邊緣點處的像素值變化較大,由式(2)可以求得瞳孔的邊緣點pi(i=1,2…24), 對圖4中的各種情況提取瞳孔邊緣點,結(jié)果如圖7所示,其中圖7(a)中的A、B、C、D、E,圖7(b)中的A、B、C、D,圖7(c)中的A、B、C、D以及圖7(f) 中的A點為偽邊緣點。因為圖7(d)和圖7(e)中的瞳孔邊緣點不存在誤差,無需偽邊緣點檢測,圖7(f)所示的情況將在下文2.5節(jié)進行偽邊緣點檢測。本文首先剔除圖7在遮擋條件下(圖7(a)、圖7(b)和圖7(c))的偽邊緣點,算法步驟如下所示
圖7 瞳孔邊緣點提取結(jié)果
(2)
(1)通過大量的眼部圖像數(shù)據(jù)可得,只存在上眼瞼遮擋。所以,首先提取出瞳孔下半部分的邊緣點;
(2)計算上半部分瞳孔邊緣相鄰兩點間連線的斜率hi(i=1,2…13);
(3)由圖7(c)可以看出眼瞼遮擋處的邊緣點之間的連線較為平緩(偽邊緣點近似在一條直線上)且其相鄰兩條連線的斜率之差近似為0;
(4)設(shè)置閾值t,因為兩條相鄰連線之間的斜率差近似為0,所以將t設(shè)置為0.1。當(dāng)點pi-1與點pi+1和pi之間的斜率之差小于閾值t時,則點pi為偽邊緣點。
通過以上算法逐步剔除眼瞼遮擋處的瞳孔邊緣點,將圖7(a)、圖7(b)和圖7(c)中的偽邊緣點剔除之后的結(jié)果如圖8(a)、圖8(b)和圖8(c)所示。
圖8 眼瞼遮擋處的偽邊緣點剔除
圖8(a)、圖8(b)和圖8(c)分別為其剔除相應(yīng)的遮擋邊緣點后的圖片。由以上方法提取到的瞳孔邊緣點為離散點,為了提取瞳孔的中心點,本文采用最小二乘法進行橢圓擬合。在平面坐標(biāo)系中,橢圓方程一般可用平面坐標(biāo)系的幾何參數(shù)表示,橢圓方程如式(3)所示
Ax2+Bxy+Cy2+Dx+Ey+F=0
(3)
其中,A、B、C、D、E和F為待求參數(shù),橢圓中心點為(Xc,Yc),長軸為a,短軸為b,如式(4)-式(5)所示
(4)
(5)
最小二乘法即實際的瞳孔邊緣點坐標(biāo)與擬合的橢圓之間的誤差平方和最小,來確定橢圓的各個參數(shù),其目標(biāo)函數(shù)如式(6)所示
F(A,B,C,D,E)=
(6)
為了使式(6)最小,由極值原理(一階導(dǎo)為零)即可求得橢圓的各個參數(shù),其中N為瞳孔邊緣點的個數(shù)。將圖4中的6種情況進行第一次橢圓擬合,對應(yīng)結(jié)果如圖9中6幅圖所示,圖中的C點即為第一次橢圓擬合求得的瞳孔中心點。
圖9 第一次橢圓擬合
由以上方法可以得到遮擋條件下的瞳孔中心點,但是當(dāng)白斑位于瞳孔邊緣(圖9(f))時,其邊緣點到第一次擬合后的橢圓距離較大,使得瞳孔中心定位的精度誤差較大。所以需要剔除由白斑引起的偽邊緣點,對瞳孔邊緣點進行二次橢圓擬合,提高瞳孔中心的精度。本文通過以下算法剔除偽邊緣點:
(1)計算瞳孔邊緣點pi(xi,yi), (i=1,2…n) 到擬合的瞳孔橢圓之間的距離Di,由式(7)所示
Di=Axi2+Bxiyi+Cyi2+Dxi+Eyi+F
(7)
(2)設(shè)置閾值t,當(dāng)D大于閾值t時,則pi點為偽邊緣點,剔除點pi。通過大量的實驗數(shù)據(jù)可得,當(dāng)t設(shè)置為0.1時可以較好地將誤差點分離出來。當(dāng)t過小時,容易將真實的邊緣點誤判為誤差點。當(dāng)t過大時,容易將偽邊緣點歸為真實的邊緣點。
由以上步驟,即可剔除邊緣點到第一次擬合后的橢圓距離較大的偽邊緣點,將剩余的瞳孔邊緣點,進行第二次橢圓擬合,以此來提高瞳孔中心的精度,圖7(f)中的A點為偽邊緣點,點A距離真實的瞳孔邊緣距離較大,將點A剔除后其結(jié)果如圖10所示。
圖10 兩次橢圓擬合結(jié)果
圖10中C1和C2分別為其剔除誤差點前和剔除誤差點后的橢圓擬合所得的瞳孔中心點。兩次橢圓擬合后瞳孔中心坐標(biāo)的比較結(jié)果見表1。
表1 兩次橢圓擬合結(jié)果
本文實驗平臺為VS2019(Visual Studio 2019),VS2019是windows平臺下的集成開發(fā)環(huán)境。本文通過c++ 編程語言在VS2019平臺下編程實現(xiàn)。計算機系統(tǒng)配置中處理器為Intel(R) Core(TM) i5-6300 2.3 GHz,內(nèi)存為8 GB,GPU為GenForce GTX 970。獲取眼動視頻圖像數(shù)據(jù)的紅外攝像機幀率為30 幀/s,紅外波長為850 nm。
為了驗證本文算法的魯棒性,采集了8名實驗者的眼動視頻圖像,圖片大小為960*540。其中3名實驗者的實驗結(jié)果如圖11所示,其中圖11(a)~圖11(c)為YoloV3檢測瞳孔區(qū)域后的結(jié)果,圖11(d)~圖11(f)為瞳孔邊緣點提取及偽邊緣點剔除后的結(jié)果,圖11(g)~圖11(i) 為擬合后的橢圓以及提取的瞳孔中心點(C點)。
圖11 3名不同實驗者的人眼圖像結(jié)果
從圖11可以看出,本文算法可以較好地適用不同的個體,具有較好的魯棒性。為了驗證本文算法在無眼瞼遮擋、眼瞼遮擋和白斑存在時的精度和有效性。將本文算法分別與文獻[18]、文獻[19]、文獻[20]進行定性及定量對比,定性比較結(jié)果如圖12~圖14所示,圖中C點即為提取的瞳孔中心點。
文獻[18]基于Starburst方法進行瞳孔邊緣點檢測,由圖12和表2得,在無眼瞼遮擋的情況下,可以較好檢測出瞳孔中心,但是,當(dāng)眼瞼遮擋和白斑存在時,存在誤差。文獻[19]算法,首先去除了白斑區(qū)域,通過Canny邊緣檢測,得到瞳孔邊緣點,再通過隨機抽樣一致性算法進行橢圓擬合。由圖13和表3可得,當(dāng)白斑存在時可以較好檢測出瞳孔中心點,但是當(dāng)眼瞼遮擋時,誤差較大。文獻[20]通過星射線算法,提取了部分角度的瞳孔邊緣點,同時每組選取5個點進行橢圓擬合,尋找到最優(yōu)橢圓。由圖14和表4可得,當(dāng)遮擋存在時可以較好5檢測出瞳孔中心點,但是當(dāng)白斑存在時,存在明顯誤差。無遮擋條件下本文算法與其它文獻結(jié)果比較如圖12所示。
圖12 無眼瞼遮擋實驗對比結(jié)果
各個算法求得的瞳孔中心坐標(biāo)與標(biāo)準(zhǔn)坐標(biāo)比較見表2。
表2 無眼瞼遮擋檢測誤差對比
在白斑干擾情況下,本文算法與其它文獻算法對比結(jié)果如圖13所示。
圖13 存在白斑實驗對比結(jié)果
各個算法求得的瞳孔中心坐標(biāo)各個算法求得的瞳孔中心坐標(biāo)與標(biāo)準(zhǔn)坐標(biāo)比較,見表3。
表3 存在白斑條件下的誤差對比
在遮擋條件下本文算法與其它文獻算法對比結(jié)果如圖14 所示。
為了驗證本文算法的精度,將圖14中遮擋條件下的瞳孔中心點C和瞳孔中心點的標(biāo)準(zhǔn)坐標(biāo)進行比較,結(jié)果見表4。
圖14 上眼瞼遮擋實驗對比結(jié)果
表4 上眼瞼遮擋條件檢測誤差對比
由以上結(jié)果可以看出,在無遮擋和白斑干擾時,都可以較好的檢測出瞳孔中心點。但是當(dāng)遮擋和白斑存在時,本文算法擬合出的瞳孔橢圓,更接近真實的瞳孔邊緣,求得的瞳孔中心點與標(biāo)定的瞳孔中心點之間的誤差更小,精度更高。
本文算法與其它文獻的速度比較見表5。因為本文算法通過深度學(xué)習(xí)模型進行了瞳孔區(qū)域的檢測,所以本文算法的時間復(fù)雜度比文獻[18]的時間復(fù)雜度略高。
表5 瞳孔定位速度對比
本文對拍攝得到的320幅清晰圖片進行了實驗,其中100幅圖片存在眼瞼遮擋,70幅圖片存在白斑遮擋,150幅圖片不存在眼瞼遮擋和白斑遮擋。本文算法的穩(wěn)定性(成功檢測出瞳孔中心的圖像數(shù)量與總的圖像數(shù)量的比值),結(jié)果見表6。
表6 算法穩(wěn)定性對比
綜上所述,本文算法的魯棒性較好。在遮擋和白斑存在時相較于其它算法,誤差更小,檢測出的瞳孔中心更接近真實的瞳孔中心。本文算法的綜合性能(速度、精度和穩(wěn)定性)優(yōu)于其它算法,可以廣泛應(yīng)用于不同的實驗個體。
本文提出了一種由粗及精的瞳孔中心定位算法。該算法通過YoloV3深度學(xué)習(xí)模型粗定位瞳孔中心,通過瞳孔橢圓參數(shù)修正,逐步精確瞳孔中心。該算法依次減弱了眼瞼遮擋、睫毛遮擋和白斑干擾存在情況下,對提取瞳孔中心點所造成的誤差。實驗結(jié)果表明,在眼瞼遮擋、睫毛遮擋和白斑干擾存在的情況下,本文算法提取的瞳孔中心點的精度、實時性和魯棒性較好。
如何檢測實驗者在戴眼鏡情況下的瞳孔中心以及提高檢測速度是本文下一步的研究工作。