NO1.目標檢測 (分類+定位)
目標檢測(Object Detection)是圖像分類的延伸,除了分類任務,還要給定多個檢測目標的坐標位置。

NO2.目標檢測的發展
R-CNN是最早基於CNN的目標檢測方法,然后基於這條路線依次演進出了SPPnet,Fast R-CNN和Faster R-CNN,然后到2017年的Mask R-CNN.

R-CNN即區域卷積神經網絡,其提出為目標檢測領域提供了兩個新的思路:首先提出將候選子圖片輸入CNN模型用於目標檢測和分割的方法,其次提出了對於數據集標簽數據有限情況下的訓練方法,即使用在其他有標簽數據集訓練好的模型,然后再用當前少量標簽數據進行特定任務的微調訓練,最終可以得到明顯的效果提升。目標檢測需要進行定位,常用的定位方法有回歸和滑動窗等。R-CNN非常簡單粗暴,使用Selective Search 算法在圖片中選出2000張可能存在目標的候選子圖片(把選區子圖片作為候選物體位置的步驟稱為Region Proposal),從而解決了定位的問題。然后把每一個子圖片大小調整為一個固定大小,逐一輸入到一個預先訓練好的CNN用於特征提取,最后再將提取到的特征輸入到SVM分類器,這樣就可以通過計算推斷每個候選區域的物體屬於什么類別,概率是多少,最后把物體小概率的區域去掉,就得到圖中物體的位置和類別。
整個系統分為三個部分:1.產生不依賴與特定類別的region proposals,這些region proposals定義了一個整個檢測器可以獲得的候選目標2.一個大的卷積神經網絡,對每個region產生一個固定長度的特征向量3.一系列特定類別的線性SVM分類器。(目標檢測系統由三個模塊組成。第一個生成類別無關區域提案。這些提案定義了可用於我們的檢測器的候選檢測集。第二個模塊是從每個區域提取固定長度特征向量的大型卷積神經網絡。第三個模塊是一組特定類別的線性SVM。)
(消融研究 逐層分析性能,沒有微調。https://blog.csdn.net/xiaqunfeng123/article/details/78715983 區域提案 region proposal)

Selective Search 算法(選擇性搜索)遵循如下的原則:(https://www.cnblogs.com/kingstrong/p/4969472.html)
- 圖片中目標的尺寸不一,邊緣清晰程度也不一樣,選擇性搜索應該能夠將所有的情況都考慮進去,如下圖,最好的辦法就是使用分層算法來實現
- 區域合並的算法應該多元化。初始的小的圖像區域(Graph-Based Image Segmentation得到)可能是根據顏色、紋理、部分封閉等原因得到的,一個單一的策略很難能適應所有的情況將小區域合並在一起,因此需要有一個多元化的策略集,能夠在不同場合都有效。
- 能夠快速計算。
R-CNN的缺點:第一,它把每一個子圖片都調整到一個固定的大小,這樣的話原圖長寬比例會扭曲,影響后面CNN分類器的效果。第二,它需要把每一個候選子圖片逐一輸入到CNN里做分類,速度很慢並且有重復計算。第三,其訓練是分階段的,對於目標檢測而言,R-CNN首先需要對預訓練模型進行特定類別物體的微調訓練,然后再訓練SVM對提取到的特征進行分類,最后還需要訓練候選框回歸器(Bounding-box Regressor)對候選子圖中的目標進行精確的提取。
(補充:非極大值抑制 http://www.360doc.com/content/16/1230/13/25664332_618876745.shtml
非極大值抑制算法(non maximum suppression, NMS,首先從所有的檢測框中找到置信度較大的那個框,然后挨個計算其與剩余框的IOU,如果其值大於一定閾值(重合度過高),那么就將該框剔除;然后對剩余的檢測框重復上述過程,直到處理完所有的檢測框。
召回率(IoU,Intersection-over-Union),這個是一個定位精度評價公式IoU.


)
為了解決第一個和第二個缺點,何凱明提出了SPP net(Spatial Pyramid Pooling).其思路是先對任意大小輸入圖片整體進行卷積操作,然后對得到的特征圖對應候選子圖位置做金字塔池化(Spatial Pyramid Pooling),該操作采用了多種不同的池化尺度,將多個池化后的特征串聯起來作為定長的特征向量,再把該特征圖繼續輸入到后續的CNN分類器中,這樣不需要對每個候選子圖分別輸入CNN處理,大大提高了檢測速度。同時,采用金字塔池化的網絡不需要固定尺寸的輸入圖像,也彌補了第一個缺陷。然而第三個缺陷仍然存在。但是仍存在第三個缺點。
SPP的優點:
1)任意尺寸輸入,固定大小輸出
2)層多
3)可對任意尺度提取的特征進行池化。
SPP網絡的核心思想:(https://blog.csdn.net/bryant_meng/article/details/78615353)
通過對feature map進行相應尺度的pooling,使得能pooling出4×4, 2×2, 1×1的feature map,再將這些feature map concat成列向量與下一層全鏈接層相連。這樣就消除了輸入尺度不一致的影響。


(https://blog.csdn.net/bryant_meng/article/details/78615353)
SPP-Net與R-CNN的對比(https://blog.csdn.net/v1_vivian/article/details/73275259)

對於R-CNN,整個過程是:
首先通過選擇性搜索,對待檢測的圖片進行搜索出~2000個候選窗口。
把這2k個候選窗口的圖片都縮放到227*227,然后分別輸入CNN中,每個proposal提取出一個特征向量,也就是說利用CNN對每個proposal進行提取特征向量。
把上面每個候選窗口的對應特征向量,利用SVM算法進行分類識別。
---------------------
而對於SPP-Net,整個過程是:
首先通過選擇性搜索,對待檢測的圖片進行搜索出2000個候選窗口。這一步和R-CNN一樣。
特征提取階段。這一步就是和R-CNN最大的區別了,這一步驟的具體操作如下:把整張待檢測的圖片,輸入CNN中,進行一次性特征提取,得到feature maps,然后在feature maps中找到各個候選框的區域,再對各個候選框采用金字塔空間池化,提取出固定長度的特征向量。而R-CNN輸入的是每個候選框,然后在進入CNN,因為SPP-Net只需要一次對整張圖片進行特征提取,速度會大大提升。
最后一步也是和R-CNN一樣,采用SVM算法進行特征向量分類識別。
---------------------
為了進一步提升速度和解決第三個問題,后續R.Girshick提出了端到端訓練的Fast R-CNN網絡。該網絡用ROI(Region Of Interest)池化,該操作可以看作空間金字塔的簡化版本,即使用了一種池化尺度。Fast R-CNN在訓練時通過共享訓練使效率更高,,比如每個mini-batch的訓練樣本來自N=2張輸入圖片,為了獲取R=128個學習樣本,需要從每張圖片中采樣R/N=64個ROI.由於對於同一張圖片的不同ROI之間在前向傳播和反向傳播時是共享計算、共享內存的,因此相比於128個來自128個圖片的ROI,該網絡有64倍的速度提升。此外,該網絡將候選框回歸任務部分也一同通過CNN實現,在卷積層后面的全連接層分為兩支,一支用於識別目標類別,一支用於預測回歸框所在位置及長寬。值得注意的是,為了實現端到端的訓練,Fast R-CNN放棄了SVM分類器,而是選擇微調后網絡自身的softmax分類器。這樣一來,特征提取,目標分類、候選框回歸三部分可以同時進行端到端(end-to-end)訓練。(基於VGG16的Fast RCNN算法在訓練速度上比RCNN快了將近9倍,比SPPnet快大概3倍;測試速度比RCNN快了213倍,比SPPnet快了10倍。在VOC2012上的mAP在66%左右。https://www.baidu.com/link?url=nS819zbqUvKfNAS1TYahDDOnj8h51brO52A6uCCbf91y24ySVl35CTqOSGL4jO94ohnLJwdrDRzUcjWbitjOLEB0OuQ3ZQg_nLphnpUWKwi&wd=&eqid=f39d3d6d0002346f000000055bc1bd8f)

(https://blog.csdn.net/amor_tila/article/details/78809791)
Fast R-CNN算法的主網絡還是VGG16,按訓練過程和測試過程來講會清晰點。
訓練的過程: (https://www.baidu.com/link?url=nS819zbqUvKfNAS1TYahDDOnj8h51brO52A6uCCbf91y24ySVl35CTqOSGL4jO94ohnLJwdrDRzUcjWbitjOLEB0OuQ3ZQg_nLphnpUWKwi&wd=&eqid=f39d3d6d0002346f000000055bc1bd8f)
輸入是224*224,經過5個卷積層和2個降采樣層(這兩個降采樣層分別跟在第一和第二個卷積層后面)后,進入ROIPooling層,該層是輸入是conv5層的輸出和region proposal,region proposal的個數差不多2000。然后再經過兩個都是output是4096的全連接層。最后分別經過output個數是21和84的兩個全連接層(這兩個全連接層是並列的,不是前后關系),前者是分類的輸出,代表每個region proposal屬於每個類別(21類)的得分,后者是回歸的輸出,代表每個region proposal的四個坐標。最后是兩個損失層,分類的是softmaxWithLoss,輸入是label和分類層輸出的得分;回歸的是SmoothL1Loss,輸入是回歸層的輸出和target坐標及weight。
測試的過程:
與訓練基本相同,最后兩個loss層要改成一個softma層,輸入是分類的score,輸出概率。最后對每個類別采用NMS(non-maximun suppression)。
---------------------
Fast R-CNN的流程圖如下,網絡有兩個輸入:圖像和對應的region proposal。其中region proposal由selective search方法得到,沒有表示在流程圖中。對每個類別都訓練一個回歸器,且只有非背景的region proposal才需要進行回歸。ROI pooling:ROI Pooling的作用是對不同大小的region proposal,從最后卷積層輸出的feature map提取大小固定的feature map.
Fast RCNN主要有3個改進:1、卷積不再是對每個region proposal進行,而是直接對整張圖像,這樣減少了很多重復計算。2、用ROI pooling進行特征的尺寸變換,因為全連接層的輸入要求尺寸大小一樣,因此不能直接把region proposal作為輸入。3、將regressor放進網絡一起訓練,每個類別對應一個regressor,同時用softmax代替原來的SVM分類器。

即便如此,Fast R-CNN仍然不夠快,其瓶頸在於使用了Selective Search算法來生成候選子圖。為了提高性能,R.Girshick繼續提出了Faster R-CNN,使用Region Proposal Networks(RPN),即通過神經網絡來學習如何生成Region Proposal.其優勢在於獲得更快收斂速度的同時,將RPN和CNN部分聯合訓練可以提高整體效果。輸入圖片在經過卷積層提取特征圖后,RPN在特征圖上通過滑動窗的方式,在每個位置生成一定數量的anchors(包括不同的尺度和長寬比,這里選取K個),每個anchor都是該特征圖當前位置所對應輸入圖片的一個區域。對於每個anchor位置RPN采用3*3大小的滑動窗,從該區域提取特征並壓縮得到256維度的特征向量,然后通過一支全連接二分類網絡來計算k個anchor所對應候選區域是否含有目標的概率,通過另一支全連接二分類網絡來預測k個尺度的候選框的位置以及長寬。通過縮小各個anchor對應的k個候選框與ground-truth直接的損失函數,RPN可以學習如何從特征圖中檢測到更有可能包含目標的候選子圖。在訓練階段,RPN與CNN交替訓練,並且共享特征提取部分的網絡參數,從而可以實現端到端的訓練。
Faster R-CNN可以簡單地看做“區域生成網絡RPNs + Fast R-CNN”的系統,用區域生成網絡代替FastR-CNN中的Selective Search方法。Faster R-CNN這篇論文着重解決了這個系統中的三個問題:(https://blog.csdn.net/amor_tila/article/details/78809791)
1. 如何設計區域生成網絡;
2. 如何訓練區域生成網絡;
3. 如何讓區域生成網絡和Fast RCNN網絡共享特征提取網絡。
Faster-R-CNN算法由兩大模塊組成:
1.PRN候選框提取模塊;
2.Fast R-CNN檢測模塊。
其中,RPN是全卷積神經網絡,用於提取候選框;Fast R-CNN基於RPN提取的proposal檢測並識別proposal中的目標


(RPN(Region Proposal Network)區域建議網絡用來提取檢測區域,它能和整個檢測網絡共享全圖的卷積特征,使得區域建議幾乎不花時間。)
(https://blog.csdn.net/amor_tila/article/details/78809791)
RCNN解決的是,“為什么不用CNN做classification呢?”
Fast R-CNN解決的是,“為什么不一起輸出bounding box和label呢?”
Faster R-CNN解決的是,“為什么還要用selective search呢?
(https://www.cnblogs.com/skyfsm/p/6806246.html)
以上的思路都很類似,即通過生成候選子圖提供需要檢測的位置信息,通過CNN分類得到類別信息。該方法結果精度很高而速度始終不夠快,難以滿足實時性的需求。YOLO(You Only Look Once)提供了一個新的思路:直接使用CNN結構的輸出層回歸候選框位置以及長寬和目標的類別預測。這個想法直接把目標檢測看作回歸問題,簡單直接有效。YOLO將輸入圖片分為7*7的網格,如果目標中心落在某個網格內部,那么就認為該網格負責對目標的檢測和識別。將輸入圖片縮放到特定尺寸輸入CNN,CNN中的卷積層負責特征提取,全連接層部分負責分類識別以及候選款回歸。對於每個網格,我們可以計算其包含目標的概率,目標屬於各個類別概率以及候選款信息等,對49個網格的結果采用極大值抑制后得到剩余的候選框,就是最終的結果。這個算法最大的特點就是運行迅速,泛化能力強,不過它的缺點是很難檢測到小的物體。
直接將原始圖片分割成互不重合的小方塊,然后通過卷積最后生產這樣大小的特征圖,基於上面的分析,可以認為特征圖的每個元素也是對應原始圖片的一個小方塊,然后用每個元素來可以預測那些中心點在該小方格內的目標,這就是Yolo算法的朴素思想。Yolo算法采用一個單獨的CNN模型實現end-to-end的目標檢測,整個系統如圖5所示:首先將輸入圖片resize到448x448,然后送入CNN網絡,最后處理網絡預測結果得到檢測的目標。(http://www.dataguru.cn/article-12966-1.html)
Yolo的CNN網絡將輸入的圖片分割成S*S網格,然后每個單元格負責去檢測那些中心點落在該格子內的目標,如圖6所示,可以看到狗這個目標的中心落在左下角一個單元格內,那么該單元格負責預測這個狗。每個單元格會預測B個邊界框(bounding box)以及邊界框的置信度(confidence score)。所謂置信度其實包含兩個方面,一是這個邊界框含有目標的可能性大小,二是這個邊界框的准確度。前者記為Pr(object),當該邊界框是背景時(即不包含目標),此時Pr(object)=0。而當該邊界框包含目標時,Pr(object)=1。邊界框的准確度可以用預測框與實際框(ground truth)的IOU(intersection over union,交並比)來表征,記為IOU。因此置信度可以定義為Pr(object)*IOU。很多人可能將Yolo的置信度看成邊界框是否含有目標的概率,但是其實它是兩個因子的乘積,預測框的准確度也反映在里面。邊界框的大小與位置可以用4個值來表征:(x,y,h,w),其中(x,y)是邊界框的中心坐標,而和是邊界框的寬與高。還有一點要注意,中心坐標的預測值(x,y)是相對於每個單元格左上角坐標點的偏移值,並且單位是相對於單元格大小的,單元格的坐標定義如圖6所示。而邊界框的w和h預測值是相對於整個圖片的寬與高的比例,這樣理論上4個元素的大小應該在[0,1]范圍。這樣,每個邊界框的預測值實際上包含5個元素:(x,y,w,h,c),其中前4個表征邊界框的大小與位置,而最后一個值是置信度。


YOLO的核心思想就是利用整張圖作為網絡的輸入,直接在輸出層回歸bounding box的位置和bounding box所屬的類別。
FPN(Feature Pyramid Networks ,特征金字塔)
FPN 主要解決的是物體檢測中的多尺度問題,通過簡單的網絡連接改變,在基本不增加原有模型計算量情況下,大幅度提升了小物體檢測的性能。
對於卷積神經網絡而言,不同深度對應着不同層次的語義特征,淺層網絡分辨率高,學的更多是細節特征,深層網絡分辨率低,學的更多是語義特征。
原來多數的object detection算法都是只采用頂層特征做預測,但我們知道低層的特征語義信息比較少,但是目標位置准確;高層的特征語義信息比較豐富,但是目標位置比較粗略。另外雖然也有些算法采用多尺度特征融合的方式,但是一般是采用融合后的特征做預測,而本文不一樣的地方在於預測是在不同特征層獨立進行的。
---------------------
https://blog.csdn.net/u014380165/article/details/72890275?utm_source=copy
下圖FIg1展示了4種利用特征的形式:
(a)圖像金字塔,即將圖像做成不同的scale,然后不同scale的圖像生成對應的不同scale的特征。這種方法的缺點在於增加了時間成本。有些算法會在測試時候采用圖像金字塔。
(b)像SPP net,Fast RCNN,Faster RCNN是采用這種方式,即僅采用網絡最后一層的特征。
(c)像SSD(Single Shot Detector)采用這種多尺度特征融合的方式,沒有上采樣過程,即從網絡不同層抽取不同尺度的特征做預測,這種方式不會增加額外的計算量。作者認為SSD算法中沒有用到足夠低層的特征(在SSD中,最低層的特征是VGG網絡的conv4_3),而在作者看來足夠低層的特征對於檢測小物體是很有幫助的。
(d)本文作者是采用這種方式,頂層特征通過上采樣和低層特征做融合,而且每層都是獨立預測的。
---------------------
https://blog.csdn.net/u014380165/article/details/72890275?utm_source=copy 
如下圖Fig2。上面一個帶有skip connection的網絡結構在預測的時候是在finest level(自頂向下的最后一層)進行的,簡單講就是經過多次上采樣並融合特征到最后一步,拿最后一步生成的特征做預測。而下面一個網絡結構和上面的類似,區別在於預測是在每一層中獨立進行的。后面有這兩種結構的實驗結果對比,非常有意思,因為之前只見過使用第一種特征融合的方式.
作者的主網絡采用ResNet。
作者的算法大致結構如下Fig3:一個自底向上的線路,一個自頂向下的線路,橫向連接(lateral connection)。圖中放大的區域就是橫向連接,這里1*1的卷積核的主要作用是減少卷積核的個數,也就是減少了feature map的個數,並不改變feature map的尺寸大小.
自底向上其實就是網絡的前向過程。在前向過程中,feature map的大小在經過某些層后會改變,而在經過其他一些層的時候不會改變,作者將不改變feature map大小的層歸為一個stage,因此每次抽取的特征都是每個stage的最后一個層輸出,這樣就能構成特征金字塔。
自頂向下的過程采用上采樣(upsampling)進行,而橫向連接則是將上采樣的結果和自底向上生成的相同大小的feature map進行融合(merge)。在融合之后還會再采用3*3的卷積核對每個融合結果進行卷積,目的是消除上采樣的混疊效應(aliasing effect)。並假設生成的feature map結果是P2,P3,P4,P5,和原來自底向上的卷積結果C2,C3,C4,C5一一對應。
目前多尺度的物體檢測主要面臨的挑戰為:
- 如何學習具有強語義信息的多尺度特征表示?
- 如何設計通用的特征表示來解決物體檢測中的多個子問題?如 object proposal, box localization, instance segmentation.
- 如何高效計算多尺度的特征表示?
本文針對這些問題,提出了特征金字塔網絡 FPN,如圖 1(d) 所示,網絡直接在原來的單網絡上做修改,每個分辨率的 feature map 引入后一分辨率縮放兩倍的 feature map 做 element-wise 相加的操作。通過這樣的連接,每一層預測所用的 feature map 都融合了不同分辨率、不同語義強度的特征,融合的不同分辨率的 feature map 分別做對應分辨率大小的物體檢測。這樣保證了每一層都有合適的分辨率以及強語義特征。同時,由於此方法只是在原網絡基礎上加上了額外的跨層連接,在實際應用中幾乎不增加額外的時間和計算量。
在 Fast RCNN 里,FPN 主要應用於選擇提取哪一層的 feature map 來做 ROI pooling。實驗發現 FPN 篩選 ROI 區域,同樣對於 Fast RCNN 的小物體檢測精度有大幅提升。
Q:如果不考慮時間情況下,image pyramid 是否可能會比 feature pyramid 的性能更高?(http://mdsa.51cto.com/art/201707/545995.htm)
A:作者覺得經過精細調整訓練是可能的,但是 image pyramid 主要的問題在於時間和空間占用太大,而 feature pyramid 可以在幾乎不增加額外計算量情況下解決多尺度檢測問題。
可變形卷積網絡deformable convolutional networks
微軟亞洲研究院視覺計算組的研究員在arXiv上公布了一篇題為“Deformable Convolutional Networks”(可變形卷積網絡)的論文,首次在卷積神經網絡(convolutional neutral networks,CNN)中引入了學習空間幾何形變的能力,得到可變形卷積網絡(deformable convolutional networks),從而更好地解決了具有空間形變的圖像識別任務。(https://blog.csdn.net/baidu_32173921/article/details/74453113)
微軟亞洲研究院的研究員們發現,標准卷積中的規則格點采樣是導致網絡難以適應幾何形變的“罪魁禍首”。為了削弱這個限制,研究員們對卷積核中每個采樣點的位置都增加了一個偏移的變量。通過這些變量,卷積核就可以在當前位置附近隨意的采樣,而不再局限於之前的規則格點。這樣擴展后的卷積操作被稱為可變形卷積(deformable convolution)
卷積神經網絡結構變化——Spatial Transformer Networks,STN創造性地在CNN結構中裝入了一個可學習的仿射變換,目的是增加CNN的旋轉、平移、縮放、剪裁性。為什么要做這個很奇怪的結構呢?原因還是因為CNN不夠魯棒,比如把一張圖片顛倒一下,可能就不認識了.(https://blog.csdn.net/xbinworld/article/details/69367281)
以9個像素點的卷積窗口為例,只要為每個像素點加上一個偏移向量(上圖 (b) (c) (d)),就可做到卷積窗口的可變形。(http://nooverfit.com/wp/msra%E5%BE%AE%E8%BD%AF%E4%BA%9A%E6%B4%B2%E7%A0%94%E7%A9%B6%E9%99%A2-cvpr%E6%9C%80%E6%96%B0%E5%8D%B7%E7%A7%AF%E7%BD%91%E7%BB%9C-deformable-convolutional-networks%E5%8F%AF%E5%8F%98%E5%BD%A2%E5%8D%B7/)(https://www.cnblogs.com/daihengchen/p/6880774.html)
STN是說CNN Kernel放死了(比如3*3大小),但是可以通過圖片變換讓CNN效果更好;而deformable是說既然圖片可能各種情況,那我索性CNN的Kernel本身是不規整的,比如可以有dilation(膨脹),也可以旋轉的,或者看起來完全沒有規則的。如下圖,(a)是常規的一個3*3卷積窗口,(b)藍色點就是原來的卷積窗口加上了一個offset的情況,(c)表示可以對進行窗口進行scale和aspect ratio的變換,(d)表示旋轉;
論文引入了兩種新的模塊來提高卷積神經網絡 (CNN) 對變換的建模能力:可變形卷積 (deformable convolution) 和可變形興趣區域池化(deformable ROI pooling),下面逐一介紹。
(1)可變形卷積 Deformable Convolution

先看傳統卷積的一個定義:(https://blog.csdn.net/xbinworld/article/details/69367281)
R代表一個receptive field的grid: R={(−1,−1),(−1,0),...,(0,1),(1,1)}R={(−1,−1),(−1,0),...,(0,1),(1,1)},以3*3為例。
對於輸出中每一個像素position P0,一般的卷積就是:
而可變形卷積做的是:

再看圖1,把原來的卷積過程分成兩路,上面一路學習offset Δpn,得到H*W*2N的輸出(offset),N=|R|表示grid中像素個數,2N的意思是有x,y兩個方向的offset。有了這個offset以后,對於原始卷積的每一個卷積窗口,都不再是原來規整的sliding window(圖1中的綠框),而是經過平移后的window(藍框),取到數據后計算過程和卷積一致。
就是這樣簡單嗎?其實還相差一點,原因是Δpn不是整數像素,而是一個高精度的小數,不能直接獲取像素坐標,而如果采用簡單粗暴的取整又會有一定誤差,因此就采用了和STN中一樣的做法——雙線性插值,插出每個點的像素值。公式上寫成簡潔的:
![]()
實際上做的就是找到小數的p所在的圖像4像素grid,然后做雙線性插值。上面公式這樣寫了以后可以和STN(參考上一篇)中做法一樣,就通過BP端到端來訓練了。
(2)可變形興趣區域池化 Deformable RoI Pooling
思路和前面一樣,一路學習offset,一路得到真正的pooling結果。

區別在於用的是FC,原因是ROI pooling之后的結果是固定大小的k*k,直接用FC得到k *k個offset。但是這些offset不能直接用,因為ROI區域大小不一,並且input feature map的w和h也是大小不一。作者提出的方法是用一個scale r:
![]()
下面是roi pooling原來的公式(用的是average?這個比較奇怪,一般都是用max的,當然按照這個邏輯,max pooling也很容易推出)

有了offset之后就可以這樣做:

和前面一樣,因為offset是帶小數的,不能直接得到像素,需要用雙線性插值算法得到每一個像素值。注意,這里的offset只有k*k個,而不是每一個像素一個。
(https://blog.csdn.net/qq_21949357/article/details/80538255)
NO3 語義分割
圖像語義分割(Semantic Segmentation)是利用圖像的語義信息,直接對每個像素進行分類。目前主流的做法是通過全卷積網絡(Fully Convolutional Networks)進行逐一的像素特征提取,再使用條件隨機場或者馬爾科夫隨機場對特征進行優化,最后得到分割圖。
NO4 實例分割
實例分割(Instance Segmentation)是物體檢測+語義分割的綜合體。相對於物體檢測的邊界框,實例分割可以精確到物體的邊緣;相對於語義分割,實例分割可以標注出同一物體的不同個體,而不是簡單地標記出一堆屬於人的像素。
(補充:
NO1.Region Proposal:可以解決滑動窗口的問題
候選區域(Region Proposal):是預先找出圖中目標可能出現的位置。它利用了圖像中的紋理、邊緣、顏色等信息,可以保證在選取較少窗口(幾千甚至幾百)的情況下保持較高的召回率(Recall)。
常用的Region Proposal有(詳見"What makes for effective detection proposals?"):
- Selective Search
- Edge Boxes
NO2.性能指標:(https://blog.csdn.net/xiaohu2022/article/details/79600037)
目標檢測問題同時是一個回歸和分類問題。首先,為了評估定位精度,需要計算IoU(Intersection over Union,介於0到1之間),其表示預測框與真實框(ground-truth box)之間的重疊程度。IoU越高,預測框的位置越准確。因而,在評估預測框時,通常會設置一個IoU閾值(如0.5),只有當預測框與真實框的IoU值大於這個閾值時,該預測框才被認定為真陽性(True Positive, TP),反之就是假陽性(False Positive,FP)。
對於二分類,AP(Average Precision評價查准率,查准率是指真正例在預測結果中的所有正例的占比;查全率是指真正例在所有真實正例中所占比例)是一個重要的指標,這是信息檢索中的一個概念,基於precision-recall曲線計算出來,詳情見這里。對於目標檢測,首先要單獨計算各個類別的AP值,這是評估檢測效果的重要指標。取各個類別的AP的平均值,就得到一個綜合指標mAP(Mean Average Precision),mAP指標可以避免某些類別比較極端化而弱化其它類別的性能這個問題。
對於目標檢測,mAP一般在某個固定的IoU上計算,但是不同的IoU值會改變TP和FP的比例,從而造成mAP的差異。COCO數據集提供了官方的評估指標,它的AP是計算一系列IoU下(0.5:0.05:0.9,見說明)AP的平均值,這樣可以消除IoU導致的AP波動。其實對於PASCAL VOC數據集也是這樣,Facebook的Detectron上的有比較清晰的實現。
除了檢測准確度,目標檢測算法的另外一個重要性能指標是速度,只有速度快,才能實現實時檢測,這對一些應用場景極其重要。評估速度的常用指標是每秒幀率(Frame Per Second,FPS),即每秒內可以處理的圖片數量。當然要對比FPS,你需要在同一硬件上進行。另外也可以使用處理一張圖片所需時間來評估檢測速度,時間越短,速度越快。
)
