人体姿态估计(人体关键点检测)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.  个人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(自上而下)方法

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

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


2.人体姿态估计数据集

(1)COCO数据集

(2)MPII数据集

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


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约1人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码-LMLPHPhttps://blog.csdn.net/guyuealian/article/details/125348189


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

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

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

(1)Environment

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

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

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
  • 修改配置文件的数据根目录,如train_model_mbv2_penson.yaml
  • 其他配置文件,也可以如下修改
DATASET:
  DATASET: 'person_coco'
  ROOT: '/path/to/yours/dataset/COCO'  
.....

MPII数据集

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

(3)模型训练

修改配置文件的数据根目录后,就可以开始训练,训练的基本命令如下
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

(4) 测试Demo

运行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
  • 可根据自己的需要,修改demo.sh
  • Demo参数说明如下

(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端上部署:

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

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

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);
}


6.项目源码下载

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

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

 如果,你不需要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,已经集成了轻量化版本的人体检测模型和人体姿态估计模型,在人体姿态估计(人体关键点检测)2D Pose训练代码和Android源码-LMLPHPhttps://panjinquan.blog.csdn.net/article/details/115765863

08-13 12:09