綜述 | 旋轉(zhuǎn)框檢測(cè)方法:RotateAnchor系列
綜述
之前我們已經(jīng)介紹了FasterRCNN面對(duì)旋轉(zhuǎn)框檢測(cè)問題時(shí)可能遇到的問題,有需要的同學(xué)可以點(diǎn)擊鏈接查看:
鏈接:https://zhuanlan.zhihu.com/p/105841613

在本章節(jié)中,我將介紹幾種常見的旋轉(zhuǎn)框檢測(cè)方法,分析這些方法是如何克服FasterRCNN的問題,從而實(shí)現(xiàn)旋轉(zhuǎn)框檢測(cè)的。另外,我也會(huì)簡(jiǎn)單的分析一下各個(gè)方法的優(yōu)缺點(diǎn),介紹在實(shí)際場(chǎng)景中應(yīng)用這些方法時(shí)可能會(huì)遇到的問題。事實(shí)上,許多的論文在提出方法的時(shí)候會(huì)更多的側(cè)重于論文在公開數(shù)據(jù)集上的表現(xiàn),但在真實(shí)場(chǎng)景中反而會(huì)表現(xiàn)不佳。
本文將介紹常見的旋轉(zhuǎn)框檢測(cè)方法:
RRPN : 更多的框
R3Det : 暴力破解基礎(chǔ)下的速度優(yōu)化
ROITransfomer:三階段算法的精度提升
all you need is Boundary :三階段算法的特殊化應(yīng)用
1 暴力破解派
一、暴力破解代表:RRPN
1.1 RRPN 簡(jiǎn)述
在FasterRCNN 的問題當(dāng)中,我們介紹了使用水平的Anchor 生成水平的Proposal ,進(jìn)一步預(yù)測(cè)旋轉(zhuǎn)框時(shí)可能會(huì)出現(xiàn)的一系列問題。那么,當(dāng)討論到這個(gè)問題的解決辦法時(shí),一個(gè)最簡(jiǎn)單的解決辦法,就是從生成水平的Anchor,轉(zhuǎn)變成生成各種不同角度的旋轉(zhuǎn)Anchor:

RRPN ( Arbitrary-Oriented Scene Text Detection via Rotation Proposals ) 的基本思想是,在FasterRCNN 的基礎(chǔ)上,對(duì)每個(gè)按照原先方法生成的框,都“原地”旋轉(zhuǎn)6個(gè)角度(上圖c),即對(duì)每個(gè)位置每個(gè)尺度(Scale),每個(gè)長(zhǎng)寬比(Ratio) 的框,都衍生成6個(gè)不同角度的框,這樣,我們就能夠更好的貼合旋轉(zhuǎn)框檢測(cè)的任務(wù)了。因?yàn)檫@種思考方式簡(jiǎn)單粗暴,在這里我們稱他們?yōu)椤氨┝ζ平馀伞埃础?strong style="max-width: 100%;color: black;box-sizing: border-box !important;overflow-wrap: break-word !important;">通過生成更加密集的旋轉(zhuǎn)Anchor 來適應(yīng)旋轉(zhuǎn)框檢測(cè)的任務(wù)“。
為了實(shí)現(xiàn)這種策略,RRPN 當(dāng)中創(chuàng)新的提出了兩個(gè)關(guān)鍵的組件:
1、 pairwise_iou_rotated:用于計(jì)算任意一個(gè)旋轉(zhuǎn)矩形和另一個(gè)旋轉(zhuǎn)矩形之間的IoU 的函數(shù)

pairwise_iou_rotated:計(jì)算各種旋轉(zhuǎn)矩形交疊情況下的IOU
2、RROIPooling/RROIAlign , 在RPN完成之后,通過輸入一個(gè)任意角度的旋轉(zhuǎn)Proposal,能夠返回一個(gè)標(biāo)準(zhǔn)的Pooling/Align 的結(jié)果,從而可以接入到一個(gè)類似于ROIHeads 的結(jié)構(gòu)當(dāng)中,進(jìn)一步對(duì)目標(biāo)旋轉(zhuǎn)框的 五個(gè)信息進(jìn)行預(yù)測(cè)

RROIPooling
整體的論文流程圖如下:

