用 Python+openpose 实现抖音尬舞机
? ? ?游戲開(kāi)始后,隨著音樂(lè)會(huì)給出不同的動(dòng)作提示,用戶按照提示擺出正確動(dòng)作即可得分。援引官方說(shuō)法,“尬舞機(jī)”主要應(yīng)用了今日頭條 AI Lab 自主開(kāi)發(fā)的“人體關(guān)鍵點(diǎn)檢測(cè)技術(shù)”,依靠這項(xiàng)技術(shù),抖音能夠檢測(cè)到圖像中所包含人體的各個(gè)關(guān)鍵點(diǎn)的位置,從而實(shí)現(xiàn)從用戶姿態(tài)到目標(biāo)姿態(tài)的準(zhǔn)確匹配。
? ? 以上這些體感游戲,都牽涉到計(jì)算機(jī)視覺(jué)中的一個(gè)細(xì)分領(lǐng)域:?人體姿態(tài)估計(jì)(pose estimation)?,即識(shí)別圖像中的人體關(guān)鍵點(diǎn)(人體上有一定自由度的關(guān)節(jié),如頭、頸、肩、肘、腕、腰、膝、踝等)并正確的聯(lián)系起來(lái),通過(guò)對(duì)人體關(guān)鍵點(diǎn)在三維空間相對(duì)位置的計(jì)算,來(lái)估計(jì)人體當(dāng)前的姿態(tài)。
? ? ?人體姿態(tài)估計(jì)有不少難點(diǎn),比如:如何從圖片中區(qū)分出人和背景;如何定位人體的關(guān)鍵點(diǎn);如何根據(jù)二維的關(guān)鍵點(diǎn)坐標(biāo)計(jì)算出三維中的姿態(tài);如何處理四肢交叉或遮擋的情況;如何定位多人;如何提升計(jì)算速度等等。而相關(guān)技術(shù)在游戲、安防、人機(jī)交互、行為分析等方面都有應(yīng)用前景。因此,這是計(jì)算機(jī)視覺(jué)甚至人工智能領(lǐng)域中極具挑戰(zhàn)的一個(gè)課題。(小聲說(shuō)句,我的碩士畢業(yè)論文就是這個(gè)方向)
? ? 不過(guò),因?yàn)榍叭说呢暙I(xiàn),現(xiàn)在你只需通過(guò)少量的 Python 代碼,也可以實(shí)現(xiàn)從照片或視頻中進(jìn)行人體姿態(tài)估計(jì)。這都要仰賴于 CMU 的開(kāi)源項(xiàng)目:?Openpose?。
OpenPose 是基于卷積神經(jīng)網(wǎng)絡(luò)和監(jiān)督學(xué)習(xí)并以 caffe 為框架寫(xiě)成的開(kāi)源庫(kù),可以實(shí)現(xiàn)人的面部表情、軀干和四肢甚至手指的跟蹤,適用多人且具有較好的魯棒性。是世界上第一個(gè)基于深度學(xué)習(xí)的實(shí)時(shí)多人二維姿態(tài)估計(jì),為機(jī)器理解人類提供了一個(gè)高質(zhì)量的信息維度。其理論基礎(chǔ)來(lái)自《Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields》,是 CVPR 2017 的一篇論文,作者是來(lái)自 CMU 感知計(jì)算實(shí)驗(yàn)室的曹哲、Tomas Simon、Shih-En Wei、Yaser Sheikh。
項(xiàng)目地址:?https://github.com/ZheC/Realtime_Multi-Person_Pose_Estimation
(摘自網(wǎng)絡(luò))
論文演示效果:
? ? ?此方法可以達(dá)到對(duì)視頻流的實(shí)時(shí)多人檢測(cè)。要知道,Kinect 可是加了一個(gè)額外的紅外深度攝像頭才做到如此準(zhǔn)確地識(shí)別(還不能是這么多人)。
詳細(xì)的原理,我在這里就不冒充大牛強(qiáng)行解釋了。但通俗地說(shuō)幾點(diǎn),為什么 Openpose 有如此突破性地效果:
? ? ?之前的文章?Python+OpenCV 十幾行代碼模仿世界名畫(huà)?中,我們提到 OpenCV-Python 在 3.3 版本中加入了?深度神經(jīng)網(wǎng)絡(luò)(DNN)?的支持。同樣在項(xiàng)目 Samples 中,提供 Openpose 的一個(gè) Python 簡(jiǎn)單實(shí)現(xiàn)版本。(只支持圖像中有單個(gè)人)
官方代碼:
https://github.com/opencv/opencv/blob/master/samples/dnn/openpose.py
使用方法,命令行進(jìn)入代碼所在目錄執(zhí)行:
python openpose.py --model pose.caffemodel --proto pose.prototxt --dataset MPI
--model?參數(shù)和?--proto?參數(shù)分別是預(yù)先訓(xùn)練好的人體姿態(tài)模型和配置文件。因?yàn)槟P臀募艽?#xff0c;并不包括在 OpenCV 代碼庫(kù)中,可以在 Openpose 項(xiàng)目(https://github.com/CMU-Perceptual-Computing-Lab/openpose?)找到下載地址。
另外可以通過(guò)?--input?參數(shù)指定識(shí)別的圖片或視頻地址,默認(rèn)則使用攝像頭實(shí)時(shí)采集。
執(zhí)行后效果:
?核心代碼:
? ? 和之前 fast-neural-style 的代碼類似,大部分的工作都是 Openpose 做好的,OpenCV 這里只是使用訓(xùn)練好的神經(jīng)網(wǎng)絡(luò)進(jìn)行計(jì)算。所以核心代碼其實(shí)沒(méi)有幾行,而且跟上次的例子幾乎一致。剩下一半的代碼都是在把獲取到的關(guān)鍵點(diǎn)坐標(biāo)繪制成人體的骨架結(jié)構(gòu)。
? ? 這里順帶提醒一下,我發(fā)現(xiàn)代碼中的一個(gè)斷言?assert(len(BODY_PARTS) == out.shape[1])?無(wú)法滿足,會(huì)導(dǎo)致程序終止。如果出現(xiàn)這樣的問(wèn)題,就把這句注釋掉,并不會(huì)對(duì)結(jié)果有影響。拿到人體關(guān)鍵點(diǎn)數(shù)據(jù)后,我們就可以做進(jìn)一步的判斷。比如我們加一個(gè)很簡(jiǎn)單的判斷:
? 如果左手腕和右手腕的高度都超過(guò)脖子的高度,就認(rèn)為是一個(gè)抬手的動(dòng)作,在屏幕上輸出“?HANDS UP!?”。注意在 OpenCV 坐標(biāo)系里,圖像的坐標(biāo)原點(diǎn)是左上角。 效果:
? ? ?如此,一個(gè)簡(jiǎn)單的動(dòng)作識(shí)別程序就有了。雖然很粗糙,但已經(jīng)可以附加在很多應(yīng)用上,比如:商場(chǎng)、科技館里的互動(dòng)游戲、交互式的視覺(jué)藝術(shù)作品等等。感興趣的同學(xué)不妨親自試一試,期待看到你們借此做出更有意思的項(xiàng)目。
總結(jié)
以上是生活随笔為你收集整理的用 Python+openpose 实现抖音尬舞机的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Microsoft Hololens开发
- 下一篇: 【正点原子STM32连载】第三章 开发环