|
|
|
import pytest |
|
import torch |
|
from torch.nn.modules.batchnorm import _BatchNorm |
|
|
|
from mmdet.models.backbones.csp_darknet import CSPDarknet |
|
from .utils import check_norm_state, is_norm |
|
|
|
|
|
def test_csp_darknet_backbone(): |
|
with pytest.raises(ValueError): |
|
|
|
CSPDarknet(frozen_stages=6) |
|
|
|
with pytest.raises(AssertionError): |
|
|
|
CSPDarknet(out_indices=[6]) |
|
|
|
|
|
frozen_stages = 1 |
|
model = CSPDarknet(frozen_stages=frozen_stages) |
|
model.train() |
|
|
|
for mod in model.stem.modules(): |
|
for param in mod.parameters(): |
|
assert param.requires_grad is False |
|
for i in range(1, frozen_stages + 1): |
|
layer = getattr(model, f'stage{i}') |
|
for mod in layer.modules(): |
|
if isinstance(mod, _BatchNorm): |
|
assert mod.training is False |
|
for param in layer.parameters(): |
|
assert param.requires_grad is False |
|
|
|
|
|
model = CSPDarknet(norm_eval=True) |
|
model.train() |
|
|
|
assert check_norm_state(model.modules(), False) |
|
|
|
|
|
model = CSPDarknet(arch='P5', widen_factor=0.25, out_indices=range(0, 5)) |
|
model.train() |
|
|
|
imgs = torch.randn(1, 3, 64, 64) |
|
feat = model(imgs) |
|
assert len(feat) == 5 |
|
assert feat[0].shape == torch.Size((1, 16, 32, 32)) |
|
assert feat[1].shape == torch.Size((1, 32, 16, 16)) |
|
assert feat[2].shape == torch.Size((1, 64, 8, 8)) |
|
assert feat[3].shape == torch.Size((1, 128, 4, 4)) |
|
assert feat[4].shape == torch.Size((1, 256, 2, 2)) |
|
|
|
|
|
model = CSPDarknet( |
|
arch='P6', |
|
widen_factor=0.25, |
|
out_indices=range(0, 6), |
|
spp_kernal_sizes=(3, 5, 7)) |
|
model.train() |
|
|
|
imgs = torch.randn(1, 3, 128, 128) |
|
feat = model(imgs) |
|
assert feat[0].shape == torch.Size((1, 16, 64, 64)) |
|
assert feat[1].shape == torch.Size((1, 32, 32, 32)) |
|
assert feat[2].shape == torch.Size((1, 64, 16, 16)) |
|
assert feat[3].shape == torch.Size((1, 128, 8, 8)) |
|
assert feat[4].shape == torch.Size((1, 192, 4, 4)) |
|
assert feat[5].shape == torch.Size((1, 256, 2, 2)) |
|
|
|
|
|
model = CSPDarknet( |
|
widen_factor=0.125, act_cfg=dict(type='ReLU'), out_indices=range(0, 5)) |
|
model.train() |
|
|
|
imgs = torch.randn(1, 3, 64, 64) |
|
feat = model(imgs) |
|
assert len(feat) == 5 |
|
assert feat[0].shape == torch.Size((1, 8, 32, 32)) |
|
assert feat[1].shape == torch.Size((1, 16, 16, 16)) |
|
assert feat[2].shape == torch.Size((1, 32, 8, 8)) |
|
assert feat[3].shape == torch.Size((1, 64, 4, 4)) |
|
assert feat[4].shape == torch.Size((1, 128, 2, 2)) |
|
|
|
|
|
model = CSPDarknet(widen_factor=0.125, out_indices=range(0, 5)) |
|
for m in model.modules(): |
|
if is_norm(m): |
|
assert isinstance(m, _BatchNorm) |
|
model.train() |
|
|
|
imgs = torch.randn(1, 3, 64, 64) |
|
feat = model(imgs) |
|
assert len(feat) == 5 |
|
assert feat[0].shape == torch.Size((1, 8, 32, 32)) |
|
assert feat[1].shape == torch.Size((1, 16, 16, 16)) |
|
assert feat[2].shape == torch.Size((1, 32, 8, 8)) |
|
assert feat[3].shape == torch.Size((1, 64, 4, 4)) |
|
assert feat[4].shape == torch.Size((1, 128, 2, 2)) |
|
|
|
|
|
arch_ovewrite = [[32, 56, 3, True, False], [56, 224, 2, True, False], |
|
[224, 512, 1, True, False]] |
|
model = CSPDarknet( |
|
arch_ovewrite=arch_ovewrite, |
|
widen_factor=0.25, |
|
out_indices=(0, 1, 2, 3)) |
|
model.train() |
|
|
|
imgs = torch.randn(1, 3, 32, 32) |
|
feat = model(imgs) |
|
assert len(feat) == 4 |
|
assert feat[0].shape == torch.Size((1, 8, 16, 16)) |
|
assert feat[1].shape == torch.Size((1, 14, 8, 8)) |
|
assert feat[2].shape == torch.Size((1, 56, 4, 4)) |
|
assert feat[3].shape == torch.Size((1, 128, 2, 2)) |
|
|