avod论文理解与代码解读

论文简析

参考文章:
csdn

代码:
代码
文献:
论文

概述

这篇论文的特点是多数据融合。自动驾驶领域对安全性的要求更加严格,这对检测的准确性要求很高。多数据的融合提供了更多的信息,相对的检测能力更好一些。avod网络以雷达点云数据生成BEV map和image作为输入,经过特征提取成两个相应的feature map,通过anchor的映射融合两个特征图,经过rpn网络产生non-oriented region proposals,(事实上rpn网络只对class和bounding box进行回归)
将这些proposals送入子网络second stage detector network产生精确的有方向的3D bounding boxs,完成3D物体的检测。网络结构如下:
avod 网络结构图

网络结构

BEV map

将点云数据处理成6channel BEV map.在水平面上分辨率为0.1,选取[-40, 40]x[0, 70]范围的点处理成700x800的BEV map.在竖直方向上选取[0, 2.5]平分为五段,这样就将点云数据划分成700x800x5的体素。然后在每个体素中提取高度信息,在整体的700x800的图上提取整体密度信息。最终构成700x800x6的BEV map.但是感觉所提特征不明显,对结果有很大的影响。
如图:
BEV map

特征提取

avod 为了提高小目标物体的检测准确率,采用FPN的想法,得到全分辨的feature map送入rpn网络。如图:
fpn 特征提取网络

rpn 网络

1.anchors以6参数形式表示。(tx, ty, tz)表示中心点,(dx, dy, dz)表示三个轴的尺寸。在BEV上以0.5米的间距采样(tx, ty), tz由传感器与地面间的距离等因素决定。anchors的大小由训练样本数据而得(怎么确定暂时没看,应该类似最近邻的方式统计出来的吧,也可以自己设定一个固定预设值,类似faster rcnn)。  
2.rpn的loss计算分为两部分:
类别loss: 采用交叉熵loss.
box regression loss: 采用smooth L1 loss.
3.在BEV上通过判定anchors与ground truth的IoU分辨object/background,在BEV上采用2D NMS将top k proposals 送入第二阶段检测网络。

特征融合

每个3D anchor投影到BEV以及image获得两个roi,每个roi进行resized to 3x3然后进行像素级别的特征融合。

第二阶段检测网络

全连接层得到类别,bounding box,方向的回归。

box 编码

本文采用4corner + 2 height offset方式编码,利用3D举行框顶点对齐的几何限制减少参数并利用物体与ground plane的偏移,得到更精确的定位。回归形式是( ∆x1…∆x4,∆y1…∆y4, ∆h1, ∆h2)。实现中的ground plane参数为4个系数,ax+by+cz+d=0确定的平面。box表示形式如图:box 表示方式

方向确定

avod采用regressed orientation vector以及计算(cos(ry),sin(ry)),可以由BEV平面的唯一单位向量表示。每个bounding box有四个可能的朝向,选取离regressed orientation vector最近的朝向。

代码解读

anchor 的产生

根据得到的cluster的每个尺寸产生两个方向的anchor。最终的anchor数量计算为70x80/0.5/0.5x(num_cluster)*2.源码中num_cluster为2,这样anchor的总数量为89600个。即每幅图产生89600个anchor。
在这里插入图片描述
在这里插入图片描述

mini batch的产生与作用

gen_mini_batches.py 会利用生成的anchors与gt来生成最终输入网络的信息。开始生成的anchors总共有89600,去除掉空的anchors,大约在8k到15k之间。然后用剩下的这些anchors与gt计算iou,最终iou大于0的大约150(只有一个gt的大致结果)。这个结果与论文不符,不知道自己哪理解的有问题。附上论文介绍:
在这里插入图片描述
最终产生的文件在文件夹mini_batches中。具体信息为:
shape:(N, 9)
index:对应的每幁图片的name, 例如:000000 或是0(记不太清了)
iou: anchors 与gt的iou.
offset(6个): anchor与gt的共同结果,计算公式如下:
t_x_gt = (x_gt - x_anch)/dim_x_anch
t_y_gt = (y_gt - y_anch)/dim_y_anch
t_z_gt = (z_gt - z_anch)/dim_z_anch
t_dx_gt = log(dim_x_gt/dim_x_anch)
t_dy_gt = log(dim_y_gt/dim_y_anch)
t_dz_gt = log(dim_z_gt/dim_z_anch)
class_index:每种object类别对应的数值,例如 car:1
另外:这个过程中可以设置类别,难度等的设置。这样数据的好坏有个分类,这样比较更加细致一些。

rpn model

这个网络主要是利用数据预处理的anchors与label进行粗预测,检测出rois.这些rois很可能是需要检测的区域。这一块利用了anchor来进行点云与图像数据的融合。生成的rois用于下一阶段的融合与检测。

avod model

利用rpn_model生成的rois来进行数据融合与检测。

loss

包括定位,类别,方向预测。

不足

1.我觉得这篇论文对点云的处理不够细致,提取的特征不足。
2.整体的网络也很平常,没有对与小物体的优化处理,网络结构可以更加丰富一些。
3.loss可以更优化一些。

原文地址:https://www.cnblogs.com/o-v-o/p/9975374.html