0 前言
?? 優(yōu)質(zhì)競(jìng)賽項(xiàng)目系列,今天要分享的是
基于深度學(xué)習(xí)的手勢(shì)檢測(cè)與識(shí)別算法
該項(xiàng)目較為新穎,適合作為競(jìng)賽課題方向,學(xué)長(zhǎng)非常推薦!
?? 更多資料, 項(xiàng)目分享:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-808702.html
https://gitee.com/dancheng-senior/postgraduate文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-808702.html
1 實(shí)現(xiàn)效果
廢話不多說(shuō),先看看學(xué)長(zhǎng)實(shí)現(xiàn)的效果吧
2 技術(shù)原理
2.1 手部檢測(cè)
主流的手勢(shì)分割方法主要分為靜態(tài)手勢(shì)分割和動(dòng)態(tài)手勢(shì)分割兩大類方法。
-
靜態(tài)手勢(shì)分割方法: 單張圖片利用手和背景的差異進(jìn)行分割,
-
動(dòng)態(tài)手勢(shì)分割方法: 利用了視頻幀序列的信息來(lái)分割。
2.1.1 基于膚色空間的手勢(shì)檢測(cè)方法
膚色是手和其他背景最明顯的區(qū)分特征,手的顏色范圍較統(tǒng)一并且有聚類性,基于膚色的分割方法還有處理速度快,對(duì)旋轉(zhuǎn)、局部遮擋、姿勢(shì)變換具有不變性,因此利用不同的顏色空間來(lái)進(jìn)行手勢(shì)分割是現(xiàn)在最常用的方法。
膚色分割的方法主要有以下幾種:基于參數(shù)、非參數(shù)的顯式膚色聚類方法。參數(shù)模型使用高斯顏色分布,非參數(shù)模型則是從訓(xùn)練數(shù)據(jù)中獲得膚色直方圖來(lái)對(duì)膚色區(qū)間進(jìn)行估計(jì)。膚色聚類顯式地在某個(gè)特定的顏色空間中定義了膚色的邊界,廣義上看是一種靜態(tài)的膚色濾波器,如Khan根據(jù)檢測(cè)到的臉部提出了一種自適應(yīng)的膚色模型。
膚色是一種低級(jí)的特征,對(duì)計(jì)算的消耗很少,感知上均勻的顏色空間如CIELAB,CIELUV等已經(jīng)被用于進(jìn)行膚色檢測(cè)。正交的顏色空間如,YCbCr,YCgCr,YIQ,YUV等也被用與膚色分割,如Julilian等使用YCrCb顏色空間,利用其中的CrCb分量來(lái)建立高斯模型進(jìn)行分割。使用膚色分割的問(wèn)題是誤檢率非常高,所以需要通過(guò)顏色校正,圖像歸一化等操作來(lái)降低外界的干擾,提高分割的準(zhǔn)確率。
基于YCrCb顏色空間Cr, Cb范圍篩選法手部檢測(cè),實(shí)現(xiàn)代碼如下:
?
# 膚色檢測(cè)之二: YCrCb中 140<=Cr<=175 100<=Cb<=120
img = cv2.imread(imname, cv2.IMREAD_COLOR)
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb) # 把圖像轉(zhuǎn)換到Y(jié)UV色域
(y, cr, cb) = cv2.split(ycrcb) # 圖像分割, 分別獲取y, cr, br通道分量圖像
skin2 = np.zeros(cr.shape, dtype=np.uint8) # 根據(jù)源圖像的大小創(chuàng)建一個(gè)全0的矩陣,用于保存圖像數(shù)據(jù)
(x, y) = cr.shape # 獲取源圖像數(shù)據(jù)的長(zhǎng)和寬
# 遍歷圖像, 判斷Cr和Br通道的數(shù)值, 如果在指定范圍中, 則置把新圖像的點(diǎn)設(shè)為255,否則設(shè)為0
for i in range(0, x):
for j in range(0, y):
if (cr[i][j] > 140) and (cr[i][j] < 175) and (cb[i][j] > 100) and (cb[i][j] < 120):
skin2[i][j] = 255
else:
skin2[i][j] = 0
cv2.imshow(imname, img)
cv2.imshow(imname + " Skin2 Cr+Cb", skin2)
檢測(cè)效果:
2.1.2 基于運(yùn)動(dòng)的手勢(shì)檢測(cè)方法
基于運(yùn)動(dòng)的手勢(shì)分割方法將運(yùn)動(dòng)的前景和靜止的背景分割開(kāi),主要有背景差分法、幀間差分法、光流法等。
幀間差分選取視頻流中前后相鄰的幀進(jìn)行差分,設(shè)定一定的閾值來(lái)區(qū)分前景和后景,從而提取目標(biāo)物體。幀差法原理簡(jiǎn)單,計(jì)算方便且迅速,但是當(dāng)前后景顏色相同時(shí)檢測(cè)目標(biāo)會(huì)不完整,靜止目標(biāo)則無(wú)法檢測(cè)。
背景差分需要建立背景圖,利用當(dāng)前幀和背景圖做差分,從而分離出前后景。背景差分在進(jìn)行目標(biāo)檢測(cè)中使用較多。有基于單高斯模型,雙高斯模型的背景差分,核密度估計(jì)法等。景差分能很好的提取完整的目標(biāo),但是受環(huán)境變化的影響比較大,因此需要建立穩(wěn)定可靠的背景模型和有效的背景更新方法。
?
1, 讀取攝像頭
2, 背景減除
fgbg1 = cv.createBackgroundSubtractorMOG2(detectShadows=True)
fgbg2 = cv.createBackgroundSubtractorKNN(detectShadows=True)
# fgmask = fgbg1.apply(frame)
fgmask = fgbg2.apply(frame) # 兩種方法
3, 將沒(méi)幀圖像轉(zhuǎn)化為灰度圖像 在高斯去噪 最后圖像二值化
gray = cv.cvtColor(res, cv.COLOR_BGR2GRAY)
blur = cv.GaussianBlur(gray, (11, 11), 0)
ret, binary = cv.threshold(blur, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)
4, 選取手部的 ROI 區(qū)域 繪制輪廓
gesture = dst[50:600, 400:700]
contours, heriachy = cv.findContours(gesture, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) # 獲取輪廓本身
for i, contour in enumerate(contours): # 獲取輪廓
cv.drawContours(frame, contours, i, (0, 0, 255), -1) # 繪制輪廓
print(i)
2.1.3 基于邊緣的手勢(shì)檢測(cè)方法
基于邊緣的手勢(shì)分割方法利用邊緣檢測(cè)算子在圖像中計(jì)算出圖像的輪廓,常用來(lái)進(jìn)行邊緣檢測(cè)的一階算子有(Roberts算子,Prewitt算子,Sobel算子,Canny算子等),二階算子則有(Marr-
Hildreth算子,Laplacian算子等),這些算子在圖像中找到手的邊緣。但是邊緣檢測(cè)對(duì)噪聲比較敏感,因此精確度往往不高。
邊緣檢測(cè)代碼示例:
?
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import scipy.signal as signal # 導(dǎo)入sicpy的signal模塊
# Laplace算子
suanzi1 = np.array([[0, 1, 0],
[1,-4, 1],
[0, 1, 0]])
# Laplace擴(kuò)展算子
suanzi2 = np.array([[1, 1, 1],
[1,-8, 1],
[1, 1, 1]])
# 打開(kāi)圖像并轉(zhuǎn)化成灰度圖像
image = Image.open("pika.jpg").convert("L")
image_array = np.array(image)
# 利用signal的convolve計(jì)算卷積
image_suanzi1 = signal.convolve2d(image_array,suanzi1,mode="same")
image_suanzi2 = signal.convolve2d(image_array,suanzi2,mode="same")
# 將卷積結(jié)果轉(zhuǎn)化成0~255
image_suanzi1 = (image_suanzi1/float(image_suanzi1.max()))*255
image_suanzi2 = (image_suanzi2/float(image_suanzi2.max()))*255
# 為了使看清邊緣檢測(cè)結(jié)果,將大于灰度平均值的灰度變成255(白色)
image_suanzi1[image_suanzi1>image_suanzi1.mean()] = 255
image_suanzi2[image_suanzi2>image_suanzi2.mean()] = 255
# 顯示圖像
plt.subplot(2,1,1)
plt.imshow(image_array,cmap=cm.gray)
plt.axis("off")
plt.subplot(2,2,3)
plt.imshow(image_suanzi1,cmap=cm.gray)
plt.axis("off")
plt.subplot(2,2,4)
plt.imshow(image_suanzi2,cmap=cm.gray)
plt.axis("off")
plt.show()
2.1.4 基于模板的手勢(shì)檢測(cè)方法
基于模版的手勢(shì)分割方法需要建立手勢(shì)模版數(shù)據(jù)庫(kù),數(shù)據(jù)庫(kù)記錄了不同手勢(shì)不同場(chǎng)景下的手勢(shì)模版。計(jì)算某個(gè)圖像塊和數(shù)據(jù)庫(kù)中各個(gè)手勢(shì)的距離,然后使用滑動(dòng)窗遍歷整幅圖像進(jìn)行相同的計(jì)算,從而在圖像正確的位置找到數(shù)據(jù)庫(kù)中的最佳匹配。模版匹配對(duì)環(huán)境和噪聲魯棒,但是數(shù)據(jù)庫(kù)需要涵蓋各種手型、大小、位置、角度的手勢(shì),并且因?yàn)樾枰闅v整個(gè)圖像進(jìn)行相同的計(jì)算,實(shí)時(shí)性較差。
2.1.5 基于機(jī)器學(xué)習(xí)的手勢(shì)檢測(cè)方法
貝葉斯網(wǎng)絡(luò),聚類分析,高斯分類器等等也被用來(lái)做基于膚色的分割。隨機(jī)森林是一種集成的分類器,易于訓(xùn)練并且準(zhǔn)確率較高,被用在分割和手勢(shì)識(shí)別上。建立膚色分類的模型,并且使用隨機(jī)森林對(duì)像素進(jìn)行分類,發(fā)現(xiàn)隨機(jī)森林得到的分割結(jié)果比上述的方法都要準(zhǔn)確.
3 手部識(shí)別
毫無(wú)疑問(wèn),深度學(xué)習(xí)做圖像識(shí)別在準(zhǔn)確度上擁有天然的優(yōu)勢(shì),對(duì)手勢(shì)的識(shí)別使用深度學(xué)習(xí)卷積網(wǎng)絡(luò)算法效果是非常優(yōu)秀的。
3.1 SSD網(wǎng)絡(luò)
SSD網(wǎng)絡(luò)是2016年提出的卷積神經(jīng)網(wǎng)絡(luò),其在物體檢測(cè)上取得了很好的效果。SSD網(wǎng)絡(luò)和FCN網(wǎng)絡(luò)一樣,最終的預(yù)測(cè)結(jié)果利用了不同尺度的特征圖信息,在不同尺度的特征圖上進(jìn)行檢測(cè),大的特征圖可以檢測(cè)小物體,小特征圖檢測(cè)大物體,使用金字塔結(jié)構(gòu)的特征圖,從而實(shí)現(xiàn)多尺度的檢測(cè)。網(wǎng)絡(luò)會(huì)對(duì)每個(gè)檢測(cè)到物體的檢測(cè)框進(jìn)行打分,得到框中物體所屬的類別,并且調(diào)整邊框的比例和位置以適應(yīng)對(duì)象的形狀。
3.2 數(shù)據(jù)集
我們實(shí)驗(yàn)室自己采集的數(shù)據(jù)集:
數(shù)據(jù)集包含了48個(gè)手勢(shì)視頻,這些視頻是由谷歌眼鏡拍攝的,視頻中以第一人稱視角拍攝了室內(nèi)室外的多人互動(dòng)。數(shù)據(jù)集中包含4個(gè)類別的手勢(shì):自己的左右手,其他人的左右手。數(shù)據(jù)集中包含了高質(zhì)量、像素級(jí)別標(biāo)注的分割數(shù)據(jù)集和檢測(cè)框標(biāo)注數(shù)據(jù)集,視頻中手不受到任何約束,包括了搭積木,下棋,猜謎等活動(dòng)。
需要數(shù)據(jù)集的同學(xué)可以聯(lián)系學(xué)長(zhǎng)獲取
3.3 最終改進(jìn)的網(wǎng)絡(luò)結(jié)構(gòu)
最后整體實(shí)現(xiàn)效果還是不錯(cuò)的:
4 最后
?? 更多資料, 項(xiàng)目分享:
https://gitee.com/dancheng-senior/postgraduate
到了這里,關(guān)于互聯(lián)網(wǎng)加競(jìng)賽 基于機(jī)器視覺(jué)的手勢(shì)檢測(cè)和識(shí)別算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!