陳壯煉,林曉樂,陳銀菊,黃秋瑩,李 超
(廣東輕工職業(yè)技術(shù)學(xué)院 信息技術(shù)學(xué)院,廣州 510300)
在現(xiàn)實生活中,手部障礙給人們帶來了諸多不便,而且嚴(yán)重影響人們的日常生活。隨著科學(xué)技術(shù)的發(fā)展,手部障礙患者的治療方式愈趨于智能化,如基于數(shù)據(jù)手套的手部遠(yuǎn)程虛擬康復(fù)系統(tǒng)[1-2]和基于觸覺的虛擬康復(fù)系統(tǒng)[3-4]。前者是利用數(shù)據(jù)手套來控制虛擬場景中小球的拿捏來完成手部的訓(xùn)練。該虛擬系統(tǒng)雖然一定程度能達(dá)到手部康復(fù)的目的,但患者在佩戴時會有負(fù)重感,容易造成二次傷害,而且數(shù)據(jù)手套價格較昂貴,不適合普通家庭的使用。后者是利用觸覺系統(tǒng)和虛擬環(huán)境結(jié)合設(shè)計出用戶圖形,患者通過舉起杯子和擠壓球等動作走出“3D迷宮”,完成訓(xùn)練。該康復(fù)系統(tǒng)雖提高了患者訓(xùn)練的積極性,但虛擬設(shè)備價格較高,而且只能訓(xùn)練某些特定的動作,不具備靈活性。
針對上述手部康復(fù)系統(tǒng)的不足,利用計算機(jī)視覺技術(shù)設(shè)計出的手勢識別康復(fù)系統(tǒng)兼具靈活、高識別準(zhǔn)確率、低成本的特點,并且在訓(xùn)練過程中能與患者進(jìn)行動態(tài)交互,通過數(shù)據(jù)庫記錄下訓(xùn)練過程,有助于醫(yī)務(wù)人員針對該訓(xùn)練過程給患者制定合理的康復(fù)訓(xùn)練療程。
本文為手部患者設(shè)計了較靈活、低成本的康復(fù)系統(tǒng)。其系統(tǒng)結(jié)構(gòu)可分為圖像采集、圖像預(yù)處理、圖像分類和圖像識別4個部分。系統(tǒng)結(jié)構(gòu)如圖1所示。
圖1 康復(fù)系統(tǒng)結(jié)構(gòu)圖
該系統(tǒng)采用的Python編輯器是PyCharm,該編輯器的好處是能夠提升編程的速度,提高開發(fā)效率。主要利用Anaconda對包進(jìn)行管理,利用開源視覺庫OpenCV和卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行圖像處理和分類,sklearn進(jìn)行模型訓(xùn)練,PyQt進(jìn)行GUI界面設(shè)計和數(shù)據(jù)可視化。
1.2.1 圖像采集
采用PC端攝像頭對康復(fù)手勢進(jìn)行拍攝采集,OpenCV會將采集的圖片會分割成多個像素點,形成像素圖,再將圖像保存到文件夾,并給文件命名作為圖像的標(biāo)簽。
1.2.2 圖像預(yù)處理
1)圖像分割:
計算機(jī)視覺中的攝像頭采集到的是不同等級的灰度圖像[5],而在很多應(yīng)用中需要的是純黑或純白的圖像,如卷積神經(jīng)網(wǎng)絡(luò)在進(jìn)行圖像的特征提取時輸入只由簡單線條、文字組成的圖像,那么在提取的過程就會簡單很多,模型訓(xùn)練的準(zhǔn)確率也會提高。本文采用局部二值化圖像中的自適應(yīng)閾值二值化算法進(jìn)行圖像分割[6]。
將攝像頭采集的彩色圖片進(jìn)行灰度化后,把灰度圖像進(jìn)行二值化處理。即找到一個閾值,灰度大于這個閾值的區(qū)域設(shè)置像素為255,灰度小于這個閾值的區(qū)域設(shè)置像素為0。自適應(yīng)二值化是針對光影變化較大的圖片,根據(jù)圖片的灰度直方圖,得到一個適合該圖像的二值化閾值?;叶戎狈綀D如圖2所示,柱狀形代表灰度直方圖,設(shè)法找到一個合適的混合高斯分布,兩個高斯分布相交的灰度值即要選擇的閾值。
本文采用最大類間方差法(OTSU)來計算圖像二值化的自適應(yīng)閾值,閾值將原圖像分為前景和后景,這里令閾值為T,圖像像素對應(yīng)的灰度級為f(x,y),經(jīng)閾值分割后的圖像g(x,y)定義為:
(1)
公式(1)中,1代表前景,0代表后景,即圖像二值化。
當(dāng)選取最佳閾值時,目標(biāo)與背景的差別最大,最大類間方差法(OTSU)公式推導(dǎo)如下。
記T為分割閾值,W0為前景點數(shù)占圖像比例,U0為前景平均灰度,W1為后景點數(shù)占圖像比例,U1為后景平均灰度,則圖像的總平均灰度U為:
U=W0*U0+W1*U1
(2)
前景和后景圖像的方差S為:
S=W0*(U0-U)2+W1*(U1-U)2=
W0*W1*(U0-U1)2
(3)
當(dāng)方差S最大時,前景和后景的差別最大,此時的灰度是最佳閾值。
2)圖像平滑處理:
圖像平滑處理[7]是計算機(jī)視覺中一種相對簡單并且使用頻率較高的圖像處理方式。常用來減少圖像中的噪點和降低圖像的分辨率。一張沒有經(jīng)過圖像處理的圖像中包含有很多的高頻信息,如噪音和邊界。如果將未經(jīng)處理的圖像直接進(jìn)行卷積運(yùn)算會帶來很多不必要的運(yùn)算量,使用濾波器可以有效地去除噪音,達(dá)到圖像模糊的目的。圖像平滑處理一般有圖像均值平滑濾波,高斯濾波和中值濾波,本文采用的是均值平滑濾波。
均值濾波是一種典型的線性濾波算法,是指在圖像上對目標(biāo)像素值給出一個濾波模板,該模板包含目標(biāo)像素周圍的M*N個臨近像素,也就是去掉目標(biāo)像素本身,再用該模板中目標(biāo)像素周圍的像素平均值來代替原來像素值。其中M*N的矩陣稱為核,采用核對原始圖像中的像素點進(jìn)行處理,從而實現(xiàn)圖像去噪,得到結(jié)果圖像。均值濾波處理過程如圖3所示。
圖3 均值濾波處理過程
均值濾波處理公式為:
(4)
根據(jù)公式(4)對圖3中的區(qū)域像素進(jìn)行均值濾波處理過程為:
((197+25+106+156+159)+(149+40+107+5+71)+(163+198+226+223+156)+(222+37+68+193+157)+(42+72+250+41+75))/25 =125.52
其中,5*5的矩陣為模糊內(nèi)核。本文使用計算機(jī)視覺中的blur()方法實現(xiàn)圖像的平滑處理。
1.2.3 圖像分類
計算機(jī)能看到的是一個個像素值,并不能像人類的視覺一樣,可以輕松分辨出圖片里面出現(xiàn)的事物,以及圖片的類別,故計算機(jī)需要通過圖像分類來區(qū)分圖片。基于計算機(jī)視覺的圖像分類方法有樸素貝葉斯分類、K近鄰、支持向量機(jī)、決策樹、Boosting、隨機(jī)森林和神經(jīng)網(wǎng)絡(luò)。本文采用神經(jīng)網(wǎng)絡(luò)中的卷積神經(jīng)網(wǎng)絡(luò)圖像分類算法[8-9],首先通過PCA技術(shù)提取樣本圖像特征與待分類的圖像特征碼,根據(jù)特征碼生成輸入項,樣本所屬標(biāo)簽作為輸出項,將輸入與輸出項送入神經(jīng)網(wǎng)絡(luò)進(jìn)行訓(xùn)練,讓神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)每個類別圖像的特征,最后將待分類圖像的特征碼輸入神經(jīng)網(wǎng)絡(luò)進(jìn)行測試,根據(jù)神經(jīng)網(wǎng)絡(luò)輸出項判斷其所屬類別。
1.2.4 圖像識別
計算機(jī)和人的眼睛一樣,都是通過顏色的輪廓來區(qū)分圖像,而圖像的顏色由三原色組成的,可以通過調(diào)色得到各種顏色。在計算機(jī)圖像識別中,制定了RGB(Red,Green,Blue)通道作為圖像識別的基礎(chǔ)。OpenCV中圖像通道有單通道、二通道、三通道和四通道,其中常見通道有單通道和三通道。
一般黑白圖像是用灰度來表示色彩,稱為單通道,例如某個像素值為0則表示黑色,255則表示白色,灰度的范圍為0~255。彩色圖像則采用RGB通道來表示,稱為三通道,例如(255,255,255)表示白色,(0,0,0)表示黑色,灰度也是彩色的一種。二通道的圖像采用RGB555和RGB565表示,一個通道為實數(shù),另一個為虛數(shù)。四通道則是采用RGBA來表示,與三通道相比多了一個A通道,A通道表示透明度。本文圖像識別采用的是三通道。
康復(fù)系統(tǒng)設(shè)計主要分為幾個步驟:1)樣本采集:首先在界面的綠色識別方框內(nèi)做出不同的手勢,攝像頭識別到手勢并將手勢進(jìn)行拍攝保存到文件夾中,再將文件夾命名為對應(yīng)手勢的名稱作為手勢標(biāo)簽。2)圖片預(yù)處理:將采集到的手勢進(jìn)行圖像分割,形成灰度圖像,以免復(fù)雜背景影響訓(xùn)練的準(zhǔn)確度,再將圖像進(jìn)行均值濾波處理,減少圖像的噪聲。3)神經(jīng)網(wǎng)絡(luò)訓(xùn)練:將處理過后的圖像通過卷積、池化和全連接層進(jìn)行特征提取和分類。4)模型測試:在相應(yīng)位置做出對應(yīng)手勢,觀察屏幕是否顯示該手勢的標(biāo)簽。5)康復(fù)訓(xùn)練:患者通過打開系統(tǒng)進(jìn)行手部康復(fù)訓(xùn)練,并將對應(yīng)訓(xùn)練過程保存到數(shù)據(jù)庫中。6)康復(fù)歷史查詢:通過點擊查詢按鈕,調(diào)用數(shù)據(jù)庫查詢語句,將訓(xùn)練過程顯示到屏幕上。
2.1.1 樣本采集
為了實現(xiàn)手部康復(fù)的訓(xùn)練,定義并采集了6種手勢,依次是懸垂、二指捏、擊打、柱狀抓握、勾拉、側(cè)捏,建立康復(fù)手勢數(shù)據(jù)庫。通過調(diào)用cv2.VideoCapture(0)方法打開PC端攝像頭,輸入采集手勢的種類和訓(xùn)練周期,將采集的手勢保存到geskind目錄下,然后將同種類的手勢放到一個文件夾并為其取標(biāo)簽名,方便后續(xù)對這些手勢圖像進(jìn)行圖像處理。采集的分別是50歲以上、10到50歲、10歲以下3個年齡段的人群,一共拍攝70組數(shù)據(jù),共490張手勢圖片,采集的圖片大小都是306*306,采集條件是室內(nèi)正常光照,采集手勢對象的男女比例均衡。圖像采集流程如圖4所示。
圖4 圖像采集
以下是進(jìn)行圖像捕獲關(guān)鍵代碼:
global gestname,sample_nums,path,saveimg if(self.is_camera_opened==False):
QMessageBox.warning(self,'警告','未打開攝像頭')
else:
if self.hand_name.text()=="":
gestname=self.hand_example.currentText()
else:
gestname=self.hand_name.text()
sample_nums=self.hand_num.value()
print(gestname+str(sample_nums))
try:
os.makedirs('./geskind/'+gestname)
except OSError as e:
print(gestname + '文件夾已創(chuàng)建')
path ="./geskind/" + gestname + "/"
if gestname =='':
互聯(lián)網(wǎng)背景下會計電算化課程改革一方面可以提高人才的理論素質(zhì);另一方面可以增強(qiáng)人才的實踐技能。與傳統(tǒng)的會計核算方式相比,會計電算化課程核算的途徑,發(fā)生了明顯的變化。會計人才不僅需要充分的了解會計專業(yè)的相關(guān)知識,同樣需掌握與會計軟件應(yīng)用情況有關(guān)的理論。加強(qiáng)課程改革,是確保教學(xué)能夠達(dá)到上述效果的基礎(chǔ),對會計人才理論素質(zhì)的提高,具有重要價值。從實踐的角度分析,會計電算化對人才計算機(jī)操作水平的要求逐漸提高。學(xué)生必須不斷的練習(xí),并積極利用網(wǎng)絡(luò)資源,方可充分了解當(dāng)前的會計政策以及核算方式的變化情況。加強(qiáng)課程改革,是確保學(xué)生的各項實踐技能,能夠得到充分培養(yǎng)的關(guān)鍵。
print("請先輸入一個存放文件夾的名字")
else:
saveimg =True
#循環(huán)捕獲圖片
ret,self.frame =self.camera.read()
self.frame =cv2.flip(self.frame,3)
roi =self.binaryMask(self.frame,x0,y0,width,height)
framecount =framecount + 1
為了降低手勢在訓(xùn)練過程過擬合和減少圖片處理時的計算量,需要進(jìn)行圖片預(yù)處理。利用Opencv中的cv2.Imread()方法將圖片加載進(jìn)來,再通過Numpy的array()方法將圖片進(jìn)行歸一化,使其能提高模型的收斂速度和精度,然后使用LabelBinarizer()進(jìn)行二值化處理,將彩色圖像處理成黑白圖像,即二值化灰度圖像,再將二值化灰度圖像用blur()方法進(jìn)行平滑處理,降低圖像噪聲,最后使用pickle.dump(lb,f)將標(biāo)簽數(shù)據(jù)保存為dat文件,方便模型訓(xùn)練和手勢識別,具體流程如圖5所示。
圖5 圖像預(yù)處理流程
2.1.3 神經(jīng)網(wǎng)絡(luò)訓(xùn)練
該手部康復(fù)系統(tǒng)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)包含5個卷積層,3個池化層和兩個全連接層。其中5個卷積層的卷積核尺寸大小都一樣,卷積核個數(shù)分別是32,64,64,128,128,而且都是采用全零填充和Relu激活函數(shù)。3個池化層采用的是2*2大小,步長為2的最大池化操作。在全連接層之前該系統(tǒng)采用了Dropout[10]隨機(jī)丟棄50%神經(jīng)元參數(shù),讓這些參數(shù)不參與當(dāng)前訓(xùn)練而達(dá)到了又一次的防止過擬合。最后在輸出層采用Softmax函數(shù)對結(jié)果進(jìn)行分類輸出。關(guān)鍵代碼如下:
# 神經(jīng)網(wǎng)絡(luò)構(gòu)建
model =Sequential()
# 第一層卷積和第一層池化
model.add(Conv2D(32,(3,3),padding="same",input_shape=(100,100,3),activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
# 第二層卷積
model.add(Conv2D(64,(3,3),padding="same",activation="relu"))
# 第三層卷積和第二層池化
model.add(Conv2D(64,(3,3),padding="same",activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
# 第四層卷積
model.add(Conv2D(128,(3,3),padding="same",activation="relu"))
# 第五層卷積和第三層池化
model.add(Conv2D(128,(3,3),padding="same",activation="relu"))
model.add(MaxPooling2D(pool_size=(2,2),strides=(2,2)))
# 全連接層
model.add(Flatten())
model.add(Dense(64,activation="relu"))
# 防止過擬合
model.add(Dropout(0.5))
# 輸出層(用的是多分類的對數(shù)損失函數(shù)softmax,如果只有兩個手勢,用sigmoid)
model.add(Dense(class_num,activation="softmax"))
2.1.4 模型測試
為了保證模型的準(zhǔn)確度,需要對模型的準(zhǔn)確度進(jìn)行測試。首先需要使用pickle.load()加載標(biāo)簽數(shù)據(jù),調(diào)用load_model()加載神經(jīng)網(wǎng)絡(luò),使用inverse_transform()將標(biāo)準(zhǔn)化的數(shù)據(jù)轉(zhuǎn)為原始數(shù)據(jù),再調(diào)用cv2.VideoCapture(0)方法打開Pc端攝像頭,在界面的綠色區(qū)域內(nèi)做出采集過的手勢,調(diào)用cv2.putText()將識別到的手勢類型名稱顯示在屏幕上,根據(jù)在綠色識別區(qū)域作出的手勢與屏幕上顯示的手勢類型名稱是否一致判斷模型的準(zhǔn)確度。重復(fù)進(jìn)行模型測試,當(dāng)模型測試達(dá)到高準(zhǔn)確度和高穩(wěn)定性時,就可以把該模型運(yùn)用到手部康復(fù)訓(xùn)練中。關(guān)鍵代碼如下:
#加載標(biāo)簽
try:
with open(LABEL_NAME,"rb")as f:
lb =pickle.load(f)
#加載神經(jīng)網(wǎng)絡(luò)
model=load_model(MODEL_NAME)
except:
print('沒有'+LABEL_NAME+'和'+MODEL_NAME)
gesture=lb.inverse_transform(prediction)[0]
手部康復(fù)患者首先打開康復(fù)訓(xùn)練程序,若是首次使用的患者可以根據(jù)需要錄入各種手勢。非首次使用可以跳過錄入手勢的步驟,設(shè)定好康復(fù)訓(xùn)練的組數(shù)作為一個療程進(jìn)行康復(fù)訓(xùn)練,在康復(fù)訓(xùn)練中患者需要根據(jù)屏幕上提示的文字信息在界面的綠色區(qū)域中做出對應(yīng)的手勢,完成療程后結(jié)束康復(fù)訓(xùn)練。訓(xùn)練完畢會生成數(shù)據(jù)錄入數(shù)據(jù)庫中,患者可點擊歷史查詢按鈕查看歷史康復(fù)訓(xùn)練數(shù)據(jù)的反饋,根據(jù)系統(tǒng)記錄判斷患者的訓(xùn)練完成程度對訓(xùn)練計劃做出相應(yīng)的調(diào)整,患者可設(shè)定較低組數(shù)作為手部的適應(yīng)性訓(xùn)練,當(dāng)患者適應(yīng)訓(xùn)練強(qiáng)度后可逐步增加訓(xùn)練的難度。循序漸進(jìn)的手部康復(fù)訓(xùn)練,有利于提高患者對康復(fù)訓(xùn)練的信心和加快患者手部的恢復(fù)速度。
通過攝像頭拍攝的各種手勢圖像一般都是RGB圖像,該系統(tǒng)使用了OpenCV技術(shù)把輸入的RGB圖像數(shù)據(jù)經(jīng)過預(yù)處理轉(zhuǎn)化為灰度圖像,同時也采用歸一化提升手勢識別康復(fù)系統(tǒng)模型的收斂速度和精度。該手部康復(fù)系統(tǒng)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)包含5個卷積層,3個池化層和兩個全連接層。經(jīng)過5個僅取圖像數(shù)據(jù)局部特征的卷積層,有效地減少了圖片的長度和寬度,減少了特征權(quán)值的數(shù)量。3個一樣的池化層不斷地降低了維數(shù),通過降采樣的方式,在不影響我們的特征圖像質(zhì)量的情況之下壓縮圖片,從而達(dá)到了減少網(wǎng)絡(luò)中的參數(shù)和計算次數(shù),縮短了訓(xùn)練時間等目的,也很好地控制了過度擬合情況的發(fā)生。最后在全連接層之前該系統(tǒng)也采用了Dropout隨機(jī)丟棄50%神經(jīng)元參數(shù),讓這些參數(shù)不參與當(dāng)前訓(xùn)練而達(dá)到了又一次的防止過擬合。其中第一個全連接層也使用了拉直層。由于手勢識別康復(fù)過程中需要訓(xùn)練的手勢往往是兩個以上的,所以輸出層用的是輸出值概率總和始終為1的多分類的對數(shù)損失函數(shù)Softmax函數(shù)。該系統(tǒng)的訓(xùn)練過程中是用總樣本的20%為測試數(shù)據(jù),剩下的80%為訓(xùn)練數(shù)據(jù)。最終的訓(xùn)練的準(zhǔn)確率可以達(dá)到96%以上。
該系統(tǒng)不僅使用了計算機(jī)視覺技術(shù),卷積神經(jīng)網(wǎng)絡(luò)也應(yīng)用在其中,使訓(xùn)練模型的準(zhǔn)確度不斷提高。整個康復(fù)系統(tǒng)也采用PyQt5設(shè)計GUI界面,實現(xiàn)了可視化。以歷史查詢界面為例,用戶通過時間選擇范圍,查看在各階段的手勢恢復(fù)數(shù)據(jù)反饋,如訓(xùn)練時間,訓(xùn)練手勢種類,訓(xùn)練周期等數(shù)據(jù)可以幫助醫(yī)生以及患者查看患者在各個階段的手部恢復(fù)情況,便于醫(yī)生對恢復(fù)程度進(jìn)行針對性的康復(fù)訓(xùn)練調(diào)整。由于計算機(jī)視覺對收集手勢的環(huán)境背景要求比較高,該康復(fù)系統(tǒng)在使用時,最好保證攝像頭開啟時的環(huán)境背景足夠單調(diào),這樣更有利于降低周圍環(huán)境對識別手勢的干擾,準(zhǔn)確識別到手勢,提高訓(xùn)練使用準(zhǔn)確率。
本文設(shè)計并實現(xiàn)了基于計算機(jī)視覺的手部康復(fù)系統(tǒng),給手部障礙患者提供一個良好的訓(xùn)練環(huán)境并進(jìn)行有效的康復(fù)訓(xùn)練,提高患者訓(xùn)練的積極性。系統(tǒng)具有以下點:采用PyQt設(shè)計了GUI界面,呈現(xiàn)效果美觀;利用計算機(jī)視覺技術(shù)與患者進(jìn)行交互,識別速度和識別準(zhǔn)確率較高;患者的訓(xùn)練過程會保存到數(shù)據(jù)庫中,可以隨時查看訓(xùn)練過程并做出相應(yīng)的訓(xùn)練調(diào)整。
手勢康復(fù)訓(xùn)練是近年來人工智能研究鄰域的熱點,對此我們對該系統(tǒng)如下展望:提高在復(fù)雜背景下識別的準(zhǔn)確率;通過跟相關(guān)醫(yī)院合作,根據(jù)更專業(yè)的醫(yī)護(hù)知識完善訓(xùn)練手勢的種類、訓(xùn)練過程設(shè)計等;進(jìn)一步研究智能決策系統(tǒng),通過主觀評估結(jié)果結(jié)合智能決策法,產(chǎn)生康復(fù)訓(xùn)練的初步方案,并將該方法運(yùn)用到游戲訓(xùn)練的過程中,通過監(jiān)控當(dāng)前游戲訓(xùn)練中的參數(shù)的變化趨勢,以此作為后續(xù)訓(xùn)練方案制定的依據(jù)。