介紹RRPN 論文細(xì)節(jié)的文章有很多,在這里不多做贅述。在detectron2當(dāng)中也已經(jīng)將這些內(nèi)容進(jìn)行了很好地集成:
RotatedAnchorGenerator:
https://github.com/facebookresearch/detectron2/blob/634770ed51ce3de969557db143d9a673508635b0/detectron2/modeling/anchor_generator.py#L202github.com
RRPN(rotated proposal 生成器):
https://github.com/facebookresearch/detectron2/blob/master/detectron2/modeling/proposal_generator/rrpn.pygithub.com
RROIHeads:
https://github.com/facebookresearch/detectron2/blob/master/detectron2/modeling/roi_heads/rotated_fast_rcnn.pygithub.com
在這里,我想按照我們介紹的整體思路,看一下RRPN是如何解決上一篇文章當(dāng)中提到的三個(gè)問題的:
1、通過使用旋轉(zhuǎn)的Anchor,優(yōu)化Anchor/Proposal和GT 的匹配問題。
如圖,如果在藍(lán)色點(diǎn)生成如圖所示大小的藍(lán)框,并將框繞著藍(lán)點(diǎn)進(jìn)行旋轉(zhuǎn),每30°生成一個(gè)Anchor,可以看到當(dāng)藍(lán)框旋轉(zhuǎn)至綠色框的位置時(shí),能夠和GT更加的匹配,生成更加合適的Anchor,同理,對(duì)應(yīng)利用綠色區(qū)域生成Proposal 信息,Proposal 和GT 的關(guān)系會(huì)比利用水平框更加貼近

2、使用旋轉(zhuǎn)的框,能夠生成更多“接近于”GT樣式的框
在上篇文章當(dāng)中,我們介紹了如果使用水平的Proposal,存在著水平Proposal的高寬和 旋轉(zhuǎn)GT 的真實(shí)高寬“相差很大”,導(dǎo)致回歸困難的問題。而在RRPN當(dāng)中,如下圖,可以看到旋轉(zhuǎn)Proposal 和真實(shí)GT 的高度和寬度“差異性大大降低”,從而使得回歸“更加容易”

1.2 RRPN 的問題
在最開始學(xué)習(xí)的時(shí)候,我對(duì)RRPN “給予厚望”。我認(rèn)為這個(gè)方法真的能夠很好的解決這一系列的問題,加上detectron2 內(nèi)置了RRPN 的相關(guān)函數(shù),幾乎“改改配置文件”就能夠訓(xùn)練出一個(gè)“精妙的模型”,但是在實(shí)際操作中,我發(fā)現(xiàn)RRPN 實(shí)際存在如下的問題:
1.2.1 如何表示一個(gè)旋轉(zhuǎn)框?
首先,在標(biāo)簽生成的時(shí)候,我們就會(huì)直面一個(gè)現(xiàn)實(shí)的問題?旋轉(zhuǎn)框應(yīng)該如何表示?
事實(shí)上,雖然我們說了可以使用5個(gè)值 來表示一個(gè)旋轉(zhuǎn)框( )特別指代框的中心位置,但是注意到這個(gè)的框表示其實(shí)有個(gè)bug: 一個(gè)框的表示不是唯一的。比如下面這張圖,當(dāng)我們把不同的邊作為高和寬的時(shí)候,計(jì)算出來的角度也會(huì)隨之發(fā)生變化(按照慣例,我們一般把逆時(shí)針旋轉(zhuǎn)的角度視為負(fù)值):

總的來說,在帶角度的這種框表示方法當(dāng)中,有三種不同的"流派":
opencv 表示法:

2. 最長(zhǎng)邊表示法:角度定義為圖像的最長(zhǎng)邊和x軸的角度

3. 以及比較其實(shí)肉眼比較直觀的表示方式
(在文字檢測(cè)當(dāng)中,一般我們會(huì)定義文本框左上角的點(diǎn)為x1,順時(shí)針遇到的第二個(gè)角為x2,則可以視x1 到 x2 的邊為w,對(duì)應(yīng)另一邊為h,角度為 x1->x2射線和x軸的夾角)

表達(dá)方式不同,在后期模型的訓(xùn)練中,對(duì)于負(fù)責(zé)預(yù)測(cè)角度對(duì)FC層的構(gòu)造有很大的影響,當(dāng)想要復(fù)現(xiàn)RRPN 或者類似的旋轉(zhuǎn)框檢測(cè)算法時(shí),需要特別的小心
1.2.2 如何回歸
在RRPN 原始的論文中,對(duì)角度的回歸方法如下:

https://blog.csdn.net/ChuiGeDaQiQiu/article/details/79821576
這里基本可以視為直接回歸 gt 和 anchor 之間的角度差。
事實(shí)上,所有“基于角度的旋轉(zhuǎn)框表示方法下”,都需要預(yù)測(cè)Anchor 和GT 的角度差,但是角度回歸結(jié)果的一點(diǎn)點(diǎn)偏差對(duì)于最后結(jié)果的影響很大:

