周亦敏, 李錫麟
(上海理工大學(xué) 光電信息與計(jì)算機(jī)工程學(xué)院, 上海 200093)
手勢(shì)是一種重要的溝通方式,手勢(shì)識(shí)別技術(shù)開創(chuàng)了人類與機(jī)器,設(shè)備或計(jì)算機(jī)交互的新局面。隨著科學(xué)技術(shù)的發(fā)展,特別是無人機(jī)、智能假體和虛擬現(xiàn)實(shí)的發(fā)展,通過手勢(shì)識(shí)別技術(shù)進(jìn)行人機(jī)交互的需求越來越廣泛,手勢(shì)識(shí)別已成為國內(nèi)外學(xué)者關(guān)注的焦點(diǎn)。因此,手勢(shì)識(shí)別技術(shù)的研究具有重要的意義[1]。
手勢(shì)識(shí)別的步驟一般分為測(cè)試分割、特征分析和特征識(shí)別。測(cè)試分割主要完成手勢(shì)檢查和分割的任務(wù),特征分析主要進(jìn)行特征檢測(cè),特征識(shí)別完成特征提取和手勢(shì)識(shí)別[2]。在特征分析和識(shí)別過程中,大多數(shù)現(xiàn)有的手勢(shì)識(shí)別算法都需要手動(dòng)提取特征來完成手勢(shì)識(shí)別任務(wù)。
近年來,隨著人工智能技術(shù)的飛速發(fā)展,深度學(xué)習(xí)算法受到了廣泛的關(guān)注。卷積神經(jīng)網(wǎng)絡(luò)(Convolution Neural Network,CNN)[3]因其快速、強(qiáng)大的分類能力而成為圖像分類領(lǐng)域的熱門算法。卷積神經(jīng)網(wǎng)絡(luò)是基于視覺神經(jīng)細(xì)胞模擬的模型。它具有特征學(xué)習(xí)的能力,不需要手動(dòng)提取功能,可以訓(xùn)練未處理的圖像并自動(dòng)生成特征提取分類器[4]。Tensorflow是Google開發(fā)的開源深度學(xué)習(xí)框架[5]。它的前端支持許多開發(fā)語言,例如Python、C ++和Java等;后端是用C ++、CUDA等編寫的。在此框架中實(shí)現(xiàn)的算法,可以輕松移植到許多異構(gòu)系統(tǒng)上,受到許多開發(fā)人員的青睞。它可以從底層實(shí)現(xiàn)隊(duì)列和線程操作,快速調(diào)用硬件資源,提供輸入數(shù)據(jù)、圖形節(jié)點(diǎn)結(jié)構(gòu)和對(duì)象功能,并可以將節(jié)點(diǎn)分配給許多設(shè)備進(jìn)行并行操作。本文在Tensorflow框架下建立了基于卷積神經(jīng)網(wǎng)絡(luò)的手勢(shì)識(shí)別模型,并設(shè)計(jì)了基礎(chǔ)網(wǎng)絡(luò)。優(yōu)化網(wǎng)絡(luò)參數(shù)后,分析了網(wǎng)絡(luò)的識(shí)別效果。
LeNet-5[6]是CNN的經(jīng)典8層卷積網(wǎng)絡(luò)結(jié)構(gòu),它最初用于手寫數(shù)字識(shí)別。該網(wǎng)絡(luò)結(jié)構(gòu)除兩個(gè)卷積層和兩個(gè)池層外,還有兩個(gè)完全連接的層以及兩個(gè)輸入和輸出層[7-8]。但是,網(wǎng)絡(luò)結(jié)構(gòu)越復(fù)雜,所需的訓(xùn)練時(shí)間就越長(zhǎng),這嚴(yán)重影響了網(wǎng)絡(luò)的通用性和實(shí)時(shí)性,不能滿足手勢(shì)識(shí)別的實(shí)時(shí)性要求[9]。本文基于LeNet-5結(jié)構(gòu),設(shè)計(jì)了卷積神經(jīng)網(wǎng)絡(luò)LeNet-G,用于手勢(shì)識(shí)別。網(wǎng)絡(luò)可以在相對(duì)較短的時(shí)間內(nèi)提取手勢(shì)進(jìn)行分類的特征。LeNet-G網(wǎng)絡(luò)的兩層卷積層和兩層池化層交替連接提取要素,以連接完整的連接層。在輸出層中使用具有強(qiáng)非線性分類能力的Softmax分類器,在網(wǎng)絡(luò)中使用Softplus激活函數(shù)[10]。本文神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。

