0. 简介
之前我们专门对bevformer系列的代码进行了介绍。其实bevformer作为这一系列比较关键的工作。也为了我们后续看这些端到端的文章非常有帮助。我们最近这一系列将会围绕SurroundOcc这一篇三维占用预测的工作。目前二维转三维主要有两条线:LSS是一个back-projection(直方图反向投射)的工作,这里主要完成了深度估计,是从2D到3D,而bevformer则是一个projection(投影算法),里面主要完成了一个深度转换,即3D到2D。OCC这一体系一脉相承,我们后面来详细对比一下BEVFormer以及具体实现流程和代码。
1. 基础理解
对于SurroundOcc,我们其实可以理解其将整个空间分成一个Voxel的合集。每个Voxel可以分为被占用和未占用的。同时也可以对被占用的Voxel来划分出。我们可以使用
python visual.py ~/data/surroundocc/nuscenes_occ/sample/n0*.npy
来看到会给出一个occ的真值,这个图片中的尺度是20020016的尺度。这里未占用的类别是不会在界面中显示出来的。
下面是SurroundOcc的整体流程。我们可以看到输入的也是6v的针孔摄像头信息。然后相较于bevformer而言,其更加简化,并同时提出了一个pipeline,针对稀疏的雷达点云生成稠密的占用栅格信息。来提供给训练3D OCC的占用真值。相关的代码位置是在:surroundocc/SurroundOcc/tools/generate_occupancy_nuscenes/generate_occupancy_nuscenes.py
2. 理解 builder
2.1 、程序结构概览
本文旨在解析 mmdetection
中模型构建的过程,特别是 train.py
中的模型构建部分。模型的构建通过以下函数调用实现:
model = build_detector(
cfg.model, train_cfg=cfg.train_cfg, test_cfg=cfg.test_cfg)
该函数有三个主要参数,分别对应模型的配置文件、训练配置文件和测试配置文件。以 faster_rcnn_r50_fpn_1x.py
为例,这些参数的解析如下:
-
cfg.model:
{ 'type': 'FasterRCNN', 'pretrained': 'modelzoo://resnet50', 'backbone': { 'type': 'ResNet', 'depth': 50, 'num_stages': 4, 'out_indices': (0, 1, 2, 3), 'frozen_stages': 1, 'style': 'pytorch' }, 'neck': { 'type': 'FPN', 'in_channels': [256, 512, 1024, 2048], 'out_channels': 256, 'num_outs': 5 }, 'rpn_head': { 'type': 'RPNHead', 'in_channels': 256, 'feat_channels': 256, 'anchor_scales': [8], 'anchor_ratios': [0.5, 1.0, 2.0], 'anchor_strides': [4, 8, 16, 32, 64], 'target_means': [0.0, 0.0, 0.0, 0.0], 'target_stds': [1.0, 1.0, 1.0, 1.0], 'use_sigmoid_cls': True }, 'bbox_roi_extractor': { 'type': 'SingleRoIExtractor', 'roi_layer': { 'type': 'RoIAlign', 'out_size': 7, 'sample_num': 2}, 'out_channels': 256, 'featmap_strides': [4, 8, 16, 32] }, 'bbox_head': { 'type': 'SharedFCBBoxHead', 'num_fcs': 2, 'in_channels': 256, 'fc_out_channels': 1024, 'roi_feat_size': 7, 'num_classes': 81, 'target_means': [0.0, 0.0, 0.0, 0.0], 'target_stds': [0.1, 0.1, 0.2, 0.2], 'reg_class_agnostic': False } }
-
train_cfg:
{ 'rpn':