R3Det 論文截圖
上圖是論文R3Det 當(dāng)中的一個(gè)示例圖,比如圖中的藍(lán)色曲線表示對(duì)于長(zhǎng)寬比為1:5的框,當(dāng)把一個(gè)框繞著原點(diǎn)旋轉(zhuǎn)任意的一個(gè)角度后(如下圖從藍(lán)框旋轉(zhuǎn)到綠框的位置),旋轉(zhuǎn)后的框和原先的框 的IoU值。從圖中我們可以看出,當(dāng)偏差角度在20°的時(shí)候,框和原先的框的IOU就只有0.4了。

事實(shí)上,RRPN一類的旋轉(zhuǎn)框檢測(cè)方法,都會(huì)有如下的問題:
1、分布在圖中的GT 的旋轉(zhuǎn)角度是任意的,而生成Anchor 使用的角度是固定的,但是如上所述,如果生成Anchor 時(shí),使用的旋轉(zhuǎn)角度不足,比如不夠每20°生成一個(gè)Anchor,就很容易出現(xiàn)盡管生成了很多的Anchor ,但是還是很難有Anchor 能夠和GT 具有高的IoU
2、對(duì)角度回歸出現(xiàn)一點(diǎn)點(diǎn)的偏差,會(huì)造成回歸的結(jié)果和GT的IoU沒有那么好,即”角度對(duì)學(xué)習(xí)是很敏感的“,所以計(jì)算其Smooth_L1_Loss 并加入到回歸偏差中,會(huì)使得回歸相關(guān)的參數(shù)不容易被學(xué)習(xí)
3、角度的變化是不連續(xù)的,因此可能會(huì)難以被學(xué)習(xí),且學(xué)習(xí)成本很大(SCRDet 對(duì)此有詳細(xì)的介紹和Loss 的設(shè)計(jì),這里不展開討論)
1.2.3 令人崩潰的速度
事實(shí)上,上述問題都不是問題,最大的問題在于:慢!
在眾多文字檢測(cè)比賽當(dāng)中,一張圖上其實(shí)框很少:

但是在真實(shí)應(yīng)用場(chǎng)景中,一張圖上的GT 的數(shù)量可能多達(dá)幾百個(gè)(比如報(bào)表啊,各種單據(jù)),然后,然后RRPN 就會(huì)慢的不行...這主要是因?yàn)槟阈枰诿總€(gè)位置生成足夠的框(旋轉(zhuǎn)的角度不夠會(huì)導(dǎo)致1.2.2 提到的問題),所以,RRPN 陷入了無盡的自我矛盾:
1、速度不夠,增大旋轉(zhuǎn)角度的間隔
2、旋轉(zhuǎn)角度間隔增大,模型的精度一定會(huì)下降
介紹完開山之作RRPN, 之后的文章基本就是在此基礎(chǔ)之上的不斷細(xì)化,在本篇專欄之中不做進(jìn)一步細(xì)致的介紹,只是列出大家針對(duì)RRPN 提出的一系列的創(chuàng)新,供讀者參考和思考。
2 暴力與速度的結(jié)合 R3Det
R3Det( Refined Single-Stage Detector with Feature Refinement for Rotating Object ) 主要解決的是RRPN 過程當(dāng)中的速度問題:
1、使用RetinaNet 構(gòu)造單階段目標(biāo)檢測(cè)框架
2、使用RefineDet 思想,對(duì)FirstStage 一階段檢測(cè)結(jié)果細(xì)化
3、引入了FRM 模塊,在一階段模型當(dāng)中實(shí)現(xiàn)了類似于 ROIPooling 的操作

3 重新用上RPN:ROITransfomer
3.1 模型結(jié)構(gòu)
事實(shí)上,在DOTA數(shù)據(jù)集(一個(gè)航拍旋轉(zhuǎn)物體檢測(cè)數(shù)據(jù)集)上,目前得分最高的模型就是這個(gè)ROITransfomer模型了,不過基于他復(fù)現(xiàn)難度較高,估計(jì)大家真正想用起來有點(diǎn)難...
簡(jiǎn)單的來說,RRPN一個(gè)非常直觀的問題在于,需要生成大量且冗余的RotateAnchor,所以,一個(gè)直觀的解決辦法是:在RPN階段,能不能首先先用RPN 水平的Proposal ,并且對(duì)于每個(gè)Proposal ,通過和GT 的最小包絡(luò)矩形進(jìn)行IoU計(jì)算分配正負(fù)樣例,訓(xùn)練出一個(gè)生成水平Anchor 的Proposal:

