哈嘍,大家好。
今天跟大家分享一個跌倒偵測項目,確切地說是基於骨骼點的人體動作辨識。
大概分成三個步驟
專案原始碼已經打包好了,取得方式見文末。
首先,我們需要取得監控的視訊串流。這段程式碼比較固定,我們可以直接讓chatgpt完成
chatgpt寫的這段程式碼是沒有問題的,可以直接使用。
但後面涉及業務型任務,例如:用mediapipe識別人體骨骼點,chatgpt給的代碼是不對的。
我覺得chatgpt可以當作一個工具箱,能獨立於業務邏輯,都可以試著交給chatgpt完成。
所以,我覺得未來對程式設計師的要求會更加重視業務抽象的能力。扯遠了,言歸正傳。
人體辨識可以用目標偵測模型,例如:YOLOv5,之前我們也分享過好多訓練YOLOv5模型的文章。
但這裡我沒有用YOLOv5,而是用mediapipe。因為mediapipe運作速度較快,在 CPU 上也能流暢地運作。
辨識骨骼點的模型有很多,如:alphapose、openpose,每個模型辨識出來的骨骼點數和位置都有差異。例如下面這兩種:
mediapipe 32個骨骼點
coco 17個骨骼點
骨骼點的辨識我仍然使用mediapipe,除了速度快,另一個優點是mediapipe辨識的骨骼點多,有32 個,能滿足我們的使用。因為下面要用的人體動作分類,強烈依賴骨骼點。
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) results = pose.process(image) if not results.pose_landmarks: continue # 识别人体骨骼点 image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) mp_drawing.draw_landmarks( image, results.pose_landmarks, mp_pose.POSE_CONNECTIONS, landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style() )
動作識別使用的是基於骨架動作識別的時空圖卷積網絡,開源方案是STGCN(Skeleton-Based Graph Convolutional Networks )
https://github.com/yysijie/st-gcn
一組動作,如:跌倒,由N 幀組成,每一幀可以建構出以骨骼點座標組成的空間圖,骨骼點在幀之間連接起來就構成時間圖,骨骼點的連接和時間幀的連接便可以構造一張時空圖。
時空圖
在時空圖上進行多層圖卷積運算,可產生更高層次的特徵圖。然後輸入到SoftMax分類器進行動作分類(Action Classification)。
圖卷積
本來我打算訓練STGCN模型的,但遇到的坑實在太多了,最後直接用了別人訓練好的模型。
坑1. STGCN 支援 OpenPose 辨識的骨骼點,有資料集Kinetics-skeleton可以直接使用。坑的地方在於OpenPose安裝太麻煩,需要一堆步驟,掙扎後放棄。
坑2. STGCN 也支援 NTU RGB D資料集,該資料集有 60 個動作分類,如:起立、行走、跌倒等。這份資料集的人體包含25 個骨骼點,只有座標數據,原始影片基本上搞不到,所以沒辦法知道這25 個骨骼點對應哪些位置,以及用什麼模型能辨識出這25 個骨骼點,掙扎後放棄。
上面兩個大坑,導致沒法直接訓練STGCN模型,找了一個開源的方案,它用的是alphapose識別 14 個骨骼點,同時修改STGCN源碼支持自定義骨骼點。
https://github.com/GajuuzZ/Human-Falling-Detect-Tracks
我看了下mediapipe包含了这 14 个骨骼点,所以可以用mediapipe识别的骨骼点输入他的模型,实现动作分类。
mediapipe 32个骨骼点
选出14个关键骨骼点
14个骨骼点提取代码:
KEY_JOINTS = [ mp_pose.PoseLandmark.NOSE, mp_pose.PoseLandmark.LEFT_SHOULDER, mp_pose.PoseLandmark.RIGHT_SHOULDER, mp_pose.PoseLandmark.LEFT_ELBOW, mp_pose.PoseLandmark.RIGHT_ELBOW, mp_pose.PoseLandmark.LEFT_WRIST, mp_pose.PoseLandmark.RIGHT_WRIST, mp_pose.PoseLandmark.LEFT_HIP, mp_pose.PoseLandmark.RIGHT_HIP, mp_pose.PoseLandmark.LEFT_KNEE, mp_pose.PoseLandmark.RIGHT_KNEE, mp_pose.PoseLandmark.LEFT_ANKLE, mp_pose.PoseLandmark.RIGHT_ANKLE ] landmarks = results.pose_landmarks.landmark joints = np.array([[landmarks[joint].x * image_w, landmarks[joint].y * image_h, landmarks[joint].visibility] for joint in KEY_JOINTS])
STGCN原始方案构造的空间图只支持openpose18个骨骼点和NTU RGB+D数据集25个骨骼点
修改这部分源码,以支持自定义的14个骨骼点
模型直接使用Human-Falling-Detect-Tracks项目已经训练好的,实际运行发现识别效果很差,因为没有看到模型训练过程,不确定问题出在哪。
有能力的朋友可以自己训练模型试试,另外,百度的Paddle也基于STGCN开发了一个跌倒检测模型,只支持摔倒这一种行为的识别。
当然大家也可以试试Transformer的方式,不需要提取骨骼点特征,直接将 N 帧摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成送入模型分类。
关于STGCN的原理,大家可以参考文章:https://www.jianshu.com/p/be85114006e3 总结的非常好。
需要源码的朋友留言区回复即可。
如果大家觉得本文对你有用就点个 在看 鼓励一下吧,后续我会持续分享优秀的 Python+AI 项目。
以上是摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成的詳細內容。更多資訊請關注PHP中文網其他相關文章!