Maison > Article > Périphériques technologiques > Détection de chute, basée sur la reconnaissance de l'action humaine au point squelettique, une partie du code est complétée avec Chatgpt
Bonjour à tous.
Aujourd'hui j'aimerais partager avec vous un projet de détection de chute, pour être précis, il s'agit de reconnaissance de mouvements humains basée sur des points squelettiques.
est grossièrement divisé en trois étapes
Le code source du projet a été empaqueté, voir la fin de l'article pour savoir comment obtenez-le.
Tout d'abord, nous devons obtenir le flux vidéo surveillé. Ce code est relativement fixe, on peut directement laisser chatgpt le compléter
Ce code écrit par chatgpt n'a aucun problème et peut être utilisé directement.
Mais lorsqu'il s'agit de tâches commerciales, telles que l'utilisation de Mediapipe pour identifier les points du squelette humain, le code donné par chatgpt est incorrect.
Je pense que chatgpt peut être utilisé comme une boîte à outils, qui peut être indépendante de la logique métier. Vous pouvez essayer de laisser chatgpt le terminer.
Donc, je pense que les exigences des programmeurs à l'avenir se concentreront davantage sur les capacités d'abstraction métier. Sans plus attendre, revenons au sujet.
La reconnaissance du corps humain peut utiliser des modèles de détection de cibles, tels que : YOLOv5. Nous avons également partagé de nombreux articles sur la formation des modèles YOLOv5.
Mais ici je n'utilise pas YOLOv5, mais mediapipe. Parce que Mediapipe fonctionne plus rapidement et fonctionne correctement sur le processeur.
Il existe de nombreux modèles pour identifier les points osseux, tels que l'alphapose et l'openpose. Le nombre et la position des points osseux reconnus par chaque modèle sont différents. Par exemple, les deux types suivants :
mediapipe 32 points d'os
coco 17 points d'os
J'utilise toujours mediapipe pour la reconnaissance des points d'os En plus de la rapidité, un autre avantage est les os reconnus par. mediapipe. Il y a 32 points qui peuvent répondre à nos besoins. Parce que la classification des mouvements du corps humain qui sera utilisée ci-dessous repose en grande partie sur des points squelettiques.
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() )
La reconnaissance d'action utilise un réseau convolutionnel de graphes spatio-temporels basé sur la reconnaissance d'actions squelettes. La solution open source est STGCN (Skeleton-Based Graph Convolutional Networks)
https://github.com. /yysijie /st-gcn
Un ensemble d'actions, telles que la chute, se compose de N images. Chaque image peut construire un graphique spatial composé de coordonnées de points squelettiques. Les points squelettiques sont connectés entre les images pour former un graphique temporel. , la connexion des points osseux et la connexion des délais peuvent construire un graphique espace-temps.
Graphique espace-temps
Effectuez des opérations de convolution de graphique multicouche sur le graphique espace-temps pour générer des cartes de caractéristiques de niveau supérieur. Ensuite, il est entré dans le classificateur SoftMax pour la classification des actions (Classification des actions).
Convolution graphique
À l'origine, j'avais prévu d'entraîner le modèle STGCN, mais j'ai rencontré trop d'embûches, j'ai donc fini par utiliser un modèle entraîné par d'autres.
Pit 1. STGCN prend en charge les points squelettes reconnus par OpenPose, et il existe un ensemble de données Kinetics-skeleton qui peut être utilisé directement. Le piège est que l’installation d’OpenPose est trop lourde et nécessite beaucoup d’étapes. Après avoir galéré, on abandonne.
Pit 2. STGCN prend également en charge l'ensemble de données NTU RGB+D, qui comporte 60 catégories d'actions, telles que : se lever, marcher, tomber, etc. Le corps humain dans cet ensemble de données contient 25 points squelettiques, uniquement des données de coordonnées, et la vidéo originale est pratiquement indisponible, il n'y a donc aucun moyen de savoir à quelles positions correspondent ces 25 points squelettiques, et quel modèle peut être utilisé pour identifier ces 25 points squelettiques. Lutte Puis abandonnez.
Les deux gros pièges ci-dessus ont rendu impossible l'entraînement direct du modèle STGCN. J'ai trouvé une solution open source, qui utilisait alphapose pour identifier 14 points d'os, et modifié le code source STGCN pour prendre en charge les points d'os personnalisés.
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 帧Détection de chute, basée sur la reconnaissance de laction humaine au point squelettique, une partie du code est complétée avec Chatgpt送入模型分类。
关于STGCN的原理,大家可以参考文章:https://www.jianshu.com/p/be85114006e3 总结的非常好。
需要源码的朋友留言区回复即可。
如果大家觉得本文对你有用就点个 在看 鼓励一下吧,后续我会持续分享优秀的 Python+AI 项目。
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!