在經(jīng)過之前對于開發(fā)板的使用,以及通過幾個愛芯派官方給出的示例demo(mobilenet/yolov5)在開發(fā)板上的部署之后,筆者也逐漸了解了愛芯派這塊開發(fā)板利用其官方的推理引擎和pipeline部署模型的整體架構(gòu)。接下來就回到最開始定的主線上了——人體姿態(tài)估計。這篇文章就是記錄對一些輕量化人體姿態(tài)估計模型的調(diào)研,和前期準(zhǔn)備。
01人體姿態(tài)估計任務(wù)介紹
其實姿態(tài)任務(wù)識別在很多生活場景都被使用到,這里給大家舉幾個例子:
虛擬主播:大家看到B站直播時的“皮套人”,通常通過一個2D live的形象展示一個動漫形象,然后和主播同步動作。這就是通過攝像頭識別當(dāng)前主播姿態(tài),再同步到虛擬形象上實現(xiàn)的。
VR游戲:大家可能用過像kinect這樣的設(shè)備,用于VR體感游戲。kinect同樣會識別當(dāng)前用戶的姿態(tài),然后用于VR交互中。
活動識別:通過得到人體姿態(tài)后,再通過一個簡單的分類器,可以得到當(dāng)前的運動狀態(tài),如用戶是否跌倒(可以幫助監(jiān)控老年人),以及用戶當(dāng)前身體狀態(tài)等。
02人體姿態(tài)估計任務(wù)技術(shù)路線
其實人體姿態(tài)估計任務(wù)已經(jīng)有很久的年頭了,在當(dāng)前也算是很成熟的任務(wù)了。有興趣的朋友可以閱讀下這篇綜述:Deep Learning-Based Human Pose Estimation: A Survey (arxiv.org)。下面簡單的對單人、多人人體姿態(tài)估計的技術(shù)路線做個小介紹:
03Openpose/lightweight openpose模型
首先要用到的是Openpose模型,這應(yīng)該是最有名的人體姿態(tài)估計的模型了,因為是首個開源的人體姿態(tài)估計框架。論文如下:1812.08008.pdf (arxiv.org)。如下圖所示,openpose能在多人情況下達到理想的識別效果。這里簡單說明一下openpose的原理:openpose就是原來的Bottom-up模型,會先生成針對關(guān)鍵點的heatmap圖像,來預(yù)測關(guān)鍵點的位置;同時也會PAF圖像,也叫做關(guān)節(jié)的親和力場,哪些關(guān)節(jié)的親和力大,那么把它們劃分為同一個人。比如一個胳膊對應(yīng)兩個關(guān)節(jié)點。
Openpose存在的一個問題便它其實是于比較大的模型,在GPU上運行速度也只是勉強實時。為了部署在端側(cè),使用較低算力的設(shè)備,我們需要進一步將其輕量化,也就是lightweight openpose項目。這個主要針對Openpose模型做一些改進,參數(shù)量下降為15% ,但是性能缺相差無幾(精度降低1%)。這里不細講了,有興趣的朋友可以看這篇文章:輕量級OpenPose, Lightweight OpenPose
針對其部署,筆者使用了一些開源的項目后,發(fā)現(xiàn)如下的項目比較好用,就先用其觀察模型的效果:
git clone https://github.com/Hzzone/pytorch-openpose.git
(左右移動查看全部內(nèi)容)
在其body.py里面可以簡單的寫一段代碼輸出onnx文件觀察網(wǎng)絡(luò)結(jié)構(gòu):
class Body(object): def __init__(self, model_path): self.model = bodypose_model() if torch.cuda.is_available(): self.model = self.model.cuda() model_dict = util.transfer(self.model, torch.load(model_path)) self.model.load_state_dict(model_dict) self.model.eval() dummy_input = torch.randn(1, 3, 368, 368).cuda() torch.onnx.export(self.model, dummy_input, "model/openpose_lightweight_body.onnx")
(左右移動查看全部內(nèi)容)
Openpose模型最終會輸出了兩個特征圖heat_map和paf_map,shape分別為(height,width,19)和(height,width,38),其中width、height分別為輸入圖片的寬高/8,其實是由于最開始會通過一個VGG網(wǎng)絡(luò)提取特征,得到輸入圖片的寬高/8的特征圖。19表示coco數(shù)據(jù)集的關(guān)節(jié)種類個數(shù)18(即一個人體的所有關(guān)節(jié)點)+1個背景類別,38表示由這18個關(guān)節(jié)點構(gòu)成的肢體的部分親和力場(每個肢體由兩個關(guān)節(jié)連接組成)。如下圖所示,把導(dǎo)出來的onnx文件放到netron網(wǎng)站可以看到其具體結(jié)構(gòu)。這里可以看到輸出的shape,也方便我們部署的要求。
04Movenet
除了Openpose外,筆者還有一個選型,就是谷歌的輕量級人體姿態(tài)估計模型MoveNet。它是更近的一個輕量級人體姿態(tài)估計模型,但是一個缺點是它沒有論文,也沒有官方代碼,雖然有開源的tfjs模型還有tflite模型,但是也只能通過觀察模型結(jié)構(gòu)去反推。
movenent的介紹在這個網(wǎng)站:Next-Generation Pose Detection with MoveNet and TensorFlow.js — The TensorFlow Blog ,通過對其學(xué)習(xí),以及利用官方模型轉(zhuǎn)換到onnx模型,打開到netron網(wǎng)站觀察其結(jié)構(gòu),可以發(fā)現(xiàn)其有四個輸出,分別對應(yīng)預(yù)測人體實例的幾何中、預(yù)測人體的全部關(guān)鍵點集、 預(yù)測所有關(guān)鍵點的位置的熱力場、以及預(yù)測關(guān)鍵點2D偏移場,也就是每個關(guān)鍵點精確子像素位置的局部偏移。這與Openpose不同,但是有了更精細話的結(jié)果。
同樣為了復(fù)刻movenet網(wǎng)絡(luò)結(jié)構(gòu),筆者選擇參照如下的項目進行實現(xiàn)。
git clone https://github.com/fire717/movenet.pytorch.git
(左右移動查看全部內(nèi)容)
后續(xù)筆者先嘗試將openpose/lightweight openpose部署在板子上,再嘗試對movenent進行進一步的優(yōu)化。
審核編輯:湯梓紅
-
gpu
+關(guān)注
關(guān)注
27文章
4590瀏覽量
128133 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4771瀏覽量
96154 -
模型
+關(guān)注
關(guān)注
1文章
3032瀏覽量
48346 -
vr
+關(guān)注
關(guān)注
34文章
9619瀏覽量
149402 -
愛芯派
+關(guān)注
關(guān)注
0文章
3瀏覽量
50
原文標(biāo)題:如何用愛芯派 Pro 開發(fā)板來部署人體姿態(tài)估計模型
文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發(fā)燒友論壇】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論