圖1 LeNet-G神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)
卷積層是用于提取圖像特征的最重要的網(wǎng)絡(luò)層。卷積是指通過權(quán)重共享和局部連接的方法,對(duì)具有學(xué)習(xí)能力卷積核的輸入圖像或上層輸出特征圖像進(jìn)行運(yùn)算。在激活功能的作用下,獲取新特征圖像的過程。每個(gè)特征圖像代表圖像的一個(gè)特征,在網(wǎng)絡(luò)的每一層上都有多個(gè)特征圖。在卷積層C2中,可以獲得邊緣、線條等低級(jí)特征;在卷積層C4中可以獲得手掌等特征。
考慮到手勢(shì)識(shí)別的復(fù)雜性,為了完全提取手勢(shì)的特征,對(duì)卷積層進(jìn)行了如下改進(jìn):
(1)由于卷積核的大小會(huì)影響手勢(shì)分類的準(zhǔn)確性,不同的手具勢(shì)有較小的特征差異,因此較小的卷積核更適用于提取局部特征信息。3*3卷積核對(duì)不同類別的手勢(shì)識(shí)別能力更強(qiáng),并且可以減少卷積層中的參數(shù),提高模型的性能。因此在本文中,將5*5卷積核替換為3*3卷積核。
(2)采用Softplus函數(shù)[11]可以提高網(wǎng)絡(luò)的收斂速度,并且縮短預(yù)訓(xùn)練時(shí)間。因此采用Softplus函數(shù)代替原來的sigmoid激活函數(shù)。Softplus和Sigmoid函數(shù)可以表示為:
fsoftplus=log(1+ex),
(1)
(2)
池化層是縮小維度,并從特征圖像中提取特征的過程,也稱為下采樣層。通過減小特征圖像的尺寸來獲得池化層中的每個(gè)特征圖像。池化對(duì)輸出的上層進(jìn)行下采樣的過程,會(huì)減少參數(shù)矩陣的尺寸并保留有用的信息,從而減少最后全連層中的參數(shù)數(shù)量。一般在池化層的處理方式有最大池化采樣和平均池化采樣,本文采用最大池化采樣[12],減小過擬合,同時(shí)提高模型的容錯(cuò)性。
LeNet-G網(wǎng)絡(luò)通過兩次卷積和下采樣特征提取操作,來連接完整的連接層,以減小網(wǎng)絡(luò)規(guī)模并增強(qiáng)非線性映射的能力。全連接層的每個(gè)神經(jīng)元都與所有上層神經(jīng)元相連。全連接層可以表示為:
(3)
其中,x是l層的第j個(gè)特征圖,n是前一層神經(jīng)元的數(shù)量,w與上層神經(jīng)元的權(quán)重,f是激活函數(shù),b是偏置。全連接層中的神經(jīng)元數(shù)設(shè)置為600,并完全連接到池化層S5。
從卷積層和池化層提取特征后,可以獲得完整的特征集。這些功能需要分類器進(jìn)行分類。由于手勢(shì)特征較為復(fù)雜,因此選擇具有較強(qiáng)非線性分類能力的Softmax作為分類器[13]。Softmax的輸出層回歸包含8個(gè)神經(jīng)元,這8個(gè)神經(jīng)元代表8種分類手勢(shì)。
Softmax適用于進(jìn)行多分類的情況,可以將多個(gè)神經(jīng)元的輸出,映射到(0,1)的概率區(qū)間內(nèi)進(jìn)行多分類。其通用原型是用于兩分類的Logistic分類器。數(shù)據(jù)集可以分成訓(xùn)練集和測(cè)試集兩部分,數(shù)據(jù)集中第i個(gè)數(shù)據(jù)的xi對(duì)應(yīng)唯一的已標(biāo)定yi,將所有數(shù)據(jù)集歸為n類。模型的訓(xùn)練集由m個(gè)已標(biāo)記的樣本構(gòu)成:{(x1,y1),...,(xm,ym)}。對(duì)于模型中softmax前一層輸入值x,對(duì)每一個(gè)類別j可以估算出概率p(y=j|x)。用一個(gè)k維的向量來表示k個(gè)估計(jì)的概率值。假設(shè)函數(shù)hθ(x)形式如下:
(4)

