|
|
|
import os |
|
import os.path as osp |
|
import tempfile |
|
from unittest import TestCase |
|
|
|
import mmengine |
|
import numpy as np |
|
import pytest |
|
import torch |
|
from mmengine.utils import is_list_of |
|
|
|
from mmdet3d.apis import LidarSeg3DInferencer |
|
from mmdet3d.structures import Det3DDataSample |
|
|
|
|
|
class TestLiDARSeg3DInferencer(TestCase): |
|
|
|
def setUp(self): |
|
|
|
self.inferencer = LidarSeg3DInferencer('pointnet2-ssg_s3dis-seg') |
|
|
|
def test_init(self): |
|
|
|
LidarSeg3DInferencer('pointnet2-ssg_s3dis-seg') |
|
|
|
LidarSeg3DInferencer( |
|
'configs/pointnet2/pointnet2_ssg_2xb16-cosine-50e_s3dis-seg.py', |
|
'https://download.openmmlab.com/mmdetection3d/v0.1.0_models/pointnet2/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class/pointnet2_ssg_16x2_cosine_50e_s3dis_seg-3d-13class_20210514_144205-995d0119.pth' |
|
) |
|
|
|
def assert_predictions_equal(self, preds1, preds2): |
|
for pred1, pred2 in zip(preds1, preds2): |
|
self.assertTrue( |
|
np.allclose(pred1['pts_semantic_mask'], |
|
pred2['pts_semantic_mask'])) |
|
|
|
@pytest.mark.skipif( |
|
not torch.cuda.is_available(), reason='requires CUDA support') |
|
@pytest.mark.skipif( |
|
'DISPLAY' not in os.environ, reason='requires DISPLAY device') |
|
def test_call(self): |
|
|
|
inputs = dict(points='tests/data/s3dis/points/Area_1_office_2.bin') |
|
torch.manual_seed(0) |
|
res_path = self.inferencer(inputs, return_vis=True) |
|
|
|
pts_bytes = mmengine.fileio.get(inputs['points']) |
|
points = np.frombuffer(pts_bytes, dtype=np.float32) |
|
points = points.reshape(-1, 6) |
|
inputs = dict(points=points) |
|
torch.manual_seed(0) |
|
res_ndarray = self.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(points='tests/data/s3dis/points/Area_1_office_2.bin'), |
|
dict(points='tests/data/s3dis/points/Area_1_office_2.bin') |
|
] |
|
torch.manual_seed(0) |
|
res_path = self.inferencer(inputs, return_vis=True) |
|
|
|
all_points = [] |
|
for p in inputs: |
|
pts_bytes = mmengine.fileio.get(p['points']) |
|
points = np.frombuffer(pts_bytes, dtype=np.float32) |
|
points = points.reshape(-1, 6) |
|
all_points.append(dict(points=points)) |
|
torch.manual_seed(0) |
|
res_ndarray = self.inferencer(all_points, return_vis=True) |
|
self.assert_predictions_equal(res_path['predictions'], |
|
res_ndarray['predictions']) |
|
self.assertIn('visualization', res_path) |
|
self.assertIn('visualization', res_ndarray) |
|
|
|
|
|
pc_dir = dict(points='tests/data/s3dis/points/') |
|
res_bs2 = self.inferencer(pc_dir, batch_size=2, return_vis=True) |
|
self.assertIn('visualization', res_bs2) |
|
self.assertIn('predictions', res_bs2) |
|
|
|
@pytest.mark.skipif( |
|
not torch.cuda.is_available(), reason='requires CUDA support') |
|
@pytest.mark.skipif( |
|
'DISPLAY' not in os.environ, reason='requires DISPLAY device') |
|
def test_visualizer(self): |
|
inputs = dict(points='tests/data/s3dis/points/Area_1_office_2.bin') |
|
|
|
with tempfile.TemporaryDirectory() as tmp_dir: |
|
self.inferencer(inputs, out_dir=tmp_dir) |
|
|
|
def test_post_processor(self): |
|
if not torch.cuda.is_available(): |
|
return |
|
|
|
inputs = dict(points='tests/data/s3dis/points/Area_1_office_2.bin') |
|
res = self.inferencer(inputs, return_datasamples=True) |
|
self.assertTrue(is_list_of(res['predictions'], Det3DDataSample)) |
|
|
|
|
|
with tempfile.TemporaryDirectory() as tmp_dir: |
|
res = self.inferencer(inputs, print_result=True, out_dir=tmp_dir) |
|
dumped_res = mmengine.load( |
|
osp.join(tmp_dir, 'preds', 'Area_1_office_2.json')) |
|
self.assertEqual(res['predictions'][0], dumped_res) |
|
|