廖學(xué)成,宋燕燕
(南京傳媒學(xué)院,江蘇 南京 211172)
計(jì)算機(jī)領(lǐng)域,經(jīng)過(guò)處理的數(shù)字圖像可以被運(yùn)用在不同的行業(yè)當(dāng)中,例如,在影視處理領(lǐng)域中,可以通過(guò)對(duì)數(shù)字圖像進(jìn)行處理從而得到驚艷的特效;在醫(yī)療影像領(lǐng)域中,圖像處理常常被用來(lái)識(shí)別病灶;在衛(wèi)星遙感領(lǐng)域中,圖像處理經(jīng)常被用來(lái)切割各種衛(wèi)星遙感地圖,從而提取出有價(jià)值的信息等。
傳統(tǒng)的神經(jīng)網(wǎng)絡(luò)由神經(jīng)元和計(jì)算關(guān)系組成,不同的神經(jīng)元之間有著極為復(fù)雜的計(jì)算關(guān)系,這些不同計(jì)算關(guān)系都有一個(gè)權(quán)重,并在進(jìn)行模型訓(xùn)練的過(guò)程中不斷地調(diào)整這些權(quán)重[1]。如圖1所示為傳統(tǒng)意義上的神經(jīng)網(wǎng)絡(luò),每層節(jié)點(diǎn)都和上一層節(jié)點(diǎn)相連接,構(gòu)成全連接網(wǎng)絡(luò),其缺點(diǎn)為參數(shù)眾多、冗余度大、難以訓(xùn)練。
圖1 神經(jīng)網(wǎng)絡(luò)
假設(shè)輸入一張像素為100×100的圖像,全連接層的每個(gè)神經(jīng)元都有將近10 000個(gè)權(quán)重參數(shù),極易產(chǎn)生過(guò)擬合[2]。為了解決這一問(wèn)題,通常在該神經(jīng)網(wǎng)絡(luò)上添加卷積運(yùn)算,構(gòu)成卷積神經(jīng)網(wǎng)絡(luò)[3]。
卷積運(yùn)算公式為
(1)
其中,t為全局時(shí)間變量。卷積函數(shù)不僅可以是連續(xù)的曲線[4],還可以是離散的形式。因此公式(1)可以改寫(xiě)為:
(2)
卷積神經(jīng)網(wǎng)絡(luò)由輸入層、卷積層、激活函數(shù)、池化層、全連接層組成[5],如圖2所示。
圖2 卷積神經(jīng)網(wǎng)絡(luò)
傅里葉描述子的作用是用來(lái)對(duì)特定物體創(chuàng)造一個(gè)特征圖像的,即只截取符合特征值的圖像[6]。從線性代數(shù)的角度思考,傅里葉描述子其實(shí)就是用一個(gè)高維的向量去描述一個(gè)物體。其計(jì)算公式為
z(t)=x(t)+μy(t)
(3)
其中,u為復(fù)數(shù)表示法;函數(shù)z為一個(gè)經(jīng)過(guò)處理只有輪廓圖的圖像,并且將所得圖像通過(guò)復(fù)變函數(shù)表達(dá)。
一般來(lái)講,在實(shí)驗(yàn)的過(guò)程中,理想的輪廓提取和實(shí)際的輪廓提取總會(huì)產(chǎn)生一定的差距。為了很好地解決這些差距,通常會(huì)定義一個(gè)損失函數(shù)來(lái)度量模型預(yù)測(cè)的輪廓與實(shí)際輪廓之間的差距[7]。本文通過(guò)計(jì)算點(diǎn)到輪廓的距離來(lái)定義損失函數(shù)。
假設(shè)在讀取的手勢(shì)圖像中有2點(diǎn)P1(x1,y1)和P2(x2,y2),為了計(jì)算這2點(diǎn)的歐幾里得空間中的直線距離,其計(jì)算公式如下:
(4)
其中,d為歐式距離;(x1,y1)和(x2,y2)分別為2個(gè)點(diǎn)的坐標(biāo)。公式(4)中的平方根運(yùn)算表示計(jì)算2個(gè)點(diǎn)在坐標(biāo)軸上的距離差的平方和的平方根。
公式(4)可以推廣到更高維度的歐幾里得空間中,其中每個(gè)點(diǎn)可以有更多的坐標(biāo)值。在三維空間中,公式會(huì)進(jìn)一步擴(kuò)展為:
(5)
首先獲取實(shí)時(shí)手勢(shì)圖像,然后進(jìn)行圖像預(yù)處理,包括圖像增強(qiáng)、圖像銳化等提高圖像清晰度[8]。接著計(jì)算手勢(shì)特征值提取輪廓,采用 YCrCb 顏色空間中的Cr分量并結(jié)合閾值分割算法進(jìn)行二值化,輸出切割圖像。最終確定當(dāng)前手勢(shì),獲取手勢(shì)信息?;?OpenCV 的手勢(shì)識(shí)別流程如圖3所示。
圖3 手勢(shì)識(shí)別流程
從攝像頭或視頻中獲取手部圖像幀,將圖像轉(zhuǎn)換為灰度圖像進(jìn)而調(diào)整對(duì)比度。轉(zhuǎn)換的實(shí)現(xiàn)過(guò)程是使用OpenCV中的“cv2.cvtColor()”函數(shù),并將轉(zhuǎn)換方式設(shè)置為“cv2.COLOR_BGR2GRAY( )”函數(shù)。其具體實(shí)現(xiàn)代碼如下:
image=cv2.imread('image.jpg')
gray_image=cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
上述代碼中,“cv2.cvtColor()”函數(shù)將彩色圖像轉(zhuǎn)換為灰度圖像。第一個(gè)參數(shù)是輸入圖像,第二個(gè)參數(shù)是轉(zhuǎn)換的方式,使用cv2.COLOR_BGR2GRAY指定轉(zhuǎn)換為灰度圖像。轉(zhuǎn)換后的灰度圖像將存儲(chǔ)在新的變量“gray_image”中。
這里需要注意的是,灰度圖像只有一個(gè)顏色通道,而彩色圖像有3個(gè)顏色通道。因此使用灰度圖像存儲(chǔ)可以大大節(jié)省內(nèi)存和計(jì)算資源。
特征圖像的創(chuàng)建過(guò)程如下:
(1)創(chuàng)建一個(gè)空白圖像,將描述子的每個(gè)元素作為像素值填充到圖像中對(duì)應(yīng)的位置。
(2)調(diào)整圖像的大小和尺度,從而適應(yīng)特定的應(yīng)用場(chǎng)景。
(3)使用諸如調(diào)色板、平滑濾波器、邊緣檢測(cè)等圖像處理技術(shù),從而突出顯示特征。
(4)將特征圖像與原始曲線圖像進(jìn)行疊加顯示。
如下代碼為創(chuàng)建特征圖像的核心算法:
def create_feature_image(descriptors):
feature_image=np.zeros((100, 100), dtype=np.uint8)
fori,descriptorin enumerate(descriptors):
x=int(descriptor[0]*50)++50
y=int(descriptor[1]*50)++50
feature_image[y,x]=255
feature_image=cv2.applyColorMap(feature_image,cv2.COLORMAP_JET)
returnfeature_image
descriptors=np.array([[1.2,0.8],[-0.5,0.2],[0.9,-0.7]])
feature_image=create_feature_image
構(gòu)建好描述子之后,可以進(jìn)行各種手勢(shì)特征提取,這些特征包括手指數(shù)量、手指的位置和彎曲度、手的方向、手掌的位置等。
膚色檢測(cè)流程如圖4所示。
圖4 膚色預(yù)測(cè)流程
首先需要進(jìn)行合適的顏色空間轉(zhuǎn)換[9]。常見(jiàn)的顏色空間轉(zhuǎn)換是將圖像從RGB空間轉(zhuǎn)換到Y(jié)UV、HSV或Lab。將圖像從RGB空間轉(zhuǎn)換到Y(jié)UV空間的實(shí)現(xiàn)代碼為:yuv_image=cv2.cvtColor(image, cv2.COLOR_BGR2YUV),將圖像從RGB空間轉(zhuǎn)換到HSV空間的實(shí)現(xiàn)代碼為:hsv_image=cv2.cvtColor(image, cv2.COLOR_BGR2HSV),將圖像從RGB空間轉(zhuǎn)換到Lab空間的實(shí)現(xiàn)代碼為:lab_image=cv2.cvtColor(image, cv2.COLOR_BGR2Lab)?!癱v2.cvtColor()”函數(shù)用于執(zhí)行顏色空間轉(zhuǎn)換。第一個(gè)參數(shù)是輸入圖像,第二個(gè)參數(shù)是轉(zhuǎn)換方式,可以通過(guò)使用預(yù)定義的常量(如cv2.COLOR_BGR2YUV、cv2.COLOR_BGR2HSV、cv2.COLOR_BGR2Lab)來(lái)指定所需的轉(zhuǎn)換。不過(guò),使用YCrCb顏色空間可以最大化地對(duì)RGB圖像進(jìn)行顯示,其從RGB空間到Y(jié)CrCb空間的轉(zhuǎn)換公式如下:
(6)
對(duì)于手部輪廓的提取,使用的是簡(jiǎn)單的自適應(yīng)閾值方法,在OpenCV中的表示代碼為:ret,threshold=cv2.threshold(gray_image, thresh, maxval, threshold_type),其中“gray_image”代表輸入的灰度圖像;“thresh”代表閾值,用于將像素分為目標(biāo)和背景;“maxval”代表像素大于閾值時(shí),所設(shè)置的像素值;“threshold_type”代表閾值分割的類型,例如“cv2.THRESH_BINARY”表示二值化閾值分割。
對(duì)于上述算法在手勢(shì)輪廓提取的應(yīng)用實(shí)驗(yàn)結(jié)果如圖5所示。
圖5 手勢(shì)輪廓
進(jìn)行膚色檢測(cè)和分割處理后的實(shí)驗(yàn)結(jié)果如圖6所示。
圖6 原始圖像及分割后的圖像
基于提取的手勢(shì)特征進(jìn)行機(jī)器學(xué)習(xí)模型訓(xùn)練,在文中使用的模型為KNN。訓(xùn)練完成后識(shí)別的結(jié)果如圖7所示。
圖7 手勢(shì)識(shí)別
隨著人機(jī)交互技術(shù)的日益發(fā)展,手勢(shì)識(shí)別算法愈來(lái)愈成熟。本文主要是對(duì)手勢(shì)的識(shí)別先導(dǎo)思想如神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)等進(jìn)行分析,并通過(guò)圖像預(yù)處理、特征值提取、膚色預(yù)測(cè)等步驟實(shí)現(xiàn)人體手勢(shì)識(shí)別。后續(xù)對(duì)于本課題還有很大的改進(jìn)空間;例如是否可以從二維的角度進(jìn)而升級(jí)從三維的角度進(jìn)行處理,從而把本課題實(shí)現(xiàn)的二維模型建成三維模型,這樣不僅可以獲得更多的特征值,還可以極大地提高識(shí)別的成功率。