ReDet:A Rotation-equivariant Detector for Aerial Object Detection

ReDet:A Rotation-equivariant Detector for Aerial Object Detection

image-20210727140437703

参考
Introduction
  • CNN特征不具有旋转不变性,上图中上半部分将Input旋转了一个角度,输入左图用普通CNN提取feature map得到的feature是不同的,而输入到右图中提取了旋转同变特征( Rotation-equivariant features,ReCNN提取)
    • RoI-Align只能在空间维度上实现旋转不变性,ReDet提出了一种新的旋转不变性RoI(RiRoI)Align算法来提取空间维度和方向维度上的旋转不变性特征
      • 直接将普通RRoI旋转应用到旋转同变特征上并不能产生旋转不变特征,因为它只能旋转二维平面上的区域特征,即空间维度(可以理解为前两维),而方向通道仍然是错位的(channel)。为了提取完全旋转不变的特征,我们还需要根据RRoI的方向调整特征图的方向维数
      • 具体的方式如上图的右下角所示,在原来RRoI的基础上,再加一次方向维度的调整,原文是说用的循环转换各个通道
        • by circularly switching orientation channels and feature interpolation
    • 因此,所谓rotation-invariant feature = rotation-equivariant backbone + Ri RoI
      • Ri RoI = RRoI + orientation alignment
  • R18代表采用了ResNet18作为backbone,ReR50同理
    • ReR18在效果上几乎追平其他模型的R50版本,ReR50更是在参数量较少的前提下拥有最高的mAP
