输入一张手部图像,实现端到端的手部关键点检测,输出完整的手部21个关键点。
该模型采用自顶向下的Heatmap手部关键点检测框架,通过端对端的快速推理可以得到图像中的全部手部关键点。
本模型基于HRNetv2和DarkPose方法,架构如下:
基于heatmap的关键点检测方法一般存在一个分辨率变化的编码-解码过程,即原始图片分辨率较大,需要先缩小后才能输入模型进行预测,得到预测结果后再还原到输入图片的原始分辨率,再得到预测坐标。这个过程可能会引入一些误差:
本文假设预测的heatmap是满足二维高斯分布的,因此基于heatmap的一阶导数和二阶导数来计算偏移方向。但在实验中发现,预测的heatmap并不严格遵守高斯分布,可能会出现多峰的情况,因此增加了一个步骤,对预测的heatmap进行平滑处理,使结果符合假设,从而保证解码效果的准确性。
使用方式:
使用范围:
目标场景:
在ModelScope框架上,提供输入图片,即可以通过简单的Pipeline调用来完成手部2D关键点检测任务。
注意:如果使用notebook运行demo代码或者下载代码仓库到本地运行,需要安装numpy==1.21.5。
import cv2
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks
from modelscope.outputs import OutputKeys
model_id = 'damo/cv_hrnetw18_hand-pose-keypoints_coco-wholebody'
hand_2d_keypoints = pipeline(Tasks.hand_2d_keypoints, model=model_id)
result = hand_2d_keypoints('https://modelscope.oss-cn-beijing.aliyuncs.com/test/images/hand_keypoints.jpg')
print(result)
注意: 当前手部检测模型是采用的mmdet提供的基于OneHand数据集训练的手部目标检测模型,对于复杂图像或单张图像中有多个手部的情况可能效果不佳。后续将更新更优的手部检测模型以达到更好的效果。
手部关键点检测模型是使用COCO-Wholebody数据集进行训练的。
@inproceedings{jin2020whole,
title={Whole-Body Human Pose Estimation in the Wild},
author={Jin, Sheng and Xu, Lumin and Xu, Jin and Wang, Can and Liu, Wentao and Qian, Chen and Ouyang, Wanli and Luo, Ping},
booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
year={2020}
}
自动下载和使用托管在modelscope DatasetHub上的数据集:
from modelscope.metainfo import Trainers
from modelscope.msdatasets import MsDataset
from modelscope.trainers import build_trainer
from modelscope.utils.constant import DownloadMode
model_id = 'damo/cv_hrnetw18_hand-pose-keypoints_coco-wholebody'
cfg_options = {'train.max_epochs': 210}
work_dir = "./output"
trainer_name = 'easycv'
train_dataset = MsDataset.load(
dataset_name='cv_hand_2d_keypoints_coco_wholebody',
namespace='chenhyer',
split='train',
download_mode=DownloadMode.REUSE_DATASET_IF_EXISTS)
eval_dataset = MsDataset.load(
dataset_name='cv_hand_2d_keypoints_coco_wholebody',
namespace='chenhyer',
split='validation',
download_mode=DownloadMode.REUSE_DATASET_IF_EXISTS)
kwargs = dict(
model=model_id,
train_dataset=train_dataset,
eval_dataset=eval_dataset,
work_dir=work_dir,
cfg_options=cfg_options)
print("build trainer.")
trainer = build_trainer(trainer_name, kwargs)
print("start training.")
trainer.train()
Adam
, lr=0.0005可通过如下代码对模型进行评估验证,我们在modelscope的DatasetHub上存储了COCO_WholeBody
的验证集,方便用户下载调用。
from modelscope.metainfo import Trainers
from modelscope.msdatasets import MsDataset
from modelscope.trainers import build_trainer
from modelscope.utils.constant import DownloadMode
model_id = 'damo/cv_hrnetw18_hand-pose-keypoints_coco-wholebody'
cfg_options = {'train.max_epochs': 100}
work_dir = "./output"
trainer_name = 'easycv'
eval_dataset = MsDataset.load(
dataset_name='cv_hand_2d_keypoints_coco_wholebody',
namespace='chenhyer',
split='subtrain', # 根据需要设置成需要测试的split,目前该数据集包括3个split: train, subtrain, validation
download_mode=DownloadMode.REUSE_DATASET_IF_EXISTS)
kwargs = dict(
model=model_id,
train_dataset=None,
eval_dataset=eval_dataset,
work_dir=work_dir,
cfg_options=cfg_options)
print("build trainer.")
trainer = build_trainer(trainer_name, kwargs)
print("start evaluation.")
metric_values = trainer.evaluate()
print(metric_values)
基于手部检测框裁剪图像后,缩放到256×256大小。
本模型设计到的预处理主要有以下几个,具体的组织方式见配置文件:
COCO-Wholebody数据集上模型指标:
Method | 输入大小 | PCK | AUC | NME |
---|---|---|---|---|
litehrnet_w18 | 256x256 | 0.8161 | 0.8393 | 4.3899 |
@article{WangSCJDZLMTWLX19,
title={Deep High-Resolution Representation Learning for Visual Recognition},
author={Jingdong Wang and Ke Sun and Tianheng Cheng and
Borui Jiang and Chaorui Deng and Yang Zhao and Dong Liu and Yadong Mu and
Mingkui Tan and Xinggang Wang and Wenyu Liu and Bin Xiao},
journal={TPAMI},
year={2019}
}
@inproceedings{zhang2020distribution,
title={Distribution-aware coordinate representation for human pose estimation},
author={Zhang, Feng and Zhu, Xiatian and Dai, Hanbin and Ye, Mao and Zhu, Ce},
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
pages={7093--7102},
year={2020}
}