基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的

本篇文章為大家展示了基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)主要從事做網(wǎng)站、成都網(wǎng)站制作、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)湘西土家族,10年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):13518219792

在檢疫期間,我們的體育活動(dòng)非常有限,這樣并不好。在進(jìn)行一些居家運(yùn)動(dòng)時(shí),我們必須時(shí)刻保持高度的注意力集中,以便記錄自己每天的運(yùn)動(dòng)量。因此我們希望建立一個(gè)自動(dòng)化的系統(tǒng)來實(shí)現(xiàn)運(yùn)動(dòng)量計(jì)算??紤]到我們?cè)谏疃讜r(shí),有明確階段和大幅度變化的基本運(yùn)動(dòng),實(shí)現(xiàn)對(duì)深蹲的計(jì)數(shù)會(huì)相對(duì)比較簡(jiǎn)單。

下面我們就一起嘗試實(shí)現(xiàn)它吧!

數(shù)據(jù)采集

使用帶相機(jī)的Raspberry Pi來獲取圖片是非常方便的,完成圖像的拍攝后再利用OpenCV即可將獲取的圖像寫入文件系統(tǒng)。

運(yùn)動(dòng)識(shí)別

最初,我們打算使用圖像分割完成人物的提取工作。但是我們都知道圖像分割是一項(xiàng)非常繁瑣的操作,尤其是在Raspberry資源有限的情況下。

除此之外,圖像分割忽略了一個(gè)事實(shí)。當(dāng)前我們所擁有的是一系列圖像幀,而不是單個(gè)圖片。該圖像序列具有明顯功能,并且我們后續(xù)將要使用到它。

因此,我們從OpenCV 著手進(jìn)行背景去除,以提供了可靠的結(jié)果。

背景扣除

首先,創(chuàng)建一個(gè)背景減法器:

backSub = cv.createBackgroundSubtractorMOG2()

向其中添加圖像幀:

mask = backSub.apply(frame)

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

基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的

然后擴(kuò)大圖像以突出輪廓。

mask = cv.dilate(mask, None, 3)

將此算法應(yīng)用于所有圖像幀可以得出每一幅圖像中的姿勢(shì)。之后,我們將它們分類為站立,下蹲以及無三種情況。

接下來我們要把圖像中的人提取出來,OpenCV可以幫助我們找到相應(yīng)的找到輪廓:

cnts, _ = cv.findContours(img, cv.RETR_CCOMP, cv.CHAIN_APPROX_SIMPLE)

這種方法或多或少適用于人物的最大輪廓的提取,但不幸的是,這樣處理的結(jié)果并不穩(wěn)定。例如,檢測(cè)得到最大的輪廓只能包括人的身體,而不包括他的腳。

但不管怎么說,擁有一系列圖像對(duì)我很有幫助。通常情況下我們做深蹲運(yùn)動(dòng)都發(fā)生在同一地點(diǎn),因此我們可以假設(shè)所有動(dòng)作都在某個(gè)區(qū)域內(nèi)進(jìn)行并且該區(qū)域是穩(wěn)定的。為此我們可以迭代構(gòu)建邊界矩形,如果需要,可以以最大輪廓增加邊界矩形。

有一個(gè)例子:

? 最大的輪廓是紅色

? 輪廓邊界矩形為藍(lán)色

? 圖邊界矩形為綠色

基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的

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

分類

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

以下Mask用作分類器輸入:

站立姿勢(shì):

基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的

下蹲姿勢(shì):

基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的

接下來我們將使用Keras 與Tensorflow進(jìn)行分類。

最初,我們使用了經(jīng)典的Lenet-5模型,運(yùn)行結(jié)果良好。隨后由于閱讀了一些有關(guān)Lenet-5變體的文章后,我們決定嘗試簡(jiǎn)化架構(gòu)。

事實(shí)證明,簡(jiǎn)化后的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個(gè)紀(jì)元的準(zhǔn)確度為86%,20個(gè)的準(zhǔn)確度為94%,而30個(gè)的準(zhǔn)確度為96%。訓(xùn)練如果在增加的話可能會(huì)導(dǎo)致過擬合引起準(zhǔn)確度的下降,因此接下來我們將把這個(gè)模型運(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()

并以此對(duì)下蹲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毫秒,幾乎接近實(shí)時(shí)。

最后讓我們將以上所有部分整合到一個(gè)應(yīng)用程序中:

? GET / —一個(gè)應(yīng)用頁(yè)面(下面有更多信息)

? GET / status-獲取當(dāng)前狀態(tài),下蹲次數(shù)和幀數(shù)

? POST / start —開始練習(xí)

? POST / stop —完成練習(xí)

? GET / stream —來自攝像機(jī)的視頻流

上述內(nèi)容就是基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

名稱欄目:基于OpenCV和Tensorflow的深蹲檢測(cè)器是怎樣的
分享網(wǎng)址:http://muchs.cn/article46/gphphg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、定制網(wǎng)站、ChatGPT網(wǎng)站導(dǎo)航、面包屑導(dǎo)航、用戶體驗(yàn)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

營(yíng)銷型網(wǎng)站建設(shè)