Related Works
Preliminaries
  • 同变性就是说,如果我们对模型的输入做变换,我们应该可以预测该特征的变换结果。

    • 给定一个变换群 G 和函数 $\Phi: X\rightarrow Y $,同变性可以表示为:

    Φ [ T g X ( x ) ] = T g Y [ Φ ( x ) ] ∀ ( x , g ) ∈ ( X , G ) ( 1 ) \Phi[T^X_g(x)] = T^Y_g[\Phi(x)] \qquad ∀(x, g) ∈ (X, G) \qquad (1) Φ[TgX(x)]=TgY[Φ(x)](x,g)(X,G)(1)

    • 其中 T g T_g Tg表示在相应空间内的一组的操作。如果所有 T g X T_g^X TgX T g Y T_g^Y TgY的值是一样的,同变性就变成了不变性

    • 对于上面这段公式,个人理解是:

      • T g X T_g^X TgX的意思应该是对X做 T g T_g Tg变换,同理 T g Y T_g^Y TgY的意思应该是对Y做 T g T_g Tg变换,但是这两种变换不一定是相同的
      • 对于输入x,对其做变换得到 T g X ( x ) T_g^X(x) TgX(x)然后再经过函数 Φ \Phi Φ得到 Φ ( T g X ( x ) ) \Phi(T_g^X(x)) Φ(TgX(x)),即可理解为先对图片做变换再输入模型中去
      • 若先再经过函数 Φ \Phi Φ得到 Φ ( x ) \Phi(x) Φ(x),再对其进行变换得到 T g Y ( Φ ( x ) ) T_g^Y(\Phi(x)) TgY(Φ(x)),即可理解为把图片输入到模型中去,再对输出对结果做一定变换
      • 上述的两个变换不一定相同,但是当对于 T g X T_g^X TgX变换总存在一个 T g Y T_g^Y TgY变换使得(1)等式成立,则说模型具有同变性,当所有 T g X T_g^X TgX T g Y T_g^Y TgY的变换是一样的,则说明
      • 这里引入了群论,群有一个性质,如果两个群满足双射的条件,也即存在一个变换,可以让两个群的元素一一对应,那么就称这两个群是同构的(特指等距同构)。等距同构是指在度量空间之间保持距离关系的同构。在几何学中对应全等变换。
  • CNN的平移同变性为例(等式的左右两边的 T t T_t Tt变换相同时,原文没说相同,因此用了同变性):

    • T t T_t Tt表示平移分组( R 2 R^2 R2,+)的一个操作,将其应用在K维的特征图 f f f上:$Z^2 \rightarrow R^K $,平移不变性可以表示为:

    [ [ T t Z 2 f ] ∗ ϕ ] ( x ) = [ T t R K [ f ∗ ϕ ] ] ( x ) ( 2 ) [[T_t^{Z^2} f]*\phi](x) = [T_t^{R^K}[f*\phi]] (x) \qquad (2) [[TtZ2f]ϕ](x)=[TtRK[fϕ]](x)(2)

    • 对于上述公式:

      • x ∈ ( R 2 , + ) x\in (R^2,+) x(R2,+) ∗ * 表示卷积操作, ϕ \phi ϕ表示卷积核, f ∗ ϕ f*\phi fϕ则表示对输入x得到的特征图 f f f进行卷积,而 T t f T_t f Ttf则表示先对特征图进行平移变换
      • 于是先平移后卷积得到的结果可以通过先卷积然后进行(不一定相同的)平移操作得到,此为CNN的平移同变性
      • 当然对于CNN来说,一般 T t Z 2 T_t^{Z^2} TtZ2= T t R K T_t^{R^K} TtRK,因此具有平移不变性
  • 所谓旋转同变性,可以参考平移同变性:

    扫描二维码关注公众号,回复: 13362782 查看本文章
    • 最近提出的一些方法将 CNN 扩展为更大的分组,实现平移不变和旋转不变(e2cnn),以 H表示旋转分组,如循环分组 C N C_N CN 包含多个离散的旋转角度,角度为 $\frac{2\pi}{N} $的倍数,我们可以定义分组G为平移分组 ( R 2 R^2 R2 , + ) 和旋转分组H的间接乘积,即 G ≅ ( R 2 , + ) ⋊ H G \cong (R^2,+) \rtimes H G(R2,+)H。在等式2中,将 x ∈ ( R 2 , + ) x\in (R^2,+) x(R2,+)替换成 g ∈ G g \in G gG,旋转同变性卷积可以定义为:

    [ [ T g Z 2 f ] ∗ ϕ ] ( g ) = [ T g R K [ f ∗ ϕ ] ] ( g ) ( 3 ) [[T_g^{Z^2} f]*\phi](g) = [T_g^{R^K}[f*\phi]] (g) \qquad (3) [[TgZ2f]ϕ](g)=[TgRK[fϕ]](g)(3)

Rotation-equivariant Networks
  • 正常的 CNN 由一系列卷积层组成,具有平移权重共享的性质。类似地,旋转同变性网络也由一组旋转同变层组成,权重共享的程度更高,即平移和旋转权重共享。(将(3)的结论推广到所有层),以 Φ = { L i ∣ i ∈ { 1 , 2.... , M } } \Phi = \{ L_i|i \in \{ 1,2....,M\}\} Φ={ Lii{ 1,2....,M}}表示分组G,具有M个旋转同变层的网络,对某一层 L i ∈ Φ L_i \in \Phi LiΦ,旋转变换 T r T_r Tr可以通过该层保留下来:

L i [ T r Z 2 ( g ) ] = T r R K [ L i ( g ) ] g ∈ G ( 4 ) L_i[T_r^{Z^2}(g)] = T_r^{R^K}[L_i(g)] \qquad g \in G \qquad (4) Li[TrZ2(g)]=TrRK[Li(g)]gG(4)

  • 那么推广到全部忘了,如果对输入I使用 T r T_r Tr,他会被每一层旋转同变卷积保留下来,进而被整个网络保留下来,于是就可以得到旋转同变的CNN了,如下所示:

[ ∏ i = 1 M L i ] ( T r Z 2 I ) = T r R K [ ∏ i = 1 M L i ] ( I ) ( 5 ) [\prod_{i=1}^ML_i](T_r^{Z^2}I) = T_r^{R^K}[\prod_{i=1}^ML_i](I) \qquad (5) [i=1MLi](TrZ2I)=TrRK[i=1MLi](I)(5)

