(一) Title
前言: 本文没有开源,但是最近我有实现一个基于Transformer的Detector的想法,因此还是决定看下这个论文,然后再基于DETR构建一个基于Transformer的旋转框目标检测方法,怎么说呢?公式里的每一个符号我都能看懂,但是合到一起就看不懂了,而且看完这个论文的感受很不好,有太多疑问了,希望之后能够开源代码吧。
论文地址:https://arxiv.org/abs/2106.03146
代码地址:没开源
(二) Summary
背景
DETR相比于传统的detectors(Faster R-CNN)这些有了competitive的表现,但是基于其他问题的研究还比较少,本文选定了旋转框目标检测的问题来看DETR的表现效果。
本文的主要工作
- 提供了解决旋转框目标检测的一个新方法,不需要使用rotated anchors
- 构建了一个更加高效地encoder,使用Depthwise Separable Convolution替代注意力机制,从而实现来实现减小内存和计算消耗,需要看下性能上的变化
- 成为旋转框目标检测中的一个新的benchmark,本文的SOTA是fine-tune the head mounted on O2DETR通过一个级联的module来提升性能。
(三) Problem Statement
目前在旋转框目标检测任务上,基于不带角度旋转的anchors回归存在问题(主要由于在航空DOTA数据集上旋转框又小,带有角度倾斜,并且很密集),使用预设旋转anchors的方法在旋转框的回归以及使用NMS的后处理上计算很复杂,目前已有的基于anchor-free的旋转框算法使用heatmap来预测中心点位置,但是密集场景下,heatmap预测的能力是比较有限的(注:这里是博主自己从heatmap的原理上分析的,不一定正确)
本文整体思路:作者在本文中看到了DETR在目标检测任务中的应用,并进行扩展,增加了angle维度的信息来进行旋转框目标的预测,最终通过bipartite matching实现object queries同GTs的one-by-one匹配。对应的整体框架如下所示
此外在DOTA数据集中的一个明显的问题是不同类别之间的scale差别很大,非常有必要引入多尺度的feature map,然而对于多尺度特征来说,transformer的注意力机制计算量很大,作者指出注意力机制带来的是global reasoning的能力,而全局推理实际上是没有必要的,因为同一类别的对象总是聚集在一起,往往只跟周边的视觉特征关联交互,而不是全局图像的视觉特征,这里地方存疑。因此作者使用depthwise separable convolutions代替Transformer中的self-attention mechanism,减少计算量并实现快速收敛。
(四) Research Object
本文基于DETR引入了角度,同时将boxes预测看成是set prediction问题,使用depthwise convolution来替换Transformer中的self-attention。
(五) Method
本文的主要工作为:
- 使用separable depthwise convolution替代attention机制实现一个更加高效的Transformer 这里我有一个想法,使用MAE来训练这个编码器,然后给看看效果可不可
5.1 Depthwise Separable Convolution and Attention
这里需要解决的问题是:怎么将原先的Attention使用Depthwise Separable Convolution来替换?需要回顾下Depthwise的原理,以及关注这里的替换方式
首先就是Depthwise Separable Convolution方式
标准卷积的运算方式为:
Conv ( W , y ) ( i , j ) = ∑ k , l , c K , L , C W ( k , l , c ) ⋅ y ( i + k , j + l , c ) \operatorname{Conv}(W, y)_{(i, j)}=\sum_{k, l, c}^{K, L, C} W_{(k, l, c)} \cdot y_{(i+k, j+l, c)} Conv(W,y)(i,j)=k,l,c∑K,L,CW(k,l,c)⋅y(i+k,j+l,c)
其中 K , L K,L K,L表示卷积核的size,也就是卷积核的长宽,应该是为了不使用W,H,然后 C C C表示Channel数。
Depthwise separable convolution(DSConv)表示成:
DepthwiseConv ( W , y ) ( i , j ) = ∑ k , l K , L W ( k , l ) ⊙ y ( i + k , j + l ) , PointwiseConv ( W , y ) ( i , j ) = ∑ c C W c ⋅ y ( i , j , c ) , DSConv ( W p , W d , y ) ( i , j ) = PointwiseConv ( i , j ) ( W p , Depthwise Conv ( i , j ) ( W d , y ) ) \begin{aligned} \text { DepthwiseConv }(W, y)_{(i, j)} &=\sum_{k, l}^{K, L} W_{(k, l)} \odot y_{(i+k, j+l)}, \\ \text { PointwiseConv }(W, y)_{(i, j)} &=\sum_{c}^{C} W_{c} \cdot y_{(i, j, c)}, \\ \text {DSConv}\left(W_{p}, W_{d}, y\right)_{(i, j)} &= \text { PointwiseConv }_{(i, j)}\left(W_{p}, \text { Depthwise Conv }_{(i, j)}\left(W_{d}, y\right)\right) \end{aligned} DepthwiseConv (W,y)(i,j) PointwiseConv (W,y)(i,j)DSConv(Wp,Wd,y)(i,j)=k,l∑K,LW(k,l)⊙y(i+k,j+l),=c∑CWc⋅y(i,j,c),= PointwiseConv (i,j)(Wp, Depthwise Conv (i,j)(Wd,y))
其中 ⊙ \odot ⊙表示element-wise product,跟上面的点没啥区别啊,这里Depthwise卷积的通道数同输入feature map的通道数相同,但是不再通道上进行加和,Pointwise卷积跟正常卷积相同,只不过这里使用的是 1 × 1 1\times1 1×1大小的卷积核,这里的符号有点儿混乱,下面结合知乎上的图示来进行说明:Depthwise Separable Convolutions
由于卷积并不使用矩阵相乘,为了减少计算量,可以将卷积的过程分成两部分:a depthwise convolution and a pointwise convolution.空间特征学习+通道特征学习
depthwise convolution
首先,我们使用3个5x5x1的卷积核产生8x8x3的图像:
pointwise convolution
其次,使用1x1x3 的卷积核对每个像素计算,得到8x8x1 的图像:
使用256个1x1x3 的卷积核,则可以产生8x8x256的图像:
可以看到,整个过程由原来的12x12x3 — (5x5x3x256) →12x12x256,变成12x12x3 — (5x5x1x1) — > (1x1x3x256) — >12x12x256
意义
主要就是减少了计算量,原先是256个5x5x3的卷积核移动8x8次,即需要256x3x5x5x8x8=1,228,800次乘法计算。使用depthwise convolution,有3个5x5x1的卷积核移动8x8次,需要3x5x5x8x8 = 4,800次乘法计算。使用pointwise convolution,有256个1x1x3的卷积核移动8x8次,需要256x1x1x3x8x8=49,152次乘法计算,加起来共有53,952次计算。接着就是Transformer中注意力的表现形式说实话这个表述给我整懵了,我都怀疑我之前看的是transformer嘛,尤其是这里符号说明很混乱,之后这里重新整理下,然后再看看同Depthwise Separable Convoluiotn之间存在的联系吧?这个应该也是这篇文章的核心了吧 😒:
Ω q ∈ R H × W \Omega_{q} \in \mathbb{R}^{H \times W} Ωq∈RH×W和 Ω k ∈ R H × W \Omega_{k} \in \mathbb{R}^{H \times W} Ωk∈RH×W分别表示query和key elements的集合,其中 q ∈ Ω q , k ∈ Ω k q \in \Omega_{q}, k \in \Omega_{k} q∈Ωq,k∈Ωk
5.2 O 2 O^2 O2DETR
这部分主要看下这里面Multi-scale Feature Presentation和Detection Head是怎么表述的?
首先是Multi-scale Feature Presentation,本文中的multi-scale feature maps是来自骨干网络的,文中描述这个输出feature map为 { x l } l = 1 L − 1 \left\{x^{l}\right\}_{l=1}^{L-1} {xl}l=1L−1从stage C 3 C_3 C3到stage C 5 C_5 C5,其中 C l C_l Cl表示 2 l 2^l 2l下采样,最低分辨率的那个feature map是在 C 5 C_5 C5使用一个 3 × 3 3\times3 3×3并且步长为2的卷积实现的,所有的feature map都是256通道的.根据这里的描述吧,输出是4个不同尺寸的feature map,对应的下采样倍数分别为8,16,32,64,同时,通道数是256.刚刚测试了下mmdetection ResNet50结构提取feature map得到的输出:
对应着下采样倍数分别为4,8,16,32.并且通道数增加,实际上ResNet50结构如下:
等弄代码的时候再仔细考虑这边骨干网络怎么弄吧接着将多尺度的feature map进行进行聚合,这是怎么聚合的呢?
DSConv ( W p , W d , x ) l = DSConv ( W p , W d , x ) l + Dropout ( D S Conv ( W p , W d , x ) l − 1 + D S Conv ( W p , W d , x ) l + 1 ) , l ∈ [ 1 , L − 1 ] \begin{array}{l} \operatorname{DSConv}\left(W_{p}, W_{d}, x\right)^{l}=\operatorname{DSConv}\left(W_{p}, W_{d}, x\right)^{l}+\operatorname{Dropout}\left(D S \operatorname{Conv}\left(W_{p}, W_{d}, x\right)^{l-1}\right. \\ \left.\quad+D S \operatorname{Conv}\left(W_{p}, W_{d}, x\right)^{l+1}\right), \quad l \in[1, L-1] \end{array} DSConv(Wp,Wd,x)l=DSConv(Wp,Wd,x)l+Dropout(DSConv(Wp,Wd,x)l−1+DSConv(Wp,Wd,x)l+1),l∈[1,L−1]
首先问题就是:没看懂上面的公式表示的是什么意思?角标 l l l是加到谁的上面的?如果说是加在 x x x上面,表示的应该是输出的4个尺度的feature map,那么 l = 1 l=1 l=1的时候,会出现 x 0 x^0 x0这个指的又是什么呢?
接着给出了encoded multi-scale features E l ( l ∈ L ) E_{l}(l \in L) El(l∈L)???没想到 l l l竟然能够属于一个Value L,又给我整懵了。最后这里的multi-scale attention表示式为:
MSAttn ( z q , p , { E l } l = 1 L ) = ∑ l = 1 L ∑ k ∈ Ω k A ( q , k , l ) ⋅ W ⋅ x k l \operatorname{MSAttn}\left(z_{q}, p,\left\{E_{l}\right\}_{l=1}^{L}\right)=\sum_{l=1}^{L} \sum_{k \in \Omega_{k}} A_{(q, k, l)} \cdot W \cdot x_{k}^{l} MSAttn(zq,p,{El}l=1L)=l=1∑Lk∈Ωk∑A(q,k,l)⋅W⋅xkl
公式还是没看懂,为什么说使用Depthwise Separate Convolution来替换multi-head self attention的,回头这个地方的话,我打算自己结合DETR的实际情况进行改动吧。
最后就是这个Detection Head这边,最终得到的feature map大小为 D ∈ R N × C D \in \mathbb{R}^{N \times C} D∈RN×C,然后分别通过一个3层的MLP以及一个linear层来预测边界框和类别置信度:
Box { x c , y c , w , h , α } = Sigmoid ( MLP ( D ) ) Score = F C ( D ) \begin{aligned} \operatorname{Box}_{\left\{x_{c}, y_{c}, w, h, \alpha\right\}} &=\operatorname{Sigmoid}(\operatorname{MLP}(D)) \\ \text { Score } &=\mathbf{F C}(D) \end{aligned} Box{xc,yc,w,h,α} Score =Sigmoid(MLP(D))=FC(D)
这里我的理解就是将原来DETR的内容保持不动,增加一个最终的预测角度。
5.3 Fine-tune O 2 \mathbf{O}^2 O2DETR
这里我的理解就是先将上面的DETR训练好,然后冻结,把整个看成一个FPN,然后再把Faster-RCNN基于proposals来预测最终边界框的方法拿过来,得到更加精细的预测边界框。
F = ROIAlign ( P , { x l } l = 1 L − 1 ) Box { x c , y c , w , h , α } F = Sigmoid ( M L P ( F ) ) Score e F = F C ( F ) , Box = Box { x c , y c , w , h , α } + Box { x c , y c , w , h , α } F , \begin{array}{c} F=\text { ROIAlign }\left(P,\left\{x^{l}\right\}_{l=1}^{L-1}\right) \\ \text { Box }_{\left\{x_{c}, y_{c}, w, h, \alpha\right\}}^{F}=\text { Sigmoid }(\mathbf{M L P}(F)) \\ \text { Score } e^{F}=\mathbf{F C}(F), \\ \text { Box }=\text { Box }_{\left\{x_{c}, y_{c}, w, h, \alpha\right\}}+\text { Box }_{\left\{x_{c}, y_{c}, w, h, \alpha\right\}}^{F}, \end{array} F= ROIAlign (P,{xl}l=1L−1) Box {xc,yc,w,h,α}F= Sigmoid (MLP(F)) Score eF=FC(F), Box = Box {xc,yc,w,h,α}+ Box {xc,yc,w,h,α}F,
又给我整懵了,首先第一个问题就是:
- ROIAlign我要是没理解错的话,好像是将proposal对应到feature map上,然后再将这个feature map做pool到固定的大小上,难道说旋转框的feature map这边也做了适配吗?
- 第二个问题就是最后的Box是 Box { x c , y c , w , h , α } \text { Box }_{\left\{x_{c}, y_{c}, w, h, \alpha\right\}} Box {xc,yc,w,h,α}和 Box { x c , y c , w , h , α } F \text { Box }_{\left\{x_{c}, y_{c}, w, h, \alpha\right\}}^{F} Box {xc,yc,w,h,α}F加和,这里的 Box { x c , y c , w , h , α } \text { Box }_{\left\{x_{c}, y_{c}, w, h, \alpha\right\}} Box {xc,yc,w,h,α}是啥?通过ROIAlign以及新的prediction head得到的更加准确的预测边界框和分数吗?那为什么还要加上原来的边界框呢?并且作者这里说不需要做NMS?
- 最最最重要的一个问题就是这边损失函数用的啥?旋转框不给出损失函数感觉很难顶~
(六) Experiments
实验设置
数据集:DOTA,corp original images into 1024x1024,random horizontal flipping
模型:基于ResNet50,ResNet101得到了O2DETR-R50和O2DETR-R101,同时还有一个Fine-tune的F-O2DETR,没有使用FPN。
训练:训练50个epoch,在第40个epoch时学习率下降1/10,Transformer encoder-decoder的学习率10-4,resnet骨干网络学习率为10-5,这边旋转框是怎么使用IoU loss呢?F-O2DETR训练了12个epoch。咱也不知道用的啥学习器啊?
6.1 同Faster-RCNN以及RetinaNet的比较
6.2 消融实验
Depthwise Separable Convolution的作用
Fine-tune on O2DETR
比较Faster-RCNN的RPN和F-O2DETR的召回率
比较O2DETR和F-O2DETR的区别
6.3 同state-of-the-art比较
(七) Conclusions
本文主要使用DETR解决了旋转框目标检测的问题,并且在此基础上提出了fine-tune的方式能够更好地解决问题。
(八) Notes
8.1 旋转框目标检测的方法
R-RPN, R 2 R^2 R2CNN,RoI Transformer,SCRDet,RSDet,CSL, R 3 R^3 R3Det, S 2 S^2 S2Det,
今年的一篇论文:Redet: A rotation-equivariant detector for aerial object detection.
8.2 基于DETR的一些工作
SMCA-DETR,Deformable DETR,需要思考一个问题是:本文是基于标准的DETR嘛?