码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码


    人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

    目录

    人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

    1.人体姿态估计2D Pose方法

    2.人体姿态估计数据集

    (1)COCO数据集

    (2)MPII数据集

    (3)关键点示意图(ID序号)

    3.人体(行人)检测

    4.人体姿态估计训练Training Pipeline

    (1)Environment

    (2)数据准备:COCO和MPII数据集

    (3)模型训练

    (4) 测试Demo

    (5) 检测效果展示

    5.人体姿态估计模型Android部署

    (1) 将Pytorch模型转换ONNX模型

    (2) 将ONNX模型转换为TNN模型

    (3) Android端上部署人体关键点检测

    6.项目源码下载


    人体关键点检测(Human Keypoints Detection)又称为人体姿态估计2D Pose,是计算机视觉中一个相对基础的任务,是人体动作识别、行为分析、人机交互等的前置任务。一般情况下可以将人体关键点检测细分为单人/多人关键点检测、2D/3D关键点检测,同时有算法在完成关键点检测之后还会进行关键点的跟踪,也被称为人体姿态跟踪。

    来,先看个Android Demo的效果图:

    视频测试图片测试图片测试

     整套项目,支持的主要内容主要有: 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

    1. 2D Pose人体关键点检测的训练和测试代码(Pytorch版本)
    2. 支持COCO数据集训练
    3. 支持MPII数据集训练
    4. 支持轻量化模型mobilenet-v2
    5. 支持高精度模型HRNet
    6. 人体关键点检测C++版本:https://github.com/PanJinquan/Human-Pose-Estimation-Lite-cpp

    7. 人体关键点检测Android Demo源码,已经集成了轻量化版本的人体检测模型和人体姿态估计模型,在普通手机可实时检测

    一些项目推荐: 

    1.  个人Repo(Python版,不含有训练代码): https://github.com/PanJinquan/Human-Keypoints-Detection
    2. 个人Repo(C++版):https://github.com/PanJinquan/Human-Pose-Estimation-Lite-cpp
    3. 2D Pose人体关键点检测Android Demo APP体检(支持CPU多线程和GPU加速,可实时检测):Android人体检测和人体关键点检测APPDemo安装包-Android文档类资源-CSDN下载
    4. 2D Pose人体关键点检测(Human Keypoints Detection)训练代码和Android源码:人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码

    1.人体姿态估计2D Pose方法

    目前,人体姿态估计的主流框架,主要有两个方法

    (1)Top-Down(自上而下)方法

    将人体检测和关键点检测分离,在图像上首先进行人体检测,找到所有的人体框,对每个人体框图再使用关键点检测,这类方法往往比较慢,但姿态估计准确度较高。目前的主流是CPN,Hourglass,CPM,Alpha Pose等。

    (2)Bottom-Up(自下而上)方法

    先检测图像中人体部件,然后将图像中多人人体的部件分别组合成人体,因此这类方法在测试推断的时候往往更快速,准确度稍低。典型就是COCO2016年人体关键点检测冠军Open Pose。

    就目前调研而言, Top-Down的方法研究较多,精度也比Bottom-Up(自下而上)方法好。本项目也主要分享基于Top-Down(自上而下)的方法。


    2.人体姿态估计数据集

    (1)COCO数据集

    下载地址:http://cocodataset.org/

    COCO人体关键点标注,最多标注全身的17个关键点,平均一幅图像2个人,最多有13个人;

    人体关键点标注,每个人体关键点个数的分布情况,其中11-15这个范围的人体是最多的,有接近70000人,6-10其次,超过40000人,后面依次为16-17,2-5,1.

    (2)MPII数据集

    下载地址:http://human-pose.mpi-inf.mpg.de/#download

     人体关键点标注了全身16个关键点及其是否可见的信息,人数:train有28821,test有11701,有409种人类活动;使用mat的struct格式;行人框使用center和scale标注,人体尺度关于200像素高度。也就是除过了200

    (3)关键点示意图(ID序号)

    数据集关键点示意图          关键点说明
    COCO​

    # 图像左右翻转时,成对的关键点(训练时用于数据增强)

    flip_pairs=[[1, 2], [3, 4], [5, 6], [7, 8],[9, 10], [11, 12], [13, 14], [15, 16]]

    # 关键点连接线序号(用于绘制图像)

    skeleton =[[15, 13], [13, 11], [16, 14], [14, 12], [11, 12], [5, 11], [6, 12], [5, 6], [5, 7], [6, 8], [7, 9], [8, 10], [0, 1], [0, 2], [1, 3], [2, 4]]

    # 每个关键点序号对应人体关键点的意义

    "keypoints": { 0: "nose", 1: "left_eye", 2: "right_eye", 3: "left_ear", 4: "right_ear", 5: "left_shoulder", 6: "right_shoulder", 7: "left_elbow", 8: "right_elbow", 9: "left_wrist", 10: "right_wrist", 11: "left_hip", 12: "right_hip", 13: "left_knee", 14: "right_knee", 15: "left_ankle", 16: "right_ankle" }

    MPII​

    # 图像左右翻转时,成对的关键点(训练时用于数据增强)

    flip_pairs = [[0, 5], [1, 4], [2, 3], [10, 15], [11, 14], [12, 13]]

    # 关键点连接线序号(用于绘制图像)

    skeleton=[[0, 1], [1, 2], [3, 4], [4, 5], [2, 6], [6, 3], [12, 11], [7, 12], [11, 10], [13, 14], [14, 15], [8, 9], [8, 7], [6, 7], [7, 13]]

    # 每个关键点序号对应人体关键点的意义

    "keypoints": {0: "r_ankle", 1: "r_knee", 2: "r_hip", 3: "l_hip", 4: "l_knee", 5: "l_ankle", 6: "pelvis", 7: "thorax", 8: "upper_neck", 9: "head_top", 10: " r_wrist", 11: "r_elbow", 12: "r_shoulder", 13: "l_shoulder", 14: "l_elbow", 15: "l_wrist" }

    human3.6M​
    kinect​
    1. JointType_SpineBase = 0 # 脊柱底
    2. JointType_SpineMid = 1 # 脊柱中间
    3. JointType_Neck = 2 # 脖子
    4. JointType_Head = 3 # 额头
    5. JointType_ShoulderLeft = 4
    6. JointType_ElbowLeft = 5
    7. JointType_WristLeft = 6
    8. JointType_HandLeft = 7
    9. JointType_ShoulderRight = 8
    10. JointType_ElbowRight = 9
    11. JointType_WristRight = 10
    12. JointType_HandRight = 11
    13. JointType_HipLeft = 12
    14. JointType_KneeLeft = 13
    15. JointType_AnkleLeft = 14
    16. JointType_FootLeft = 15
    17. JointType_HipRight = 16
    18. JointType_KneeRight = 17
    19. JointType_AnkleRight = 18
    20. JointType_FootRight = 19
    21. JointType_SpineShoulder = 20
    22. JointType_HandTipLeft = 21
    23. JointType_ThumbLeft = 22
    24. JointType_HandTipRight = 23
    25. JointType_ThumbRight = 24
    26. JointType_Count = 25

    3.人体(行人)检测

    基于Top-Down(自上而下)人体关键点检测方法,将人体检测和关键点检测分离;首先在图像上进行人体检测,找到所有的人体框,然后对每个人体框区域进行关键点检测,这类方法往往比较慢,但姿态估计准确度较高。目前的主流是CPN,Hourglass,CPM,Alpha Pose等。

    人脸检测的方法很多,你可以基于YOLO,SSD模型训练一个通用人体检测模型即可,本篇博客不做重点介绍,感兴趣的话,可以看一下我的另一篇博客《人检测(人体检测)和人脸检测和人脸关键点检测(C++/Android)》

    又快又好,行人检测和人脸检测和人脸关键点检测(C++/Android源码)_pan_jinquan的博客-CSDN博客考虑到人脸人体检测的需求,本人开发了一套轻量化的,高精度的,可实时的人脸/人体检测Android Demo,主要支持功能如下:支持人脸检测算法模型支持人脸检测和人脸关键点检测(5个人脸关键点)算法模型支持人体检测(行人检测)算法模型支持人脸和人体同时检测算法模型所有算法模型都使用C++开发,推理框架采用TNN,Android通过JNI接口进行算法调用;所有算法模型都可在普通Android手机实时跑,在普通Android手机,CPU和GPU都可以达到实时检测的效果(CPU约25毫秒左右,GPU约1https://blog.csdn.net/guyuealian/article/details/125348189


    4.人体姿态估计训练Training Pipeline

    人体姿态估计训练Pipeline,整套工程项目,基本结构如下:

    1. ├── configs # 配置文件
    2. ├── data # 数据文件等
    3. ├── models # models核心代码
    4. ├── docker # docker配置文件
    5. ├── docs # 说明文档
    6. ├── libs # 第三方库
    7. ├── work_dir # 训练输出保存目录
    8. ├── scripts # 脚本文件
    9. ├── demo.py # 推理的demo文件
    10. ├── test.py # 测试文件
    11. ├── train.py # 训练文件
    12. ├── requirements.txt # 依赖包
    13. └── README.md # README文件

    (1)Environment

    python依赖包,可参考[requirements.txt]

    1. numpy==1.16.3
    2. matplotlib==3.1.0
    3. Pillow==6.0.0
    4. bcolz==1.2.1
    5. easydict==1.9
    6. opencv-contrib-python==4.5.2.52
    7. opencv-python==4.5.1.48
    8. pandas==1.1.5
    9. PyYAML==5.3.1
    10. scikit-image==0.17.2
    11. scikit-learn==0.24.0
    12. scipy==1.5.4
    13. seaborn==0.11.2
    14. sklearn==0.0
    15. tensorboard==2.5.0
    16. tensorboardX==2.1
    17. torch==1.7.1+cu110
    18. torchvision==0.8.2+cu110
    19. tqdm==4.55.1
    20. xmltodict==0.12.0
    21. memory_profiler
    22. dldtrainer

    (2)数据准备:COCO和MPII数据集

    COCO数据集

    • 下载地址: COCO - Common Objects in Context
    • 解压后,并保存如下的文件结构
    1. COCO
    2. ├── train2017
    3. │     ├── annotations
    4. │     │       ├── instances_train2017.json
    5. │     │       └── person_keypoints_train2017.json
    6. │     └── images
    7. │              ├── 000000001.jpg
    8. │              ├── 000000002.jpg
    9. │              ├── 000000003.jpg
    10. └── val2017
    11.       ├── annotations
    12.       │        ├── instances_val2017.json
    13.       │        └── person_keypoints_val2017.json
    14.       └── images
    15.                 ├── 000000001.jpg
    16.                 ├── 000000002.jpg
    17.                 ├── 000000003.jpg
    • 修改配置文件的数据根目录,如train_model_mbv2_penson.yaml
    • 其他配置文件,也可以如下修改
    1. DATASET:
    2.   DATASET: 'person_coco'
    3.   ROOT: '/path/to/yours/dataset/COCO'  
    4. .....

    MPII数据集

    • 下载地址: MPII Human Pose Database
    • 原始数据集的标注是Matlab格式,使用前需要转换json格式: 下载地址: GoogleDrive
    • 解压后,并保存如下的文件结构
    1. MPII
    2. ├── annot
    3. │ ├── gt_valid.mat
    4. │ ├── test.json
    5. │ ├── train.json
    6. │ ├── trainval.json
    7. │ └── valid.json
    8. └── images
    9. ├── 000000001.jpg
    10. ├── 000000002.jpg
    11. ├── 000000003.jpg
    • 修改配置文件的数据根目录,如train_model_mbv2_penson.yaml
    • 其他配置文件,也可以如下修改
    1. DATASET:
    2.   DATASET: 'custom_mpii'
    3.   ROOT: '/path/to/yours/dataset/MPII'  
    4. ....

    (3)模型训练

    修改配置文件的数据根目录后,就可以开始训练,训练的基本命令如下
    
    1. bash build.sh # 训练之前,需要先编译工程
    2. python train.py -c path/to/config.yaml --gpu_id 0

    训练COCO人体关键点:

    1. # 轻量化模型:mobilenet
    2. python train.py  -c configs/coco/mobilenet/train_model_mbv2_penson.yaml --gpu_id 0 
    3. # 高精度模型:HRNet
    4. python train.py  -c configs/coco/hrnet/w48_adam_penson.yaml --gpu_id 0

    训练MPII人体关键点:

    1. # 轻量化模型:mobilenet
    2. python train.py  -c configs/mpii/mobilenet/train_model_mbv2_penson.yaml --gpu_id 0
    3. # 高精度模型:HRNet
    4. python train.py  --c configs/mpii/hrnet/w48_adam_penson.yaml --gpu_id 0

    (4) 测试Demo

    运行Demo测试效果

    1. # 运行Demo测试效果
    2. bash demo.sh
    3. # 或者通过命令行
    4. # 测试图片
    5. python demo.py \
    6.   -c data/pretrained/model_mobilenet_v2/train_model_mbv2_penson.yaml \
    7.   -m data/pretrained/model_mobilenet_v2/best_model_178_0.6272.pth \
    8.   --skeleton coco \
    9.   --image_dir data/test_image \
    10.   --save_dir data/result_image
    11. # 测试视频
    12. python demo.py \
    13.   -c data/pretrained/model_mobilenet_v2/train_model_mbv2_penson.yaml \
    14.   -m data/pretrained/model_mobilenet_v2/best_model_178_0.6272.pth \
    15.   --skeleton coco \
    16.   --video_path data/videos/kunkun_cut.mp4 \
    17.   --video_save data/videos/kunkun_cut_result.mp4
    • 可根据自己的需要,修改demo.sh
    • Demo参数说明如下
    参数类型参考值说明
    c,config_filestr配置文件
    m,model_file str模型文件
    skeletonstr,listmpii骨骼点类型,如mpii,coco
    image_dirstrdata/test_image测试图片的路径
    save_dirstrdata/result_image保存结果,为空不保存
    video_pathstr测试的视频文件
    video_savestr保存视频文件路径
    detect_personboolTrue是否检测人体检测,默认True
    threshholdfloat0.3关键点检测置信度
    devicestrcuda:0 GPU ID

    (5) 检测效果展示

    ​​
    ​​

    5.人体姿态估计模型Android部署

    (1) 将Pytorch模型转换ONNX模型

    训练好Pytorch模型后,你可以将模型转换为ONNX模型,方便后续模型部署

    python utils/convert_tools/convert_torch_to_onnx.py

    (2) 将ONNX模型转换为TNN模型

    目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行Android端上部署:

    将ONNX模型转换为TNN模型,请参考TNN官方说明:

    TNN/onnx2tnn.md at master · Tencent/TNN · GitHub

    (3) Android端上部署人体关键点检测

    项目实现了Android版本的2D Pose人体关键点检测Demo,部署框架采用TNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。2D Pose人体关键点检测Android源码,核心算法均采用C++实现,上层通过JNI接口调用.

    如果你想在这个Android Demo部署你自己训练的分类模型,你可将训练好的Pytorch模型转换ONNX ,再转换成TNN模型,然后把TNN模型代替你模型即可。

    1. package com.cv.tnn.model;
    2. import android.graphics.Bitmap;
    3. public class Detector {
    4. static {
    5. System.loadLibrary("tnn_wrapper");
    6. }
    7. /***
    8. * 初始化关键点检测模型
    9. * @param proto: TNN *.tnnproto文件文件名(含后缀名)
    10. * @param model: TNN *.tnnmodel文件文件名(含后缀名)
    11. * @param root:模型文件的根目录,放在assets文件夹下
    12. * @param model_type:模型类型
    13. * @param num_thread:开启线程数
    14. * @param useGPU:关键点的置信度,小于值的坐标会置-1
    15. */
    16. public static native void init(String proto, String model, String root, int model_type, int num_thread, boolean useGPU);
    17. /***
    18. * 检测关键点
    19. * @param bitmap 图像(bitmap),ARGB_8888格式
    20. * @param threshold:关键点的置信度,小于值的坐标会置-1
    21. * @return
    22. */
    23. public static native FrameInfo[] detect(Bitmap bitmap, float threshold);
    24. }

    6.项目源码下载

     整套项目源码《人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码》,主要内容包含有:

    1. 2D Pose人体关键点检测的训练和测试代码(Pytorch版本)
    2. 支持COCO数据集训练
    3. 支持MPII数据集训练
    4. 支持轻量化模型mobilenet-v2
    5. 支持高精度模型HRNet
    6. 人体关键点检测C++版本:https://github.com/PanJinquan/Human-Pose-Estimation-Lite-cpp

    7. 人体关键点检测Android Demo源码,已经集成了轻量化版本的人体检测模型和人体姿态估计模型,在普通手机可实时检测

     如果,你不需要Python训练代码,仅考虑C++和Android Demo,可参考《2D Pose人体关键点实时检测(Python/Android /C++ Demo)》:

    2D Pose人体关键点实时检测(Python/Android /C++ Demo)_pan_jinquan的博客-CSDN博客_python人体检测代码​人体关键点检测(Human Keypoints Detection)又称为人体姿态估计2D Pose,是计算机视觉中一个相对基础的任务,是人体动作识别、行为分析、人机交互等的前置任务。一般情况下可以将人体关键点检测细分为单人/多人关键点检测、2D/3D关键点检测,同时有算法在完成关键点检测之后还会进行关键点的跟踪,也被称为人体姿态跟踪。本博客提供2D Pose的Python代码,以及C++版本的推理代码,还提供Android Demo APP,已经集成了轻量化版本的人体检测模型和人体姿态估计模型,在https://panjinquan.blog.csdn.net/article/details/115765863

  • 相关阅读:
    I/O性能与可靠性
    基于SSM+SpringBoot+Vue的高校竞赛赛事管理系统
    Android平台GB28181设备接入模块相关博客概览
    【注册Huggingface】获取token
    【Linux】vimrc 配置方案
    【SpringBoot整合缓存】-----jetcache以及j2cache篇
    React源码分析2-深入理解fiber
    windows添加定时任务命令
    [附源码]Python计算机毕业设计Django基于Java的图书购物商城
    mac常见问题(五) Mac 无法开机
  • 原文地址:https://blog.csdn.net/guyuealian/article/details/125502259
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号