人體關鍵點檢測2:Pytorch實現人體關鍵點檢測(人體姿勢估計)含訓練代碼
目錄
人體關鍵點檢測2:Pytorch實現人體關鍵點檢測(人體姿勢估計)含訓練代碼
1. 前言
2.人體關鍵點檢測方法
(1)Top-Down(自上而下)方法
(2)Bottom-Up(自下而上)方法:
3.人體關鍵點檢測數據集
4.人體檢測模型訓練
5.人體關鍵點檢測模型訓練
(1)項目安裝
(2)準備Train和Test數據
(3)配置文件configs
(4)開始訓練
(5)Tensorboard可視化訓練過程
6.人體關鍵點檢測檢測模型效果
7.人體關鍵點檢測(推理代碼)下載
8.人體關鍵點檢測(訓練代碼)下載
9.人體關鍵點檢測C++/Android版本
1. 前言
人體關鍵點檢測(Human Keypoints Detection)又稱為人體姿態估計2D Pose,是計算機視覺中一個相對基礎的任務,是人體動作識別、行為分析、人機交互等的前置任務。一般情況下可以將人體關鍵點檢測細分為單人/多人關鍵點檢測、2D/3D關鍵點檢測,同時有算法在完成關鍵點檢測之后還會進行關鍵點的跟蹤,也被稱為人體姿態跟蹤。
本項目將實現人體關鍵點檢測算法,其中使用YOLOv5模型實現人體檢測(Person Detection),使用HRNet,LiteHRNet和Mobilenet-v2模型實現人體關鍵點檢測。項目分為數據集說明,模型訓練和C++/Android部署等多個章節,本篇是項目《人體關鍵點檢測(人體姿勢估計)》系列文章之Pytorch實現人體關鍵點檢測(人體姿勢估計);為了方便后續模型工程化和Android平臺部署,項目支持高精度HRNet檢測模型,輕量化模型LiteHRNet和Mobilenet模型訓練和測試,并提供Python/C++/Android多個版本;
輕量化Mobilenet-v2模型在普通Android手機上可以達到實時的檢測效果,CPU(4線程)約50ms左右,GPU約30ms左右 ,基本滿足業務的性能需求。下表格給出HRNet,以及輕量化模型LiteHRNet和Mobilenet的計算量和參數量,以及其檢測精度
模型 | input-size | params(M) | GFLOPs | AP |
HRNet-w32 | 192×256 | 28.48M | 5734.05M | 0.7585 |
LiteHRNet18 | 192×256 | 1.10M | 182.15M | 0.6237 |
Mobilenet-v2 | 192×256 | 2.63M | 529.25M | 0.6181 |
先展示一下人體關鍵點檢測效果:
Android人體關鍵點檢測APP Demo體驗(下載):https://download.csdn.net/download/guyuealian/88610359
【尊重原創,轉載請注明出處】https://blog.csdn.net/guyuealian/article/details/134837816
更多項目《人體關鍵點檢測(人體姿勢估計)》系列文章請參考:
- 人體關鍵點檢測1:人體姿勢估計數據集(含下載鏈接)?https://blog.csdn.net/guyuealian/article/details/134703548
- 人體關鍵點檢測2:Pytorch實現人體關鍵點檢測(人體姿勢估計)含訓練代碼和數據集?https://blog.csdn.net/guyuealian/article/details/134837816
- 人體關鍵點檢測3:Android實現人體關鍵點檢測(人體姿勢估計)含源碼 可實時檢測?https://blog.csdn.net/guyuealian/article/details/134881797
- 人體關鍵點檢測4:C/C++實現人體關鍵點檢測(人體姿勢估計)含源碼 可實時檢測?https://blog.csdn.net/guyuealian/article/details/134881797
- 手部關鍵點檢測1:手部關鍵點(手部姿勢估計)數據集(含下載鏈接)https://blog.csdn.net/guyuealian/article/details/133277630
- 手部關鍵點檢測2:YOLOv5實現手部檢測(含訓練代碼和數據集)https://blog.csdn.net/guyuealian/article/details/133279222
- 手部關鍵點檢測3:Pytorch實現手部關鍵點檢測(手部姿勢估計)含訓練代碼和數據集https://blog.csdn.net/guyuealian/article/details/133277726
- 手部關鍵點檢測4:Android實現手部關鍵點檢測(手部姿勢估計)含源碼 可實時檢測https://blog.csdn.net/guyuealian/article/details/133931698
- 手部關鍵點檢測5:C++實現手部關鍵點檢測(手部姿勢估計)含源碼 可實時檢測https://blog.csdn.net/guyuealian/article/details/133277748
??
2.人體關鍵點檢測方法
目前主流的人體關鍵點檢測(人體姿勢估計)方法主要兩種:一種是Top-Down(自上而下)方法,另外一種是Bottom-Up(自下而上)方法;
(1)Top-Down(自上而下)方法
將人體檢測和人體關鍵點檢測(人體姿勢估計)檢測分離,在圖像上首先進行人體目標檢測,定位人體位置;然后crop每一個人體圖像,再估計人體關鍵點;這類方法往往比較慢,但姿態估計準確度較高。目前主流模型主要有CPN,Hourglass,CPM,Alpha Pose,HRNet等。
(2)Bottom-Up(自下而上)方法:
先估計圖像中所有人體關鍵點,然后在通過Grouping的方法組合成一個一個實例;因此這類方法在測試推斷的時候往往更快速,準確度稍低。典型就是COCO2016年人體關鍵點檢測冠軍Open Pose。
通常來說,Top-Down具有更高的精度,而Bottom-Up具有更快的速度;就目前調研而言,?Top-Down的方法研究較多,精度也比Bottom-Up(自下而上)方法高。本項目采用Top-Down(自上而下)方法,先使用YOLOv5模型實現人體檢測,然后再使用HRNet進行人體關鍵點檢測(人體姿勢估計);
本項目基于開源的HRNet進行改進,關于HRNet項目請參考GitHub
HRNet: https://github.com/leoxiaobin/deep-high-resolution-net.pytorch
3.人體關鍵點檢測數據集
本項目主要使用COCO數據集和MPII數據集,關于人體關鍵點檢測數據集說明,請參考《人體關鍵點檢測1:人體姿勢估計數據集》https://blog.csdn.net/guyuealian/article/details/134703548
4.人體檢測模型訓練
本項目采用Top-Down(自上而下)方法,使用YOLOv5模型實現人體目標檢測,使用HRNet進行人體關鍵點檢測(人體姿勢估計);關于人體檢測模型訓練方法,可參考 :
行人檢測(人體檢測)2:YOLOv5實現人體檢測(含人體檢測數據集和訓練代碼)
5.人體關鍵點檢測模型訓練
?整套工程項目基本結構如下:
.
├── configs # 訓練配置文件
├── data # 一些數據
├── libs # 一些工具庫
├── pose # 姿態估計模型文件
├── work_space # 訓練輸出工作目錄
├── demo.py # 模型推理demo文件
├── README.md # 項目工程說明文檔
├── requirements.txt # 項目相關依賴包
└── train.py # 訓練文件
(1)項目安裝
推薦使用Python3.8或Python3.7,更高版本可能存在版本差異問題,項目依賴python包請參考requirements.txt,使用pip安裝即可,項目代碼都在Ubuntu系統和Windows系統驗證正常運行,請放心使用;若出現異常,大概率是相關依賴包版本沒有完全對應
numpy==1.21.6
matplotlib==3.2.2
Pillow==8.4.0
bcolz==1.2.1
easydict==1.9
onnx==1.8.1
onnx-simplifier==0.2.28
onnxoptimizer==0.2.0
onnxruntime==1.6.0
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
pycocotools==2.0.2
pybaseutils==0.9.4
basetrainer
項目安裝教程請參考(初學者入門,麻煩先看完下面教程,配置好Python開發環境):
- 推薦使用Python3.8或Python3.7,更高版本可能存在版本差異問題
- 項目開發使用教程和常見問題和解決方法
- 視頻教程:1 手把手教你安裝CUDA和cuDNN(1)
- 視頻教程:2 手把手教你安裝CUDA和cuDNN(2)
- 視頻教程:3 如何用Anaconda創建pycharm環境
- 視頻教程:4 如何在pycharm中使用Anaconda創建的python環境
(2)準備Train和Test數據
下載COCO數據集或者MPII數據集(建議使用COCO數據集),然后:
- COCO數據集下載并解壓到本地,存儲目錄結構參考如下(原始圖片目錄和標注信息文件在同一級目錄)
─── COCO├── train2017│?? ├── images # COCO訓練集原始圖片目錄│?? └── person_keypoints_train2017.json # COCO訓練集標注信息文件└── val2017├── images # COCO驗證集原始圖片目錄└── person_keypoints_val2017.json # COCO驗證集標注信息文件
- MPII數據集下載并解壓到本地,存儲目錄結構參考如下
─── MPII├── images # MPII數據集原始圖片目錄├── train.json # MPII訓練集標注信息文件└── valid.json # MPII訓練集標注信息文件
(3)配置文件configs
項目支持HRNet以及輕量化模型LiteHRNet和Mobilenet模型訓練,并提供對應的配置文件;你需要修改對應配置文件的數據路徑;本篇以訓練HRNet-w32為例子,其配置文件在configs/coco/hrnet/w32_adam_192_192.yaml,修改該文件的訓練數據集路徑TRAIN_FILE(支持多個數據集訓練)和測試數據集TEST_FILE的數據路徑為你本地數據路徑,其他參數保持默認即可,如下所示:
WORKERS: 8
PRINT_FREQ: 10
DATASET:DATASET: 'custom_coco'TRAIN_FILE:- 'D:/COCO/train2017/person_keypoints_train2017.json'TEST_FILE: 'D:/COCO/val2017/person_keypoints_val2017.json'FLIP: trueROT_FACTOR: 45SCALE_FACTOR: 0.3SCALE_RATE: 1.25JOINT_IDS: [0,1]FLIP_PAIRS: [ ]SKELETON: [ ]
配置文件的一些參數說明,請參考
參數 | 類型 | 參考值 | 說明 |
WORKERS | int | 8 | 數據加載處理的進程數 |
PRINT_FREQ | int | 10 | 打印LOG信息的間隔 |
DATASET | str | custom_coco | 數據集類型,目前僅支持COCO數據格式 |
TRAIN_FILE | List | - | 訓練數據集文件列表(COCO數據格式),支持多個數據集 |
TEST_FILE | string | - | 測試數據集文件(COCO數據格式),僅支持單個數據集 |
FLIP | bool | True | 是否翻轉圖片進行測試,可提高測試效果 |
ROT_FACTOR | float | 45 | 訓練數據隨機旋轉的最大角度,用于數據增強 |
SCALE_FACTOR | float | 1.25 | 圖像縮放比例因子 |
SCALE_RATE | float | 0.25 | 圖像縮放率 |
JOINT_IDS | list | [ ] | [ ]表示所有關鍵點,也可以指定需要訓練的關鍵點序號ID |
FLIP_PAIRS | list | [ ] | 圖像翻轉時,關鍵點不受翻轉影響的ID號 |
SKELETON | list | [ ] | 關鍵點連接線的序列列表,用于可視化效果 |
(4)開始訓練
修改好配置文件后,就可以開始準備訓練了:
- 訓練高精度模型HRNet-w48或者HRNet-w32
# 高精度模型:HRNet-w32
python train.py -c "configs/coco/hrnet/w48_adam_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"
# 高精度模型:HRNet-w48
python train.py -c "configs/coco/hrnet/w32_adam_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"
- 訓練輕量化模型LiteHRNet
# 輕量化模型:LiteHRNet
python train.py -c "configs/coco/litehrnet/litehrnet18_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"
- 訓練輕量化模型Mobilenetv2
# 輕量化模型:Mobilenet
python train.py -c "configs/coco/mobilenet/mobilenetv2_192_192.yaml" --workers=8 --batch_size=32 --gpu_id=0 --work_dir="work_space/person"
下表格給出HRNet,以及輕量化模型LiteHRNet和Mobilenet的計算量和參數量,以及其檢測精度AP; 高精度檢測模型HRNet-w32,AP可以達到0.7585,但其參數量和計算量比較大,不合適在移動端部署;LiteHRNet18和Mobilenet-v2參數量和計算量比較少,合適在移動端部署;雖然LiteHRNet18的理論計算量和參數量比Mobilenet-v2低,但在實際測試中,發現Mobilenet-v2運行速度更快。輕量化Mobilenet-v2模型在普通Android手機上可以達到實時的檢測效果,CPU(4線程)約50ms左右,GPU約30ms左右 ,基本滿足業務的性能需求
模型 | input-size | params(M) | GFLOPs | AP |
HRNet-w32 | 192×256 | 28.48M | 5734.05M | 0.7585 |
LiteHRNet18 | 192×256 | 1.10M | 182.15M | 0.6237 |
Mobilenet-v2 | 192×256 | 2.63M | 529.25M | 0.6181 |
(5)Tensorboard可視化訓練過程
訓練過程可視化工具是使用Tensorboard,使用方法,在終端輸入:
# 基本方法
tensorboard --logdir=path/to/log/
# 例如
tensorboard --logdir="work_space/person/hrnet_w32_16_192_256_mpii_20231127_113836_6644/log"
點擊終端TensorBoard打印的鏈接,即可在瀏覽器查看訓練LOG信息等:
6.人體關鍵點檢測檢測模型效果
demo.py文件用于推理和測試模型的效果,填寫好配置文件,模型文件以及測試圖片即可運行測試了;demo.py命令行參數說明如下:
參數 | 類型 | 參考值 | 說明 |
---|---|---|---|
-c,--config_file | str | - | 配置文件 |
-m,--model_file | str | - | 模型文件 |
target | str | - | 骨骼點類型,如hand,coco_person,mpii_person |
image_dir | str | data/image | 測試圖片的路徑 |
video_file | str,int | - | 測試的視頻文件 |
out_dir | str | output | 保存結果,為空不保存 |
threshold | float | 0.3 | 關鍵點檢測置信度 |
device | str | cuda:0 | GPU ID |
下面以運行HRNet-w32為樣例,其他模型修改--config_file或者--model_file即可
- 測試圖片
python demo.py -c work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/model/best_model_195_0.7585.pth --image_dir data/test_images --out_dir output
- 測試視頻文件
python demo.py -c work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/model/best_model_195_0.7585.pth --video_file data/video-test.mp4 --out_dir output
- ?測試攝像頭
python demo.py -c work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_17_192_256_custom_coco_20231115_092948_1789/model/best_model_195_0.7585.pth --video_file 0 --out_dir output
項目同時支持MPII數據集格式人體關鍵點檢測
- 測試圖片(MPII格式的人體關鍵點檢測)
python demo.py -c work_space/person/hrnet_w32_16_192_256_mpii_20231127_113836_6644/w32_adam_192_192.yaml -m work_space/person/hrnet_w32_16_192_256_mpii_20231127_113836_6644/model/best_model_148_89.4041.pth --image_dir data/test_images --out_dir output --target mpii_person
運行效果(支持單人和多人人體關鍵點檢測):
7.人體關鍵點檢測(推理代碼)下載
人體關鍵點檢測推理代碼下載地址:Pytorch實現人體關鍵點檢測(人體姿勢估計)推理代碼
資源內容包含:
- 提供YOLOv5人體檢測推理代碼(不包含訓練代碼)
- 提供人體關鍵點檢測(人體姿勢估計)推理代碼demo.py(不包含訓練代碼)
- 提供高精度版本HRNet人體關鍵點檢測(人體姿勢估計)(不包含訓練代碼)
- 提供輕量化模型LiteHRNet,以及Mobilenet-v2人體關鍵點檢測(人體姿勢估計)(不包含訓練代碼)
- 提供訓練好的模型:HRNet-w32,LiteHRNet和Mobilenet-v2模型權重文件,配置好環境,可直接運行demo.py
- 推理代碼demo.py支持圖片,視頻和攝像頭測試
?如果你需要配套的訓練數據集和訓練代碼,請查看下面部分
8.人體關鍵點檢測(訓練代碼)下載
人體關鍵點檢測訓練代碼下載地址:?
資源內容包含:
- 提供YOLOv5人體檢測推理代碼
- 提供整套完整的項目工程代碼,包含人體關鍵點檢測(人體姿勢估計)的訓練代碼train.py和推理測試代碼demo.py
- 提供高精度版本HRNet人體關鍵點檢測(人體姿勢估計)訓練和測試代碼
- 提供輕量化模型LiteHRNet以及Mobilenet-v2人體關鍵點檢測(人體姿勢估計)訓練和測試代碼
- 項目代碼支持MPII數據集和COCO數據集人體關鍵點檢測模型訓練和測試
- 根據本篇博文說明,簡單配置即可開始訓練:train.py
- 提供訓練好的模型:HRNet-w32,LiteHRNet和Mobilenet-v2模型權重文件,配置好環境,可直接運行demo.py
- 推理代碼demo.py支持圖片,視頻和攝像頭測試
9.人體關鍵點檢測C++/Android版本
- 人體關鍵點檢測3:Android實現人體關鍵點檢測(人體姿勢估計)含源碼 可實時檢測?https://blog.csdn.net/guyuealian/article/details/134881797
- 人體關鍵點檢測4:C/C++實現人體關鍵點檢測(人體姿勢估計)含源碼 可實時檢測?https://blog.csdn.net/guyuealian/article/details/134881797
?Android人體關鍵點檢測APP Demo體驗(下載):https://download.csdn.net/download/guyuealian/88610359?