(5)
其中,l{yi=j}的值為1。
網(wǎng)絡(luò)訓(xùn)練的主要問題是如何降低損失函數(shù)。對(duì)于此問題通常可以使用梯度下降法解決。
Tensorflow是一種用數(shù)據(jù)流圖進(jìn)行計(jì)算的開源軟件庫,TensorFlow會(huì)將所有計(jì)算轉(zhuǎn)換為有向圖上的節(jié)點(diǎn)。每個(gè)操作是一個(gè)節(jié)點(diǎn),節(jié)點(diǎn)之間的連接稱為邊,每個(gè)邊代表計(jì)算之間的依存關(guān)系[14-15]。有向圖描述了計(jì)算數(shù)據(jù)的過程,并負(fù)責(zé)維護(hù)和更新狀態(tài)。用戶可以在有向圖的分支上執(zhí)行條件控制或循環(huán)操作;可以使用C ++、Java、Python等開發(fā)語言,來設(shè)計(jì)用于數(shù)據(jù)計(jì)算的有向圖。有向圖中的每個(gè)節(jié)點(diǎn)都具有任意數(shù)量的輸入和輸出;每個(gè)節(jié)點(diǎn)都描述一個(gè)可以視為操作實(shí)例的操作;在有向圖邊緣上流動(dòng)的數(shù)據(jù)將成為張量。每個(gè)張量都是類型化的多維數(shù)據(jù),可以預(yù)先定義或從有向圖的結(jié)構(gòu)中推斷得出。一個(gè)節(jié)點(diǎn)可以具有零個(gè)或多個(gè)張量,可以輕松地構(gòu)建和修改神經(jīng)網(wǎng)絡(luò)。本文實(shí)驗(yàn)框架基于Python。Python庫中有許多輔助函數(shù)來構(gòu)造數(shù)據(jù)圖,這些輔助函數(shù)通過“導(dǎo)入”的形式加載連接數(shù)據(jù)庫。該過程自動(dòng)將定義的計(jì)算轉(zhuǎn)換為有向圖上的節(jié)點(diǎn)。
Tensorflow程序通常分為兩個(gè)階段,第一階段定義有向圖中的所有計(jì)算,第二階段執(zhí)行計(jì)算,如圖2所示。

圖2 Tensorflow程序
第一階段,在執(zhí)行計(jì)算操作之前先構(gòu)造一個(gè)有向圖,然后創(chuàng)建常量和變量。有向圖由單個(gè)節(jié)點(diǎn)和邊組成。第二階段,即通過啟動(dòng)有向圖來創(chuàng)建會(huì)話對(duì)象,并通過執(zhí)行節(jié)點(diǎn)操作以更新變量,最后保存數(shù)據(jù)。
基于Tensorflow的CNN手勢(shì)識(shí)別模型的框架結(jié)構(gòu)如圖3所示。

圖3 CNN模型的框架結(jié)構(gòu)圖
該模型分為二部分:訓(xùn)練和識(shí)別。這二部分的節(jié)點(diǎn)結(jié)構(gòu)和操作基本相同,其主要區(qū)別在于權(quán)重變量的初始分配。模型給出了網(wǎng)絡(luò)訓(xùn)練部分的初始權(quán)重,并通過訓(xùn)練樣本對(duì)卷積網(wǎng)絡(luò)結(jié)構(gòu)每一層的權(quán)重進(jìn)行了調(diào)整,以減少實(shí)際輸出誤差。識(shí)別部分的權(quán)重直接使用從訓(xùn)練中獲得的權(quán)重,并用測(cè)試集進(jìn)行測(cè)試,輸出為手勢(shì)識(shí)別的結(jié)果。
為了保證數(shù)據(jù)的有效性,實(shí)驗(yàn)數(shù)據(jù)采用國際公認(rèn)的數(shù)據(jù)集和自行收集的數(shù)據(jù)集。國際公認(rèn)的手勢(shì)集來自“美國手語”手勢(shì)集。該手勢(shì)集有24個(gè)手勢(shì),每個(gè)手勢(shì)都有2 500個(gè)自然色樣本圖像。本次實(shí)驗(yàn)在手語數(shù)據(jù)集中隨機(jī)選擇了8個(gè)手勢(shì),每個(gè)手勢(shì)為1 250張圖像,總共獲取了10 000個(gè)有效樣本。
自我收集的數(shù)據(jù)集由10名學(xué)生作為參與者收集。手勢(shì)樣本是從不同的角度和不同的背景環(huán)境中拍攝的。例如:左右手,采用室外自然光背景和室內(nèi)自然光背景,增強(qiáng)數(shù)據(jù)的有效性。總共獲取了10 000個(gè)有效樣本。
本文的有效樣本圖像是基于膚色的二值化模型,在一定的膚色空間內(nèi),膚色具有一定的聚類特性。通過選擇適當(dāng)?shù)拈撝狄詸z測(cè)和分割膚色,可以將手勢(shì)圖像與背景圖像分離,然后根據(jù)高斯概率模型將手勢(shì)圖像轉(zhuǎn)換為像素值為0-255的灰度圖像。圖片像素大小縮放為32*32。
人手膚色在YCrCb[16]顏色范圍內(nèi)具有出色的聚類特征。將獲得的樣本圖像從RGB空間轉(zhuǎn)換為YCrCb顏色空間。亮度信息Y對(duì)顏色聚類沒有影響。為了降低計(jì)算難度,僅針對(duì)Cr和Cb計(jì)算高斯概率。使用高斯卷積檢查包含手勢(shì)的圖像,以進(jìn)行卷積運(yùn)算以獲得概率值,并將概率值與閾值進(jìn)行比較以提取手勢(shì)特征。高斯概率模型可以表示為:
P(Cr,Cb)=exp[-0.5(x-A)TC-1(x-A)].
(6)
其中,x-[Cr,Cb]T,A是通過對(duì)許多人的皮膚顏色進(jìn)行采樣而得出的平均皮膚顏色。通過上式可以計(jì)算出樣本圖像與膚色之間相似度的概率矩陣。收集了許多黃種人的膚色值,并求出了平均值:A=[140.231, 199.157]T。
樣本的三維圖像是在高斯概率模型下計(jì)算得到,如圖4所示。

