摔倒檢測,基于骨骼點(diǎn)人體動(dòng)作識(shí)別,部分代碼用 Chatgpt 完成
哈嘍,大家好。
今天給大家分享一個(gè)摔倒檢測項(xiàng)目,準(zhǔn)確地說是基于骨骼點(diǎn)的人體動(dòng)作識(shí)別。
大概分為三個(gè)步驟
- 識(shí)別人體
- 識(shí)別人體骨骼點(diǎn)
- 動(dòng)作分類
項(xiàng)目源碼已經(jīng)打包好了,獲取方式見文末。
0. chatgpt
首先,我們需要獲取監(jiān)控的視頻流。這段代碼比較固定,我們可以直接讓chatgpt完成
chatgpt寫的這段代碼是沒有問題的,可以直接使用。
但后面涉及到業(yè)務(wù)型任務(wù),比如:用mediapipe?識(shí)別人體骨骼點(diǎn),chatgpt給出的代碼是不對(duì)的。
我覺得chatgpt?可以作為一個(gè)工具箱,能獨(dú)立于業(yè)務(wù)邏輯,都可以試著交給chatgpt完成。
所以,我覺得未來對(duì)程序員的要求會(huì)更加注重業(yè)務(wù)抽象的能力。扯遠(yuǎn)了,言歸正傳。
1. 人體識(shí)別
人體識(shí)別可以用目標(biāo)檢測模型,比如:YOLOv5?,之前我們也分享過好多訓(xùn)練YOLOv5模型的文章。
但這里我沒有用YOLOv5?,而是用mediapipe?。因?yàn)閙ediapipe?運(yùn)行速度更快,在 CPU 上也能流暢地運(yùn)行。
2. 骨骼點(diǎn)識(shí)別
識(shí)別骨骼點(diǎn)的模型有很多,如:alphapose、openpose,每種模型識(shí)別出來的骨骼點(diǎn)個(gè)數(shù)和位置都有所差異。比如下面這兩種:
mediapipe 32個(gè)骨骼點(diǎn)
coco 17個(gè)骨骼點(diǎn)
骨骼點(diǎn)的識(shí)別我仍然使用mediapipe?,除了速度快,另一個(gè)優(yōu)勢是mediapipe識(shí)別的骨骼點(diǎn)多,有 32 個(gè),能滿足我們的使用。因?yàn)橄旅嬉玫娜梭w動(dòng)作分類,強(qiáng)依賴于骨骼點(diǎn)。
3. 動(dòng)作識(shí)別
動(dòng)作識(shí)別使用的是基于骨架動(dòng)作識(shí)別的時(shí)空?qǐng)D卷積網(wǎng)絡(luò),開源方案是STGCN(Skeleton-Based Graph Convolutional Networks)
https://github.com/yysijie/st-gcn
一組動(dòng)作,如:摔倒,由 N 幀組成,每一幀可以構(gòu)造出以骨骼點(diǎn)坐標(biāo)組成的空間圖,骨骼點(diǎn)在幀之間連接起來就構(gòu)成時(shí)間圖,骨骼點(diǎn)的連接和時(shí)間幀的連接便可以構(gòu)造一張時(shí)空?qǐng)D。
時(shí)空?qǐng)D
在時(shí)空?qǐng)D上進(jìn)行多層圖卷積運(yùn)算,便可生成更高層次的特征圖。然后輸入到SoftMax分類器進(jìn)行動(dòng)作分類(Action Classification)。
圖卷積
本來我打算訓(xùn)練STGCN模型的,但遇到的坑實(shí)在是太多了,最后直接用了別人訓(xùn)練好的模型。
坑1. STGCN? 支持 OpenPose? 識(shí)別的骨骼點(diǎn),有數(shù)據(jù)集Kinetics-skeleton?可以直接用??拥牡胤皆谟贠penPose安裝太麻煩,需要一堆步驟,掙扎后放棄。
坑2. STGCN? 還支持 NTU RGB+D數(shù)據(jù)集,該數(shù)據(jù)集有 60 個(gè)動(dòng)作分類,如:起立、行走、摔倒等。這份數(shù)據(jù)集的人體包含 25 個(gè)骨骼點(diǎn),只有坐標(biāo)數(shù)據(jù),原始視頻基本搞不到,所以沒辦法知道這 25 個(gè)骨骼點(diǎn)對(duì)應(yīng)哪些位置,以及用什么模型能識(shí)別出這 25 個(gè)骨骼點(diǎn),掙扎后放棄。
上面兩個(gè)大坑,導(dǎo)致沒法直接訓(xùn)練STGCN?模型,找了一個(gè)開源的方案,它用的是alphapose?識(shí)別 14 個(gè)骨骼點(diǎn),同時(shí)修改STGCN源碼支持自定義骨骼點(diǎn)。
https://github.com/GajuuzZ/Human-Falling-Detect-Tracks
我看了下mediapipe包含了這 14 個(gè)骨骼點(diǎn),所以可以用mediapipe識(shí)別的骨骼點(diǎn)輸入他的模型,實(shí)現(xiàn)動(dòng)作分類。
mediapipe 32個(gè)骨骼點(diǎn)
選出14個(gè)關(guān)鍵骨骼點(diǎn)
14個(gè)骨骼點(diǎn)提取代碼:
STGCN?原始方案構(gòu)造的空間圖只支持openpose?18個(gè)骨骼點(diǎn)和NTU RGB+D數(shù)據(jù)集25個(gè)骨骼點(diǎn)
修改這部分源碼,以支持自定義的14個(gè)骨骼點(diǎn)
模型直接使用Human-Falling-Detect-Tracks項(xiàng)目已經(jīng)訓(xùn)練好的,實(shí)際運(yùn)行發(fā)現(xiàn)識(shí)別效果很差,因?yàn)闆]有看到模型訓(xùn)練過程,不確定問題出在哪。
有能力的朋友可以自己訓(xùn)練模型試試,另外,百度的Paddle?也基于STGCN?開發(fā)了一個(gè)跌倒檢測模型,只支持摔倒這一種行為的識(shí)別。
當(dāng)然大家也可以試試Transformer的方式,不需要提取骨骼點(diǎn)特征,直接將 N 幀圖片送入模型分類。
關(guān)于STGCN的原理,大家可以參考文章:https://www.jianshu.com/p/be85114006e3 總結(jié)的非常好。
需要源碼的朋友留言區(qū)回復(fù)即可。
如果大家覺得本文對(duì)你有用就點(diǎn)個(gè) 在看 鼓勵(lì)一下吧,后續(xù)我會(huì)持續(xù)分享優(yōu)秀的 Python+AI 項(xiàng)目。