这里是 paper
这里是 code
这是一篇来自北理工和百度合作的文章,目前还未开源,只有项目地址,2020年3月份放置在arxiv上,已经被CVPR2020接收;从标题我们猜测该文采用的时空信息将多帧的点云信息融合做3D目标检测,目前的确是没有研究是通过视频流的方式做3D目标检测,不过这也要求数据集是一些连续的帧才能使得这样一个任务的完成,但是KITTI的确是没有满足这样的要求,因此作者在Nuscence上进行的实验。这是一个CVPR19年上的公布的数据集,这里先给出一张目前在公布的nuscence的榜单,如下,这里的榜一的文章目前将SECOND的代码重构,加入了更多SOTA的方法开源了新的3D detection base,即Det 3D项目,链接为: https://github.com/poodarchu/Det3D,而MEGV则是采用了多尺度检测的head,规定了不同大小的物体的检测采用不同的head,同时采用了一种数据增广方式缓解了nuscence中的long tail问题
本文的这一章节主要运用了基于点云的检测方法的backbone和graph-based的方法,因此主要介绍这两方面内容。
整体结构图如下,可以看出主包含了空间特征编码和时空特征融合两个模块。前者是对每一帧的点云提取空间特征,后者是采用空间和时间上的注意力机制对提取到的特征序列做融合。
作者首先当前帧的前一帧点云通过GPS信息将其对应的坐标转换到当前帧来,目的是消除运动影响,使静态物体在帧间对其。然后再采用PMPnet提取空间特征和AST-GRU进行时空特征融合。
作者指出之前的提取voxel特征的方法VFE(被提出在voxelnet,其中SECOND1.0和pointpillars也都有使用)由于感受野的问题并不能完全挖掘voxel的特征(实际上后续有采用3D CNN或者稀疏卷积再次提取,相当于是做了感受野的扩大吧,只是在VFE层仅仅是对单个voxel进行了特征提取);因此这一部分则是为了来解决这样一个问题,即将非空的pillar当做节点,然后将其构建成图结构(怎么构建,距离?),作者称这种图结构有效的保留了非欧式的原始结构。(流型结构就是一个非欧式结构,因为点云扫描得到的都是表面点,可以这样理解)。
我们记通过pillar构建的图结构为 G = ( V , E ) \mathcal{G}=(\mathcal{V}, \mathcal{E}) G=(V,E),前者表示非空的pillar,后者表示的是边的特征。这里作者表示本文采用的是K-NN建图,采用周围的最近的几个pillar作为邻居节点。采用迭代的方式更新特征,我们假设一个pillar节点为 v i v_i vi,其对应是初始特征为 h i 0 h_i^0 hi0,该初始特征是通过pillar内采用PFE(简化版的pointnet)提取到, 整体运行流程为:
(3)传递完特征后,再采用二维卷积进一步提取高维语义信息。
总结一下,上述的backbone,仅仅比pointpillars多了一步信息传递,其余的两步(PFE 2DCNN)都是一样的。
如果直接采用传统的ConvGRU对上文backbone得到的特征进行融合会得到两个问题:
本文中,采用如下的公式表示使用旧memory中的状态和输入得到新memory中的状态的过程:
z t = σ ( W z ∗ X t + U z ∗ H t − 1 ) r t = σ ( W r ∗ X t + U r ∗ H t − 1 ) H ~ t = tanh ( W ∗ X t + U ∗ ( r t ∘ H t − 1 ) ) H t = ( 1 − z t ) ∘ H t − 1 + z t ∘ H ~ t \begin{array}{l} \boldsymbol{z}_{t}=\sigma\left(\boldsymbol{W}_{z} * \boldsymbol{X}_{t}+\boldsymbol{U}_{z} * \boldsymbol{H}_{t-1}\right) \\ \boldsymbol{r}_{t}=\sigma\left(\boldsymbol{W}_{r} * \boldsymbol{X}_{t}+\boldsymbol{U}_{r} * \boldsymbol{H}_{t-1}\right) \\ \tilde{\boldsymbol{H}}_{t}=\tanh \left(\boldsymbol{W} * \boldsymbol{X}_{t}+\boldsymbol{U} *\left(\boldsymbol{r}_{t} \circ \boldsymbol{H}_{t-1}\right)\right) \\ \boldsymbol{H}_{t}=\left(\boldsymbol{1}-\boldsymbol{z}_{t}\right) \circ \boldsymbol{H}_{t-1}+\boldsymbol{z}_{t} \circ \tilde{\boldsymbol{H}}_{t} \end{array} zt=σ(Wz∗Xt+Uz∗Ht−1)rt=σ(Wr∗Xt+Ur∗Ht−1)H~t=tanh(W∗Xt+U∗(rt∘Ht−1))Ht=(1−zt)∘Ht−1+zt∘H~t
其中字符表示的含义由如下的表格显示:
字符 | 含义 |
---|---|
z t z_t zt | 更新门 |
W z , W , W r , U , U z , U r W_z,W,W_r,U,U_z,U_r Wz,W,Wr,U,Uz,Ur | 2D卷积核 |
σ \sigma σ | sigmoid函数 |
r t r_t rt | 遗忘门 |
$\tilde{\boldsymbol{H}}_{t} | candidate memory |
\boldsymbol{H}_{t-1} | 上一个memory状态 |
\boldsymbol{H}_{t} | 新的memory状态 |
*,o | 卷积操作 |
配合上文的动态图,就可以比较清晰的知道本文中的GRU的运行流程了。
(2)STA 空间注意力模块
和以往的空间注意力机制类似,作者设计了对于输入的fea map的每一个像素采用一个加权的方式,如下公式:
y q = ∑ k ∈ Ω q A ( ϕ Q ( x q ) , ϕ K ( x k ) ) ∘ ϕ V ( x k ) \boldsymbol{y}_{q}=\sum_{k \in \Omega_{q}} A\left(\phi_{Q}\left(\boldsymbol{x}_{q}\right), \phi_{K}\left(\boldsymbol{x}_{k}\right)\right) \circ \phi_{V}\left(\boldsymbol{x}_{k}\right) yq=k∈Ωq∑A(ϕQ(xq),ϕK(xk))∘ϕV(xk)
其中代表的含义表示如下:
字符 | 含义 |
---|---|
x q x_q xq | feamap中的当前像素点 |
x k x_k xk | fea map中 x q x_q xq的邻域像素点 |
y q y_q yq | 空间加权后的q的像素值 |
A ( ⋅ , ⋅ ) A(\cdot, \cdot) A(⋅,⋅) | 注意力加权权重 |
ϕ K , ϕ Q , ϕ V \phi_{K}, \phi_{Q},\phi_{V} ϕK,ϕQ,ϕV | 线性层 |
也就是说,上式表示的内容是对目标pix的输出为:和邻域Pix的加权值再和邻域信息卷积。
(3)TTA 时间注意力机制
前文提到,这个模块是为了对运动的物体进行配准,作者采用的是改进的DCN结构,也就是可变型卷积结构,目的是通过融合运动信息自适应的筛选出关键支持区域。DCN简化表达为下式子:
h q ′ = ∑ m = 1 M w m ⋅ h q + p m + Δ p m \boldsymbol{h}_{q}^{\prime}=\sum_{m=1}^{M} \boldsymbol{w}_{m} \cdot \boldsymbol{h}_{q+p_{m}+\Delta p_{m}} hq′=m=1∑Mwm⋅hq+pm+Δpm
其中,下表表示字符含义:
字符 | 含义 |
---|---|
⋅ h q · h_q ⋅hq | 输入位置为 q ∈ w × h q \in w \times h q∈w×h的格点特征 |
p m p_m pm | 表示为预先定义的偏移量,九个邻域格点 p m ∈ { ( − 1 , − 1 ) , ( − 1 , 0 ) , … , ( 1 , 1 ) } p_{m} \in\{(-1,-1),(-1,0), \ldots,(1,1)\} pm∈{(−1,−1),(−1,0),…,(1,1)} |
Δ p m \Delta p_{m} Δpm | 学习到的偏移量,通过卷积层学习到的, |
w m w_m wm | 卷积核 |
如果将TTA模块中的输入和空间注意力模块中的输出带入,可以表示为:
h q ′ = ∑ m = 1 M w m ⋅ ∑ k ∈ Ω q G ( k , q + p m + Δ p m ) ⋅ ϕ v ( h k ) \boldsymbol{h}_{q}^{\prime}=\sum_{m=1}^{M} \boldsymbol{w}_{m} \cdot \sum_{k \in \Omega_{q}} G\left(k, q+p_{m}+\Delta p_{m}\right) \cdot \phi_{\mathrm{v}}\left(\boldsymbol{h}_{k}\right) hq′=m=1∑Mwm⋅k∈Ωq∑G(k,q+pm+Δpm)⋅ϕv(hk)
可以看出实际上在TTA模块中,邻域信息也是起到了非常重要的作用的,该TTA模块由偏移量 Δ p m \Delta p_{m} Δpm决定,上表格中提到这里的偏移通过卷积层学习到,表达为如下:
Δ P t − 1 = Φ R ( [ H t − 1 , H t − 1 − X t ′ ] ) ∈ R w × h × 2 r 2 \Delta \boldsymbol{P}_{t-1}=\Phi_{R}\left(\left[\boldsymbol{H}_{t-1}, \boldsymbol{H}_{t-1}-\boldsymbol{X}_{t}^{\prime}\right]\right) \in \mathbb{R}^{w \times h \times 2 r^{2}} ΔPt−1=ΦR([Ht−1,Ht−1−Xt′])∈Rw×h×2r2
这里面有:
字符 | 含义 |
---|---|
Φ R \Phi_{R} ΦR | 正则卷积层 |
[.,.] | concat |
总的来讲,该模块为了配准动态物体,采用上一次memory和本次fea map作为输入,预测了偏移值 Δ P t − 1 \Delta \boldsymbol{P}_{t-1} ΔPt−1,和下一个的menory特征结合出得到新的输入。
和以往的lidar-based的方法一样,不多介绍。
这其中采用的卷积核大小都是3×3的,除非是用1×1卷积代替全连接的形式。
该结构的输入是经过AST-GRU迭代到最后的menory feature,loss函数和其他的lidar-based的方法一致,采用的是L1 loss和focal loss.
作者在nuscenes数据集上进行了测试,
Nuscene数据集简单介绍:这个数据采集是由6个摄像头,1个LIDAR,5个RADAR,GPS,IMU采集得到,与KITTI相比,nuScenes包含7倍以上的对象注释。
重要信息:
(1)以2Hz对同步良好的关键帧(图像,激光雷达,雷达)进行采样,并将它们发送到我们的注释软件Scale进行注释。
(2)nuScenes数据集中的所有对象都带有语义类别,以及它们出现的每个帧的3D边界框和属性。
(3)一共有23个对象
更多细节大家可以去官网上的文档细细研究,这里不做过多介绍。
本文采用在nuscenes而不在KIITTI上进行实验的原因正是KITTI并不提供3D video.
如下图,对于nuscenes的10类目标检测得到的结果如下,可以看出效在大部分物体上都是达到的sota的
下图展示了在pointpillars的基础上添加本文提出的模块后的性能提升,最后的指标不仅仅是检测的IOU值,还和很多其他指标加权得到的结果,在官网中有介绍。
[1]Delving deeper into convolutional networks for learning video representations
[2] Fast point r-cnn
[3] graph convolutional networks: Semisupervised learning via gaussian processes
[4]Deep hough voting for 3d object detection in point clouds