圖4 三維圖像
圖4中,x、y是圖像在灰色空間中的坐標(biāo),而z軸是相應(yīng)的概率值。在z軸上設(shè)置閾值,提取高于閾值的手勢(shì)圖像,并對(duì)其進(jìn)行灰度處理和Canny邊界檢測(cè)[17],以獲取標(biāo)準(zhǔn)圖像。最后,圖像尺寸設(shè)為32 * 32,如圖5所示。

圖5 手勢(shì)圖像
本文實(shí)驗(yàn)在Windows10操作系統(tǒng)中運(yùn)行Tensorflow,以測(cè)試LeNet-G網(wǎng)絡(luò)。計(jì)算機(jī)CPU為i7-8700K,內(nèi)存為32G,用于CUDA加速的GPU為NVIDIA GTX2080。數(shù)據(jù)集分為訓(xùn)練集和測(cè)試集。訓(xùn)練集隨機(jī)選擇每個(gè)手勢(shì)圖像的2 000個(gè)圖像,總共16 000個(gè)樣本;測(cè)試集每個(gè)手勢(shì)圖像的500個(gè)圖像,總共4 000個(gè)樣本。
學(xué)習(xí)率是根據(jù)當(dāng)前收斂程度和梯度更新情況的重要參數(shù)。在模型開始訓(xùn)練時(shí),用較大的學(xué)習(xí)率可以跳出局部最優(yōu)解。隨著模型訓(xùn)練迭代次數(shù)增加,逐漸減小學(xué)習(xí)率,逼近全局最優(yōu)解。
設(shè)置學(xué)習(xí)速率的方法有二種:自適應(yīng)調(diào)整和手動(dòng)設(shè)置。當(dāng)權(quán)重值具有較大的波動(dòng)時(shí),降低學(xué)習(xí)率;而當(dāng)權(quán)重值趨于不變時(shí),提高學(xué)習(xí)率。神經(jīng)網(wǎng)絡(luò)參數(shù)是動(dòng)態(tài)變化的,最好的方法是為每個(gè)權(quán)重值設(shè)置不同的學(xué)習(xí)率。可以利用上一層數(shù)值更新的變化來建立兩個(gè)權(quán)重更新之間的關(guān)系,從而加快學(xué)習(xí)過程。本文采用自適應(yīng)梯度下降算法來更新參數(shù),然后比較全局學(xué)習(xí)率的初始值的選擇。如果初始值太大,則會(huì)錯(cuò)過極值點(diǎn),并且系統(tǒng)將不會(huì)收斂,并且錯(cuò)誤率很高。如果初始值太小,系統(tǒng)將收斂太慢,甚至?xí)萑刖植孔顑?yōu)狀態(tài)。因此,根據(jù)經(jīng)驗(yàn)初始學(xué)習(xí)率分別設(shè)置為0.05、0.01、0. 005、0.001、0.0005,并且在批量處理100個(gè)樣本的情況下進(jìn)行了訓(xùn)練。識(shí)別效果見表1。

