59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
import pytest
|
|
import torch
|
|
|
|
from mmseg.models.decode_heads import APCHead
|
|
from .utils import _conv_has_norm, to_cuda
|
|
|
|
|
|
def test_apc_head():
|
|
|
|
with pytest.raises(AssertionError):
|
|
# pool_scales must be list|tuple
|
|
APCHead(in_channels=32, channels=16, num_classes=19, pool_scales=1)
|
|
|
|
# test no norm_cfg
|
|
head = APCHead(in_channels=32, channels=16, num_classes=19)
|
|
assert not _conv_has_norm(head, sync_bn=False)
|
|
|
|
# test with norm_cfg
|
|
head = APCHead(
|
|
in_channels=32,
|
|
channels=16,
|
|
num_classes=19,
|
|
norm_cfg=dict(type='SyncBN'))
|
|
assert _conv_has_norm(head, sync_bn=True)
|
|
|
|
# fusion=True
|
|
inputs = [torch.randn(1, 32, 45, 45)]
|
|
head = APCHead(
|
|
in_channels=32,
|
|
channels=16,
|
|
num_classes=19,
|
|
pool_scales=(1, 2, 3),
|
|
fusion=True)
|
|
if torch.cuda.is_available():
|
|
head, inputs = to_cuda(head, inputs)
|
|
assert head.fusion is True
|
|
assert head.acm_modules[0].pool_scale == 1
|
|
assert head.acm_modules[1].pool_scale == 2
|
|
assert head.acm_modules[2].pool_scale == 3
|
|
outputs = head(inputs)
|
|
assert outputs.shape == (1, head.num_classes, 45, 45)
|
|
|
|
# fusion=False
|
|
inputs = [torch.randn(1, 32, 45, 45)]
|
|
head = APCHead(
|
|
in_channels=32,
|
|
channels=16,
|
|
num_classes=19,
|
|
pool_scales=(1, 2, 3),
|
|
fusion=False)
|
|
if torch.cuda.is_available():
|
|
head, inputs = to_cuda(head, inputs)
|
|
assert head.fusion is False
|
|
assert head.acm_modules[0].pool_scale == 1
|
|
assert head.acm_modules[1].pool_scale == 2
|
|
assert head.acm_modules[2].pool_scale == 3
|
|
outputs = head(inputs)
|
|
assert outputs.shape == (1, head.num_classes, 45, 45)
|