• pvrcnn在openpcdet框架下的实现流程


    1.数据预处理

    pcdet/datasets/kitti/kitti_dataset.py下__getitem__函数

        def __getitem__(self, index):
            # index = 4
            if self._merge_all_iters_to_one_epoch:
                index = index % len(self.kitti_infos)
    
            info = copy.deepcopy(self.kitti_infos[index])
    
            sample_idx = info['point_cloud']['lidar_idx']
            img_shape = info['image']['image_shape']
            calib = self.get_calib(sample_idx)
            get_item_list = self.dataset_cfg.get('GET_ITEM_LIST', ['points'])
    
            input_dict = {
       
                'frame_id': sample_idx,
                'calib': calib,
            }
    
            if 'annos' in info:
                annos = info['annos']
                annos = common_utils.drop_info_with_name(annos, name='DontCare')
                loc, dims, rots = annos['location'], annos['dimensions'], annos['rotation_y']
                gt_names = annos['name']
                gt_boxes_camera = np.concatenate([loc, dims, rots[..., np.newaxis]], axis=1).astype(np.float32)
                gt_boxes_lidar = box_utils.boxes3d_kitti_camera_to_lidar(gt_boxes_camera, calib)
    
                input_dict.update({
       
                    'gt_names': gt_names,
                    'gt_boxes': gt_boxes_lidar
                })
                if "gt_boxes2d" in get_item_list:
                    input_dict['gt_boxes2d'] = annos["bbox"]
    
                road_plane = self.get_road_plane(sample_idx)
                if road_plane is not None:
                    input_dict['road_plane'] = road_plane
    
            if "points" in get_item_list:
                points = self.get_lidar(sample_idx)
                '''
                1.将点云数据从激光雷达坐标系转换为相机坐标系中的矩形坐标
                2.表示只保留视场(Field of View,FOV)内的点云数据,即位于相机视野中的数据
                '''
                if self.dataset_cfg.FOV_POINTS_ONLY:
                    pts_rect = calib.lidar_to_rect(points[:, 0:3])
                    fov_flag = self.get_fov_flag(pts_rect, img_shape, calib)
                    points = points[fov_flag]
                input_dict['points'] = points
    
            if "images" in get_item_list:
                input_dict['images'] = self.get_image(sample_idx)
    
            if "depth_maps" in get_item_list:
                input_dict['depth_maps'] = self.get_depth_map(sample_idx)
    
            if "calib_matricies" in get_item_list:
                input_dict["trans_lidar_to_cam"], input_dict["trans_cam_to_img"] = kitti_utils.calib_to_matricies(calib)
    
            input_dict['calib'] = calib
            
    
    此时input_dict为当前索引对应的信息,最重要的是FOV视角内的点云数据和点云形式的标注框形式
    
            data_dict = self.prepare_data(data_dict=input_dict)
    
            data_dict['image_shape'] = img_shape
            return data_dict
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68

    在这里插入图片描述

    其中prepare_data函数中对数据主要做了三个操作(yaml中配置)

    • 数据增强(真值框采样、随机全局翻转、旋转、缩放等)
    • 通道维数选择(从输入的维度中选择需要的维度作为输出,在此代码中输出维数=输入维数)
    • 数据处理(去除视野范围外的点、打乱点的顺序,将点云转换成体素)

    2.生成anchor

    pcdet/models/dense_heads/target_assigner/anchor_generator.py下的generate_anchors函数

        def generate_anchors(self, grid_sizes):
            assert len(grid_sizes) == self.num_of_anchor_sets
            # 1.初始化
            all_anchors = []
            num_anchors_per_location = []
            # 2.三个类别的先验框逐类别生成
            for grid_size, anchor_size, anchor_rotation, anchor_height, align_center in zip(
                    grid_sizes, self.anchor_sizes, self.anchor_rotations, self.anchor_heights, self.align_center):
                # 每个位置产生2个anchor,这里的2代表两个方向
                # 2.三个类别的先验框逐类别生成
                num_anchors_per_location.append(len(anchor_rotation) * len(anchor_size) * len(anchor_height))
                if align_center:
                    x_stride = (self.anchor_range[3] - self.anchor_range[0]) / grid_size[0]
                    y_stride = (self.anchor_range[4] - self.anchor_range[1]) / grid_size[1]
                    x_offset, y_offset = x_stride / 2, y_stride / 2
                else:
                    # 计算每个网格的在点云空间中的实际大小,将每个anchor映射回实际点云
                    x_stride = (self.anchor_range[3] - self.anchor_range[0]) / (grid_size[0] - 1)
                    y_stride = (self.anchor_range[4] - self.anchor_range[1
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    在家怎么做芋圆 芋圆的做法
    softmax函数计算时减去一个最大值的原因
    Docker Desktop -WSL kernel version too low
    Dilated Convolution(空洞卷积、膨胀卷积)详解
    [WUSTCTF2020]颜值成绩查询-1
    Django——路由
    shell脚本编程基础(上)
    虹科工业树莓派应用案例之在石油开采中的应用
    Postman核心功能解析-参数化和测试报告
    Zookeeper------简介与基本概念解释(一)
  • 原文地址:https://blog.csdn.net/weixin_52288941/article/details/134014851