表1 不同學(xué)習(xí)率下的手勢(shì)識(shí)別效果
根據(jù)表1的值,當(dāng)初始學(xué)習(xí)率設(shè)置為0.05、0.0.1和0. 000 5時(shí),系統(tǒng)的準(zhǔn)確率遠(yuǎn)低于0.001和0.005。這表明神經(jīng)網(wǎng)絡(luò)陷入局部最優(yōu)的情況,錯(cuò)誤率增加。將識(shí)別結(jié)果與初始學(xué)習(xí)率分別為0.001和0.005二種情況進(jìn)行比較,可以看出2個(gè)值的錯(cuò)誤率沒有較大差異,但是訓(xùn)練時(shí)間卻有很大差異。綜合分析表明,初始學(xué)習(xí)率應(yīng)設(shè)置在0.005左右。
卷積層通過手勢(shì)樣本與卷積核之間的卷積運(yùn)算來提取特定的手勢(shì)特征。每個(gè)卷積核代表一個(gè)特殊功能。更多的卷積核可以更準(zhǔn)確,更真實(shí)地識(shí)別樣本圖像。
為了驗(yàn)證卷積核數(shù)目對(duì)LeNet-G網(wǎng)絡(luò)的影響,設(shè)置了兩個(gè)卷積層中的卷積核數(shù)目,分別為8-16、16-16、16-32、32-32。然后訓(xùn)練手勢(shì)數(shù)據(jù)集并記錄識(shí)別效果。識(shí)別效果見表2。由表2可知,隨著卷積核數(shù)的增加,錯(cuò)誤率逐漸降低。但是,卷積核的數(shù)量越多,計(jì)算量增大,訓(xùn)練時(shí)間增加,并對(duì)計(jì)算機(jī)性能的要求增加。均衡考慮計(jì)算機(jī)性能、訓(xùn)練時(shí)間和識(shí)別效果,設(shè)置卷積核為16-32結(jié)構(gòu)就可以滿足網(wǎng)絡(luò)的要求。

表2 不同卷積核下的識(shí)別效果
手勢(shì)樣本圖像用作輸入數(shù)據(jù),LeNet-G網(wǎng)絡(luò)用于訓(xùn)練樣本。全連接層中初始神經(jīng)元的數(shù)量分別設(shè)置為600個(gè)、800個(gè)和1 000個(gè),進(jìn)行5 000次訓(xùn)練。根據(jù)全連接層中神經(jīng)元的數(shù)量,測(cè)試樣本訓(xùn)練后神經(jīng)網(wǎng)絡(luò)模型的準(zhǔn)確率見表3。

表3 全連接層中不同數(shù)目的神經(jīng)元下的網(wǎng)絡(luò)識(shí)別效果
從表3可以看出,當(dāng)通過梯度下降法改變整個(gè)連接層中神經(jīng)元的數(shù)量時(shí),損失函數(shù)的準(zhǔn)確度將發(fā)生變化。可以得出結(jié)論,增加全連接層中的神經(jīng)元可以在一定程度上提高準(zhǔn)確度。
通過實(shí)驗(yàn)表明,基于卷積神經(jīng)網(wǎng)絡(luò)的手勢(shì)識(shí)別模型具有編程簡(jiǎn)單、使用靈活等優(yōu)點(diǎn)。它可以有效地提高建模、編程和分析的效率。本文中采用基于Tensorflow平臺(tái)的卷積神經(jīng)網(wǎng)絡(luò)手勢(shì)識(shí)別框架,并設(shè)計(jì)了一個(gè)7層LeNet-G卷積神經(jīng)網(wǎng)絡(luò)用于手勢(shì)識(shí)別。通過改變初始學(xué)習(xí)速率、全連接層中卷積核和神經(jīng)元數(shù),得出結(jié)論:當(dāng)初始學(xué)習(xí)率為0.005時(shí),兩個(gè)卷積層中的卷積核數(shù)設(shè)置為16-32,全連接層中的神經(jīng)元數(shù)為600,卷積神經(jīng)網(wǎng)絡(luò)可以獲得更好的識(shí)別效果。由于所收集的手勢(shì)樣本是多個(gè)背景的手勢(shì),因此所設(shè)計(jì)的網(wǎng)絡(luò)訓(xùn)練的模型具有很強(qiáng)的魯棒性。同時(shí),由于實(shí)驗(yàn)是在GPU模式下進(jìn)行的,因此運(yùn)算速度相對(duì)較快,可以快速找到運(yùn)行效率最高的網(wǎng)絡(luò)結(jié)構(gòu)訓(xùn)練模型,并且在處理速度上具有很大的優(yōu)勢(shì)。可以看出,基于卷積神經(jīng)網(wǎng)絡(luò)的手勢(shì)識(shí)別模型的設(shè)計(jì)具有很大的開發(fā)和應(yīng)用潛力。