Initial snapshot: hand motion pipeline (Dyn-HaMR + dex-retargeting + SPIDER)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+16
@@ -0,0 +1,16 @@
|
||||
# 2D Hand Pose Estimation
|
||||
|
||||
2D hand pose estimation is defined as the task of detecting the poses (or keypoints) of the hand from an input image.
|
||||
|
||||
Normally, the input images are cropped hand images, where the hand locates at the center;
|
||||
or the rough location (or the bounding box) of the hand is provided.
|
||||
|
||||
## Data preparation
|
||||
|
||||
Please follow [DATA Preparation](/docs/en/tasks/2d_hand_keypoint.md) to prepare data.
|
||||
|
||||
## Demo
|
||||
|
||||
Please follow [Demo](/demo/docs/2d_hand_demo.md) to run demos.
|
||||
|
||||
<img src="https://user-images.githubusercontent.com/11788150/109098558-8c54db00-775c-11eb-8966-85df96b23dc5.gif" width="600px" alt><br>
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
# Deeppose: Human pose estimation via deep neural networks
|
||||
|
||||
## Introduction
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2014/html/Toshev_DeepPose_Human_Pose_2014_CVPR_paper.html">DeepPose (CVPR'2014)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{toshev2014deeppose,
|
||||
title={Deeppose: Human pose estimation via deep neural networks},
|
||||
author={Toshev, Alexander and Szegedy, Christian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={1653--1660},
|
||||
year={2014}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
DeepPose first proposes using deep neural networks (DNNs) to tackle the problem of keypoint detection.
|
||||
It follows the top-down paradigm, that first detects the bounding boxes and then estimates poses.
|
||||
It learns to directly regress the hand keypoint coordinates.
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/onehand10k.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50, num_stages=4, out_indices=(3, )),
|
||||
neck=dict(type='GlobalAveragePooling'),
|
||||
keypoint_head=dict(
|
||||
type='DeepposeRegressionHead',
|
||||
in_channels=2048,
|
||||
num_joints=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='SmoothL1Loss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTargetRegression'),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/onehand10k'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2014/html/Toshev_DeepPose_Human_Pose_2014_CVPR_paper.html">DeepPose (CVPR'2014)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{toshev2014deeppose,
|
||||
title={Deeppose: Human pose estimation via deep neural networks},
|
||||
author={Toshev, Alexander and Szegedy, Christian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={1653--1660},
|
||||
year={2014}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/8529221/">OneHand10K (TCSVT'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@article{wang2018mask,
|
||||
title={Mask-pose cascaded cnn for 2d hand pose estimation from single color image},
|
||||
author={Wang, Yangang and Peng, Cong and Liu, Yebin},
|
||||
journal={IEEE Transactions on Circuits and Systems for Video Technology},
|
||||
volume={29},
|
||||
number={11},
|
||||
pages={3258--3268},
|
||||
year={2018},
|
||||
publisher={IEEE}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on OneHand10K val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [deeppose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/deeppose/onehand10k/res50_onehand10k_256x256.py) | 256x256 | 0.990 | 0.486 | 34.28 | [ckpt](https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_onehand10k_256x256-cbddf43a_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_onehand10k_256x256_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: ResNet
|
||||
Paper:
|
||||
Title: Deep residual learning for image recognition
|
||||
URL: http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/resnet.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/deeppose/onehand10k/res50_onehand10k_256x256.py
|
||||
In Collection: ResNet
|
||||
Metadata:
|
||||
Architecture:
|
||||
- DeepPose
|
||||
- ResNet
|
||||
Training Data: OneHand10K
|
||||
Name: deeppose_res50_onehand10k_256x256
|
||||
Results:
|
||||
- Dataset: OneHand10K
|
||||
Metrics:
|
||||
AUC: 0.486
|
||||
EPE: 34.28
|
||||
PCK@0.2: 0.99
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_onehand10k_256x256-cbddf43a_20210330.pth
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/panoptic_hand2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCKh', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50, num_stages=4, out_indices=(3, )),
|
||||
neck=dict(type='GlobalAveragePooling'),
|
||||
keypoint_head=dict(
|
||||
type='DeepposeRegressionHead',
|
||||
in_channels=2048,
|
||||
num_joints=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='SmoothL1Loss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTargetRegression'),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/panoptic'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2014/html/Toshev_DeepPose_Human_Pose_2014_CVPR_paper.html">DeepPose (CVPR'2014)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{toshev2014deeppose,
|
||||
title={Deeppose: Human pose estimation via deep neural networks},
|
||||
author={Toshev, Alexander and Szegedy, Christian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={1653--1660},
|
||||
year={2014}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2017/html/Simon_Hand_Keypoint_Detection_CVPR_2017_paper.html">CMU Panoptic HandDB (CVPR'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{simon2017hand,
|
||||
title={Hand keypoint detection in single images using multiview bootstrapping},
|
||||
author={Simon, Tomas and Joo, Hanbyul and Matthews, Iain and Sheikh, Yaser},
|
||||
booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
|
||||
pages={1145--1153},
|
||||
year={2017}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on CMU Panoptic (MPII+NZSL val set)
|
||||
|
||||
| Arch | Input Size | PCKh@0.7 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [deeppose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/deeppose/panoptic2d/res50_panoptic2d_256x256.py) | 256x256 | 0.999 | 0.686 | 9.36 | [ckpt](https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_panoptic_256x256-8a745183_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_panoptic_256x256_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: ResNet
|
||||
Paper:
|
||||
Title: Deep residual learning for image recognition
|
||||
URL: http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/resnet.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/deeppose/panoptic2d/res50_panoptic2d_256x256.py
|
||||
In Collection: ResNet
|
||||
Metadata:
|
||||
Architecture:
|
||||
- DeepPose
|
||||
- ResNet
|
||||
Training Data: CMU Panoptic HandDB
|
||||
Name: deeppose_res50_panoptic2d_256x256
|
||||
Results:
|
||||
- Dataset: CMU Panoptic HandDB
|
||||
Metrics:
|
||||
AUC: 0.686
|
||||
EPE: 9.36
|
||||
PCKh@0.7: 0.999
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_panoptic_256x256-8a745183_20210330.pth
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/rhd2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50, num_stages=4, out_indices=(3, )),
|
||||
neck=dict(type='GlobalAveragePooling'),
|
||||
keypoint_head=dict(
|
||||
type='DeepposeRegressionHead',
|
||||
in_channels=2048,
|
||||
num_joints=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='SmoothL1Loss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTargetRegression'),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/rhd'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2014/html/Toshev_DeepPose_Human_Pose_2014_CVPR_paper.html">DeepPose (CVPR'2014)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{toshev2014deeppose,
|
||||
title={Deeppose: Human pose estimation via deep neural networks},
|
||||
author={Toshev, Alexander and Szegedy, Christian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={1653--1660},
|
||||
year={2014}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://lmb.informatik.uni-freiburg.de/projects/hand3d/">RHD (ICCV'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@TechReport{zb2017hand,
|
||||
author={Christian Zimmermann and Thomas Brox},
|
||||
title={Learning to Estimate 3D Hand Pose from Single RGB Images},
|
||||
institution={arXiv:1705.01389},
|
||||
year={2017},
|
||||
note="https://arxiv.org/abs/1705.01389",
|
||||
url="https://lmb.informatik.uni-freiburg.de/projects/hand3d/"
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on RHD test set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [deeppose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/deeppose/rhd2d/res50_rhd2d_256x256.py) | 256x256 | 0.988 | 0.865 | 3.29 | [ckpt](https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_rhd2d_256x256-37f1c4d3_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_rhd2d_256x256_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: ResNet
|
||||
Paper:
|
||||
Title: Deep residual learning for image recognition
|
||||
URL: http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/resnet.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/deeppose/rhd2d/res50_rhd2d_256x256.py
|
||||
In Collection: ResNet
|
||||
Metadata:
|
||||
Architecture:
|
||||
- DeepPose
|
||||
- ResNet
|
||||
Training Data: RHD
|
||||
Name: deeppose_res50_rhd2d_256x256
|
||||
Results:
|
||||
- Dataset: RHD
|
||||
Metrics:
|
||||
AUC: 0.865
|
||||
EPE: 3.29
|
||||
PCK@0.2: 0.988
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/deeppose/deeppose_res50_rhd2d_256x256-37f1c4d3_20210330.pth
|
||||
Vendored
+9
@@ -0,0 +1,9 @@
|
||||
# Top-down heatmap-based hand keypoint estimation
|
||||
|
||||
Top-down methods divide the task into two stages: hand detection and hand keypoint estimation.
|
||||
|
||||
They perform hand detection first, followed by hand keypoint estimation given hand bounding boxes.
|
||||
Instead of estimating keypoint coordinates directly, the pose estimator will produce heatmaps which represent the
|
||||
likelihood of being a keypoint.
|
||||
|
||||
Various neural network models have been proposed for better performance.
|
||||
+137
@@ -0,0 +1,137 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/coco_wholebody_hand.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained=None,
|
||||
backbone=dict(
|
||||
type='HourglassNet',
|
||||
num_stacks=1,
|
||||
),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapMultiStageHead',
|
||||
in_channels=256,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_stages=1,
|
||||
num_deconv_layers=0,
|
||||
extra=dict(final_conv_kernel=1, ),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/coco'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_train_v1.0.json',
|
||||
img_prefix=f'{data_root}/train2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-319-46484-8_29">Hourglass (ECCV'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{newell2016stacked,
|
||||
title={Stacked hourglass networks for human pose estimation},
|
||||
author={Newell, Alejandro and Yang, Kaiyu and Deng, Jia},
|
||||
booktitle={European conference on computer vision},
|
||||
pages={483--499},
|
||||
year={2016},
|
||||
organization={Springer}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-030-58545-7_12">COCO-WholeBody-Hand (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on COCO-WholeBody-Hand val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hourglass_52](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/hourglass52_coco_wholebody_hand_256x256.py) | 256x256 | 0.804 | 0.835 | 4.54 | [ckpt](https://download.openmmlab.com/mmpose/hand/hourglass/hourglass52_coco_wholebody_hand_256x256-7b05c6db_20210909.pth) | [log](https://download.openmmlab.com/mmpose/hand/hourglass/hourglass52_coco_wholebody_hand_256x256_20210909.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: Hourglass
|
||||
Paper:
|
||||
Title: Stacked hourglass networks for human pose estimation
|
||||
URL: https://link.springer.com/chapter/10.1007/978-3-319-46484-8_29
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/hourglass.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/hourglass52_coco_wholebody_hand_256x256.py
|
||||
In Collection: Hourglass
|
||||
Metadata:
|
||||
Architecture:
|
||||
- Hourglass
|
||||
Training Data: COCO-WholeBody-Hand
|
||||
Name: topdown_heatmap_hourglass52_coco_wholebody_hand_256x256
|
||||
Results:
|
||||
- Dataset: COCO-WholeBody-Hand
|
||||
Metrics:
|
||||
AUC: 0.835
|
||||
EPE: 4.54
|
||||
PCK@0.2: 0.804
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/hourglass/hourglass52_coco_wholebody_hand_256x256-7b05c6db_20210909.pth
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-030-58545-7_12">COCO-WholeBody-Hand (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on COCO-WholeBody-Hand val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/hrnetv2_w18_coco_wholebody_hand_256x256.py) | 256x256 | 0.813 | 0.840 | 4.39 | [ckpt](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_coco_wholebody_hand_256x256-1c028db7_20210908.pth) | [log](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_coco_wholebody_hand_256x256_20210908.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: HRNetv2
|
||||
Paper:
|
||||
Title: Deep High-Resolution Representation Learning for Visual Recognition
|
||||
URL: https://ieeexplore.ieee.org/abstract/document/9052469/
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/hrnetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/hrnetv2_w18_coco_wholebody_hand_256x256.py
|
||||
In Collection: HRNetv2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
Training Data: COCO-WholeBody-Hand
|
||||
Name: topdown_heatmap_hrnetv2_w18_coco_wholebody_hand_256x256
|
||||
Results:
|
||||
- Dataset: COCO-WholeBody-Hand
|
||||
Metrics:
|
||||
AUC: 0.84
|
||||
EPE: 4.39
|
||||
PCK@0.2: 0.813
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_coco_wholebody_hand_256x256-1c028db7_20210908.pth
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html">DarkPose (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-030-58545-7_12">COCO-WholeBody-Hand (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on COCO-WholeBody-Hand val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18_dark](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/hrnetv2_w18_coco_wholebody_hand_256x256_dark.py) | 256x256 | 0.814 | 0.840 | 4.37 | [ckpt](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_coco_wholebody_hand_256x256_dark-a9228c9c_20210908.pth) | [log](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_coco_wholebody_hand_256x256_dark_20210908.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: DarkPose
|
||||
Paper:
|
||||
Title: Distribution-aware coordinate representation for human pose estimation
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/techniques/dark.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/hrnetv2_w18_coco_wholebody_hand_256x256_dark.py
|
||||
In Collection: DarkPose
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
- DarkPose
|
||||
Training Data: COCO-WholeBody-Hand
|
||||
Name: topdown_heatmap_hrnetv2_w18_coco_wholebody_hand_256x256_dark
|
||||
Results:
|
||||
- Dataset: COCO-WholeBody-Hand
|
||||
Metrics:
|
||||
AUC: 0.84
|
||||
EPE: 4.37
|
||||
PCK@0.2: 0.814
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_coco_wholebody_hand_256x256_dark-a9228c9c_20210908.pth
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/coco_wholebody_hand.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/coco'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_train_v1.0.json',
|
||||
img_prefix=f'{data_root}/train2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/coco_wholebody_hand.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='unbiased',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2, unbiased_encoding=True),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/coco'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_train_v1.0.json',
|
||||
img_prefix=f'{data_root}/train2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://arxiv.org/abs/2104.06403">LiteHRNet (CVPR'2021)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{Yulitehrnet21,
|
||||
title={Lite-HRNet: A Lightweight High-Resolution Network},
|
||||
author={Yu, Changqian and Xiao, Bin and Gao, Changxin and Yuan, Lu and Zhang, Lei and Sang, Nong and Wang, Jingdong},
|
||||
booktitle={CVPR},
|
||||
year={2021}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-030-58545-7_12">COCO-WholeBody-Hand (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on COCO-WholeBody-Hand val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [LiteHRNet-18](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/litehrnet_w18_coco_wholebody_hand_256x256.py) | 256x256 | 0.795 | 0.830 | 4.77 | [ckpt](https://download.openmmlab.com/mmpose/hand/litehrnet/litehrnet_w18_coco_wholebody_hand_256x256-d6945e6a_20210908.pth) | [log](https://download.openmmlab.com/mmpose/hand/litehrnet/litehrnet_w18_coco_wholebody_hand_256x256_20210908.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: LiteHRNet
|
||||
Paper:
|
||||
Title: 'Lite-HRNet: A Lightweight High-Resolution Network'
|
||||
URL: https://arxiv.org/abs/2104.06403
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/litehrnet.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/litehrnet_w18_coco_wholebody_hand_256x256.py
|
||||
In Collection: LiteHRNet
|
||||
Metadata:
|
||||
Architecture:
|
||||
- LiteHRNet
|
||||
Training Data: COCO-WholeBody-Hand
|
||||
Name: topdown_heatmap_litehrnet_w18_coco_wholebody_hand_256x256
|
||||
Results:
|
||||
- Dataset: COCO-WholeBody-Hand
|
||||
Metrics:
|
||||
AUC: 0.83
|
||||
EPE: 4.77
|
||||
PCK@0.2: 0.795
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/litehrnet/litehrnet_w18_coco_wholebody_hand_256x256-d6945e6a_20210908.pth
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/coco_wholebody_hand.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained=None,
|
||||
backbone=dict(
|
||||
type='LiteHRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stem=dict(stem_channels=32, out_channels=32, expand_ratio=1),
|
||||
num_stages=3,
|
||||
stages_spec=dict(
|
||||
num_modules=(2, 4, 2),
|
||||
num_branches=(2, 3, 4),
|
||||
num_blocks=(2, 2, 2),
|
||||
module_type=('LITE', 'LITE', 'LITE'),
|
||||
with_fuse=(True, True, True),
|
||||
reduce_ratios=(8, 8, 8),
|
||||
num_channels=(
|
||||
(40, 80),
|
||||
(40, 80, 160),
|
||||
(40, 80, 160, 320),
|
||||
)),
|
||||
with_head=True,
|
||||
)),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=40,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(final_conv_kernel=1, ),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/coco'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_train_v1.0.json',
|
||||
img_prefix=f'{data_root}/train2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html">MobilenetV2 (CVPR'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{sandler2018mobilenetv2,
|
||||
title={Mobilenetv2: Inverted residuals and linear bottlenecks},
|
||||
author={Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={4510--4520},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-030-58545-7_12">COCO-WholeBody-Hand (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on COCO-WholeBody-Hand val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--------: | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_mobilenetv2](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/mobilenetv2_coco_wholebody_hand_256x256.py) | 256x256 | 0.795 | 0.829 | 4.77 | [ckpt](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_coco_wholebody_hand_256x256-06b8c877_20210909.pth) | [log](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_coco_wholebody_hand_256x256_20210909.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: MobilenetV2
|
||||
Paper:
|
||||
Title: 'Mobilenetv2: Inverted residuals and linear bottlenecks'
|
||||
URL: http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/mobilenetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/mobilenetv2_coco_wholebody_hand_256x256.py
|
||||
In Collection: MobilenetV2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- MobilenetV2
|
||||
Training Data: COCO-WholeBody-Hand
|
||||
Name: topdown_heatmap_mobilenetv2_coco_wholebody_hand_256x256
|
||||
Results:
|
||||
- Dataset: COCO-WholeBody-Hand
|
||||
Metrics:
|
||||
AUC: 0.829
|
||||
EPE: 4.77
|
||||
PCK@0.2: 0.795
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_coco_wholebody_hand_256x256-06b8c877_20210909.pth
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/coco_wholebody_hand.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='mmcls://mobilenet_v2',
|
||||
backbone=dict(type='MobileNetV2', widen_factor=1., out_indices=(7, )),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=1280,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/coco'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_train_v1.0.json',
|
||||
img_prefix=f'{data_root}/train2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/coco_wholebody_hand.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/coco'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_train_v1.0.json',
|
||||
img_prefix=f'{data_root}/train2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html">SimpleBaseline2D (ECCV'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{xiao2018simple,
|
||||
title={Simple baselines for human pose estimation and tracking},
|
||||
author={Xiao, Bin and Wu, Haiping and Wei, Yichen},
|
||||
booktitle={Proceedings of the European conference on computer vision (ECCV)},
|
||||
pages={466--481},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-030-58545-7_12">COCO-WholeBody-Hand (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on COCO-WholeBody-Hand val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--------: | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/res50_coco_wholebody_hand_256x256.py) | 256x256 | 0.800 | 0.833 | 4.64 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_coco_wholebody_hand_256x256-8dbc750c_20210908.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_coco_wholebody_hand_256x256_20210908.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: SimpleBaseline2D
|
||||
Paper:
|
||||
Title: Simple baselines for human pose estimation and tracking
|
||||
URL: http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/algorithms/simplebaseline2d.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/res50_coco_wholebody_hand_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture:
|
||||
- SimpleBaseline2D
|
||||
- ResNet
|
||||
Training Data: COCO-WholeBody-Hand
|
||||
Name: topdown_heatmap_res50_coco_wholebody_hand_256x256
|
||||
Results:
|
||||
- Dataset: COCO-WholeBody-Hand
|
||||
Metrics:
|
||||
AUC: 0.833
|
||||
EPE: 4.64
|
||||
PCK@0.2: 0.8
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_coco_wholebody_hand_256x256-8dbc750c_20210908.pth
|
||||
+132
@@ -0,0 +1,132 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/coco_wholebody_hand.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='https://download.openmmlab.com/mmpose/'
|
||||
'pretrain_models/scnet50-7ef0a199.pth',
|
||||
backbone=dict(type='SCNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/coco'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_train_v1.0.json',
|
||||
img_prefix=f'{data_root}/train2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='HandCocoWholeBodyDataset',
|
||||
ann_file=f'{data_root}/annotations/coco_wholebody_val_v1.0.json',
|
||||
img_prefix=f'{data_root}/val2017/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Liu_Improving_Convolutional_Networks_With_Self-Calibrated_Convolutions_CVPR_2020_paper.html">SCNet (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{liu2020improving,
|
||||
title={Improving Convolutional Networks with Self-Calibrated Convolutions},
|
||||
author={Liu, Jiang-Jiang and Hou, Qibin and Cheng, Ming-Ming and Wang, Changhu and Feng, Jiashi},
|
||||
booktitle={Proceedings of the IEEE/CVF Conference on Computer Vision and Pattern Recognition},
|
||||
pages={10096--10105},
|
||||
year={2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/chapter/10.1007/978-3-030-58545-7_12">COCO-WholeBody-Hand (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on COCO-WholeBody-Hand val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--------: | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_scnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/scnet50_coco_wholebody_hand_256x256.py) | 256x256 | 0.803 | 0.834 | 4.55 | [ckpt](https://download.openmmlab.com/mmpose/hand/scnet/scnet50_coco_wholebody_hand_256x256-e73414c7_20210909.pth) | [log](https://download.openmmlab.com/mmpose/hand/scnet/scnet50_coco_wholebody_hand_256x256_20210909.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: SCNet
|
||||
Paper:
|
||||
Title: Improving Convolutional Networks with Self-Calibrated Convolutions
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Liu_Improving_Convolutional_Networks_With_Self-Calibrated_Convolutions_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/scnet.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/coco_wholebody_hand/scnet50_coco_wholebody_hand_256x256.py
|
||||
In Collection: SCNet
|
||||
Metadata:
|
||||
Architecture:
|
||||
- SCNet
|
||||
Training Data: COCO-WholeBody-Hand
|
||||
Name: topdown_heatmap_scnet50_coco_wholebody_hand_256x256
|
||||
Results:
|
||||
- Dataset: COCO-WholeBody-Hand
|
||||
Metrics:
|
||||
AUC: 0.834
|
||||
EPE: 4.55
|
||||
PCK@0.2: 0.803
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/scnet/scnet50_coco_wholebody_hand_256x256-e73414c7_20210909.pth
|
||||
+165
@@ -0,0 +1,165 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/freihand2d.py'
|
||||
]
|
||||
evaluation = dict(
|
||||
interval=10, metric=['PCK', 'AUC', 'EPE'], key_indicator='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/freihand'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='FreiHandDataset',
|
||||
ann_file=f'{data_root}/annotations/freihand_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='FreiHandDataset',
|
||||
ann_file=f'{data_root}/annotations/freihand_val.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='FreiHandDataset',
|
||||
ann_file=f'{data_root}/annotations/freihand_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/freihand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=1)
|
||||
evaluation = dict(interval=1, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[50, 70])
|
||||
total_epochs = 100
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[224, 224],
|
||||
heatmap_size=[56, 56],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/freihand'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='FreiHandDataset',
|
||||
ann_file=f'{data_root}/annotations/freihand_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='FreiHandDataset',
|
||||
ann_file=f'{data_root}/annotations/freihand_val.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='FreiHandDataset',
|
||||
ann_file=f'{data_root}/annotations/freihand_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html">SimpleBaseline2D (ECCV'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{xiao2018simple,
|
||||
title={Simple baselines for human pose estimation and tracking},
|
||||
author={Xiao, Bin and Wu, Haiping and Wei, Yichen},
|
||||
booktitle={Proceedings of the European conference on computer vision (ECCV)},
|
||||
pages={466--481},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_ICCV_2019/html/Zimmermann_FreiHAND_A_Dataset_for_Markerless_Capture_of_Hand_Pose_and_ICCV_2019_paper.html">FreiHand (ICCV'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{zimmermann2019freihand,
|
||||
title={Freihand: A dataset for markerless capture of hand pose and shape from single rgb images},
|
||||
author={Zimmermann, Christian and Ceylan, Duygu and Yang, Jimei and Russell, Bryan and Argus, Max and Brox, Thomas},
|
||||
booktitle={Proceedings of the IEEE International Conference on Computer Vision},
|
||||
pages={813--822},
|
||||
year={2019}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on FreiHand val & test set
|
||||
|
||||
| Set | Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
|val| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/freihand2d/res50_freihand_224x224.py) | 224x224 | 0.993 | 0.868 | 3.25 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_freihand_224x224-ff0799bc_20200914.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_freihand_224x224_20200914.log.json) |
|
||||
|test| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/freihand2d/res50_freihand_224x224.py) | 224x224 | 0.992 | 0.868 | 3.27 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_freihand_224x224-ff0799bc_20200914.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_freihand_224x224_20200914.log.json) |
|
||||
+37
@@ -0,0 +1,37 @@
|
||||
Collections:
|
||||
- Name: SimpleBaseline2D
|
||||
Paper:
|
||||
Title: Simple baselines for human pose estimation and tracking
|
||||
URL: http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/algorithms/simplebaseline2d.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/freihand2d/res50_freihand_224x224.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: &id001
|
||||
- SimpleBaseline2D
|
||||
- ResNet
|
||||
Training Data: FreiHand
|
||||
Name: topdown_heatmap_res50_freihand_224x224
|
||||
Results:
|
||||
- Dataset: FreiHand
|
||||
Metrics:
|
||||
AUC: 0.868
|
||||
EPE: 3.25
|
||||
PCK@0.2: 0.993
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_freihand_224x224-ff0799bc_20200914.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/freihand2d/res50_freihand_224x224.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: FreiHand
|
||||
Name: topdown_heatmap_res50_freihand_224x224
|
||||
Results:
|
||||
- Dataset: FreiHand
|
||||
Metrics:
|
||||
AUC: 0.868
|
||||
EPE: 3.27
|
||||
PCK@0.2: 0.992
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_freihand_224x224-ff0799bc_20200914.pth
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=5)
|
||||
evaluation = dict(interval=5, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[40, 50])
|
||||
total_epochs = 60
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained=None,
|
||||
backbone=dict(
|
||||
type='ViT',
|
||||
img_size=(256, 192),
|
||||
patch_size=16,
|
||||
embed_dim=768,
|
||||
depth=12,
|
||||
num_heads=12,
|
||||
ratio=1,
|
||||
use_checkpoint=False,
|
||||
mlp_ratio=4,
|
||||
qkv_bias=True,
|
||||
drop_path_rate=0.3,
|
||||
),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=768,
|
||||
num_deconv_layers=2,
|
||||
num_deconv_filters=(256, 256),
|
||||
num_deconv_kernels=(4, 4),
|
||||
extra=dict(final_conv_kernel=1, ),
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[192, 256],
|
||||
heatmap_size=[48, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=5)
|
||||
evaluation = dict(interval=5, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[40, 50])
|
||||
total_epochs = 60
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained=None,
|
||||
backbone=dict(
|
||||
type='ViT',
|
||||
img_size=(256, 192),
|
||||
patch_size=16,
|
||||
embed_dim=1280,
|
||||
depth=32,
|
||||
num_heads=16,
|
||||
ratio=1,
|
||||
use_checkpoint=False,
|
||||
mlp_ratio=4,
|
||||
qkv_bias=True,
|
||||
drop_path_rate=0.3,
|
||||
),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=1280,
|
||||
num_deconv_layers=2,
|
||||
num_deconv_filters=(256, 256),
|
||||
num_deconv_kernels=(4, 4),
|
||||
extra=dict(final_conv_kernel=1, ),
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[192, 256],
|
||||
heatmap_size=[48, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=5)
|
||||
evaluation = dict(interval=5, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[40, 50])
|
||||
total_epochs = 60
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained=None,
|
||||
backbone=dict(
|
||||
type='ViT',
|
||||
img_size=(256, 192),
|
||||
patch_size=16,
|
||||
embed_dim=1024,
|
||||
depth=24,
|
||||
num_heads=16,
|
||||
ratio=1,
|
||||
use_checkpoint=False,
|
||||
mlp_ratio=4,
|
||||
qkv_bias=True,
|
||||
drop_path_rate=0.3,
|
||||
),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=1024,
|
||||
num_deconv_layers=2,
|
||||
num_deconv_filters=(256, 256),
|
||||
num_deconv_kernels=(4, 4),
|
||||
extra=dict(final_conv_kernel=1, ),
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[192, 256],
|
||||
heatmap_size=[48, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+162
@@ -0,0 +1,162 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=5)
|
||||
evaluation = dict(interval=5, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[40, 50])
|
||||
total_epochs = 60
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained=None,
|
||||
backbone=dict(
|
||||
type='ViT',
|
||||
img_size=(256, 192),
|
||||
patch_size=16,
|
||||
embed_dim=384,
|
||||
depth=12,
|
||||
num_heads=12,
|
||||
ratio=1,
|
||||
use_checkpoint=False,
|
||||
mlp_ratio=4,
|
||||
qkv_bias=True,
|
||||
drop_path_rate=0.3,
|
||||
),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=384,
|
||||
num_deconv_layers=2,
|
||||
num_deconv_filters=(256, 256),
|
||||
num_deconv_kernels=(4, 4),
|
||||
extra=dict(final_conv_kernel=1, ),
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[192, 256],
|
||||
heatmap_size=[48, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=5)
|
||||
evaluation = dict(interval=5, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[40, 50])
|
||||
total_epochs = 60
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=5)
|
||||
evaluation = dict(interval=5, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[40, 50])
|
||||
total_epochs = 60
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/human_annot/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/human_annot/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/human_annot/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/human_annot/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/human_annot/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/human_annot/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+146
@@ -0,0 +1,146 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand2d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=5)
|
||||
evaluation = dict(interval=5, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[40, 50])
|
||||
total_epochs = 60
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand2DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+66
@@ -0,0 +1,66 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html">SimpleBaseline2D (ECCV'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{xiao2018simple,
|
||||
title={Simple baselines for human pose estimation and tracking},
|
||||
author={Xiao, Bin and Wu, Haiping and Wei, Yichen},
|
||||
booktitle={Proceedings of the European conference on computer vision (ECCV)},
|
||||
pages={466--481},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/content/pdf/10.1007/978-3-030-58565-5_33.pdf">InterHand2.6M (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@InProceedings{Moon_2020_ECCV_InterHand2.6M,
|
||||
author = {Moon, Gyeongsik and Yu, Shoou-I and Wen, He and Shiratori, Takaaki and Lee, Kyoung Mu},
|
||||
title = {InterHand2.6M: A Dataset and Baseline for 3D Interacting Hand Pose Estimation from a Single RGB Image},
|
||||
booktitle = {European Conference on Computer Vision (ECCV)},
|
||||
year = {2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on InterHand2.6M val & test set
|
||||
|
||||
|Train Set| Set | Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--- | :--------: | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
|Human_annot|val(M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py) | 256x256 | 0.973 | 0.828 | 5.15 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human_20201029.log.json) |
|
||||
|Human_annot|test(H)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py) | 256x256 | 0.973 | 0.826 | 5.27 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human_20201029.log.json) |
|
||||
|Human_annot|test(M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py) | 256x256 | 0.975 | 0.841 | 4.90 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human_20201029.log.json) |
|
||||
|Human_annot|test(H+M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py) | 256x256 | 0.975 | 0.839 | 4.97 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human_20201029.log.json) |
|
||||
|Machine_annot|val(M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py) | 256x256 | 0.970 | 0.824 | 5.39 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine_20201102.log.json) |
|
||||
|Machine_annot|test(H)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py) | 256x256 | 0.969 | 0.821 | 5.52 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine_20201102.log.json) |
|
||||
|Machine_annot|test(M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py) | 256x256 | 0.972 | 0.838 | 5.03 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine_20201102.log.json) |
|
||||
|Machine_annot|test(H+M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py) | 256x256 | 0.972 | 0.837 | 5.11 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine_20201102.log.json) |
|
||||
|All|val(M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py) | 256x256 | 0.977 | 0.840 | 4.66 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all_20201102.log.json) |
|
||||
|All|test(H)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py) | 256x256 | 0.979 | 0.839 | 4.65 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all_20201102.log.json) |
|
||||
|All|test(M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py) | 256x256 | 0.979 | 0.838 | 4.42 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all_20201102.log.json) |
|
||||
|All|test(H+M)| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py) | 256x256 | 0.979 | 0.851 | 4.46 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all_20201102.log.json) |
|
||||
+177
@@ -0,0 +1,177 @@
|
||||
Collections:
|
||||
- Name: SimpleBaseline2D
|
||||
Paper:
|
||||
Title: Simple baselines for human pose estimation and tracking
|
||||
URL: http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/algorithms/simplebaseline2d.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: &id001
|
||||
- SimpleBaseline2D
|
||||
- ResNet
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_human_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.828
|
||||
EPE: 5.15
|
||||
PCK@0.2: 0.973
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_human_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.826
|
||||
EPE: 5.27
|
||||
PCK@0.2: 0.973
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_human_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.841
|
||||
EPE: 4.9
|
||||
PCK@0.2: 0.975
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_human_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_human_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.839
|
||||
EPE: 4.97
|
||||
PCK@0.2: 0.975
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_human-77b27d1a_20201029.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_machine_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.824
|
||||
EPE: 5.39
|
||||
PCK@0.2: 0.97
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_machine_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.821
|
||||
EPE: 5.52
|
||||
PCK@0.2: 0.969
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_machine_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.838
|
||||
EPE: 5.03
|
||||
PCK@0.2: 0.972
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_machine_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_machine_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.837
|
||||
EPE: 5.11
|
||||
PCK@0.2: 0.972
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_machine-8f3efe9a_20201102.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_all_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.84
|
||||
EPE: 4.66
|
||||
PCK@0.2: 0.977
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_all_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.839
|
||||
EPE: 4.65
|
||||
PCK@0.2: 0.979
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_all_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.838
|
||||
EPE: 4.42
|
||||
PCK@0.2: 0.979
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/interhand2d/res50_interhand2d_all_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: topdown_heatmap_res50_interhand2d_all_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
AUC: 0.851
|
||||
EPE: 4.46
|
||||
PCK@0.2: 0.979
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_interhand2d_256x256_all-78cc95d4_20201102.pth
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html">DarkPose (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/8529221/">OneHand10K (TCSVT'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@article{wang2018mask,
|
||||
title={Mask-pose cascaded cnn for 2d hand pose estimation from single color image},
|
||||
author={Wang, Yangang and Peng, Cong and Liu, Yebin},
|
||||
journal={IEEE Transactions on Circuits and Systems for Video Technology},
|
||||
volume={29},
|
||||
number={11},
|
||||
pages={3258--3268},
|
||||
year={2018},
|
||||
publisher={IEEE}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on OneHand10K val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18_dark](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/hrnetv2_w18_onehand10k_256x256_dark.py) | 256x256 | 0.990 | 0.573 | 23.84 | [ckpt](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_onehand10k_256x256_dark-a2f80c64_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_onehand10k_256x256_dark_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: DarkPose
|
||||
Paper:
|
||||
Title: Distribution-aware coordinate representation for human pose estimation
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/techniques/dark.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/hrnetv2_w18_onehand10k_256x256_dark.py
|
||||
In Collection: DarkPose
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
- DarkPose
|
||||
Training Data: OneHand10K
|
||||
Name: topdown_heatmap_hrnetv2_w18_onehand10k_256x256_dark
|
||||
Results:
|
||||
- Dataset: OneHand10K
|
||||
Metrics:
|
||||
AUC: 0.573
|
||||
EPE: 23.84
|
||||
PCK@0.2: 0.99
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_onehand10k_256x256_dark-a2f80c64_20210330.pth
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/8529221/">OneHand10K (TCSVT'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@article{wang2018mask,
|
||||
title={Mask-pose cascaded cnn for 2d hand pose estimation from single color image},
|
||||
author={Wang, Yangang and Peng, Cong and Liu, Yebin},
|
||||
journal={IEEE Transactions on Circuits and Systems for Video Technology},
|
||||
volume={29},
|
||||
number={11},
|
||||
pages={3258--3268},
|
||||
year={2018},
|
||||
publisher={IEEE}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on OneHand10K val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/hrnetv2_w18_onehand10k_256x256.py) | 256x256 | 0.990 | 0.568 | 24.16 | [ckpt](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_onehand10k_256x256-30bc9c6b_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_onehand10k_256x256_20210330.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: HRNetv2
|
||||
Paper:
|
||||
Title: Deep High-Resolution Representation Learning for Visual Recognition
|
||||
URL: https://ieeexplore.ieee.org/abstract/document/9052469/
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/hrnetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/hrnetv2_w18_onehand10k_256x256.py
|
||||
In Collection: HRNetv2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
Training Data: OneHand10K
|
||||
Name: topdown_heatmap_hrnetv2_w18_onehand10k_256x256
|
||||
Results:
|
||||
- Dataset: OneHand10K
|
||||
Metrics:
|
||||
AUC: 0.568
|
||||
EPE: 24.16
|
||||
PCK@0.2: 0.99
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_onehand10k_256x256-30bc9c6b_20210330.pth
|
||||
+60
@@ -0,0 +1,60 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Huang_The_Devil_Is_in_the_Details_Delving_Into_Unbiased_Data_CVPR_2020_paper.html">UDP (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@InProceedings{Huang_2020_CVPR,
|
||||
author = {Huang, Junjie and Zhu, Zheng and Guo, Feng and Huang, Guan},
|
||||
title = {The Devil Is in the Details: Delving Into Unbiased Data Processing for Human Pose Estimation},
|
||||
booktitle = {The IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
|
||||
month = {June},
|
||||
year = {2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/8529221/">OneHand10K (TCSVT'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@article{wang2018mask,
|
||||
title={Mask-pose cascaded cnn for 2d hand pose estimation from single color image},
|
||||
author={Wang, Yangang and Peng, Cong and Liu, Yebin},
|
||||
journal={IEEE Transactions on Circuits and Systems for Video Technology},
|
||||
volume={29},
|
||||
number={11},
|
||||
pages={3258--3268},
|
||||
year={2018},
|
||||
publisher={IEEE}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on OneHand10K val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18_udp](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/hrnetv2_w18_onehand10k_256x256_udp.py) | 256x256 | 0.990 | 0.572 | 23.87 | [ckpt](https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_onehand10k_256x256_udp-0d1b515d_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_onehand10k_256x256_udp_20210330.log.json) |
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
Collections:
|
||||
- Name: UDP
|
||||
Paper:
|
||||
Title: 'The Devil Is in the Details: Delving Into Unbiased Data Processing for
|
||||
Human Pose Estimation'
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Huang_The_Devil_Is_in_the_Details_Delving_Into_Unbiased_Data_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/techniques/udp.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/hrnetv2_w18_onehand10k_256x256_udp.py
|
||||
In Collection: UDP
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
- UDP
|
||||
Training Data: OneHand10K
|
||||
Name: topdown_heatmap_hrnetv2_w18_onehand10k_256x256_udp
|
||||
Results:
|
||||
- Dataset: OneHand10K
|
||||
Metrics:
|
||||
AUC: 0.572
|
||||
EPE: 23.87
|
||||
PCK@0.2: 0.99
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_onehand10k_256x256_udp-0d1b515d_20210330.pth
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/onehand10k.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/onehand10k'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/onehand10k.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='unbiased',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2, unbiased_encoding=True),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/onehand10k'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+171
@@ -0,0 +1,171 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/onehand10k.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
target_type = 'GaussianHeatmap'
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=False,
|
||||
target_type=target_type,
|
||||
modulate_kernel=11,
|
||||
use_udp=True))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine', use_udp=True),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='TopDownGenerateTarget',
|
||||
sigma=2,
|
||||
encoding='UDP',
|
||||
target_type=target_type),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine', use_udp=True),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/onehand10k'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html">MobilenetV2 (CVPR'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{sandler2018mobilenetv2,
|
||||
title={Mobilenetv2: Inverted residuals and linear bottlenecks},
|
||||
author={Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={4510--4520},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/8529221/">OneHand10K (TCSVT'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@article{wang2018mask,
|
||||
title={Mask-pose cascaded cnn for 2d hand pose estimation from single color image},
|
||||
author={Wang, Yangang and Peng, Cong and Liu, Yebin},
|
||||
journal={IEEE Transactions on Circuits and Systems for Video Technology},
|
||||
volume={29},
|
||||
number={11},
|
||||
pages={3258--3268},
|
||||
year={2018},
|
||||
publisher={IEEE}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on OneHand10K val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_mobilenet_v2](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/mobilenetv2_onehand10k_256x256.py) | 256x256 | 0.986 | 0.537 | 28.60 | [ckpt](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_onehand10k_256x256-f3a3d90e_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_onehand10k_256x256_20210330.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: MobilenetV2
|
||||
Paper:
|
||||
Title: 'Mobilenetv2: Inverted residuals and linear bottlenecks'
|
||||
URL: http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/mobilenetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/mobilenetv2_onehand10k_256x256.py
|
||||
In Collection: MobilenetV2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- MobilenetV2
|
||||
Training Data: OneHand10K
|
||||
Name: topdown_heatmap_mobilenetv2_onehand10k_256x256
|
||||
Results:
|
||||
- Dataset: OneHand10K
|
||||
Metrics:
|
||||
AUC: 0.537
|
||||
EPE: 28.6
|
||||
PCK@0.2: 0.986
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_onehand10k_256x256-f3a3d90e_20210330.pth
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/onehand10k.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='mmcls://mobilenet_v2',
|
||||
backbone=dict(type='MobileNetV2', widen_factor=1., out_indices=(7, )),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=1280,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'],
|
||||
)
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/onehand10k'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/onehand10k.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/onehand10k'
|
||||
data = dict(
|
||||
samples_per_gpu=32,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='OneHand10KDataset',
|
||||
ann_file=f'{data_root}/annotations/onehand10k_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+59
@@ -0,0 +1,59 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html">SimpleBaseline2D (ECCV'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{xiao2018simple,
|
||||
title={Simple baselines for human pose estimation and tracking},
|
||||
author={Xiao, Bin and Wu, Haiping and Wei, Yichen},
|
||||
booktitle={Proceedings of the European conference on computer vision (ECCV)},
|
||||
pages={466--481},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/8529221/">OneHand10K (TCSVT'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@article{wang2018mask,
|
||||
title={Mask-pose cascaded cnn for 2d hand pose estimation from single color image},
|
||||
author={Wang, Yangang and Peng, Cong and Liu, Yebin},
|
||||
journal={IEEE Transactions on Circuits and Systems for Video Technology},
|
||||
volume={29},
|
||||
number={11},
|
||||
pages={3258--3268},
|
||||
year={2018},
|
||||
publisher={IEEE}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on OneHand10K val set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/res50_onehand10k_256x256.py) | 256x256 | 0.989 | 0.555 | 25.19 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_onehand10k_256x256-739c8639_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_onehand10k_256x256_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: SimpleBaseline2D
|
||||
Paper:
|
||||
Title: Simple baselines for human pose estimation and tracking
|
||||
URL: http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/algorithms/simplebaseline2d.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/onehand10k/res50_onehand10k_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture:
|
||||
- SimpleBaseline2D
|
||||
- ResNet
|
||||
Training Data: OneHand10K
|
||||
Name: topdown_heatmap_res50_onehand10k_256x256
|
||||
Results:
|
||||
- Dataset: OneHand10K
|
||||
Metrics:
|
||||
AUC: 0.555
|
||||
EPE: 25.19
|
||||
PCK@0.2: 0.989
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_onehand10k_256x256-739c8639_20210330.pth
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html">DarkPose (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2017/html/Simon_Hand_Keypoint_Detection_CVPR_2017_paper.html">CMU Panoptic HandDB (CVPR'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{simon2017hand,
|
||||
title={Hand keypoint detection in single images using multiview bootstrapping},
|
||||
author={Simon, Tomas and Joo, Hanbyul and Matthews, Iain and Sheikh, Yaser},
|
||||
booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
|
||||
pages={1145--1153},
|
||||
year={2017}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on CMU Panoptic (MPII+NZSL val set)
|
||||
|
||||
| Arch | Input Size | PCKh@0.7 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18_dark](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/hrnetv2_w18_panoptic_256x256_dark.py) | 256x256 | 0.999 | 0.745 | 7.77 | [ckpt](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_panoptic_256x256_dark-1f1e4b74_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_panoptic_256x256_dark_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: DarkPose
|
||||
Paper:
|
||||
Title: Distribution-aware coordinate representation for human pose estimation
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/techniques/dark.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/hrnetv2_w18_panoptic_256x256_dark.py
|
||||
In Collection: DarkPose
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
- DarkPose
|
||||
Training Data: CMU Panoptic HandDB
|
||||
Name: topdown_heatmap_hrnetv2_w18_panoptic_256x256_dark
|
||||
Results:
|
||||
- Dataset: CMU Panoptic HandDB
|
||||
Metrics:
|
||||
AUC: 0.745
|
||||
EPE: 7.77
|
||||
PCKh@0.7: 0.999
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_panoptic_256x256_dark-1f1e4b74_20210330.pth
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2017/html/Simon_Hand_Keypoint_Detection_CVPR_2017_paper.html">CMU Panoptic HandDB (CVPR'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{simon2017hand,
|
||||
title={Hand keypoint detection in single images using multiview bootstrapping},
|
||||
author={Simon, Tomas and Joo, Hanbyul and Matthews, Iain and Sheikh, Yaser},
|
||||
booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
|
||||
pages={1145--1153},
|
||||
year={2017}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on CMU Panoptic (MPII+NZSL val set)
|
||||
|
||||
| Arch | Input Size | PCKh@0.7 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/hrnetv2_w18_panoptic_256x256.py) | 256x256 | 0.999 | 0.744 | 7.79 | [ckpt](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_panoptic_256x256-53b12345_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_panoptic_256x256_20210330.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: HRNetv2
|
||||
Paper:
|
||||
Title: Deep High-Resolution Representation Learning for Visual Recognition
|
||||
URL: https://ieeexplore.ieee.org/abstract/document/9052469/
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/hrnetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/hrnetv2_w18_panoptic_256x256.py
|
||||
In Collection: HRNetv2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
Training Data: CMU Panoptic HandDB
|
||||
Name: topdown_heatmap_hrnetv2_w18_panoptic_256x256
|
||||
Results:
|
||||
- Dataset: CMU Panoptic HandDB
|
||||
Metrics:
|
||||
AUC: 0.744
|
||||
EPE: 7.79
|
||||
PCKh@0.7: 0.999
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_panoptic_256x256-53b12345_20210330.pth
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Huang_The_Devil_Is_in_the_Details_Delving_Into_Unbiased_Data_CVPR_2020_paper.html">UDP (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@InProceedings{Huang_2020_CVPR,
|
||||
author = {Huang, Junjie and Zhu, Zheng and Guo, Feng and Huang, Guan},
|
||||
title = {The Devil Is in the Details: Delving Into Unbiased Data Processing for Human Pose Estimation},
|
||||
booktitle = {The IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
|
||||
month = {June},
|
||||
year = {2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2017/html/Simon_Hand_Keypoint_Detection_CVPR_2017_paper.html">CMU Panoptic HandDB (CVPR'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{simon2017hand,
|
||||
title={Hand keypoint detection in single images using multiview bootstrapping},
|
||||
author={Simon, Tomas and Joo, Hanbyul and Matthews, Iain and Sheikh, Yaser},
|
||||
booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
|
||||
pages={1145--1153},
|
||||
year={2017}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on CMU Panoptic (MPII+NZSL val set)
|
||||
|
||||
| Arch | Input Size | PCKh@0.7 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18_udp](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/hrnetv2_w18_panoptic_256x256_udp.py) | 256x256 | 0.998 | 0.742 | 7.84 | [ckpt](https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_panoptic_256x256_udp-f9e15948_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_panoptic_256x256_udp_20210330.log.json) |
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
Collections:
|
||||
- Name: UDP
|
||||
Paper:
|
||||
Title: 'The Devil Is in the Details: Delving Into Unbiased Data Processing for
|
||||
Human Pose Estimation'
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Huang_The_Devil_Is_in_the_Details_Delving_Into_Unbiased_Data_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/techniques/udp.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/hrnetv2_w18_panoptic_256x256_udp.py
|
||||
In Collection: UDP
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
- UDP
|
||||
Training Data: CMU Panoptic HandDB
|
||||
Name: topdown_heatmap_hrnetv2_w18_panoptic_256x256_udp
|
||||
Results:
|
||||
- Dataset: CMU Panoptic HandDB
|
||||
Metrics:
|
||||
AUC: 0.742
|
||||
EPE: 7.84
|
||||
PCKh@0.7: 0.998
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_panoptic_256x256_udp-f9e15948_20210330.pth
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/panoptic_hand2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCKh', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/panoptic'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/panoptic_hand2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCKh', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='unbiased',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2, unbiased_encoding=True),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/panoptic'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+171
@@ -0,0 +1,171 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/panoptic_hand2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCKh', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
target_type = 'GaussianHeatmap'
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=False,
|
||||
target_type=target_type,
|
||||
modulate_kernel=11,
|
||||
use_udp=True))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine', use_udp=True),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='TopDownGenerateTarget',
|
||||
sigma=2,
|
||||
encoding='UDP',
|
||||
target_type=target_type),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine', use_udp=True),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/panoptic'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html">MobilenetV2 (CVPR'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{sandler2018mobilenetv2,
|
||||
title={Mobilenetv2: Inverted residuals and linear bottlenecks},
|
||||
author={Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={4510--4520},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2017/html/Simon_Hand_Keypoint_Detection_CVPR_2017_paper.html">CMU Panoptic HandDB (CVPR'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{simon2017hand,
|
||||
title={Hand keypoint detection in single images using multiview bootstrapping},
|
||||
author={Simon, Tomas and Joo, Hanbyul and Matthews, Iain and Sheikh, Yaser},
|
||||
booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
|
||||
pages={1145--1153},
|
||||
year={2017}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on CMU Panoptic (MPII+NZSL val set)
|
||||
|
||||
| Arch | Input Size | PCKh@0.7 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_mobilenet_v2](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/mobilenetv2_panoptic_256x256.py) | 256x256 | 0.998 | 0.694 | 9.70 | [ckpt](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_panoptic_256x256-b733d98c_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_panoptic_256x256_20210330.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: MobilenetV2
|
||||
Paper:
|
||||
Title: 'Mobilenetv2: Inverted residuals and linear bottlenecks'
|
||||
URL: http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/mobilenetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/mobilenetv2_panoptic_256x256.py
|
||||
In Collection: MobilenetV2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- MobilenetV2
|
||||
Training Data: CMU Panoptic HandDB
|
||||
Name: topdown_heatmap_mobilenetv2_panoptic_256x256
|
||||
Results:
|
||||
- Dataset: CMU Panoptic HandDB
|
||||
Metrics:
|
||||
AUC: 0.694
|
||||
EPE: 9.7
|
||||
PCKh@0.7: 0.998
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_panoptic_256x256-b733d98c_20210330.pth
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/panoptic_hand2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCKh', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='mmcls://mobilenet_v2',
|
||||
backbone=dict(type='MobileNetV2', widen_factor=1., out_indices=(7, )),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=1280,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/panoptic'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/panoptic_hand2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCKh', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/panoptic'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='PanopticDataset',
|
||||
ann_file=f'{data_root}/annotations/panoptic_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html">SimpleBaseline2D (ECCV'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{xiao2018simple,
|
||||
title={Simple baselines for human pose estimation and tracking},
|
||||
author={Xiao, Bin and Wu, Haiping and Wei, Yichen},
|
||||
booktitle={Proceedings of the European conference on computer vision (ECCV)},
|
||||
pages={466--481},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2017/html/Simon_Hand_Keypoint_Detection_CVPR_2017_paper.html">CMU Panoptic HandDB (CVPR'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{simon2017hand,
|
||||
title={Hand keypoint detection in single images using multiview bootstrapping},
|
||||
author={Simon, Tomas and Joo, Hanbyul and Matthews, Iain and Sheikh, Yaser},
|
||||
booktitle={Proceedings of the IEEE conference on Computer Vision and Pattern Recognition},
|
||||
pages={1145--1153},
|
||||
year={2017}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on CMU Panoptic (MPII+NZSL val set)
|
||||
|
||||
| Arch | Input Size | PCKh@0.7 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_resnet_50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/res50_panoptic_256x256.py) | 256x256 | 0.999 | 0.713 | 9.00 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_panoptic_256x256-4eafc561_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_panoptic_256x256_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: SimpleBaseline2D
|
||||
Paper:
|
||||
Title: Simple baselines for human pose estimation and tracking
|
||||
URL: http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/algorithms/simplebaseline2d.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/panoptic2d/res50_panoptic_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture:
|
||||
- SimpleBaseline2D
|
||||
- ResNet
|
||||
Training Data: CMU Panoptic HandDB
|
||||
Name: topdown_heatmap_res50_panoptic_256x256
|
||||
Results:
|
||||
- Dataset: CMU Panoptic HandDB
|
||||
Metrics:
|
||||
AUC: 0.713
|
||||
EPE: 9.0
|
||||
PCKh@0.7: 0.999
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_panoptic_256x256-4eafc561_20210330.pth
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html">DarkPose (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://lmb.informatik.uni-freiburg.de/projects/hand3d/">RHD (ICCV'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@TechReport{zb2017hand,
|
||||
author={Christian Zimmermann and Thomas Brox},
|
||||
title={Learning to Estimate 3D Hand Pose from Single RGB Images},
|
||||
institution={arXiv:1705.01389},
|
||||
year={2017},
|
||||
note="https://arxiv.org/abs/1705.01389",
|
||||
url="https://lmb.informatik.uni-freiburg.de/projects/hand3d/"
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on RHD test set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18_dark](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/hrnetv2_w18_rhd2d_256x256_dark.py) | 256x256 | 0.992 | 0.903 | 2.17 | [ckpt](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_rhd2d_256x256_dark-4df3a347_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_rhd2d_256x256_dark_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: DarkPose
|
||||
Paper:
|
||||
Title: Distribution-aware coordinate representation for human pose estimation
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Zhang_Distribution-Aware_Coordinate_Representation_for_Human_Pose_Estimation_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/techniques/dark.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/hrnetv2_w18_rhd2d_256x256_dark.py
|
||||
In Collection: DarkPose
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
- DarkPose
|
||||
Training Data: RHD
|
||||
Name: topdown_heatmap_hrnetv2_w18_rhd2d_256x256_dark
|
||||
Results:
|
||||
- Dataset: RHD
|
||||
Metrics:
|
||||
AUC: 0.903
|
||||
EPE: 2.17
|
||||
PCK@0.2: 0.992
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/dark/hrnetv2_w18_rhd2d_256x256_dark-4df3a347_20210330.pth
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://lmb.informatik.uni-freiburg.de/projects/hand3d/">RHD (ICCV'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@TechReport{zb2017hand,
|
||||
author={Christian Zimmermann and Thomas Brox},
|
||||
title={Learning to Estimate 3D Hand Pose from Single RGB Images},
|
||||
institution={arXiv:1705.01389},
|
||||
year={2017},
|
||||
note="https://arxiv.org/abs/1705.01389",
|
||||
url="https://lmb.informatik.uni-freiburg.de/projects/hand3d/"
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on RHD test set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/hrnetv2_w18_rhd2d_256x256.py) | 256x256 | 0.992 | 0.902 | 2.21 | [ckpt](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_rhd2d_256x256-95b20dd8_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_rhd2d_256x256_20210330.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: HRNetv2
|
||||
Paper:
|
||||
Title: Deep High-Resolution Representation Learning for Visual Recognition
|
||||
URL: https://ieeexplore.ieee.org/abstract/document/9052469/
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/hrnetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/hrnetv2_w18_rhd2d_256x256.py
|
||||
In Collection: HRNetv2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
Training Data: RHD
|
||||
Name: topdown_heatmap_hrnetv2_w18_rhd2d_256x256
|
||||
Results:
|
||||
- Dataset: RHD
|
||||
Metrics:
|
||||
AUC: 0.902
|
||||
EPE: 2.21
|
||||
PCK@0.2: 0.992
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/hrnetv2/hrnetv2_w18_rhd2d_256x256-95b20dd8_20210330.pth
|
||||
+58
@@ -0,0 +1,58 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://ieeexplore.ieee.org/abstract/document/9052469/">HRNetv2 (TPAMI'2019)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@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}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_CVPR_2020/html/Huang_The_Devil_Is_in_the_Details_Delving_Into_Unbiased_Data_CVPR_2020_paper.html">UDP (CVPR'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@InProceedings{Huang_2020_CVPR,
|
||||
author = {Huang, Junjie and Zhu, Zheng and Guo, Feng and Huang, Guan},
|
||||
title = {The Devil Is in the Details: Delving Into Unbiased Data Processing for Human Pose Estimation},
|
||||
booktitle = {The IEEE/CVF Conference on Computer Vision and Pattern Recognition (CVPR)},
|
||||
month = {June},
|
||||
year = {2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://lmb.informatik.uni-freiburg.de/projects/hand3d/">RHD (ICCV'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@TechReport{zb2017hand,
|
||||
author={Christian Zimmermann and Thomas Brox},
|
||||
title={Learning to Estimate 3D Hand Pose from Single RGB Images},
|
||||
institution={arXiv:1705.01389},
|
||||
year={2017},
|
||||
note="https://arxiv.org/abs/1705.01389",
|
||||
url="https://lmb.informatik.uni-freiburg.de/projects/hand3d/"
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on CMU Panoptic (MPII+NZSL val set)
|
||||
|
||||
| Arch | Input Size | PCKh@0.7 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_hrnetv2_w18_udp](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/hrnetv2_w18_rhd2d_256x256_udp.py) | 256x256 | 0.998 | 0.742 | 7.84 | [ckpt](https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_rhd2d_256x256_udp-63ba6007_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_rhd2d_256x256_udp_20210330.log.json) |
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
Collections:
|
||||
- Name: UDP
|
||||
Paper:
|
||||
Title: 'The Devil Is in the Details: Delving Into Unbiased Data Processing for
|
||||
Human Pose Estimation'
|
||||
URL: http://openaccess.thecvf.com/content_CVPR_2020/html/Huang_The_Devil_Is_in_the_Details_Delving_Into_Unbiased_Data_CVPR_2020_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/techniques/udp.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/hrnetv2_w18_rhd2d_256x256_udp.py
|
||||
In Collection: UDP
|
||||
Metadata:
|
||||
Architecture:
|
||||
- HRNetv2
|
||||
- UDP
|
||||
Training Data: RHD
|
||||
Name: topdown_heatmap_hrnetv2_w18_rhd2d_256x256_udp
|
||||
Results:
|
||||
- Dataset: RHD
|
||||
Metrics:
|
||||
AUC: 0.742
|
||||
EPE: 7.84
|
||||
PCKh@0.7: 0.998
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/udp/hrnetv2_w18_rhd2d_256x256_udp-63ba6007_20210330.pth
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/rhd2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/rhd'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+164
@@ -0,0 +1,164 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/rhd2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='unbiased',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2, unbiased_encoding=True),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/rhd'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+171
@@ -0,0 +1,171 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/rhd2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
target_type = 'GaussianHeatmap'
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='open-mmlab://msra/hrnetv2_w18',
|
||||
backbone=dict(
|
||||
type='HRNet',
|
||||
in_channels=3,
|
||||
extra=dict(
|
||||
stage1=dict(
|
||||
num_modules=1,
|
||||
num_branches=1,
|
||||
block='BOTTLENECK',
|
||||
num_blocks=(4, ),
|
||||
num_channels=(64, )),
|
||||
stage2=dict(
|
||||
num_modules=1,
|
||||
num_branches=2,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4),
|
||||
num_channels=(18, 36)),
|
||||
stage3=dict(
|
||||
num_modules=4,
|
||||
num_branches=3,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4),
|
||||
num_channels=(18, 36, 72)),
|
||||
stage4=dict(
|
||||
num_modules=3,
|
||||
num_branches=4,
|
||||
block='BASIC',
|
||||
num_blocks=(4, 4, 4, 4),
|
||||
num_channels=(18, 36, 72, 144),
|
||||
multiscale_output=True),
|
||||
upsample=dict(mode='bilinear', align_corners=False))),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=[18, 36, 72, 144],
|
||||
in_index=(0, 1, 2, 3),
|
||||
input_transform='resize_concat',
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
num_deconv_layers=0,
|
||||
extra=dict(
|
||||
final_conv_kernel=1, num_conv_layers=1, num_conv_kernels=(1, )),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=False,
|
||||
target_type=target_type,
|
||||
modulate_kernel=11,
|
||||
use_udp=True))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine', use_udp=True),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='TopDownGenerateTarget',
|
||||
sigma=2,
|
||||
encoding='UDP',
|
||||
target_type=target_type),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine', use_udp=True),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/rhd'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html">MobilenetV2 (CVPR'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{sandler2018mobilenetv2,
|
||||
title={Mobilenetv2: Inverted residuals and linear bottlenecks},
|
||||
author={Sandler, Mark and Howard, Andrew and Zhu, Menglong and Zhmoginov, Andrey and Chen, Liang-Chieh},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={4510--4520},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://lmb.informatik.uni-freiburg.de/projects/hand3d/">RHD (ICCV'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@TechReport{zb2017hand,
|
||||
author={Christian Zimmermann and Thomas Brox},
|
||||
title={Learning to Estimate 3D Hand Pose from Single RGB Images},
|
||||
institution={arXiv:1705.01389},
|
||||
year={2017},
|
||||
note="https://arxiv.org/abs/1705.01389",
|
||||
url="https://lmb.informatik.uni-freiburg.de/projects/hand3d/"
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on RHD test set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_mobilenet_v2](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/mobilenetv2_rhd2d_256x256.py) | 256x256 | 0.985 | 0.883 | 2.80 | [ckpt](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_rhd2d_256x256-85fa02db_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_rhd2d_256x256_20210330.log.json) |
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
Collections:
|
||||
- Name: MobilenetV2
|
||||
Paper:
|
||||
Title: 'Mobilenetv2: Inverted residuals and linear bottlenecks'
|
||||
URL: http://openaccess.thecvf.com/content_cvpr_2018/html/Sandler_MobileNetV2_Inverted_Residuals_CVPR_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/backbones/mobilenetv2.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/mobilenetv2_rhd2d_256x256.py
|
||||
In Collection: MobilenetV2
|
||||
Metadata:
|
||||
Architecture:
|
||||
- MobilenetV2
|
||||
Training Data: RHD
|
||||
Name: topdown_heatmap_mobilenetv2_rhd2d_256x256
|
||||
Results:
|
||||
- Dataset: RHD
|
||||
Metrics:
|
||||
AUC: 0.883
|
||||
EPE: 2.8
|
||||
PCK@0.2: 0.985
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/mobilenetv2/mobilenetv2_rhd2d_256x256-85fa02db_20210330.pth
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/rhd2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=10,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='mmcls://mobilenet_v2',
|
||||
backbone=dict(type='MobileNetV2', widen_factor=1., out_indices=(7, )),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=1280,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/rhd'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/rhd2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[224, 224],
|
||||
heatmap_size=[56, 56],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/rhd'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+130
@@ -0,0 +1,130 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/rhd2d.py'
|
||||
]
|
||||
evaluation = dict(interval=10, metric=['PCK', 'AUC', 'EPE'], save_best='AUC')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=5e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(
|
||||
policy='step',
|
||||
warmup='linear',
|
||||
warmup_iters=500,
|
||||
warmup_ratio=0.001,
|
||||
step=[170, 200])
|
||||
total_epochs = 210
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=21,
|
||||
dataset_joints=21,
|
||||
dataset_channel=[
|
||||
[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
|
||||
19, 20
|
||||
],
|
||||
],
|
||||
inference_channel=[
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
|
||||
20
|
||||
])
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='TopDown',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='TopdownHeatmapSimpleHead',
|
||||
in_channels=2048,
|
||||
out_channels=channel_cfg['num_output_channels'],
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True)),
|
||||
train_cfg=dict(),
|
||||
test_cfg=dict(
|
||||
flip_test=True,
|
||||
post_process='default',
|
||||
shift_heatmap=True,
|
||||
modulate_kernel=11))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64],
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownRandomFlip', flip_prob=0.5),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation', rot_factor=90, scale_factor=0.3),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(type='TopDownGenerateTarget', sigma=2),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=['image_file', 'center', 'scale', 'rotation', 'flip_pairs']),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/rhd'
|
||||
data = dict(
|
||||
samples_per_gpu=64,
|
||||
workers_per_gpu=2,
|
||||
val_dataloader=dict(samples_per_gpu=32),
|
||||
test_dataloader=dict(samples_per_gpu=32),
|
||||
train=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_train.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='Rhd2DDataset',
|
||||
ann_file=f'{data_root}/annotations/rhd_test.json',
|
||||
img_prefix=f'{data_root}/',
|
||||
data_cfg=data_cfg,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html">SimpleBaseline2D (ECCV'2018)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{xiao2018simple,
|
||||
title={Simple baselines for human pose estimation and tracking},
|
||||
author={Xiao, Bin and Wu, Haiping and Wei, Yichen},
|
||||
booktitle={Proceedings of the European conference on computer vision (ECCV)},
|
||||
pages={466--481},
|
||||
year={2018}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://lmb.informatik.uni-freiburg.de/projects/hand3d/">RHD (ICCV'2017)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@TechReport{zb2017hand,
|
||||
author={Christian Zimmermann and Thomas Brox},
|
||||
title={Learning to Estimate 3D Hand Pose from Single RGB Images},
|
||||
institution={arXiv:1705.01389},
|
||||
year={2017},
|
||||
note="https://arxiv.org/abs/1705.01389",
|
||||
url="https://lmb.informatik.uni-freiburg.de/projects/hand3d/"
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on RHD test set
|
||||
|
||||
| Arch | Input Size | PCK@0.2 | AUC | EPE | ckpt | log |
|
||||
| :--- | :--------: | :------: | :------: | :------: |:------: |:------: |
|
||||
| [pose_resnet50](/configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/res50_rhd2d_256x256.py) | 256x256 | 0.991 | 0.898 | 2.33 | [ckpt](https://download.openmmlab.com/mmpose/hand/resnet/res50_rhd2d_256x256-5dc7e4cc_20210330.pth) | [log](https://download.openmmlab.com/mmpose/hand/resnet/res50_rhd2d_256x256_20210330.log.json) |
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
Collections:
|
||||
- Name: SimpleBaseline2D
|
||||
Paper:
|
||||
Title: Simple baselines for human pose estimation and tracking
|
||||
URL: http://openaccess.thecvf.com/content_ECCV_2018/html/Bin_Xiao_Simple_Baselines_for_ECCV_2018_paper.html
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/algorithms/simplebaseline2d.md
|
||||
Models:
|
||||
- Config: configs/hand/2d_kpt_sview_rgb_img/topdown_heatmap/rhd2d/res50_rhd2d_256x256.py
|
||||
In Collection: SimpleBaseline2D
|
||||
Metadata:
|
||||
Architecture:
|
||||
- SimpleBaseline2D
|
||||
- ResNet
|
||||
Training Data: RHD
|
||||
Name: topdown_heatmap_res50_rhd2d_256x256
|
||||
Results:
|
||||
- Dataset: RHD
|
||||
Metrics:
|
||||
AUC: 0.898
|
||||
EPE: 2.33
|
||||
PCK@0.2: 0.991
|
||||
Task: Hand 2D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand/resnet/res50_rhd2d_256x256-5dc7e4cc_20210330.pth
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
# 3D Hand Pose Estimation
|
||||
|
||||
3D hand pose estimation is defined as the task of detecting the poses (or keypoints) of the hand from an input image.
|
||||
|
||||
## Data preparation
|
||||
|
||||
Please follow [DATA Preparation](/docs/en/tasks/3d_hand_keypoint.md) to prepare data.
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
# InterHand2.6M: A Dataset and Baseline for 3D Interacting Hand Pose Estimation from a Single RGB Image
|
||||
|
||||
## Introduction
|
||||
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/content/pdf/10.1007/978-3-030-58565-5_33.pdf">InterNet (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@InProceedings{Moon_2020_ECCV_InterHand2.6M,
|
||||
author = {Moon, Gyeongsik and Yu, Shoou-I and Wen, He and Shiratori, Takaaki and Lee, Kyoung Mu},
|
||||
title = {InterHand2.6M: A Dataset and Baseline for 3D Interacting Hand Pose Estimation from a Single RGB Image},
|
||||
booktitle = {European Conference on Computer Vision (ECCV)},
|
||||
year = {2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
<!-- [ALGORITHM] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/content/pdf/10.1007/978-3-030-58565-5_33.pdf">InterNet (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@InProceedings{Moon_2020_ECCV_InterHand2.6M,
|
||||
author = {Moon, Gyeongsik and Yu, Shoou-I and Wen, He and Shiratori, Takaaki and Lee, Kyoung Mu},
|
||||
title = {InterHand2.6M: A Dataset and Baseline for 3D Interacting Hand Pose Estimation from a Single RGB Image},
|
||||
booktitle = {European Conference on Computer Vision (ECCV)},
|
||||
year = {2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [BACKBONE] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="http://openaccess.thecvf.com/content_cvpr_2016/html/He_Deep_Residual_Learning_CVPR_2016_paper.html">ResNet (CVPR'2016)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@inproceedings{he2016deep,
|
||||
title={Deep residual learning for image recognition},
|
||||
author={He, Kaiming and Zhang, Xiangyu and Ren, Shaoqing and Sun, Jian},
|
||||
booktitle={Proceedings of the IEEE conference on computer vision and pattern recognition},
|
||||
pages={770--778},
|
||||
year={2016}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
<!-- [DATASET] -->
|
||||
|
||||
<details>
|
||||
<summary align="right"><a href="https://link.springer.com/content/pdf/10.1007/978-3-030-58565-5_33.pdf">InterHand2.6M (ECCV'2020)</a></summary>
|
||||
|
||||
```bibtex
|
||||
@InProceedings{Moon_2020_ECCV_InterHand2.6M,
|
||||
author = {Moon, Gyeongsik and Yu, Shoou-I and Wen, He and Shiratori, Takaaki and Lee, Kyoung Mu},
|
||||
title = {InterHand2.6M: A Dataset and Baseline for 3D Interacting Hand Pose Estimation from a Single RGB Image},
|
||||
booktitle = {European Conference on Computer Vision (ECCV)},
|
||||
year = {2020}
|
||||
}
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Results on InterHand2.6M val & test set
|
||||
|
||||
|Train Set| Set | Arch | Input Size | MPJPE-single | MPJPE-interacting | MPJPE-all | MRRPE | APh | ckpt | log |
|
||||
| :--- | :--- | :--------: | :--------: | :------: | :------: | :------: |:------: |:------: |:------: |:------: |
|
||||
| All | test(H+M) | [InterNet_resnet_50](/configs/hand/3d_kpt_sview_rgb_img/internet/interhand3d/res50_interhand3d_all_256x256.py) | 256x256 | 9.47 | 13.40 | 11.59 | 29.28 | 0.99 | [ckpt](https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3dv1.0_all_256x256-42b7f2ac_20210702.pth) | [log](https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3dv1.0_all_256x256_20210702.log.json) |
|
||||
| All | val(M) | [InterNet_resnet_50](/configs/hand/3d_kpt_sview_rgb_img/internet/interhand3d/res50_interhand3d_all_256x256.py) | 256x256 | 11.22 | 15.23 | 13.16 | 31.73 | 0.98 | [ckpt](https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3dv1.0_all_256x256-42b7f2ac_20210702.pth) | [log](https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3dv1.0_all_256x256_20210702.log.json) |
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
Collections:
|
||||
- Name: InterNet
|
||||
Paper:
|
||||
Title: 'InterHand2.6M: A Dataset and Baseline for 3D Interacting Hand Pose Estimation
|
||||
from a Single RGB Image'
|
||||
URL: https://link.springer.com/content/pdf/10.1007/978-3-030-58565-5_33.pdf
|
||||
README: https://github.com/open-mmlab/mmpose/blob/master/docs/en/papers/algorithms/internet.md
|
||||
Models:
|
||||
- Config: configs/hand/3d_kpt_sview_rgb_img/internet/interhand3d/res50_interhand3d_all_256x256.py
|
||||
In Collection: InterNet
|
||||
Metadata:
|
||||
Architecture: &id001
|
||||
- InterNet
|
||||
- ResNet
|
||||
Training Data: InterHand2.6M
|
||||
Name: internet_res50_interhand3d_all_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
APh: 0.99
|
||||
MPJPE-all: 11.59
|
||||
MPJPE-interacting: 13.4
|
||||
MPJPE-single: 9.47
|
||||
Task: Hand 3D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3dv1.0_all_256x256-42b7f2ac_20210702.pth
|
||||
- Config: configs/hand/3d_kpt_sview_rgb_img/internet/interhand3d/res50_interhand3d_all_256x256.py
|
||||
In Collection: InterNet
|
||||
Metadata:
|
||||
Architecture: *id001
|
||||
Training Data: InterHand2.6M
|
||||
Name: internet_res50_interhand3d_all_256x256
|
||||
Results:
|
||||
- Dataset: InterHand2.6M
|
||||
Metrics:
|
||||
APh: 0.98
|
||||
MPJPE-all: 13.16
|
||||
MPJPE-interacting: 15.23
|
||||
MPJPE-single: 11.22
|
||||
Task: Hand 3D Keypoint
|
||||
Weights: https://download.openmmlab.com/mmpose/hand3d/internet/res50_intehand3dv1.0_all_256x256-42b7f2ac_20210702.pth
|
||||
+181
@@ -0,0 +1,181 @@
|
||||
_base_ = [
|
||||
'../../../../_base_/default_runtime.py',
|
||||
'../../../../_base_/datasets/interhand3d.py'
|
||||
]
|
||||
checkpoint_config = dict(interval=1)
|
||||
evaluation = dict(
|
||||
interval=1,
|
||||
metric=['MRRPE', 'MPJPE', 'Handedness_acc'],
|
||||
save_best='MPJPE_all')
|
||||
|
||||
optimizer = dict(
|
||||
type='Adam',
|
||||
lr=2e-4,
|
||||
)
|
||||
optimizer_config = dict(grad_clip=None)
|
||||
# learning policy
|
||||
lr_config = dict(policy='step', step=[15, 17])
|
||||
total_epochs = 20
|
||||
log_config = dict(
|
||||
interval=20,
|
||||
hooks=[
|
||||
dict(type='TextLoggerHook'),
|
||||
# dict(type='TensorboardLoggerHook')
|
||||
])
|
||||
|
||||
channel_cfg = dict(
|
||||
num_output_channels=42,
|
||||
dataset_joints=42,
|
||||
dataset_channel=[list(range(42))],
|
||||
inference_channel=list(range(42)))
|
||||
|
||||
# model settings
|
||||
model = dict(
|
||||
type='Interhand3D',
|
||||
pretrained='torchvision://resnet50',
|
||||
backbone=dict(type='ResNet', depth=50),
|
||||
keypoint_head=dict(
|
||||
type='Interhand3DHead',
|
||||
keypoint_head_cfg=dict(
|
||||
in_channels=2048,
|
||||
out_channels=21 * 64,
|
||||
depth_size=64,
|
||||
num_deconv_layers=3,
|
||||
num_deconv_filters=(256, 256, 256),
|
||||
num_deconv_kernels=(4, 4, 4),
|
||||
),
|
||||
root_head_cfg=dict(
|
||||
in_channels=2048,
|
||||
heatmap_size=64,
|
||||
hidden_dims=(512, ),
|
||||
),
|
||||
hand_type_head_cfg=dict(
|
||||
in_channels=2048,
|
||||
num_labels=2,
|
||||
hidden_dims=(512, ),
|
||||
),
|
||||
loss_keypoint=dict(type='JointsMSELoss', use_target_weight=True),
|
||||
loss_root_depth=dict(type='L1Loss', use_target_weight=True),
|
||||
loss_hand_type=dict(type='BCELoss', use_target_weight=True),
|
||||
),
|
||||
train_cfg={},
|
||||
test_cfg=dict(flip_test=False))
|
||||
|
||||
data_cfg = dict(
|
||||
image_size=[256, 256],
|
||||
heatmap_size=[64, 64, 64],
|
||||
heatmap3d_depth_bound=400.0,
|
||||
heatmap_size_root=64,
|
||||
root_depth_bound=400.0,
|
||||
num_output_channels=channel_cfg['num_output_channels'],
|
||||
num_joints=channel_cfg['dataset_joints'],
|
||||
dataset_channel=channel_cfg['dataset_channel'],
|
||||
inference_channel=channel_cfg['inference_channel'])
|
||||
|
||||
train_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='HandRandomFlip', flip_prob=0.5),
|
||||
dict(type='TopDownRandomTranslation', trans_factor=0.15),
|
||||
dict(
|
||||
type='TopDownGetRandomScaleRotation',
|
||||
rot_factor=45,
|
||||
scale_factor=0.25,
|
||||
rot_prob=0.6),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='MultitaskGatherTarget',
|
||||
pipeline_list=[
|
||||
[dict(
|
||||
type='Generate3DHeatmapTarget',
|
||||
sigma=2.5,
|
||||
max_bound=255,
|
||||
)], [dict(type='HandGenerateRelDepthTarget')],
|
||||
[
|
||||
dict(
|
||||
type='RenameKeys',
|
||||
key_pairs=[('hand_type', 'target'),
|
||||
('hand_type_valid', 'target_weight')])
|
||||
]
|
||||
],
|
||||
pipeline_indices=[0, 1, 2],
|
||||
),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img', 'target', 'target_weight'],
|
||||
meta_keys=[
|
||||
'image_file', 'joints_3d', 'joints_3d_visible', 'center', 'scale',
|
||||
'rotation', 'flip_pairs'
|
||||
]),
|
||||
]
|
||||
|
||||
val_pipeline = [
|
||||
dict(type='LoadImageFromFile'),
|
||||
dict(type='TopDownAffine'),
|
||||
dict(type='ToTensor'),
|
||||
dict(
|
||||
type='NormalizeTensor',
|
||||
mean=[0.485, 0.456, 0.406],
|
||||
std=[0.229, 0.224, 0.225]),
|
||||
dict(
|
||||
type='Collect',
|
||||
keys=['img'],
|
||||
meta_keys=[
|
||||
'image_file', 'center', 'scale', 'rotation', 'flip_pairs',
|
||||
'heatmap3d_depth_bound', 'root_depth_bound'
|
||||
]),
|
||||
]
|
||||
|
||||
test_pipeline = val_pipeline
|
||||
|
||||
data_root = 'data/interhand2.6m'
|
||||
data = dict(
|
||||
samples_per_gpu=16,
|
||||
workers_per_gpu=1,
|
||||
train=dict(
|
||||
type='InterHand3DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_train_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/train/',
|
||||
data_cfg=data_cfg,
|
||||
use_gt_root_depth=True,
|
||||
rootnet_result_file=None,
|
||||
pipeline=train_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
val=dict(
|
||||
type='InterHand3DDataset',
|
||||
ann_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_data.json',
|
||||
camera_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_camera.json',
|
||||
joint_file=f'{data_root}/annotations/machine_annot/'
|
||||
'InterHand2.6M_val_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/val/',
|
||||
data_cfg=data_cfg,
|
||||
use_gt_root_depth=True,
|
||||
rootnet_result_file=None,
|
||||
pipeline=val_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
test=dict(
|
||||
type='InterHand3DDataset',
|
||||
ann_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_data.json',
|
||||
camera_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_camera.json',
|
||||
joint_file=f'{data_root}/annotations/all/'
|
||||
'InterHand2.6M_test_joint_3d.json',
|
||||
img_prefix=f'{data_root}/images/test/',
|
||||
data_cfg=data_cfg,
|
||||
use_gt_root_depth=True,
|
||||
rootnet_result_file=None,
|
||||
pipeline=test_pipeline,
|
||||
dataset_info={{_base_.dataset_info}}),
|
||||
)
|
||||
Reference in New Issue
Block a user