您好,登錄后才能下訂單哦!
本篇文章為大家展示了基于OpenCV和Tensorflow的深蹲檢測器是怎樣的,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。
在檢疫期間,我們的體育活動非常有限,這樣并不好。在進(jìn)行一些居家運(yùn)動時,我們必須時刻保持高度的注意力集中,以便記錄自己每天的運(yùn)動量。因此我們希望建立一個自動化的系統(tǒng)來實現(xiàn)運(yùn)動量計算??紤]到我們在深蹲時,有明確階段和大幅度變化的基本運(yùn)動,實現(xiàn)對深蹲的計數(shù)會相對比較簡單。
下面我們就一起嘗試實現(xiàn)它吧!
數(shù)據(jù)采集
使用帶相機(jī)的Raspberry Pi來獲取圖片是非常方便的,完成圖像的拍攝后再利用OpenCV即可將獲取的圖像寫入文件系統(tǒng)。
運(yùn)動識別
最初,我們打算使用圖像分割完成人物的提取工作。但是我們都知道圖像分割是一項非常繁瑣的操作,尤其是在Raspberry資源有限的情況下。
除此之外,圖像分割忽略了一個事實。當(dāng)前我們所擁有的是一系列圖像幀,而不是單個圖片。該圖像序列具有明顯功能,并且我們后續(xù)將要使用到它。
因此,我們從OpenCV 著手進(jìn)行背景去除,以提供了可靠的結(jié)果。
背景扣除
首先,創(chuàng)建一個背景減法器:
backSub = cv.createBackgroundSubtractorMOG2()
向其中添加圖像幀:
mask = backSub.apply(frame)
最后我們可以得到一張帶有身體輪廓的圖片:
然后擴(kuò)大圖像以突出輪廓。
mask = cv.dilate(mask, None, 3)
將此算法應(yīng)用于所有圖像幀可以得出每一幅圖像中的姿勢。之后,我們將它們分類為站立,下蹲以及無三種情況。
接下來我們要把圖像中的人提取出來,OpenCV可以幫助我們找到相應(yīng)的找到輪廓:
cnts, _ = cv.findContours(img, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)
這種方法或多或少適用于人物的最大輪廓的提取,但不幸的是,這樣處理的結(jié)果并不穩(wěn)定。例如,檢測得到最大的輪廓只能包括人的身體,而不包括他的腳。
但不管怎么說,擁有一系列圖像對我很有幫助。通常情況下我們做深蹲運(yùn)動都發(fā)生在同一地點,因此我們可以假設(shè)所有動作都在某個區(qū)域內(nèi)進(jìn)行并且該區(qū)域是穩(wěn)定的。為此我們可以迭代構(gòu)建邊界矩形,如果需要,可以以最大輪廓增加邊界矩形。
有一個例子:
? 最大的輪廓是紅色
? 輪廓邊界矩形為藍(lán)色
? 圖邊界矩形為綠色
通過以上的邊緣提取以及輪廓繪制,可以為進(jìn)一步處理做好充足準(zhǔn)備。
分類
接下來我們將從圖像中提取出邊界矩形,并將其轉(zhuǎn)化為按尺寸64x64正方形。
以下Mask用作分類器輸入:
站立姿勢:
下蹲姿勢:
接下來我們將使用Keras 與Tensorflow進(jìn)行分類。
最初,我們使用了經(jīng)典的Lenet-5模型,運(yùn)行結(jié)果良好。隨后由于閱讀了一些有關(guān)Lenet-5變體的文章后,我們決定嘗試簡化架構(gòu)。
事實證明,簡化后的CNN在當(dāng)前示例中的精度幾乎相同:
model = Sequential([ Convolution2D(8,(5,5), activation='relu', input_shape=input_shape), MaxPooling2D(), Flatten(), Dense(512, activation='relu'), Dense(3, activation='softmax') ])model.compile(loss="categorical_crossentropy", optimizer=SGD(lr=0.01), metrics=["accuracy"])
10個紀(jì)元的準(zhǔn)確度為86%,20個的準(zhǔn)確度為94%,而30個的準(zhǔn)確度為96%。訓(xùn)練如果在增加的話可能會導(dǎo)致過擬合引起準(zhǔn)確度的下降,因此接下來我們將把這個模型運(yùn)用到生活中去。
模型運(yùn)用
我們將在Raspberry上運(yùn)行。
加載模型:
with open(MODEL_JSON, 'r') as f:model_data = f.read()model = tf.keras.models.model_from_json(model_data)model.load_weights(MODEL_H5)graph = tf.get_default_graph()
并以此對下蹲Mask進(jìn)行分類:
img = cv.imread(path + f, cv.IMREAD_GRAYSCALE)img = np.reshape(img,[1,64,64,1])with graph.as_default():c = model.predict_classes(img)return c[0] if c else None
在Raspberry上,輸入為64x64的分類調(diào)用大約需要60-70毫秒,幾乎接近實時。
最后讓我們將以上所有部分整合到一個應(yīng)用程序中:
? GET / —一個應(yīng)用頁面(下面有更多信息)
? GET / status-獲取當(dāng)前狀態(tài),下蹲次數(shù)和幀數(shù)
? POST / start —開始練習(xí)
? POST / stop —完成練習(xí)
? GET / stream —來自攝像機(jī)的視頻流
上述內(nèi)容就是基于OpenCV和Tensorflow的深蹲檢測器是怎樣的,你們學(xué)到知識或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識儲備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。