Rotation-invariant Features
  • 对于输入做任意的旋转变换 T r T_r Tr ,如果输出保持不变,我们就说这个输出特征是旋转不变的。旋转不变特征可以分为3个层级:图像层级,实例层级和像素层级。这里我们主要关注实例层级的选择不变特征,对于目标检测任务来说更加适合。

  • (ROI部分):对$ I_R\in I , , f_R\in f , 分 别 表 示 图 像 ,分别表示图像 ,I 的 R o I 和 特 征 图 的 RoI 和特征图 RoIf 的 R o I , 的 RoI, RoI,f=\Phi(I) 。 假 设 。假设 I_R 是 一 个 H o I ( x , y , w , h ) , 对 朝 向 表 示 不 变 , 是一个HoI(x,y,w,h),对朝向表示不变, HoI(x,y,w,h)T_r 表 示 旋 转 操 作 , 则 表示旋转操作,则 T_rI_R 则 是 一 个 关 于 朝 向 则是一个关于朝向 \theta 对 R R o I ( x , y , w , h , 对RRoI(x,y,w,h, RRoI(x,y,w,h,\theta$),那么可以得到和(5)类似的旋转同变的式子

Φ ( T r I R ) = T r Φ ( I R ) ( 6 ) \Phi(T_rI_R)=T_r\Phi(I_R) \qquad (6) Φ(TrIR)=TrΦ(IR)(6)

  • 我们如果将图像 I I I的HRoI( I R I_R IR)看作图像 I I I的RRoI( T r Z 2 I R T_r^{Z^2}I_R TrZ2IR)的旋转不变特征,那么 Φ ( I R ) \Phi(I_R) Φ(IR)可以当作 Φ ( T r I R ) \Phi(T_rI_R) Φ(TrIR)在对应特征空间的旋转不变特征(可由(6)式得到)。

    • 原文的意思我的理解是:原来backbone部分输出的是旋转同变特征,我们需要在RoI这里将其变为旋转不变特征,要使同变转化为不变,则等式左右两边的转化操作需要一样,也就是做另一侧的反操作( T r T_r Tr通常就是朝向 θ \theta θ的一个函数: T r = T ( θ ) T_r=T(\theta) Tr=T(θ))

    Φ ( I R ) = ( T r ) ′ Φ ( T r ) ( 7 ) \Phi(I_R) = (T_r)^{'} \Phi(T_r) \qquad (7) Φ(IR)=(Tr)Φ(Tr)(7)

Rotation-equivariant Detector
  • image-20210729150019787

    • 从上图可以看到ReDet采用了Faster RCNN的架构,其创新点由(b)©两图所示,
Rotation-equivariant Backbone:旋转同变Backbone
  • 这个由上面的理论得到,想要得到旋转同变特征,则需要得到旋转同变网络(Rotation-equivariant Networks),在实现上,作者将带有FPN的ResNet重写,使用e2cnn.nn替代torch.nn得到具有旋转同变的backbone——ReResNet,通过这个网络,可以得到旋转同变特征图。
  • 它有如下特点
    • (a) 更高度的权重共享。
    • (b)丰富的朝向信息。
    • © 模型体积更小。
Rotation-invariant RoI Align:旋转不变RoI Align
  • 其任务就是将旋转同变feature map转化后得到旋转不变的feature map(实例级),所谓旋转不变,就是无论输入如何改变(旋转),输出总是不变

  • 常见的 RRoI warping 只能在空间维度对齐特征,而没有对齐朝向维度。

    • 如上图 ©所示RiRoI Align 包含2个部分:(1)空间对齐。 (2) 朝向对齐。对于输出区域特征 f ^ R \hat f_R f^R,朝向对齐表示为:

    • f ^ R = I n t ( S C ( f R , r ) , θ ) , r = └ θ ∗ N 2 π ┘ ( 8 ) \hat f_R = Int(SC(f_R,r),\theta),\qquad r=\llcorner \frac{\theta*N}{2\pi} \lrcorner \qquad (8) f^R=Int(SC(fR,r),θ),r=2πθN(8)

    • 其中SC,Int分别表示切换通道和特征插值操作。

    • 对于输出区域特征$ f_R , 首 先 计 算 出 一 个 索 引 值 ,首先计算出一个索引值 ,r , 然 后 循 环 地 切 换 朝 向 通 道 , 确 保 ,然后循环地切换朝向通道,确保 C_N^{®} 是 第 一 个 朝 向 通 道 。 但 是 因 为 旋 转 同 变 性 只 在 里 塞 的 分 组 是第一个朝向通道。但是因为旋转同变性只在里塞的分组 C_N 中 得 到 , 如 果 中得到,如果 \theta \notin C_N 我 们 需 要 对 特 征 做 插 值 , 我 们 用 最 近 的 我们需要对特征做插值,我们用最近的 l 朝 向 特 征 做 插 值 , 如 , 朝向特征做插值,如, ,l=2 的 第 的第 i$个朝向通道的输出特征可以表示为:

    • f ^ R ( i ) = ( 1 − α ) f R ( i ) + α f R ( i + 1 ) ( 9 ) \hat f_R^{(i)} = (1- \alpha)f_R^{(i)} +\alpha f_R^{(i+1)} \qquad (9) f^R(i)=(1α)fR(i)+αfR(i+1)(9)

    • 其中 α = θ ∗ N 2 π \alpha = \frac{ \theta * N}{2 \pi} α=2πθN 表示一维插值的距离因子,同时 i ∈ [ 1 , N ] i \in [1,N] i[1,N],可以使用mod函数实现

  • 在实现中,作者先对再进行RRoI(参考RoI Transformer中的方法),然后channel进行旋转(用rotate比较合适)与插值

    • 18、RoIAlign/RoIPooling CUDA源码解读

    • //文件位于:ReDet/mmdet/ops/riroi_align/src/riroi_align_kernel.cu/RiROIAlignForward
      // 这里是旋转的代码
      //nOrientation表示结构图中的N,代表把特征图分成N块
      // o在这里表示分出来的块的编号
      int o = (index / pooled_width / pooled_height) % nOrientation;
      
      // TODO
      // find aligned index
      // 相当于图中r= [\theta * N / 2*PI]
      scalar_t ind_float = theta * nOrientation / (2 * PI);
      int ind =  floor(ind_float);
      scalar_t l_var = ind_float - (scalar_t)ind;
      scalar_t r_var = 1.0 - l_var;
      
      // correct start channel
      // 开始通道编号
      ind = (ind + nOrientation) % nOrientation;
      // rotated channel
      // 旋转通道
      int ind_rot = (o - ind + nOrientation) % nOrientation;
      int ind_rot_plus = (ind_rot + 1 + nOrientation) % nOrientation; 
      
      const scalar_t* offset_bottom_data =
              bottom_data + (roi_batch_ind * channels * nOrientation + c * nOrientation + ind_rot) * height * width;
      
          const scalar_t* offset_bottom_data_plus =
              bottom_data + (roi_batch_ind * channels * nOrientation + c * nOrientation + ind_rot_plus) * height * width;
      
      
      //...//
      // 双线性插值
      scalar_t val = bilinear_interpolate<scalar_t>(
        offset_bottom_data, height, width, y, x);
      scalar_t val_plus = bilinear_interpolate<scalar_t>(
        offset_bottom_data_plus, height, width, y, x);
      output_val += r_var * val + l_var * val_plus;
      }
      
Experiments and Analysis
  • image-20210730004421241

猜你喜欢

转载自blog.csdn.net/symuamua/article/details/119225006