赞
踩
目录
人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码
人体关键点检测(Human Keypoints Detection)又称为人体姿态估计2D Pose,是计算机视觉中一个相对基础的任务,是人体动作识别、行为分析、人机交互等的前置任务。一般情况下可以将人体关键点检测细分为单人/多人关键点检测、2D/3D关键点检测,同时有算法在完成关键点检测之后还会进行关键点的跟踪,也被称为人体姿态跟踪。
来,先看个Android Demo的效果图:
视频测试 | 图片测试 | 图片测试 |
整套项目,支持的主要内容主要有: 人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码
- 2D Pose人体关键点检测的训练和测试代码(Pytorch版本)
- 支持COCO数据集训练
- 支持MPII数据集训练
- 支持轻量化模型mobilenet-v2
- 支持高精度模型HRNet
人体关键点检测C++版本:https://github.com/PanJinquan/Human-Pose-Estimation-Lite-cpp
人体关键点检测Android Demo源码,已经集成了轻量化版本的
人体检测模型
和人体姿态估计模型
,在普通手机可实时检测
更多项目《人体关键点检测(人体姿势估计)》系列文章请参考:
目前,人体姿态估计的主流框架,主要有两个方法
(1)Top-Down(自上而下)方法
将人体检测和关键点检测分离,在图像上首先进行人体检测,找到所有的人体框,对每个人体框图再使用关键点检测,这类方法往往比较慢,但姿态估计准确度较高。目前的主流是CPN,Hourglass,CPM,Alpha Pose等。
(2)Bottom-Up(自下而上)方法
先检测图像中人体部件,然后将图像中多人人体的部件分别组合成人体,因此这类方法在测试推断的时候往往更快速,准确度稍低。典型就是COCO2016年人体关键点检测冠军Open Pose。
就目前调研而言, Top-Down的方法研究较多,精度也比Bottom-Up(自下而上)方法好。本项目也主要分享基于Top-Down(自上而下)的方法。
下载地址:http://cocodataset.org/
COCO人体关键点标注,最多标注全身的17个关键点,平均一幅图像2个人,最多有13个人;
人体关键点标注,每个人体关键点个数的分布情况,其中11-15这个范围的人体是最多的,有接近70000人,6-10其次,超过40000人,后面依次为16-17,2-5,1.
下载地址:http://human-pose.mpi-inf.mpg.de/#download
人体关键点标注了全身16个关键点及其是否可见的信息,人数:train有28821,test有11701,有409种人类活动;使用mat的struct格式;行人框使用center和scale标注,人体尺度关于200像素高度。也就是除过了200
数据集 | 关键点示意图 | 关键点说明 |
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 | |
|
基于Top-Down(自上而下)人体关键点检测方法,将人体检测和关键点检测分离;首先在图像上进行人体检测,找到所有的人体框,然后对每个人体框区域进行关键点检测,这类方法往往比较慢,但姿态估计准确度较高。目前的主流是CPN,Hourglass,CPM,Alpha Pose等。
人脸检测的方法很多,你可以基于YOLO,SSD模型训练一个通用人体检测模型即可,本篇博客不做重点介绍,感兴趣的话,可以看一下我的另一篇博客《人检测(人体检测)和人脸检测和人脸关键点检测(C++/Android)》
人体姿态估计训练Pipeline,整套工程项目,基本结构如下:
- ├── configs # 配置文件
- ├── data # 数据文件等
- ├── models # models核心代码
- ├── docker # docker配置文件
- ├── docs # 说明文档
- ├── libs # 第三方库
- ├── work_dir # 训练输出保存目录
- ├── scripts # 脚本文件
- ├── demo.py # 推理的demo文件
- ├── test.py # 测试文件
- ├── train.py # 训练文件
- ├── requirements.txt # 依赖包
- └── README.md # README文件
python依赖包,可参考[requirements.txt]
- numpy==1.16.3
- matplotlib==3.1.0
- Pillow==6.0.0
- bcolz==1.2.1
- easydict==1.9
- opencv-contrib-python==4.5.2.52
- opencv-python==4.5.1.48
- pandas==1.1.5
- PyYAML==5.3.1
- scikit-image==0.17.2
- scikit-learn==0.24.0
- scipy==1.5.4
- seaborn==0.11.2
- sklearn==0.0
- tensorboard==2.5.0
- tensorboardX==2.1
- torch==1.7.1+cu110
- torchvision==0.8.2+cu110
- tqdm==4.55.1
- xmltodict==0.12.0
- memory_profiler
- dldtrainer
COCO数据集
- COCO
- ├── train2017
- │ ├── annotations
- │ │ ├── instances_train2017.json
- │ │ └── person_keypoints_train2017.json
- │ └── images
- │ ├── 000000001.jpg
- │ ├── 000000002.jpg
- │ ├── 000000003.jpg
- └── val2017
- ├── annotations
- │ ├── instances_val2017.json
- │ └── person_keypoints_val2017.json
- └── images
- ├── 000000001.jpg
- ├── 000000002.jpg
- ├── 000000003.jpg
- DATASET:
- DATASET: 'person_coco'
- ROOT: '/path/to/yours/dataset/COCO'
- .....
MPII数据集
- MPII
- ├── annot
- │ ├── gt_valid.mat
- │ ├── test.json
- │ ├── train.json
- │ ├── trainval.json
- │ └── valid.json
- └── images
- ├── 000000001.jpg
- ├── 000000002.jpg
- ├── 000000003.jpg
- DATASET:
- DATASET: 'custom_mpii'
- ROOT: '/path/to/yours/dataset/MPII'
- ....
修改配置文件的数据根目录后,就可以开始训练,训练的基本命令如下
- bash build.sh # 训练之前,需要先编译工程
- python train.py -c path/to/config.yaml --gpu_id 0
训练COCO人体关键点:
- # 轻量化模型:mobilenet
- python train.py -c configs/coco/mobilenet/train_model_mbv2_penson.yaml --gpu_id 0
- # 高精度模型:HRNet
- python train.py -c configs/coco/hrnet/w48_adam_penson.yaml --gpu_id 0
训练MPII人体关键点:
- # 轻量化模型:mobilenet
- python train.py -c configs/mpii/mobilenet/train_model_mbv2_penson.yaml --gpu_id 0
- # 高精度模型:HRNet
- python train.py --c configs/mpii/hrnet/w48_adam_penson.yaml --gpu_id 0
运行Demo测试效果
- # 运行Demo测试效果
- bash demo.sh
- # 或者通过命令行
- # 测试图片
- python demo.py \
- -c data/pretrained/model_mobilenet_v2/train_model_mbv2_penson.yaml \
- -m data/pretrained/model_mobilenet_v2/best_model_178_0.6272.pth \
- --skeleton coco \
- --image_dir data/test_image \
- --save_dir data/result_image
-
- # 测试视频
- python demo.py \
- -c data/pretrained/model_mobilenet_v2/train_model_mbv2_penson.yaml \
- -m data/pretrained/model_mobilenet_v2/best_model_178_0.6272.pth \
- --skeleton coco \
- --video_path data/videos/kunkun_cut.mp4 \
- --video_save data/videos/kunkun_cut_result.mp4
参数 | 类型 | 参考值 | 说明 |
c,config_file | str | 配置文件 | |
m,model_file | str | 模型文件 | |
skeleton | str,list | mpii | 骨骼点类型,如mpii,coco |
image_dir | str | data/test_image | 测试图片的路径 |
save_dir | str | data/result_image | 保存结果,为空不保存 |
video_path | str | 测试的视频文件 | |
video_save | str | 保存视频文件路径 | |
detect_person | bool | True | 是否检测人体检测,默认True |
threshhold | float | 0.3 | 关键点检测置信度 |
device | str | cuda:0 | GPU ID |
| |
| |
训练好Pytorch模型后,你可以将模型转换为ONNX模型,方便后续模型部署
python utils/convert_tools/convert_torch_to_onnx.py
目前CNN模型有多种部署方式,可以采用TNN,MNN,NCNN,以及TensorRT等部署工具,鄙人采用TNN进行Android端上部署:
将ONNX模型转换为TNN模型,请参考TNN官方说明:
项目实现了Android版本的2D Pose人体关键点检测Demo,部署框架采用TNN,支持多线程CPU和GPU加速推理,在普通手机上可以实时处理。2D Pose人体关键点检测Android源码,核心算法均采用C++实现,上层通过JNI接口调用.
如果你想在这个Android Demo部署你自己训练的分类模型,你可将训练好的Pytorch模型转换ONNX ,再转换成TNN模型,然后把TNN模型代替你模型即可。
- package com.cv.tnn.model;
-
- import android.graphics.Bitmap;
-
- public class Detector {
-
- static {
- System.loadLibrary("tnn_wrapper");
- }
-
-
- /***
- * 初始化关键点检测模型
- * @param proto: TNN *.tnnproto文件文件名(含后缀名)
- * @param model: TNN *.tnnmodel文件文件名(含后缀名)
- * @param root:模型文件的根目录,放在assets文件夹下
- * @param model_type:模型类型
- * @param num_thread:开启线程数
- * @param useGPU:关键点的置信度,小于值的坐标会置-1
- */
- public static native void init(String proto, String model, String root, int model_type, int num_thread, boolean useGPU);
-
- /***
- * 检测关键点
- * @param bitmap 图像(bitmap),ARGB_8888格式
- * @param threshold:关键点的置信度,小于值的坐标会置-1
- * @return
- */
- public static native FrameInfo[] detect(Bitmap bitmap, float threshold);
- }
-
参考解决方法:解决dlopen failed: library “libomp.so“ not found
Android项目源码下载地址:Android实现人体关键点检测(人体姿势估计)含源码 可实时检测
Android人体关键点检测APP Demo体验(下载):https://download.csdn.net/download/guyuealian/88610359
整套Android项目源码内容包含:
- Android Demo源码支持YOLOv5人体检测
- Android Demo源码支持轻量化模型LiteHRNet和Mobilenet-v2人体关键点检测(人体姿态估计)
- Android Demo在普通手机CPU/GPU上可以实时检测,CPU约50ms,GPU约30ms左右
- Android Demo支持图片,视频,摄像头测试
- 所有依赖库都已经配置好,可直接build运行,若运行出现闪退,请参考dlopen failed: library “libomp.so“ not found 解决。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。