本文主要是介绍ReDet:A Rotation-equivariant Detector for Aerial Object Detection,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
ReDet:A Rotation-equivariant Detector for Aerial Object Detection
文章目录
- ReDet:A Rotation-equivariant Detector for Aerial Object Detection
- 参考
- Introduction
- Related Works
- Preliminaries
- Rotation-equivariant Networks
- Rotation-invariant Features
- Rotation-equivariant Detector
- Rotation-equivariant Backbone:旋转同变Backbone
- Rotation-invariant RoI Align:旋转不变RoI Align
- Experiments and Analysis
参考
- 笔记:1、论文笔记:ReDet: A Rotation-equivariant Detector for Aerial Object Detection
- 翻译:2、ReDet A Rotation-equivariant Detector for Aerial Object Detection 论文学习
- 翻译:3、Learning roi transformer for oriented object detection in aerial images
- 笔记:4、 [论文笔记]Arbitrary-Oriented Scene Text Detection via Rotation Proposals
- 笔记:5、《RRPN:Arbitrary-Oriented Scene Text Detection via Rotation Proposals》论文笔记
- 笔记:6、R3Det: Refined Single-Stage Detector with Feature Refinement for Rotating Object
- 笔记:7、论文笔记:Group Equivariant Convolutional Networks
- 原文:8、HEXACONV
- 笔记:9、[论文理解]旋转等变向量场网络Rotation equivariant vector field networks
- 笔记:10、Oriented Response Networks 论文解读
- 笔记:11、有方向的CNN–Oriented Response Networks
- 笔记:12、[论文理解]E(2)群等变可操控神经网络General E(2) - Equivariant Steerable CNNs
- 笔记:13、[论文理解]为旋转等变CNN学习可操纵卷积核Learning Steerable Filters for Rotation Equivariant CNNs
- 笔记:14、[论文理解]谐波网络:深度平移和旋转等变Harmonic Networks: Deep Translation and Rotation Equivariance
- 视频:15、Harmonic Networks: Deep Translation and Rotation Equivariance
- 笔记:16、ROI Pooling和ROI Align
- 笔记:17、遥感检测——RoI Transformer(CVPR2019)
- 笔记:18、RoIAlign/RoIPooling CUDA源码解读
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
- RoI-Align只能在空间维度上实现旋转不变性,ReDet提出了一种新的旋转不变性RoI(RiRoI)Align算法来提取空间维度和方向维度上的旋转不变性特征
- R18代表采用了ResNet18作为backbone,ReR50同理
- ReR18在效果上几乎追平其他模型的R50版本,ReR50更是在参数量较少的前提下拥有最高的mAP
Related Works
- HBB->OBB
- Rotation-equivariant Networks,将下面的方法从分类任务中引入目标检测任务中去
- 提出了群卷积,将4倍旋转同变纳入CNN
- 参考:论文笔记:Group Equivariant Convolutional Networks
- 将群卷积推广到六角格子上的6倍旋转同变
- HEXACONV
- 通过插值对滤波器进行再采样
- 参考:[论文理解]旋转等变向量场网络Rotation equivariant vector field networks
- 参考:Oriented Response Networks 论文解读
- 参考:有方向的CNN–Oriented Response Networks
- 使用谐波(harmonics)作为滤波器在连续域中产生equivariant feature(所谓滤波器就是多个卷积核的堆叠),根据代码实现,作者采用的是参考1,借用e2cnn的实现来重写backbone,
- 参考:[论文理解]E(2)群等变可操控神经网络General E(2) - Equivariant Steerable CNNs
- 参考:[论文理解]为旋转等变CNN学习可操纵卷积核Learning Steerable Filters for Rotation Equivariant CNNs
- 参考:[论文理解]谐波网络:深度平移和旋转等变Harmonic Networks: Deep Translation and Rotation Equivariance
- 视频:Harmonic Networks: Deep Translation and Rotation Equivariance
- 提出了群卷积,将4倍旋转同变纳入CNN
- Rotation-invariant Object Detection
- 旋转不变的特征对于任意朝向的目标检测来说很重要。但是,CNN 对旋转变化进行建模的能力很差,也就是说需要更多的参数来编码朝向信息。STN 和 DCN 直接在网络中建模旋转角度,在朝向目标检测上广泛使用。Cheng 等人提出了一个旋转不变层,对目标函数施加了一个显式的正则约束。尽管上述方法能够取得旋转不变性的近似效果,但需要大量的参数和训练样本。此外,目标检测需要实例级的旋转不变特征。因此,一些方法将 RoI warping 扩展为 RRoI warping,比如 RoI Transformer 学习如何将 HRoIs 变换为 RRoIs,然后利用一个旋转的位置敏感的 RoI Align 操作来扭曲区域特征。但是正常的 CNN 不具备旋转同变性。所以,哪怕通过 RRoI Align,我们仍无法提取出旋转不变特征。和这些方法不同,本文方法通过旋转不变 RoI Align(RiRoI Align) 从旋转同变特征中提取旋转不变特征。作者在主干网络中加入了旋转同变网络,产生旋转同变特征,然后在空间维度和朝向维度,利用 RiRoI Align 从旋转同变特征中提取出旋转不变特征。
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,因此具有平移不变性
-
所谓旋转同变性,可以参考平移同变性:
- 最近提出的一些方法将 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 g∈G,旋转同变性卷积可以定义为:
[ [ 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\}\} Φ={Li∣i∈{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)]g∈G(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=1∏MLi](TrZ2I)=TrRK[i=1∏MLi](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 和特征图 的RoI和特征图f 的 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
-
- 从上图可以看到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
这篇关于ReDet:A Rotation-equivariant Detector for Aerial Object Detection的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!