当前位置:网站首页>3D detection: fast visualization of 3D box and point cloud

3D detection: fast visualization of 3D box and point cloud

2022-07-07 13:55:00 Roast zongzi

3D testing , be used for 3D box, Quick visualization of point cloud , auxiliary debug And analysis :
(Nuscenes,mmdet3d,OpenPCDet And so on )

Be careful : The code is applicable to a variety of models , But notice BEVDet Series and FCOS3D(front View) Choose different series box transformation .

3D box Projection to bev visualization :

import matplotlib.pyplot as plt
import torch

def box3d2x0y0wh(boxes_3d):
	# BEVDet/CenterPoints
    import numpy as np
    n = boxes_3d.shape[0]
    box2d = np.zeros((n,4))
    # 3dbox --> xywh
    box2d[:,:2] = boxes_3d[:,:2]
    box2d[:,2] = boxes_3d[:,3]
    box2d[:,3] = boxes_3d[:,4] # 2xywh
    # 
    # xyxy = np.ones_like(box2d)
    box2d[:,0] = box2d[:, 0] - box2d[:, 2] / 2 
    box2d[:,1] = box2d[:, 1] + box2d[:, 3] / 2 # NOTE:  Lower left corner 
    
    return box2d

def box3d2x0y0wh_2(boxes_3d):
    # FCOS3D: front view--> BEV
    import numpy as np
    n = boxes_3d.shape[0]
    box2d = np.zeros((n,4))
    # 3dbox --> xywh  Lower left corner 
    box2d[:, 0] = boxes_3d[:, 0]
    box2d[:, 1] = boxes_3d[:, 2]
    box2d[:, 2] = boxes_3d[:, 4]
    box2d[:, 3] = boxes_3d[:, 5] # 2xywh
    # 
    # xyxy = np.ones_like(box2d)
    box2d[:,0] = box2d[:, 0] - box2d[:, 2] / 2 
    box2d[:,1] = box2d[:, 1] + box2d[:, 3] / 2 # NOTE
    
    return box2d

#  Drawing according to coordinates 
def draw_boxes(pred_boxes_3d, target_boxes_3d, path):
    # pred_boxes xywh
    
    import matplotlib.pyplot as plt
    import matplotlib.patches as patches
    
    pred_boxes = box3d2x0y0wh(pred_boxes_3d)
    target_boxes = box3d2x0y0wh(target_boxes_3d)

    fig, ax = plt.subplots()
    ax.plot()
    # ax.add_patch(patches.Rectangle((1, 1),0.5,0.5,edgecolor = 'blue',facecolor = 'red',fill=True) )
    
    #
    for index, coord in enumerate(pred_boxes):
        rect = patches.Rectangle((coord[0], coord[1]), coord[2], coord[3], 
        						linewidth=1, edgecolor='r',facecolor='none')
        ax.add_patch(rect)
    for index, coord in enumerate(target_boxes):
        rect = patches.Rectangle((coord[0], coord[1]), coord[2], coord[3], 
        						linewidth=1, edgecolor='g',facecolor='none')
        ax.add_patch(rect)
    
    # plt.legend(loc='best',edgecolor='g')
	if os.path.exists(path):
        os.remove(path)
    fig.savefig(path, dpi=90, bbox_inches='tight')
    # print(0)
    plt.close(fig)
    print('Successfully saved')

Quick visualization of point cloud :

def draw_pts(points, save_path, show=False):
    ''' points: [N,3+c] '''
    assert len(points.shape) == 2
    if isinstance(points, torch.Tensor):
        points = points.cpu().numpy()

    points = points.copy()

    fig = plt.figure()
    ax = fig.add_subplot(111, projection='3d')
    # point_range = range(0, points.shape[0], skip) # skip points to prevent crash
    point_range = range(0, points.shape[0])
    ax.scatter(points[point_range, 0],   # x
            points[point_range, 1],   # y
            points[point_range, 2],   # z
            c=points[point_range, 2], # height data for color
            cmap=plt.get_cmap("Spectral"),
            marker="x")
    ax.axis('auto')  # {equal, scaled}
    if show:
        plt.show()

    if save_path is not None:
        fig.savefig(save_path, dpi=90, bbox_inches='tight')
    plt.close(fig)
原网站

版权声明
本文为[Roast zongzi]所创,转载请带上原文链接,感谢
https://yzsam.com/2022/188/202207071156193464.html