|
|
|
import os.path as osp |
|
import tempfile |
|
from unittest import TestCase |
|
|
|
import mmcv |
|
import mmengine |
|
import numpy as np |
|
from mmengine.utils import is_list_of |
|
from parameterized import parameterized |
|
|
|
from mmdet3d.apis import MonoDet3DInferencer |
|
from mmdet3d.structures import Det3DDataSample |
|
|
|
|
|
class TestMonoDet3DInferencer(TestCase): |
|
|
|
def test_init(self): |
|
|
|
MonoDet3DInferencer('pgd_kitti') |
|
|
|
MonoDet3DInferencer( |
|
'configs/pgd/pgd_r101-caffe_fpn_head-gn_4xb3-4x_kitti-mono3d.py', |
|
'https://download.openmmlab.com/mmdetection3d/v1.0.0_models/pgd/' |
|
'pgd_r101_caffe_fpn_gn-head_3x4_4x_kitti-mono3d/' |
|
'pgd_r101_caffe_fpn_gn-head_3x4_4x_kitti-mono3d_' |
|
'20211022_102608-8a97533b.pth') |
|
|
|
def assert_predictions_equal(self, preds1, preds2): |
|
for pred1, pred2 in zip(preds1, preds2): |
|
if 'bboxes_3d' in pred1: |
|
self.assertTrue( |
|
np.allclose(pred1['bboxes_3d'], pred2['bboxes_3d'], 0.1)) |
|
if 'scores_3d' in pred1: |
|
self.assertTrue( |
|
np.allclose(pred1['scores_3d'], pred2['scores_3d'], 0.1)) |
|
if 'labels_3d' in pred1: |
|
self.assertTrue( |
|
np.allclose(pred1['labels_3d'], pred2['labels_3d'])) |
|
|
|
@parameterized.expand(['pgd_kitti']) |
|
def test_call(self, model): |
|
|
|
img_path = 'demo/data/kitti/000008.png' |
|
infos_path = 'demo/data/kitti/000008.pkl' |
|
inferencer = MonoDet3DInferencer(model) |
|
inputs = dict(img=img_path, infos=infos_path) |
|
res_path = inferencer(inputs, return_vis=True) |
|
|
|
img = mmcv.imread(img_path) |
|
inputs = dict(img=img, infos=infos_path) |
|
res_ndarray = inferencer(inputs, return_vis=True) |
|
self.assert_predictions_equal(res_path['predictions'], |
|
res_ndarray['predictions']) |
|
self.assertIn('visualization', res_path) |
|
self.assertIn('visualization', res_ndarray) |
|
|
|
|
|
inputs = [ |
|
dict( |
|
img='demo/data/kitti/000008.png', |
|
infos='demo/data/kitti/000008.pkl'), |
|
dict( |
|
img='demo/data/kitti/000008.png', |
|
infos='demo/data/kitti/000008.pkl') |
|
] |
|
res_path = inferencer(inputs, return_vis=True) |
|
|
|
imgs = [mmcv.imread(p['img']) for p in inputs] |
|
inputs = [ |
|
dict(img=imgs[0], infos='demo/data/kitti/000008.pkl'), |
|
dict(img=imgs[1], infos='demo/data/kitti/000008.pkl') |
|
] |
|
res_ndarray = inferencer(inputs, return_vis=True) |
|
self.assert_predictions_equal(res_path['predictions'], |
|
res_ndarray['predictions']) |
|
self.assertIn('visualization', res_path) |
|
self.assertIn('visualization', res_ndarray) |
|
|
|
@parameterized.expand(['pgd_kitti']) |
|
def test_visualize(self, model): |
|
inputs = dict( |
|
img='demo/data/kitti/000008.png', |
|
infos='demo/data/kitti/000008.pkl') |
|
inferencer = MonoDet3DInferencer(model) |
|
|
|
with tempfile.TemporaryDirectory() as tmp_dir: |
|
inferencer(inputs, out_dir=tmp_dir) |
|
self.assertTrue( |
|
osp.exists(osp.join(tmp_dir, 'vis_camera/CAM2/000008.png'))) |
|
|
|
@parameterized.expand(['pgd_kitti']) |
|
def test_postprocess(self, model): |
|
|
|
img_path = 'demo/data/kitti/000008.png' |
|
infos_path = 'demo/data/kitti/000008.pkl' |
|
inputs = dict(img=img_path, infos=infos_path) |
|
inferencer = MonoDet3DInferencer(model) |
|
res = inferencer(inputs, return_datasamples=True) |
|
self.assertTrue(is_list_of(res['predictions'], Det3DDataSample)) |
|
|
|
|
|
with tempfile.TemporaryDirectory() as tmp_dir: |
|
inputs = dict(img=img_path, infos=infos_path) |
|
res = inferencer(inputs, print_result=True, out_dir=tmp_dir) |
|
dumped_res = mmengine.load( |
|
osp.join(tmp_dir, 'preds', '000008.json')) |
|
self.assertEqual(res['predictions'][0], dumped_res) |
|
|