Spaces:
Build error
Build error
| # Copyright (c) OpenMMLab. All rights reserved. | |
| import pytest | |
| import torch | |
| from mmpose.models.backbones.hrformer import (HRFomerModule, HRFormer, | |
| HRFormerBlock) | |
| def test_hrformer_module(): | |
| norm_cfg = dict(type='BN') | |
| block = HRFormerBlock | |
| # Test multiscale forward | |
| num_channles = (32, 64) | |
| num_inchannels = [c * block.expansion for c in num_channles] | |
| hrmodule = HRFomerModule( | |
| num_branches=2, | |
| block=block, | |
| num_blocks=(2, 2), | |
| num_inchannels=num_inchannels, | |
| num_channels=num_channles, | |
| num_heads=(1, 2), | |
| num_window_sizes=(7, 7), | |
| num_mlp_ratios=(4, 4), | |
| drop_paths=(0., 0.), | |
| norm_cfg=norm_cfg) | |
| feats = [ | |
| torch.randn(1, num_inchannels[0], 64, 64), | |
| torch.randn(1, num_inchannels[1], 32, 32) | |
| ] | |
| feats = hrmodule(feats) | |
| assert len(str(hrmodule)) > 0 | |
| assert len(feats) == 2 | |
| assert feats[0].shape == torch.Size([1, num_inchannels[0], 64, 64]) | |
| assert feats[1].shape == torch.Size([1, num_inchannels[1], 32, 32]) | |
| # Test single scale forward | |
| num_channles = (32, 64) | |
| in_channels = [c * block.expansion for c in num_channles] | |
| hrmodule = HRFomerModule( | |
| num_branches=2, | |
| block=block, | |
| num_blocks=(2, 2), | |
| num_inchannels=num_inchannels, | |
| num_channels=num_channles, | |
| num_heads=(1, 2), | |
| num_window_sizes=(7, 7), | |
| num_mlp_ratios=(4, 4), | |
| drop_paths=(0., 0.), | |
| norm_cfg=norm_cfg, | |
| multiscale_output=False, | |
| ) | |
| feats = [ | |
| torch.randn(1, in_channels[0], 64, 64), | |
| torch.randn(1, in_channels[1], 32, 32) | |
| ] | |
| feats = hrmodule(feats) | |
| assert len(feats) == 1 | |
| assert feats[0].shape == torch.Size([1, in_channels[0], 64, 64]) | |
| # Test single branch HRFormer module | |
| hrmodule = HRFomerModule( | |
| num_branches=1, | |
| block=block, | |
| num_blocks=(1, ), | |
| num_inchannels=[num_inchannels[0]], | |
| num_channels=[num_channles[0]], | |
| num_heads=(1, ), | |
| num_window_sizes=(7, ), | |
| num_mlp_ratios=(4, ), | |
| drop_paths=(0.1, ), | |
| norm_cfg=norm_cfg, | |
| ) | |
| feats = [ | |
| torch.randn(1, in_channels[0], 64, 64), | |
| ] | |
| feats = hrmodule(feats) | |
| assert len(feats) == 1 | |
| assert feats[0].shape == torch.Size([1, in_channels[0], 64, 64]) | |
| # Value tests | |
| kwargs = dict( | |
| num_branches=2, | |
| block=block, | |
| num_blocks=(2, 2), | |
| num_inchannels=num_inchannels, | |
| num_channels=num_channles, | |
| num_heads=(1, 2), | |
| num_window_sizes=(7, 7), | |
| num_mlp_ratios=(4, 4), | |
| drop_paths=(0.1, 0.1), | |
| norm_cfg=norm_cfg, | |
| ) | |
| with pytest.raises(ValueError): | |
| # len(num_blocks) should equal num_branches | |
| kwargs['num_blocks'] = [2, 2, 2] | |
| HRFomerModule(**kwargs) | |
| kwargs['num_blocks'] = [2, 2] | |
| with pytest.raises(ValueError): | |
| # len(num_blocks) should equal num_branches | |
| kwargs['num_channels'] = [2] | |
| HRFomerModule(**kwargs) | |
| kwargs['num_channels'] = [2, 2] | |
| with pytest.raises(ValueError): | |
| # len(num_blocks) should equal num_branches | |
| kwargs['num_inchannels'] = [2] | |
| HRFomerModule(**kwargs) | |
| kwargs['num_inchannels'] = [2, 2] | |
| def test_hrformer_backbone(): | |
| norm_cfg = dict(type='BN') | |
| # only have 3 stages | |
| extra = dict( | |
| drop_path_rate=0.2, | |
| stage1=dict( | |
| num_modules=1, | |
| num_branches=1, | |
| block='BOTTLENECK', | |
| num_blocks=(2, ), | |
| num_channels=(64, )), | |
| stage2=dict( | |
| num_modules=1, | |
| num_branches=2, | |
| block='HRFORMERBLOCK', | |
| window_sizes=(7, 7), | |
| num_heads=(1, 2), | |
| mlp_ratios=(4, 4), | |
| num_blocks=(2, 2), | |
| num_channels=(32, 64)), | |
| stage3=dict( | |
| num_modules=4, | |
| num_branches=3, | |
| block='HRFORMERBLOCK', | |
| window_sizes=(7, 7, 7), | |
| num_heads=(1, 2, 4), | |
| mlp_ratios=(4, 4, 4), | |
| num_blocks=(2, 2, 2), | |
| num_channels=(32, 64, 128)), | |
| stage4=dict( | |
| num_modules=3, | |
| num_branches=4, | |
| block='HRFORMERBLOCK', | |
| window_sizes=(7, 7, 7, 7), | |
| num_heads=(1, 2, 4, 8), | |
| mlp_ratios=(4, 4, 4, 4), | |
| num_blocks=(2, 2, 2, 2), | |
| num_channels=(32, 64, 128, 256), | |
| multiscale_output=True)) | |
| with pytest.raises(ValueError): | |
| # len(num_blocks) should equal num_branches | |
| extra['stage4']['num_branches'] = 3 | |
| HRFormer(extra=extra) | |
| extra['stage4']['num_branches'] = 4 | |
| # Test HRFormer-S | |
| model = HRFormer(extra=extra, norm_cfg=norm_cfg) | |
| model.init_weights() | |
| model.train() | |
| imgs = torch.randn(1, 3, 64, 64) | |
| feats = model(imgs) | |
| assert len(feats) == 4 | |
| assert feats[0].shape == torch.Size([1, 32, 16, 16]) | |
| assert feats[3].shape == torch.Size([1, 256, 2, 2]) | |
| # Test single scale output and model | |
| # without relative position bias | |
| extra['stage4']['multiscale_output'] = False | |
| extra['with_rpe'] = False | |
| model = HRFormer(extra=extra, norm_cfg=norm_cfg) | |
| model.init_weights() | |
| model.train() | |
| imgs = torch.randn(1, 3, 64, 64) | |
| feats = model(imgs) | |
| assert len(feats) == 1 | |
| assert feats[0].shape == torch.Size([1, 32, 16, 16]) | |