溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

基于OpenCV和Tensorflow的深蹲檢測器是怎樣的

發(fā)布時間:2021-12-15 17:52:38 來源:億速云 閱讀:182 作者:柒染 欄目:大數(shù)據(jù)

本篇文章為大家展示了基于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)

最后我們可以得到一張帶有身體輪廓的圖片:

基于OpenCV和Tensorflow的深蹲檢測器是怎樣的

然后擴(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)色

? 圖邊界矩形為綠色

基于OpenCV和Tensorflow的深蹲檢測器是怎樣的

通過以上的邊緣提取以及輪廓繪制,可以為進(jìn)一步處理做好充足準(zhǔn)備。

分類

接下來我們將從圖像中提取出邊界矩形,并將其轉(zhuǎn)化為按尺寸64x64正方形。

以下Mask用作分類器輸入:

站立姿勢:

基于OpenCV和Tensorflow的深蹲檢測器是怎樣的

下蹲姿勢:

基于OpenCV和Tensorflow的深蹲檢測器是怎樣的

接下來我們將使用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è)資訊頻道。

向AI問一下細(xì)節(jié)

免責(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)容。

AI