首頁 >科技週邊 >人工智慧 >摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

PHPz
PHPz轉載
2023-04-12 08:19:022422瀏覽

哈嘍,大家好。

今天跟大家分享一個跌倒偵測項目,確切地說是基於骨骼點的人體動作辨識。

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

大概分成三個步驟

  • 辨識人體
  • 辨識人體骨骼點
  • 動作分類

專案原始碼已經打包好了,取得方式見文末。

0. chatgpt

首先,我們需要取得監控的視訊串流。這段程式碼比較固定,我們可以直接讓chatgpt完成

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

chatgpt寫的這段程式碼是沒有問題的,可以直接使用。

但後面涉及業務型任務,例如:用mediapipe識別人體骨骼點,chatgpt給的代碼是不對的。

我覺得chatgpt可以當作一個工具箱,能獨立於業務邏輯,都可以試著交給chatgpt完成。

所以,我覺得未來對程式設計師的要求會更加重視業務抽象的能力。扯遠了,言歸正傳。

1. 人體辨識

人體辨識可以用目標偵測模型,例如:YOLOv5,之前我們也分享過好多訓練YOLOv5模型的文章。

但這裡我沒有用YOLOv5,而是用mediapipe。因為mediapipe運作速度較快,在 CPU 上也能流暢地運作。

2. 骨骼點辨識

辨識骨骼點的模型有很多,如:alphapose、openpose,每個模型辨識出來的骨骼點數和位置都有差異。例如下面這兩種:

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

mediapipe 32個骨骼點

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

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()
)

3. 動作識別

動作識別使用的是基於骨架動作識別的時空圖卷積網絡,開源方案是STGCN(Skeleton-Based Graph Convolutional Networks )

https://github.com/yysijie/st-gcn

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

一組動作,如:跌倒,由N 幀組成,每一幀可以建構出以骨骼點座標組成的空間圖,骨骼點在幀之間連接起來就構成時間圖,骨骼點的連接和時間幀的連接便可以構造一張時空圖。

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

時空圖

在時空圖上進行多層圖卷積運算,可產生更高層次的特徵圖。然後輸入到SoftMax分類器進行動作分類(Action Classification)。

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

圖卷積

本來我打算訓練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识别的骨骼点输入他的模型,实现动作分类。

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

mediapipe 32个骨骼点

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

选出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​原始方案构造的空间图只支持openpose​18个骨骼点和NTU RGB+D数据集25个骨骼点

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

修改这部分源码,以支持自定义的14个骨骼点

摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成

模型直接使用Human-Falling-Detect-Tracks项目已经训练好的,实际运行发现识别效果很差,因为没有看到模型训练过程,不确定问题出在哪。

有能力的朋友可以自己训练模型试试,另外,百度的Paddle​也基于STGCN​开发了一个跌倒检测模型,只支持摔倒这一种行为的识别。

当然大家也可以试试Transformer的方式,不需要提取骨骼点特征,直接将 N 帧摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成送入模型分类。

关于STGCN的原理,大家可以参考文章:https://www.jianshu.com/p/be85114006e3  总结的非常好。

需要源码的朋友留言区回复即可。

如果大家觉得本文对你有用就点个 在看 鼓励一下吧,后续我会持续分享优秀的 Python+AI 项目。

以上是摔倒偵測,基於骨骼點人體動作識別,部分代碼用 Chatgpt 完成的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除