沒錯(cuò),雖然之前我們拋棄了這個(gè)思路,但是當(dāng)時(shí)我們說過,其實(shí)FasterrRCNN是有能力在最終給出包絡(luò)住物體的框的,所以其實(shí)這種思路生成RPN也是行的通的,但在當(dāng)前思路下,如何回歸GT 的旋轉(zhuǎn)坐標(biāo)呢?這里文章的思路其實(shí)很類似于R3Det,盜用R3Det的一張圖:

如果GroundTruth(R) 是我們的GT,即最終希望預(yù)測(cè)的結(jié)果,在ROITransfomer這里的操作其實(shí)很類似于CascadeRCNN,即首先從綠框(Anchor) 利用ROIPooling/ROIAlign 的方式回歸到一個(gè)旋轉(zhuǎn)的結(jié)果RefinedBbox,在兩階段的網(wǎng)絡(luò)結(jié)構(gòu)中,模型推斷到這里就應(yīng)該結(jié)束,但事實(shí)上,我們可以再做一步,通過使用一個(gè)RotateROIPooling,輸入黃色的旋轉(zhuǎn)框,再進(jìn)一步修正框的坐標(biāo)信息,獲得最后的預(yù)測(cè)結(jié)果
通過在中間加一層網(wǎng)絡(luò)結(jié)構(gòu),能夠使得模型的預(yù)測(cè)結(jié)果更加精準(zhǔn),具體而言,文章的基本思路如下:

這里的RROI Learner 就是第一次的ROIPooling,但是文出于對(duì)速度的考量,換成了更快速的PSROIPooling,而ROIWarping 就是第二階段的框的精修,文中提出了一種新的pooling方式,但是對(duì)于我們想快速嘗試,可以試試使用RotateROIPooling 替代
3.2 復(fù)現(xiàn)困難
我曾經(jīng)試過使用簡(jiǎn)單的ROIAign+RROIAlign的策略實(shí)現(xiàn)過三階段的算法,不得不說,雖然減少了框的數(shù)量,但是實(shí)際上如果不類似于原文,替換為PSROIPooling或者類似于LightHeadRcnn 的網(wǎng)絡(luò)結(jié)構(gòu),推斷速度是十分不給力的
同樣,在復(fù)現(xiàn)AnchorBased類型論文當(dāng)中,Matcher 部分的不一致問題始終是一個(gè)很難以解決的問題:
1、如果使用RPN 生成水平的Anchor ,則在RPN訓(xùn)練中,Anchor 和 GT 進(jìn)行Matcher 匹配的時(shí)候,應(yīng)該是使得Anchor和GT的包絡(luò)矩形進(jìn)行比較。
2、則這樣RPN生成的Proposal,基本都是"包著GT"的,如下圖展示的Proposal,但是在第二輪需要和旋轉(zhuǎn)GT 進(jìn)行Matcher 的時(shí)候,會(huì)發(fā)現(xiàn)生成的Proposal 如果是和GT 的旋轉(zhuǎn)框進(jìn)行IoU計(jì)算的話,實(shí)際上就算是最包絡(luò)的Proposal , 和 GT 的IoU值都可能很小(如下圖的”單位:人民幣元“)

4 All you need is Boundary:最有技巧的三階段模型
沒啥說的,阿里的文章,技巧極其復(fù)雜,復(fù)現(xiàn)極其困難.速度嘛,反正用detectron2的話,三階段都不算快, 這篇中心思想和第三篇類似,但做的更加tricky,感興趣的可以去看看。
總的來說,第三篇在三階段仍舊回歸框坐標(biāo),但是這篇直接回歸了文本的”邊界點(diǎn)“:

圖a) : 從RPN 回歸至旋轉(zhuǎn)框
圖c): 從旋轉(zhuǎn)框回歸到文字邊界
論文的基礎(chǔ)框架和核心如下:


(兩階段的框檢測(cè)+一階段的邊界檢測(cè))= 三階段方法
?------------------------------------------------
雙一流大學(xué)研究生團(tuán)隊(duì)創(chuàng)建,一個(gè)專注于目標(biāo)檢測(cè)與深度學(xué)習(xí)的組織,希望可以將分享變成一種習(xí)慣。
整理不易,點(diǎn)贊三連!
