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