mmpose官方文档
mmpose版本:1.0.0rc0
数据集准备
coco数据集下载官网下载地址
你可能还需要:
COCO_test-dev2017_detections_AP_H_609_person.json;
COCO_val2017_detections_AP_H_56_person.json;
以上两个连接来自:OneDrive
以上两个下载好后存放目录如下
测试一下数据集
需要先准备好配置文件和预训练权重
python tools/test.py \
xxx/config/resnetv1d50_coco_256x192.py \
xxx/checkpoints/resnetv1d50_coco_256x192-a243b840_20200727.pth \
--eval mAP
训练coco数据
python tools/train.py \
xxx/my_code/config/resnetv1d50_coco_256x192.py \
--work-dir xxx/my_code/data/train_ret/resnetv1d50_coco_256x192
训练自己的数据集
我这里用的是coco格式
数据集type:CocoDataset
注意:annotations中的 category_id == 1 这是必须的
准备bbox_file
踩坑过程中看了点源码,这个文件不是必须的,但是我还是参考已有的配置,准备了这个文件。
如果不打算准备这个配置文件,需要将bbox_file配置项设置为None。
bbox_file中记录了n个矩形框,这里面的每一个框与ann_file文件中的每一个关键点对象一一对应。
bbox_file格式如下:
[
{
"bbox": [
0.9995520000000226,
68.99987199999998,
225.00019199999997,
475.000128
],
"category_id": 0,
"image_id": 1,
"score": 0.98
},
... ...
]
准备metainfo
可参考:configs/base/datasets/coco.py
修改配置文件
# 继承已有的配置文件
_base_ = ['configs/body_2d_keypoint/topdown_heatmap/coco/td-hm_mobilenetv2_8xb64-210e_coco-384x288.py']
# 调整最大epoch和模型保存间隔。
train_cfg = dict(by_epoch=True, max_epochs=210, val_interval=10)
# 加载预训练的模型,我这里直接加载了官方的模型。
load_from = "model/mmpose/mobilenetv2_coco_384x288-26be4816_20200727.pth"
# 修改模型输出的关键点数
model = dict(
head=dict(
out_channels=2
))
# 调整学习率
optim_wrapper = dict(optimizer=dict(type='Adam', lr=0.0005 / 32))
# log和Tensorboard可视化
visualizer = dict(
type='PoseLocalVisualizer',
vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')],
name='visualizer')
# 下面全是数据相关,要修改的地方比较多。
data_root = 'data/my_coco/'
# 这个就是事先创建好的 metainfo 文件。
metainfo: dict = dict(
from_file='config/my_coco_point_metainfo.py')
train_dataloader = dict(
batch_size=16,
num_workers=2,
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='annotations/labels_coco_pot_train.json',
data_prefix=dict(img='images/')
))
val_dataloader = dict(
batch_size=16,
num_workers=2,
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='annotations/labels_coco_pot_val.json',
bbox_file='data/my_coco/annotations/labels_coco_pot_val_bbox.json',
# bbox_file=None,
data_prefix=dict(img='images/'),
))
test_dataloader = dict(
batch_size=16,
num_workers=2,
dataset=dict(
data_root=data_root,
metainfo=metainfo,
ann_file='annotations/labels_coco_pot_val.json',
bbox_file='data/my_coco/annotations/labels_coco_pot_val_bbox.json',
# bbox_file=None,
data_prefix=dict(img='images/'),
))
val_evaluator = dict(
ann_file=data_root + 'annotations/labels_coco_pot_val.json')
test_evaluator = dict(
ann_file=data_root + 'annotations/labels_coco_pot_val.json')
模型训练
cd ${MMPOSE_PATH}
python tools/train.py \
xxx/my_code/config/td-hm_mobilenetv2_8xb64-210e_coco-384x288.py \
--work-dir xxx/data/train_ret/td-hm_mobilenetv2_8xb64-210e_coco-384x288
用训练好的模型可视化图片
cd ${MMPOSE_PATH}
python tools/test.py \
xxx/config/td-hm_mobilenetv2_8xb64-210e_coco-384x288.py \
xxx/data/train_ret/td-hm_mobilenetv2_8xb64-210e_coco-384x288_23031801/best_coco/AP_epoch_10.pth \
--work-dir td-hm_mobilenetv2_8xb64-210e_coco-384x288_23031801/test \
--show-dir td-hm_mobilenetv2_8xb64-210e_coco-384x288_23031801/test/visualize
训练过程遇到的一个坑
训练过程的loss下降正常,打印的acc_pose也正常,训练结束后可视化出来的图片也正常,但是在跑验证时所有结果均为0。
Average Precision (AP) @[ IoU=0.50:0.95 | area= all | maxDets= 20 ] = 0.000
Average Precision (AP) @[ IoU=0.50 | area= all | maxDets= 20 ] = 0.000
Average Precision (AP) @[ IoU=0.75 | area= all | maxDets= 20 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area=medium | maxDets= 20 ] = 0.000
Average Precision (AP) @[ IoU=0.50:0.95 | area= large | maxDets= 20 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= all | maxDets= 20 ] = 0.000
Average Recall (AR) @[ IoU=0.50 | area= all | maxDets= 20 ] = 0.000
Average Recall (AR) @[ IoU=0.75 | area= all | maxDets= 20 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area=medium | maxDets= 20 ] = 0.000
Average Recall (AR) @[ IoU=0.50:0.95 | area= large | maxDets= 20 ] = 0.000
这是因为我的category_id != 1,我还特意为此改了源码,最后算ap时遇到了这个问题。
训练过程可视化
这里我选择的是Tensorboard。
只需要修改一下配置文件,可参考下面的配置。也可以配置“WandbVisBackend”,使用wandb可视化。
然后
visualizer = dict(
type='PoseLocalVisualizer',
vis_backends=[dict(type='LocalVisBackend'), dict(type='TensorboardVisBackend')],
name='visualizer')
训练跑起来后在work_dir下会有tensorboard输出的文件,可参考下面的命令启动服务,再在浏览器打开即可
tensorboard --logdir work_dir/20230101_060606/vis_data