You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
483 lines
16 KiB
483 lines
16 KiB
# Copyright (c) OpenMMLab. All rights reserved.
|
|
import numpy as np
|
|
import pytest
|
|
import torch
|
|
|
|
from mmpose.models import AEHigherResolutionHead, AESimpleHead
|
|
|
|
|
|
def test_ae_simple_head():
|
|
"""test bottom up AE simple head."""
|
|
|
|
with pytest.raises(TypeError):
|
|
# extra
|
|
_ = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True],
|
|
extra=[],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
# test final_conv_kernel
|
|
with pytest.raises(AssertionError):
|
|
_ = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True],
|
|
extra={'final_conv_kernel': -1},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True],
|
|
extra={'final_conv_kernel': 3},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
assert head.final_layer.padding == (1, 1)
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True],
|
|
extra={'final_conv_kernel': 1},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
assert head.final_layer.padding == (0, 0)
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
assert head.final_layer.padding == (0, 0)
|
|
# test with_ae_loss
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
num_deconv_layers=0,
|
|
with_ae_loss=[True],
|
|
extra={'final_conv_kernel': 3},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 34, 32, 32])
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
num_deconv_layers=0,
|
|
with_ae_loss=[False],
|
|
extra={'final_conv_kernel': 3},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 17, 32, 32])
|
|
# test tag_per_joint
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
num_deconv_layers=0,
|
|
tag_per_joint=False,
|
|
with_ae_loss=[False],
|
|
extra={'final_conv_kernel': 3},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 17, 32, 32])
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
num_deconv_layers=0,
|
|
tag_per_joint=False,
|
|
with_ae_loss=[True],
|
|
extra={'final_conv_kernel': 3},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 18, 32, 32])
|
|
head = AESimpleHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
num_deconv_layers=0,
|
|
tag_per_joint=False,
|
|
with_ae_loss=[True],
|
|
extra={'final_conv_kernel': 3},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=1,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True],
|
|
push_loss_factor=[0.001],
|
|
pull_loss_factor=[0.001],
|
|
with_heatmaps_loss=[True],
|
|
heatmaps_loss_factor=[1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head([inputs])
|
|
assert out[0].shape == torch.Size([1, 18, 32, 32])
|
|
|
|
|
|
def test_ae_higherresolution_head():
|
|
"""test bottom up AE higherresolution head."""
|
|
|
|
# test final_conv_kernel
|
|
with pytest.raises(AssertionError):
|
|
_ = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
extra={'final_conv_kernel': 0},
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
extra={'final_conv_kernel': 3},
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
assert head.final_layers[0].padding == (1, 1)
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
extra={'final_conv_kernel': 1},
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
assert head.final_layers[0].padding == (0, 0)
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
assert head.final_layers[0].padding == (0, 0)
|
|
# test deconv layers
|
|
with pytest.raises(ValueError):
|
|
_ = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
num_deconv_kernels=[1],
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
num_deconv_kernels=[4],
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
assert head.deconv_layers[0][0][0].output_padding == (0, 0)
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
num_deconv_kernels=[3],
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
assert head.deconv_layers[0][0][0].output_padding == (1, 1)
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
with_ae_loss=[True, False],
|
|
num_deconv_kernels=[2],
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
assert head.deconv_layers[0][0][0].output_padding == (0, 0)
|
|
# test tag_per_joint & ae loss
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
tag_per_joint=False,
|
|
with_ae_loss=[False, False],
|
|
extra={'final_conv_kernel': 3},
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[False, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 17, 32, 32])
|
|
assert out[1].shape == torch.Size([1, 17, 64, 64])
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
tag_per_joint=False,
|
|
with_ae_loss=[True, False],
|
|
extra={'final_conv_kernel': 3},
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, False],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 18, 32, 32])
|
|
assert out[1].shape == torch.Size([1, 17, 64, 64])
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
tag_per_joint=True,
|
|
with_ae_loss=[True, True],
|
|
extra={'final_conv_kernel': 3},
|
|
cat_output=[True],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, True],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 34, 32, 32])
|
|
assert out[1].shape == torch.Size([1, 34, 64, 64])
|
|
# cat_output
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
tag_per_joint=True,
|
|
with_ae_loss=[True, True],
|
|
extra={'final_conv_kernel': 3},
|
|
cat_output=[False],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, True],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head(inputs)
|
|
assert out[0].shape == torch.Size([1, 34, 32, 32])
|
|
assert out[1].shape == torch.Size([1, 34, 64, 64])
|
|
head = AEHigherResolutionHead(
|
|
in_channels=512,
|
|
num_joints=17,
|
|
tag_per_joint=True,
|
|
with_ae_loss=[True, True],
|
|
extra={'final_conv_kernel': 3},
|
|
cat_output=[False],
|
|
loss_keypoint=dict(
|
|
type='MultiLossFactory',
|
|
num_joints=17,
|
|
num_stages=2,
|
|
ae_loss_type='exp',
|
|
with_ae_loss=[True, True],
|
|
push_loss_factor=[0.001, 0.001],
|
|
pull_loss_factor=[0.001, 0.001],
|
|
with_heatmaps_loss=[True, True],
|
|
heatmaps_loss_factor=[1.0, 1.0]))
|
|
head.init_weights()
|
|
input_shape = (1, 512, 32, 32)
|
|
inputs = _demo_inputs(input_shape)
|
|
out = head([inputs])
|
|
assert out[0].shape == torch.Size([1, 34, 32, 32])
|
|
assert out[1].shape == torch.Size([1, 34, 64, 64])
|
|
|
|
|
|
def _demo_inputs(input_shape=(1, 3, 64, 64)):
|
|
"""Create a superset of inputs needed to run backbone.
|
|
|
|
Args:
|
|
input_shape (tuple): input batch dimensions.
|
|
Default: (1, 3, 64, 64).
|
|
Returns:
|
|
Random input tensor with the size of input_shape.
|
|
"""
|
|
inps = np.random.random(input_shape)
|
|
inps = torch.FloatTensor(inps)
|
|
return inps
|
|
|