giantmonkeyTC
2344
34d1f8b
# Copyright (c) OpenMMLab. All rights reserved.
from unittest import TestCase
import pytest
import torch
from mmdet3d import * # noqa
from mmdet3d.models.dense_heads import ImVoxelHead
from mmdet3d.testing import create_detector_inputs
class TestImVoxelHead(TestCase):
def test_imvoxel_head_loss(self):
"""Test imvoxel head loss when truth is empty and non-empty."""
if not torch.cuda.is_available():
pytest.skip('test requires GPU and torch+cuda')
# build head
prior_generator = dict(
type='AlignedAnchor3DRangeGenerator',
ranges=[[-3.2, -0.2, -2.28, 3.2, 6.2, 0.28]],
rotations=[.0])
imvoxel_head = ImVoxelHead(
n_classes=1,
n_levels=1,
n_channels=32,
n_reg_outs=7,
pts_assign_threshold=27,
pts_center_threshold=18,
prior_generator=prior_generator,
center_loss=dict(type='mmdet.CrossEntropyLoss', use_sigmoid=True),
bbox_loss=dict(type='RotatedIoU3DLoss'),
cls_loss=dict(type='mmdet.FocalLoss'),
)
imvoxel_head = imvoxel_head.cuda()
# fake input of head
# (x, valid_preds)
x = [
torch.randn(1, 32, 10, 10, 4).cuda(),
torch.ones(1, 1, 10, 10, 4).cuda()
]
# fake annotation
num_gt_instance = 1
packed_inputs = create_detector_inputs(
with_points=False,
with_img=True,
img_size=(128, 128),
num_gt_instance=num_gt_instance,
with_pts_semantic_mask=False,
with_pts_instance_mask=False)
data_samples = [
sample.cuda() for sample in packed_inputs['data_samples']
]
losses = imvoxel_head.loss(x, data_samples)
print(losses)
self.assertGreaterEqual(losses['center_loss'], 0)
self.assertGreaterEqual(losses['bbox_loss'], 0)
self.assertGreaterEqual(losses['cls_loss'], 0)