点云_OpenPcdet_框架和使用

目标检框架-模型和数据

 01.框架
   2D目标检测是一个比较成熟的领域,相关的目标检测框架非常多,比如Detection2,MMDetection等
   3D目标检测框架主要 :OpenPCDet, mmdetection3d, Det3D, Paddle3D
        OpenPCDet 主要聚焦在基于点云的 3D 目标检测
        Paddle3D是最近(2022年8月)才推出来的3D目标检测框架,目前 有基础的数据集(KITTI,NuScenes和SemanticKITTI)和模型(pointpillars和centerpoint)
 02.模型: VoxelNet,SECOND,CBGS ,Point Pillars,PIXOR,PointNet++,Point RCNN等目标检测模型
 03.数据集:KITTI、NuScene、Lyft、Waymo、PandaSet

点云感知

点云数据集(KITTI、NuScene、Lyft、Waymo、PandaSet等)
点云感知算法(point-based、 voxel-based、one-stage/two-stage等)
PCDet是一种用于点云3D对象感知的基于pytorch的代码。
定制化
  新增数据集: dataloade
       self._getitem_() 中加载自己的数据-送入数据基类提供的 self.prepare_data();	
       self.generate_prediction_dicts()	
  数据预处理		   
     data_augmentor与data_processor两个基类可灵活添加、删除各种数据增强与预处理操作
  模型-组合、改进旧模型+支持新的模型
	   PCDet框架中实现其所特有的模块来替换掉原有模块,并修改响应模型配置文件

1.OpenPCDet环境

基础环境
代码下载和python setup.py develop

2. 从官方下载,想要测试的网络模型

3.运行代码

  python demo.py --cfg_file cfgs/kitti_models/pv_rcnn.yaml \
  --ckpt pv_rcnn_8369.pth \
  --data_path ../data/kitti/testing/velodyne/000008.bin 

4.demo代码改造示例 demo.py

import os
import json
import datetime
import argparse
import glob
from pathlib import Path
import numpy as np
import torch
from pcdet.config import cfg, cfg_from_yaml_file
from pcdet.datasets import DatasetTemplate
from pcdet.models import build_network, load_data_to_gpu
from pcdet.utils import common_utils


class DemoDataset(DatasetTemplate):
    def __init__(self, dataset_cfg, class_names, training=True, root_path=None, logger=None, ext='.bin'):
        """
        Args:
            root_path: 根目录
            dataset_cfg:  数据集配置
            class_names: 类别名称
            training: 训练模式
            logger: 日志
        """
        super().__init__(
            dataset_cfg=dataset_cfg, class_names=class_names, training=training, root_path=root_path, logger=logger
        )
        self.root_path = root_path
        self.ext = ext
        data_file_list = glob.glob(str(root_path / f'*{self.ext}')) if self.root_path.is_dir() else [self.root_path]

        data_file_list.sort()
        self.sample_file_list = data_file_list

    def __len__(self):
        return len(self.sample_file_list)

    def __getitem__(self, index):
        if self.ext == '.bin':
            points = np.fromfile(self.sample_file_list[index], dtype=np.float32).reshape(-1, 4)
        elif self.ext == '.npy':
            points = np.load(self.sample_file_list[index])
        else:
            raise NotImplementedError

        input_dict = {
            'points': points,
            'frame_id': index,
        }

        data_dict = self.prepare_data(data_dict=input_dict)
        return data_dict


def parse_config():
    parser = argparse.ArgumentParser(description='arg parser')
    parser.add_argument('--cfg_file', type=str, default='cfgs/kitti_models/second.yaml',
                        help='specify the config for demo')
    parser.add_argument('--data_path', type=str, default='demo_data',
                        help='specify the point cloud data file or directory')
    parser.add_argument('--ckpt', type=str, default=None, help='specify the pretrained model')
    parser.add_argument('--ext', type=str, default='.bin', help='specify the extension of your point cloud data file')

    args = parser.parse_args()

    cfg_from_yaml_file(args.cfg_file, cfg)

    return args, cfg


def main():
    args, cfg = parse_config()
	# 创建日志
    logger = common_utils.create_logger()
    logger.info('-----------------Quick Demo of OpenPCDet-------------------------')
    demo_dataset = DemoDataset(
        dataset_cfg=cfg.DATA_CONFIG, class_names=cfg.CLASS_NAMES, training=False,
        root_path=Path(args.data_path), ext=args.ext, logger=logger
    )
    logger.info(f'Total number of samples: \t{len(demo_dataset)}')

    model = build_network(model_cfg=cfg.MODEL, num_class=len(cfg.CLASS_NAMES), dataset=demo_dataset)
	# 加载权重文件
    model.load_params_from_file(filename=args.ckpt, logger=logger, to_cpu=True)
	# 将网络放到GPU上
    model.cuda()
	# 开启评估模式
    model.eval()
    with torch.no_grad():
        for idx, data_dict in enumerate(demo_dataset):
            logger.info(f'Visualized sample index: \t{idx + 1}')
            data_dict = demo_dataset.collate_batch([data_dict])
            load_data_to_gpu(data_dict)
            pred_dicts, _ = model.forward(data_dict)
            points=data_dict['points'][:, 1:]
		ref_boxes=pred_dicts[0]['pred_boxes'],
            ref_scores=pred_dicts[0]['pred_scores']
		ref_labels=pred_dicts[0]['pred_labels']	
		points = points.cpu().numpy()
            boxes = ref_boxes.cpu().numpy()
            labels = ref_labels.cpu().numpy()
		scores = ref_scores.cpu().numpy()
		boxes_with_label = np.c_[boxes, labels.T]
            np.savetxt("./pred.txt",boxes_with_label)

    logger.info('Demo done.')


if __name__ == '__main__':
    main()

OpenPCDet 训练的Pipeline

 1.生成 kitti infos	--》 生成训练数据的字典,保证使用时高效加载。
 2.定义 Dataset 及 创建 DataLoader	
 3.加载Model 并训练	 

6.说明

 接下来 
   01. OpenPCDet训练篇--自定义数据集
   自定义数据集需要重载3个方法:
      __init__
      __len__: 数据集的长度
      __getitem__:取一个样本
   
   
   02.自定义模型结构

参考

 open-mmlab/OpenPCDet   https://github.com/open-mmlab/OpenPCDet
 3D目标检测(4):OpenPCDet训练篇--自定义数据集 https://zhuanlan.zhihu.com/p/407302009
posted @ 2022-11-10 17:54  辰令  阅读(1384)  评论(0编辑  收藏  举报