當前位置:
首頁 > 知識 > 收藏 | 目標檢測網路學習總結(RCNN --> YOLO V3),

收藏 | 目標檢測網路學習總結(RCNN --> YOLO V3),

來源:知乎 -方宇   編輯 :專知


之前總結了一下卷積網路在分類方面的一些網路演變,但是自己做的是語義SLAM,所以對於目標檢測和語義分割甚至實例分割演算法都要有所了解,畢竟以後要拿來用,不了解那根本沒法用。這個也是結合深度學習大講壇的課程和我自己的總結,個人覺得這個課程還是比較不錯的,把整個演算法脈絡給我們講清楚了,只要自己去梳理,也就能夠比較快速的了解。自從2012年深度學習在ImageNet上面大放異彩之後,大家關注到了深度學習在計算機視覺領域的巨大潛力。首先來對比一下傳統的目標檢測演算法和基於深度學習的目標檢測演算法之間的不同點:



深度學慣用於目標檢測的演算法從思路上來看,可以分為兩大類,一類是two stage的方法,也就是把整個分為兩部分,生成候選框和識別框內物體;另一類是one stage的方法,把整個流程統一在一起,直接給出檢測結果,主要包含SSD,YOLO系列。首先介紹兩階段的檢測演算法,其實這條路線基本就是R-CNN SPP Net Fast R-CNN faster RCNN R-FCN FPN,然後集大成者Mask RCNN。




預備知識



先講一下目標檢測裡面都會用到的一些基本知識IOU,非極大值抑制。



IOU其實就是交並比,具體定義如下:


計算框A和框B的重合率:


這個是用來判斷定位的準確度的。

非極大值抑制


所謂非極大值抑制,說白了就是取最大值,這個過程是一個迭代-遍歷-消除的過程。第一步,對所有的框根據置信度進行排序,從低到高放到一個列表裡面,從列表中取出當前置信度最高的,作為目標,把還在列表內的框與目標框進行比較,如果重合度大於閾值,就將該框從列表內刪去,遍歷整個列表。然後再取出當前置信度最高的,重複上述操作,知道這個列表最終變空。




Two st

age




1.RCNN



RCNN是把深度學慣用到目標檢測領域的先驅,開創了一個時代!先了解一下這個方法的整體思路:


首先用Selective Search的方法,獲得一些可能的候選框(這些框可能包含有需要檢測的物體),隨後將這些產生的框送到CNN裡面進行特徵的提取,最後利用支持向量機進行分類。


候選框生成(Selective Search演算法)


下面來了解一下候選框的搜索過程,這個演算法借鑒了層次聚類的思想,把這種思想用到了可能區域的合併中來。這個演算法是基於2004年Felzenszwalb在論文《Efficient Graph-Based Image Segmentation 》上的一個改進,那麼先來介紹一下這一篇論文。


這篇論文提出的是一種基於貪心選擇的圖像分割演算法,論文中把圖像中的每個像素表示圖上的一個節點,每一條連接節點的無向邊都具有一個權重(weights),以衡量其連接的兩個節點之間的不相似度,這篇論文的創新點在於該演算法能夠根據相鄰區域在特徵值上變化速度的大小動態調整分割閾值。這個特徵值就是類間距離和類內距離,如果類間距離大於類內距離就認為是兩個區域。


定義類間距離為對應區域的最小生成樹(因為把圖像看做一個連接圖,所以每個區域可以用最小生成樹來表示)中權重最大的邊的權重值,類間距離定義為兩個區域內相鄰點的最小權重邊,如果兩個區域沒有相鄰邊則取無窮大。但是這樣其實還是有問題,比如一個類中只有一個點的時候,它的類內距離為0,這樣就沒法搞了(每個點都變成了一類),所以作者又引入了一個閾值函數,用來表示兩個區域的區域的類間距離至少要比類內距離大多少才能認為是兩個區域。用公式可以表達如下:


其中Dif表示類間距離,Mint的表達式如下:


這裡的τ就是用來控制最短距離的,一般取為C的負相關函數,k為一個常數。


演算法實現分為以下步驟:


1.首先對所有的邊

進行非遞減排序。


2.把每個節點都作為一個區域,記為S(0)。


3. 按照以下規則有S(q-1)生成

 

,也就是第q條邊連接

 

兩個節點,如果在S(q-1)中

 

是分別屬於兩個區域並且第q條邊的權重小於兩個區域的類內距離,則合併兩個區域。否則令S(q) = S(q-1)。


4.對q=1…m重複步驟3,最終獲得需要的區域分割。論文在後面基於這個思想實現了兩個具體的演算法,一個是直接基於像素的,另一個是把每個像素映射到特徵空間,再使用該演算法,後者效果會好一些。


接下來介紹Selective Search演算法,該演算法利用上面的圖分割演算法獲得的分割區域結果,再一次根據一些搜索策略(相似度)做了一個聚類。也是和上面的思路一致,首先根據獲得的區域,算出每個區域和其他區域的相似度,不相鄰的和自身與自身的相似度都設置為0,得到一個N*N的矩陣,然後將相似度最大的合併,再次計算相似度矩陣(這裡是增量更新,只需要計算新生成的區域和其他區域的相似度就可以了),這樣合併一次較少一個區域,對於N個區域需要執行N-1次合併,最終得到一個區域。

對於相似度的度量,作者主要選取了顏色和區域兩大塊,顏色作者比較了8中模型,最終選擇了HSV,區域主要考量大小、紋理和吻合度(相交包含關係)這三個因素。簡單介紹一下這四個是怎麼計算的:


顏色相似度計算


顏色相似度計算以圖像直方圖的形式來進行的,每個通道分成25個bin(這是他們做了是呀發現效果不錯),這樣3個通道一共75個bin,這裡需要注意的是,要對每個直方圖進行歸一化處理,以便於我們後面計算分數,分數計算如下:


對更新之後的區域,它的計算顏色分布直方圖可以根據下式進行計算:


紋理相似度計算:


這裡使用的是一種類似於SIFT的演算法來描述空間的紋理特性,這裡使用的是描述子,利用SIFT識別材料特性參考這篇論文《Exploring features in a bayesian framework for material recognition》。這裡取了8個方向,方差為1的高斯濾波器(也就是計算加權)對每個通道進行了濾波,然後將得到的結果分到10個bin當中,如果是個3通道的圖像,那麼就一共有3*8*10=240個bin,然後對這些bin做歸一化處理,計算方法如下:


合併後的更新方式也和顏色的更新方式一樣。


大小相似度的計算:


這個其實就是鼓勵小的區域進行合併,也就是把周邊的小區域都合併了:


這裡的size(im)表示整張圖的像素總數。


吻合相似度計算:


這個就是用來填空白的,也就是說如果兩個區域的面積之和與包含他們最小面積相差越小,分數也就越高。


這裡的

用來表示包含兩個區域的最小區域。


最後考慮以上這些因素,得到一個相似度的分數計算:


中這裡的

取值只要在[0,1]就可以,這裡作者強調的是多元化的策略,而不是一個優化,所以這裡作者並沒有進一步的討論。


這樣根據這種相似度的策略,我們就可以獲得一系列的候選框了。(之前也看RCNN,基本就沒去管這個候選框的產生,原來這裡面還這麼複雜!!!!)


這裡雖然產生了候選框,但是候選框的大小不一致,對於卷積網路來說,必須輸入尺寸一致,所以這裡需要對生成的候選框做預處理。


作者在這裡提到了兩大類三種處理辦法,第一類是各向異性縮放,其實也就是直接resize到目標尺寸。第二類是各項同性縮放,這裡有兩種辦法,先擴充然後再裁剪或者是先裁剪再擴充,經過試驗發現第一類直接縮放到目標尺寸效果最好。然後作者還發現如何對獲得的框進行選取也有一些講究,直接取出來的效果不是padding一下效果好,經過試驗發現了padding=16 的效果最好。


CNN提取特徵


提取特徵的架構選擇的是AlexNet,AlexNet的具體介紹可以參考我之前的一篇文章,裡面有介紹。通過五個卷積層和兩個全連接層來對每張圖片提取4096維的特徵,作者這裡使用了在ILSVRC2012數據集上訓練好的分類器模型參數來初始化作者的CNN模型參數,然後在PASCAL VOC訓練集上進行微調。 作者最後根據每張圖片獲得的4096維向量,用支持向量機對圖像進行了分類,這樣出來的可能會出現框重疊的情況,通過非極大值抑制就可以解決這個問題了。


SVM分類


在微調之後,再送到SVM裡面進行分類,在SVM分類裡面,我們需要注意一個問題,SVM是適合於小樣本訓練數據的,所以作者在這裡根據實驗發現把IOU值低於0.7的都當做負樣本來處理,這樣效果會比直接用softmax的效果更好(這裡是經過實驗測出來的,作者也只是給了一些推測,所以神經網路這東西,有時候真的是玄學)。


SVM是一個二分類的問題,如何把它做成多分類問題呢?這裡作者是通過給,21類物體,每一類物體都訓練一個分類器,然後把這些分類器構成一個矩陣的4096*21的矩陣,然後與CNN提取的特徵相乘即可(比如每張圖片提取2000個可能的框,那麼一張圖片訓練下來,到最後一層就是2000*4096),這樣就能獲得分類結果。


預測框回歸


獲得了分類結果之後,我們還需要對預測框進行回歸。這裡需要去學習一個回歸映射,對於所有兩個框之間的不一致,其實我們都可以通過平移和尺度縮放去變換到一起,於是作者就定義了四個函數,分別表示兩個方向的平移和兩個方向的縮放。


現在我們就是要去學這個變換參數,這裡需要注意的是:只有預測框和真實框兩者重疊程度較大的時候(IOU>0.6)才能認為這個是成立的,因為這其實是一種線性變換,要是距離太遠,肯定就不能當做一個線性問題來處理。


這個學習的輸入是P,輸出的是平移變換和尺度縮放的四個值,而不是真實的預測邊框。這四個值時通過pool5層的特徵給學出來的,這個學習可以表示為:


對於訓練樣本,它給出的值可以通過下式求出來:


這樣根據樣本給的尺度變換和預測的尺度變換,損失函數設置如下:


這裡肯定有很多小夥伴會有疑問,為什麼這裡要寫成指數的形式,x,y坐標為什麼要除以寬和高?這裡我的理解這裡使用的是相對尺度,因為遠近觀測不同,那麼他們的中心距離邊界的偏移肯定是不同的,那直接做一個除法,其實就能夠把這種絕對尺度變成了相對尺度。寫成指數形式是因為限制必須要大於0,所以就用了指數。最後這個正則化參數經過試驗,選擇了1000.至此,整個RCNN的東西基本就講完了。


2.SPP Net


這篇論文打開了一個新的思路,我個人認為RCNN其實就是一個組裝,把各種方法組裝到了一起。SPPNet提出了共用特徵卷積圖,這樣一張圖片只用卷一次,速度肯定比你卷2000次要快得多。其次SPPnet引入空間金字塔池化,有效的解決了不同尺度的圖片在全連接層輸出不一致的問題。SPPnet其實就是解決了這兩個問題,步驟還是和RCNN一樣的,先採取一些演算法生成候選框,這裡只對一張圖片卷積一次獲得特徵圖,然後把這些候選框的坐標映射到特徵圖上面,最後分類和回歸。下面仔細介紹一下這個過程:


候選框生成


候選框生成演算法作者既用了Selective Search演算法去與RCNN做對比,發現速度會比RCNN快,精度高。同時作者這裡也使用了一個微軟在2014年ECCV提出的EdgeBoxes演算法,速度會更快。這個方法的主要思路在於利用邊緣信息確定框內的輪廓數和與邊緣重疊的輪廓數。這個演算法的思路步驟可以有下圖給出


第一行是原圖,第二行是經過結構化邊緣提取演算法處理之後得到的邊緣,第三行是經過Edge group處理之後的邊緣,第四行是獲得的正確框,第五行是一些錯誤的框。接下來就j講一下獲得第三行以及第四行的操作。


Edge group顧名思義就是一個邊緣組,作者在每個點上通過不斷尋找8連通點直到邊緣與邊緣之間的角度差值大於90度,以這種方式對邊緣處理之後便獲得了n個Edge group。作者獲得了不同的Edge group之後,會對所有的組與組之間進行相似度評價,它以每個組的平均位置(中心點)作為評價依據,評價函數如下:


在這其中

是兩組的平均方向,θ_ij是平均位置x_i,x_j上的夾角,γ是一個超參數,作者在文中選擇的是2。如果兩個組之間的距離超過了兩個像素,直接將相似度設置為0,同時為了提高計算效率,相似度小於0.05的也直接設置為0.


現在給定了每一個邊緣組以及各個邊緣組之間的相似度,我們先假定已知邊框,就可以計算邊對框的貢獻,也就是權值,把權值為1的組算作該框內部,權值為0的就作為外部處理。對於所有的組計算權值公式如下


這裡T是一個序列,它表示從邊框重疊區域的一個邊緣組到邊框內的一個邊緣組的序列(這裡面每個序列之間的相似度都要大於0),如果一個邊緣組不存在於重疊區域連通的路徑,則權值為1,因為其實這裡會有很多0,所以計算效率是比較快的。獲得了每個組的權值,我們就可以計算一個邊框的得分,計算公式如下:


這裡的

表示一個組內的所有點的數目,

分別表示框的寬和高,k是一個超參數,這裡取的是1.5,用來抵消一些偏差較大的邊框具有更多邊緣的情況。在實際計算中可以通過對圖像積分來加速計算,具體的可以看論文以及代碼。


最後,我們都知道對於一個邊框而言,邊框內部的組應該不如邊框邊緣的組重要,所以對於邊框內部的組,其實就是把這邊框內部的給減去,具體計算如下:


這裡減掉的是以框為中心點,長寬各為整體的1/2的小框。在後面發現以這個作為分數,效果會更好一點。


那麼如何獲得這個重疊區域呢?首先分別對水平邊界和垂直邊界建立兩個矩陣,每個矩陣當中只有邊緣組才存儲索引值,比如沿著每一行先創建一個列表,這裡面存儲的是兩個邊緣組之間的轉變,如果存在連接,就存儲下值,否則記為0,這樣這個矩陣裡面只有有邊緣的地方才會有值。由於絕大部分位置都不屬於邊緣,所以這個數據結構會很方便查找,所以很快就能夠得到一些重疊的區域(具體的建議看看代碼)。建立好了這種存儲結構之後,作者就根據上述的得分情況用貪心演算法搜索得到一些可能存在的框。這就是edge boxes演算法的大體思路。


卷積層提取特徵


這是SPPnet的改進之處了,原來RCNN是對每一個候選框都進行卷積,提特徵,SPPnet通過一次卷積的方式避免了重複計算問題。要一次卷積的話,就需要解決點與點之間的匹配,也就是說原圖像的坐標經過映射之後到特徵圖上的坐標。這個其實是很容易想到的,對於卷積網路而言,只有stride才會改變網路的尺寸,所以對於左上角和右下角的坐標計算的方法如下:


這裡的s是所有stride的乘積。


這樣一幅圖片經過卷積之後,對應的特徵位置就能夠找到,但是由於各個框的大小不一致,而神經網路則是要求輸入的大小要相同,為了解決這個問題RCNN通過裁剪縮放的辦法來解決這個問題,但是這樣會帶來精度的損失,你看,好好一幅圖,左右兩邊明顯看著就不一樣。於是作者就提出了空間池化層來改善這個問題。


作者通過分析,之前通過卷積好之後,把每個區域取出來再送到全連接層裡面去訓練,只要保證輸入到全連接層的數目保證相同,那麼久沒什麼問題了,於是作者對RCNN進行了改進,流程如下:


上面的步驟是RCNN的,下面是作者提出來的空間池化層。這個空間池化層其實思想也分簡單,把每一個邊框,分成3個層次去池化,也就是說將圖片劃分為4*4的小格,每個小格取一個數,2*2的小格每個小格進行池化和對整張圖像進行全局池化,然後在合併起來,這樣得到的輸出就是固定的,具體見下圖


空間池化層實際就是一種自適應的層,這樣無論你的輸入是什麼尺寸,輸出都是固定的。SPPNet改變了卷積的順序,提出了自適應的池化層,避免了預測框大小不一致所帶來的問題。從這個結構設計上來看,整體也非常巧妙,不像RCNN那樣蠻力求解。


SVM分類+邊框回歸


這裡也是延續了RCNN的思路,沒有什麼特別的改進,所以也就不再介紹了。


3.Fast RCNN


這篇論文是Rbg大神的作品,也就是RCNN的作者,這篇論文是他在去了微軟之後做出來,當時何凱明也在微軟,所以這篇論文是借鑒了何凱明的SPP Net的思想的,這篇論文做了一個多任務學習,就是網路同時學了邊框預測和分類兩件事,而不是像以前一樣物體分類歸分類,邊框預測歸邊框預測,因為分別學兩件事其實由於樣本的不同,會變得比較麻煩,佔用存儲空間比較大;同時引入了一個ROI pooling的操作來解決不同邊框大小不一的問題,這個ROI pooling其實就是單層的SPP layer,這就是本文的兩個創新點。


這篇論文還是需要進行預先的產生一些候選框位置,這裡用的是Selective Search演算法產生一些候選框,也就是ROI區域。然後還是對圖片只做一次卷積,獲得特徵圖,然後通過ROI pooling對每個區域獲得一個固定的輸入,經過全連接層之後,分別送到分類的子任務和回歸的子任務當中,然後再通過損失函數對網路參數進行調整。(注意SPP和RCNN之前都是沒有辦法做到一體化調整參數的,他們的都是單任務調整)作者這裡也分析了為什麼SPPnet沒有辦法進行整改網路參數調整,主要是因為是SPPNet在訓練的時候樣本批次都不是來自同一副圖像,這樣反向傳播的時候需要的跨度就會非常的大,這樣就會導致異常低效。作者這裡使用SGD優化的時候,用的是一種分層次小批量採樣的辦法,每一次用N幅圖來更新參數,但是每張圖就取R/N個感興趣區域(這裡的R是指批量的大小),這樣只要N取的小一點,那麼更新參數也是可以實現的(因為這樣你更新參數所需要的其實也就是幾張圖片,而不是像SPP Net那樣需要去更新很多張圖片,其實就是把原來的隨機給固定了一下,固定了只能來自N張圖片,然後在ROI區域上面去隨機採樣),這裡訓練數據保證保證25%的正樣本,75%的負樣本。


ROI區域採樣,其實就是單層的SPP Layer,SPP Layer把每個框劃分為了不同的層級,4*4,2*2,1*1,這裡只保留了一層,也就是每個框經過ROI pooling之後固定輸出H*W,就是將一個款平均劃分成H*W個小格,每個小格內採用最大池化。


網路結構,可以利用經典的網路如VGG等,VGG的介紹可以看我之前的一篇介紹,然後對VGG進行一下小改造,把最後的一層池化換成ROI pooling(這個ROI的位置是根據SPP Net當中的計算圖片到特徵圖映射獲得的,具體公式可以看SPP Net),然後再接全連接層,然後在跟兩個子任務,回歸和分類。


多任務網路,對於一個多任務網路而言,最重要的就是損失函數的設定,這裡的分類採用的是softmax損失函數,定位採用的是平滑L1損失函數,不過訓練的時候需要注意,背景區域不計入定位損失函數。具體表達式如下:


這裡的u>1表示背景的定位損失函數不計入。


同時作者用了兩種方法對網路進行了測試,一種就是單一的圖片,另一種就是對每張圖片進行尺度變換,經過測試雖然多尺度精度高1個百分點左右,但是速度卻更低,這也間接證明了神經網路可以自己學到尺度不變性。


最後作者利用SVD分解來加速全連接層的計算,因為我們通過共享了卷積特徵之後,整個計算量主要就集中在了全連接層的計算上面。(這裡是在測試的時候,訓練的時候不能分解,不然這個矩陣都還沒有得到,我們就沒法做這個分解啊!)簡單介紹一下SVD分解,對於任意一個實數矩陣

 

,SVD分解就是要找到它的左奇異向量


,右奇異向量

 

 

和奇異值矩陣

 

(特徵值):


這裡的U,V都是正交矩陣,也就是

 

。如何構成的呢?這其中U的列是由

 

的歸一化特徵向量按特徵值降序排列組成的,V的列是由


的歸一化特徵向量按特徵值降序排列組成的,Σ對角上的值由或在的特徵值降序組成,其餘為0。




作者在這裡對權值矩陣進行了SVD分解,用前t個最大特徵值來近似矩陣,相當於用兩個小的全連接層去替代了大的全連接層,這樣可以有效的降低計算時間(時間複雜度從O(uv)降到了O(t(u+v)),而不會損失太多的精度。


4.Faster RCNN


Fast RCNN雖然採用了多任務學習把回歸和分類和卷積特徵提取統一了,但是對於產生候選框還是單獨的,於是任少卿在微軟的時候受到何凱明、孫劍的指導,終於把候選框的提取也換成了一個網路,這樣整個四步全部統一到了網路架構,大一統,所以效果也好!簡單來說,可以把Faster RCNN=Fast RCNN+RPN,先看一下整個網路的構成


因為Faster RCNN是一個統一的網路,所以這個區域生成網路也能夠共享前面的卷積特徵,需要注意的是這裡的區域生成網路其實包括兩個任務,第一個是獲得邊框的坐標(回歸4個值),另外一個是這個框內是背景還是前景(二分類)。


這裡作者通過在特徵圖上面滑動生成一些框,注意:這裡每個點都會生成9個框(3種長寬比例和3中尺寸的自由組合,3*3=9,這裡的尺寸是基於原圖而不是特徵圖),然後這些初步的框會去進一步學習一個線性變換,這個與RCNN裡面的框回歸是一樣的,都是去學習尺度的變換和平移變換4個參數。注意:上圖只是針對每一個3*3的滑窗,而不是整個特徵圖都只變為了一個256維的數組。接下來我們都只針對一個滑窗進行討論,每個3*3的滑窗變為了1*1*256維(實際上從這個層來看是W*H*256)的數組,對於判斷前景和背景,我們需要做一個二分類判斷,同時因為有9個尺度大小不同的框,所以我們輸出應該是18維的結果(2*9,用一個1*1*256*18的卷積核即可),同理針對每一個回歸邊框也是輸出36個結果(4*9,用一個1*1*256*36的卷積核)。如果去看caffe的源碼會發現在softmax分類之前和之後都有一個reshape層,這個是與caffe的代碼實現本身有關係,具體可以參考softmax_loss_layer.cpp。


損失函數,這裡RPN網路是有兩個任務,所以這裡的損失函數也是有兩部分組成,一部分是分類,一部分是回歸。在定義損失函數之前,需要先定義什麼是正例,什麼是負例。作者在這裡定義了兩種情況的正例:第一種,與每個真實的框重疊比例最大的是正例,第二,與真實框的IOU值大於0.7的是正例;負例:與任意一個真實框的IOU值都小於0.3的。其餘的框都不計入損失。損失函數的具體表達形式如下:


這裡的回歸框損失函數使用的是L1平滑損失函數。在給出了損失函數和網路結構之後,開始訓練網路,作者在論文中提到了三種訓練方式:交替訓練、近似聯合訓練、非近似聯合訓練。這裡作者用的是交替訓練方式,具體而言分為4步:1.先基於ImageNet訓練好的模型去訓練RPN,2.基於訓練好的RPN和預訓練模型去訓練Fast RCNN,3.把共享的卷積層固定,微調RPN,4.固定共享的卷積層,微調Fast RCNN.這4步交替進行訓練整個網路。


來自於知乎專欄(曉雷機器學習筆記https://zhuanlan.zhihu.com/p/24916624)


最後,為了消除一些冗餘,在生成ROI區域的時候,針對重疊框採用了非極大值抑制(根據二分類輸出的概率)的辦法,減少了一些候選區域,最後得到了候選的區域。


這樣獲得了候選區域,就再把這個送到Fast RCNN網路當中去檢測就可以了。這是一個影響非常深遠的工作,因為第一次把整個目標檢測全部納入到一個網路當中了,而且檢測速度和準確率明顯上升,其實我們這裡可以看到多任務帶來了一系列的好處。


5.R-FCN


這篇論文也是微軟亞洲研究院何凱明孫劍團隊所做的工作,作者通過分析目標分類任務和檢測任務之間的異同,發現對於分類網路而言,要求對位置不敏感,而對於檢測網路而言,對物體的位置是有要求的(因為要把物體定位出來),而當前工作基本都是基於CNN來做抽取特徵,池化會損失位置精度,所以作者提出來了一個位置敏感層,就是說要把這個位置的信息加進去。這是這篇論文的主要思想,就是為當前的檢測網路加入一個位置敏感層。


這個位置敏感層的設計非常的巧妙,先來看看整體的結構框架(我覺得深度學習網路架構非常棒的就是很多東西只要給出了網路的架構,就很容易理解,看論文形象生動)


首先整體架構還是與Faster RCNN差不多還是由一個卷積網路提取特徵,然後用一個RPN來生成一些候選框,最後進行分類和修整候選框的位置。但是這裡需要注意到作者在feature map之後引入了一個卷積操作,得到了一個k*k*(c+1)通道的特徵圖,看下圖更清楚一點。


這個K*K*(C+1)通道的特徵圖是用來幹啥的呢?這個就是作者思路的關鍵點了,作者將ROI區域劃分成k*k的格子(用來池化),每個格子的池化數據都來自於固定的單個通道所對應的區域,這樣其實就能強迫某一個通道只去學習對應格子的特徵。這裡使用了一個平均池化,經過這樣的一個操作之後,獲得的其實就是c+1個通道,每個通道k*k。(這裡其實就是對通道下的功夫)最後把這個k*k個值相加,就能夠獲得c+1個分數,然後用softmax函數就能夠輸出當前區域的預測類別。


在回歸框的設計上也是類似於分類的思路,對每個小框進行估計偏移量和縮放量,這樣就能夠獲得4*k*k個值,然後對著k*k個值進行求和,最終得到回歸框的4個值。


損失函數這裡也是由交叉熵損失函數和平滑L1損失函數構成,對於負例不計算邊框損失函數。訓練的時候還是需要預先訓練邊框生成網路,隨後再進行端到端的訓練。


6.FPN


特徵金字塔網路,這個方法對不同的語義層級都進行了預測,因為對於底層的信息來說,位置精度相對更高,高層語義信息的語義特徵更為抽象,所以本文就將兩者進行了結合。(這篇論文是何凱明去Facebook之後的工作)


這是四種常見的多尺度融合的操作,第一種就是把一副圖片縮放成不同尺寸,然後去對每張圖進行預測,第二種則經神經網路處理後直接對最後的一層做預測,這是SPP Net ,Fast RCNN, Faster RCNN的操作,第三種則是直接從神經網路當中拿出不同尺度拿出來做預測,這是SSS所採用的多層次信息融合,第四種就是本文所使用的多尺度融合,把神經網路中的層拿出來,然後特徵圖進行上採樣,得到與上一個尺度相同的圖像,兩者相加,然後通過一個3*3的卷積核來融合一下,最後再進行預測。(這裡1*1的conv是為了消除通道不一致)


這就是本文的核心思路,非常的簡單,現在作者就用這個網路去替換Faster RCNN當中的RPN網路。原來的RPN網路在一個尺度上面生成不同大小不同長寬比的邊框,這樣並不能利用到多個尺度的信息。作者把從神經網路拿出來的特徵圖稱為C,通過上採樣加融合的特徵圖稱為P,現在把原先的RPN網路在單尺度上生成多尺度的邊框替換為了在不同的P層生成邊框,因為每個P的尺度是不一樣的,所以在每個P層只需要生成一種尺度的邊框(當然長寬比還是要保持不同)。


這樣產生了一些邊框之後,就要進行ROI pooling,因為你這個區域是多個尺度產生的,那麼很自然的就想到在pooling的時候應該要在不同的尺度上pooling,由於你大尺度的邊框是在靠後的層產生的,於是作者給出了一個取特徵層的公式:


這裡作者借鑒了ResNet做目標檢測任務時的取的第4層作為特徵層,所以這裡k_0取的是4。這裡的224是ImageNet中圖像的標準長寬。


接下來的其餘部分和Faster RCNN一致,共享網路,後面接分類和回歸。


7.Mask RCNN


這是一篇引入了分割的目標檢測,其實就是實例分割,這樣就完成了計算機視覺的分類、檢測、分割三個任務,集大成者,目前很多工作都是基於Mask RCNN來開展的。簡單的來說Mask RCNN就是在Faster RCNN的基礎之上又添加了一個語義分割網路(FCN),然後在對ROI Pooling的取整改為了雙線性插值(ROI Align)。


ROI Align是指像素對齊,什麼叫做對齊,也就是說物體怎麼移動,我們檢測結果就怎麼移動,這是因為我們引入了分割網路,分割要求點對點,所以必須要對齊。原來的ROI pooling有兩個操作會損壞位置信息:在候選框映射到特徵圖層的時候,這裡需要取整(因為我們做檢測任務對這個要求精度並不高)第二個是在ROI Pooling的時候,要對特徵層劃分bin,每個bin劃分的時候也是取整。所以引入這個ROI Align其實就是為了解決這兩個問題,那麼其實就很簡單了啊,這兩步我都不取整,取浮點數。首先把邊框從原圖映射到特徵圖的時候,取浮點數,然後對於取每一bin的時候,我們同樣按浮點數來取,最後我們在每一個bin內都取4個點,這4個點均勻分布(他們的位置還是浮點數),這個時候通過雙線性插值來確定浮點數所對應的像素值,然後每個bin對這4個點取max pooling。


這樣我們獲得了每個ROI Align的輸出值之後,我們再引出一條網路,用來做分割,這裡使用的是FCN,下圖是分別以ResNet和FPN為基礎架構的網路結構。


從這個結構圖我們可以看到最後有一個14*14*80和28*28*80輸出,這裡的80是類別,也就是說,這裡我們是在不同的通道上去預測的類別,那麼其實我們在每個通道執行的是一個二分類過程,即前景和背景。這裡和傳統的FCN不同,傳統的FCN是去預測每個像素屬於哪一類,是一個多分類問題。這種方式可以有效的避免類間競爭,這裡的類別信息我們可以通過檢測網路獲得。


對於多任務網路,損失函數是非常關鍵的,我們可以很直觀的判斷損失函數肯定是由3部分組成,框回歸、目標類別、掩碼。函數表達式如下:


前兩項和Faster RCNN當中的定義一樣,第三項,由於我們是二分類的問題,所以這裡使用平均二值交叉熵損失函數(注意,這裡每個通道的損失僅與其對應的類別的ground-truth有關,與其他類別之間無關)。最後一層使用的激活函數是sigmoid激活函數。訓練的時候,還是兩階段訓練,先訓練候選框生成網路再訓練剩下的檢測分割網路。


這篇論文的關鍵點在於,所有組件都是靈活,可替換的,主體網路、檢測網路、分割網路都可替換,針對不同任務需求可以進行個性化指定方案。到目前為止兩階段的目標檢測演算法R-CNN, SPP Net, Fast R-CNN, Faster R-CNN,R-FCN, FPN, Mask R-CNN基本介紹完了,從這個演算法演變過程可以看到,先從分散的組件組建演變為多任務一體化網路,加強多層次特徵融合,挖掘卷積通道的潛力以及多任務組合可以不斷的提升網路的精度。這個其實在分類網路裡面也有體現,感興趣可以看看我之前關於卷積網路結構演變的相關介紹。


One Stage




1. YOLO



YOLO是you only look once的縮寫,從這個名字就可以看出,YOLO的特點就一個字快,其次YOLO可以對整張圖片進行操作,這與RCNN系列不一樣,只針對一個ROI區域。這篇文章的創新點在於,把候選框的生成和檢測一起融合到了一個網路當中實現了實時的目標檢測。YOLO的整體思想是將整個流程放到網路裡面,將整個過程視為一個由網路自動學習的過程(其實從思路上看,更接近於深度學習的本質:讓網路自己去學習一切)而R-CNN系列是將這個過程拆分為兩步,生成候選框、框內檢測。


首先還是來看看YOLO的整體流程:


YOLO整體分三步,第一步將圖片resize為448*448大小,並且每幅圖片分成7*7的格子第二步,通過卷積網路對圖像進行抽取特徵,然後全連接層負責對每個框進行位置的回歸以及每個框包含檢測目標的概率和類別的判斷;第三步,非極大值抑制。


具體操作上:將一張圖片劃分為S*S個小格,每個小格負責檢測落入該區域的物體,同時每個小格要預測B個邊框以及該邊框對應的置信度,這裡的置信度定義為是否含有物體的概率以及預測的框與真實的IOU值(這裡物體的概率只有0或1,其實就是前景或背景)。每一個網格的回歸值有5*B+20個,B個框,每個框需要預測5個值,分別是中心的坐標(邊界框相對於網格單元邊界框的中心,比值),長和寬(相對於整張圖片的長寬,比值)以及置信度,最後每個網格還要預測這20類的概率。所以對於每一張圖片最後的輸出值一共有S*S*(B*5+20)個。在論文中,作者S取的是7,B取的是2。注意這些劃分都只是作者在結構上的設計,具體的體現就是在最後的全連接層輸出上面,沒有對整張圖片進行顯式的劃分。(做深度學習一定要注意,有些東西就是你強制讓網路去學的)


作者這裡預訓練網路的輸入是224*224的,這是基於ImageNet的數據,訓練好了之後,在前面加上4個卷積層,權重隨機初始化,把輸入變成了448*448的。


整體的網路結構如下圖所示:


這個網路架構是在Google Net的基礎上改的,Google Net的介紹可以看我之前的一篇知乎文章,這裡交替使用1*1的卷積層是為了降維。這裡的全連接層激活函數都是使用的漏泄修正線性激活,最後一層是直接輸出的


這裡重點需要介紹一下損失函數,對於one stage的網路而言,結構設計和損失函數的設計是非常重要的。先來看看這個函數到底長啥樣:


一看這個誤差函數就知道,真的是很複雜,其實也就是由三個部分組成的,框的坐標誤差,IOU誤差以及分類的誤差。這裡IOU誤差由分為兩部分,一部分是含有目標的置信度預測值和不含有目標的置信度預測值,這裡需要注意的是對於不含有目標的框的置信度損失,我們需要令他小一點,畢竟一副圖片中大部分都不含有目標,如果這個設置過大的話,那麼容易忽略掉存在目標的框,造成訓練發散,所以這裡設定了權值

。長寬的誤差可以發現這裡用的是根號,這樣做的目的是因為同樣的絕對偏差對於小邊框而言比大邊框影響會更大。YOLO的思想是讓邊框預測落在自己中心的物體,所以這個時候就必須要在損失函數上有所體現,這裡的

表示目標是否出現在第i個網格,

表示第i個網格的第j個邊框負責該預測。YOLO在訓練中不是每個預測框都要與真是IOU計算誤差,這裡選擇的是IOU值最大的與真是邊框求誤差,也就是說每個網格只有一個邊框與真實值求誤差,並反向傳播。


2.YOLO V2(YOLO9000)


這篇論文中作者對YOLO進行了一系列改進,然後得到了YOLO V2,同時作者提出了一種數據聯合訓練方法可以結合不同數據集進行訓練,得到了可以分9000個類別的檢測演算法。


作者借鑒VGG重新設計了一個模型叫darknet-19,.有19個卷積層和5個maxpooling層,處理一張圖片只需要5.58 billion次運算,速度更快(darknet是一個較為輕型的完全基於C與CUDA的開源深度學習框架,其主要特點就是容易安裝,沒有任何依賴項(OpenCV都可以不用),移植性非常好,支持CPU與GPU兩種計算方式)。同時刪除了最後一個卷積層,加上了三個具有1024個濾波器的3×3卷積層,其後是最後的1×1卷積層與我們檢測需要的輸出數量,最終每個格子輸出是125個,因為每個格子需要輸出5個框,每個框需要輸出類別信息20個,置信度和坐標一共5個。


引入BN:作者在每個卷積之後就都加了一個BN層,mAP提升了2個百分點。BN層簡單的來說就是減均值除方差,然後再學一個線性的y=ax+b,這裡a和b是要學習的參量。


高解析度適應:以前是在224*224的網路上進行的預訓練,然後檢測的時候再在前面加卷積層,使解析度變為448*448。作者這次預訓練直接就用的448*448,在ImageNet預訓練然後再去適應檢測網路,mAP提高了4個百分點。


引入錨框,這個是在Faster RCNN裡面提出來的,就是說每個點生成一些長寬大小不一的邊框,所以這裡YOLO把全連接層去掉了,保留了卷積,這樣可以有效的保留空間信息,同時這裡為了保證經過卷積下採樣之後能夠得到唯一的中心點,對圖像進行了縮放,縮放為416*416(416/32=13),原來的YOLO是網格複雜預測類別,邊框負責預測坐標值,V2中每個邊框預測都要預測類別,坐標和置信度。


引入聚類演算法為錨框自動選擇大小,首先在訓練集上運行K-Means演算法,這裡採用的度量函數是基於IOU值的,因為如果是歐式度量的話,那麼較大的邊界框比較小的邊界框產生更多的誤差。


作者在訓練集上發現k=5會有一個比較好的結果,於是每個錨點就產生5個錨框。


直接預測位置,錨框在之前Faster RCNN裡面是用來預測偏移量和縮放的,但是作者發現這樣會導致中心點可以出現在圖像的任意位置(但是我們YOLO是要求只預測落在網格內的物體),所以作者還是沿用了YOLO直接預測坐標的方法。作者是在特徵圖上進行的操作,映入邏輯回歸函數保證了中心位置的偏移只能在(0,1)之間,再加上網格的中心位置坐標,這樣就得到了新的預測中心坐標。(這樣限制了坐標位置)


每個錨框預測五個值,中心點坐標,長和寬以及置信度。需要注意的是這裡的p_w,p_h都是聚類生成的先驗。這個操作和聚類生成錨框長和寬,準確率大概提升了5%。


細粒度融合,無論是Faster RCNN,還是同樣單階段的SSD都用到了多尺度的信息,所以作者這裡也用了一個跨層連接來實現多尺度信息融合,這個與ResNet不同的是:這裡使用的是Concat。就是引一條旁路出來,把26*26的特徵圖通過一個1*1的卷積降維為64通道,這個時候獲得的就是26*26*64,然後通過一個特徵重排(隔行隔列採樣,這樣獲得4個13*13*64的特徵圖,把這四個特徵圖concat起來得到13*13*256)獲得13*13*256的特徵圖,然後再同上一層的13*13*1024一起concat起來作為下一層的輸入。這個方法可以獲得1%的提升。


尺度訓練,因為作者原來是448,後來又變成了416,所以作者就想,希望整個網路能夠適應多個尺度的變化,強迫網路去學習這些參數,所以作者這裡採取了一種策略就是沒迭代10輪就改變一個網路的輸入大小,由於使用了下採樣參數是32,所以不同的尺寸大小也選擇為32的倍數{320,352 …..608},最小320*320,最大608*608。


最後作者在這篇論文中提出了聯合訓練分類和檢測數據集的機制,使得可以分到超過9000個類別。訓練的時候,作者混合來自檢測和分類數據集的圖像。當網路看到標記為檢測的圖像時,就基於完整的YOLOv2損失函數(分類+框)進行反向傳播。當它看到一個分類圖像時,就從該架構的分類特定部分反向傳播損失。


這個就需要解決一個關鍵點,檢測的數據集通常是更廣泛的抽象,比如狗,貓,但是分類卻有更細緻的分類,比如狗有很多種狗,貓也有很多種貓,因此需要整合這兩者的數據。作者在這裡從WordNet(一種認知語言詞典)當中提取出來一個WordTree ,具體操作就是:首先找出ImageNet中一個類別的辭彙在WordNet中到根節點的路徑,如果有很多條路徑到達根節點,那麼選擇最短的那一條。遍歷ImageNet,獲得WordTree


這是一個視覺概念的分層模型,獲得了這棵樹以後,對於每一個節點的概率就根據鏈式法則去計算。


獲得了一個樹之後,對於數據我們就需要重新進行一下標註,也就是標籤擴展,因為Norfolk terrier現在也是terrier又是hunting dog,也是dog,也是animal。所以原來的標籤是[0,0,0,0,0,0,0,1,0,0]可能現在就變為了[0,0,0,1,0,0,1,1,1,1]。這個時候可以在共同的下義詞上執行多次softmax操作。


看到一個檢測圖像時,正常的反向傳播損失。對於分類損失,僅在等於或高於標籤對應的層反向傳播損失。當網路輸入的是分類圖像的時候, 只需找到預測該類別最高概率的邊界框,然後計算其預測樹上的損失。這裡假設預測邊界框與真實標籤的IOU值至少為0.3,並且基於這個假設反向傳播目標損失。


3.YOLO V3


這是最新的一篇,前兩天剛剛放出來,簡直是快到沒朋友,作者文風也很跳脫。相比於YOLO9000,改進的地方如下:


每個框會預測中心點坐標和長度寬度以及該框內有目標的置信度(通過邏輯回歸產生),引入了一個Faster RCNN的閾值,如果IOU小於0.5,就不考慮,在大於0.5的所有邊框裡面選一個先驗最好(預測的IOU最大)的框與真是邊框計算損失(注意:也就是說每個網格最多只有一個邊框與真實的IOU進行計算誤差,如果當前網格所有邊框的預測值都小於0.5,那麼這個網格就不會與真實邊框計算IOU損失。)


用獨立的邏輯分類器代替了softmax函數,因為作者發現用softmax並不能提升性能,同時考慮到了在某些多標籤問題上,softmax限制每個框只有一個類別,不符合實際情況。


引入了一個新的基礎網路,這個網路仿照著ResNet對Darknet-19的改進。


最後作者引入了FPN網路,來對多尺度預測。具體的可以看FPN網路。這篇文章嚴格來說應該是一篇技術報告,因為作者寫的非常之隨意,不過這種文風還是非常之有趣的。


4.SSD


SSD是ECCV2016年的一篇文章,這篇文章也是one stage方法的,當時這篇文章精度比YOLO更高,但是速度比兩階段的都要慢,所以這篇文章引起了極大的關注。作者在SSD裡面指定了不同的長寬比,面積(在YOLO裡面是沒有的,YOLOV2裡面通過聚類產生了一些框的尺寸)同時作者做了多尺度的預測(其實也就是對不同大小的特徵圖做檢測),其實這些思路在之前都已經介紹過了。


SSD300用的是VGG作為基礎架構,在降採樣的時候,每一層特徵圖都會做預測。SSD的設計創新點如下:


1.用多尺度的特徵圖來檢測,這樣做可以對小目標物體有一定的改善,在每個尺度都會做出預測。


2.去掉了全連接層,直接用3*3的卷積去對特徵圖山的每一個點產生k個預測框,每個框會有4個坐標輸出(這裡輸出的是預先設定的bounding box與真實的bounding box的偏移量)以及21個類別輸出,這樣每個點有k*(21+4)個輸出,所以卷積的濾波器數目p=k*(21+4)。


3.設置先驗邊框。由不同的scale 和 ratio 生成,k 個 default boxes,特徵圖的每個點都會產生k個。現在假定輸入為w*h,給定n個不同的大小s,可以獲得ws*hs大小的框,m個不同的比例,可以獲得

大小的框。不同層的感知野不一樣,所以對於不同層上的尺寸選擇也不一樣,作者在論文中給出了一個選擇公式:


這裡的

這裡m表示特徵圖的個數,但是由於conv4_3是單獨設置的,所以取5。那麼我們可以計算出每一層的尺度分別為0.2,0.37,0.54,0.71,0.88,再分別乘以300,就可以得到每一層的具體預測尺寸為:30(conv4_3),60,111,162,213,264。作者在論文中每個尺度設定了一些比例,分別是{1,2,3,1/2,1/3}作者在這裡額外增加了一個框的尺寸s_k^"=√(s_k s_(k+1) ),但是最後一層沒有下一層了,所以最後一層在這個尺度上的設置為315。每個box的中心選擇這裡是在每個點的坐標上偏移了0.5,

 

,其中

表示k個特徵圖的大小

.每個點會生成6個box,在多個層上面做預測,這樣看出SSD其實是一個密集採樣的演算法。


4.匹配策略:這裡和faster RCNN類似。每個ground truth先與其IOU值最大的框匹配,然後只要預測框與一個ground truth的IOU值大於0.5,都進行匹配。


5.損失函數:對於多任務而言,損失函數永遠是一個不可忽視的問題,兩個任務,所以還是分成兩個部分,分類損失函數和定位損失函數。


這裡和Faster RCNN的損失函數設置一樣的,softmax損失和L1平滑損失。


6負難例挖掘:先將每一個物體位置上對應 predictions(default boxes)是背景的 boxes 進行排序,按照 boxes 的 confidence的大小。 選擇最高的幾個,保證最後正負比例在 1:3。(參考:小白將:目標檢測|SSD原理與實現)


5.DSSD


這是對SSD的一個改進,SSD的作者也是本文的作者之一。這篇文章主要是為了解決多尺度融合的問題,原先的SSD,只是在不同的特徵圖上面進行了預測,但是沒有充分考慮到上下文的信息,FPN裡面也提到過。這篇論文主要有兩個貢獻:1.使用了ResNet替代了VGG,提升了特徵的提取能力,同時引入預測模塊,提升了準確度;2.引入轉置卷積,將上下信息融合到一起,提升了精度。


作者將首先將VGG直接替換為ResNet,發現精度反而還下降了一點點,從77.5降到了76.4。這表面如果只是簡單更換網路是不能提升精度的,作者根據論文《A unified multiscale deep convolutional neural network for fast object detection》中提到的改善任務的每個子網路,有助於提升精度,於是作者在每個預測之間,加了一個殘差模塊。


上圖是作者提出的幾種預測模塊,每個模塊的測試結果如下所示:


為了更好的融合上下文信息,作者這裡採取了轉置卷積操作來獲得一個與之前特徵圖對應的高解析度的特徵圖,形成了編碼-解碼的網路結構。轉置卷積這個不是本文提出來的而是在分割網路裡面用的,最早是在ZFNet裡面提出來的,要想理解轉置卷積的過程,需要了解卷積在底層是如何實現的。因為在底層實現的時候,通常會把卷積轉化成SGEMM進行加速,這就需要對輸入圖片進行滑動窗展開。(注意:caffe裡面不是這樣實現的,caffe的實現不是將整張圖轉換為一個向量)


對於矩陣運算y=Cx,首先將圖片展開為向量的形式,這樣就有輸入圖片的大小為16*1,為了加速運算,這裡會將卷積核根據滑動窗進行展開,對於輸出的特徵圖(0,0)上面的點,只是原圖位置中(0,0),(0,1),(0,2),(1,0),(1,1,),(1,2),(2,0),(2,1),(2,2)9個點的加權和,那麼對應矩陣的第一行,應該只有對應位置有值,其餘位置都是0,於是卷積的矩陣可以寫成如下形式:


對於梯度反向傳播公式,則有:


現在將Loss對y的導看做是輸入,Loss對x的導看做輸出,那麼

就是輸入梯度與輸出梯度之間的權值。我們假定一個16*1的經過4*16的矩陣,得到4*1,同理,將4*1的矩陣,經過一個4*16轉置之後,可以獲得16*1。


附:Caffe內部的實現機制如下(參考:余俊:FCN學習:Semantic Segmentation)


對於矩陣運算操作:A*B=C


在caffe內部的操作如下:


這就是im2col過程,這裡的feature matrix對應於上圖中的矩陣B的轉置,k即是卷積核的尺寸,C為輸入的維度,矩陣B中的K=C x k x k,當然N就等於H" x W"了,H",W"對應於輸出的高和寬,顯然H"=(H-k+2*pad)/stride+1,W"=(W-k+2*pad)/stride+1(這裡向下取整),接下來我們看看A矩陣:


A矩陣對應於filter matrix,Cout是輸出的維度,亦即卷積核的個數,K= C x k x k.


所以在caffe中,先調用im2col將filters和input轉換為對應filter matrix(A)和feature matrix(B"),然後再用filter matrix乘以feature matrix的轉置,就得到了C矩陣,亦即輸出矩陣,再將C矩陣通過col2im轉換為對應的feature
map,這就是caffe中完整的卷積的前向傳播過程。


通過轉置卷積獲得了一個與之對應的高解析度特徵圖,然後將兩者合併起來。


藍色的是特徵圖,紅色的是經過轉置卷積獲得的尺度相同的更高級特徵圖,具體的辦法如下圖所示:


作者在論文中也提到,在最後融合的時候,試過加法和乘法,乘法會好一些,大概0.2,但是預測速度會有所降低。


6.RetinaNet(

Focal Loss


這也是何凱明提出來的,這篇論文主要是提出了 Focal
Loss函數,用來消除樣本比例不均衡問題。作者分析了,當前精度表現好的網路都是two-stage的,而one-stage的網路主要優勢在於其速度會非常快。為什麼one-stage不如two-stage的精度高呢?作者通過實驗發現主要是因為two-stage的網路通過生成候選區域,消除了大量的背景,而one-stage的網路卻要在大量的背景當中找到少量的目標信息,這樣負例過多,導致梯度回傳的時候,可能會淹沒掉正例信息,這導致了模型優化的方向,有時候可能不是我們預期的方向。


OHEM是通常採用的一種方法,它通過對loss排序,選出loss最大的樣本來進行訓練,這樣就能保證訓練的區域都是比較難分的區域,但是它又把易於區分的樣本給忽視掉了。


本文提出的Focal Loss就是為了解決one stage的精度問題。這個損失函數是在交叉熵損失函數的基礎上進行的改進,它降低了容易分類樣本的權重,讓整個優化方向更加的專註於難分類的樣本。


標準的交叉熵損失函數如下:


這裡將p寫成以下格式:


果引入一個α,那麼這個α就可以對不同的樣本產生的loss的權重進行控制:


這樣就解決了背景權重過大的問題,但是它並沒有區分難分的樣本和容易分的樣本之間的差異,於是,作者引入了一個γ參數,作為對難分和易分樣本之間差異的衡量:




從這個函數就可以看出對於好分的樣本,loss較小,對於難分的樣本,loss較大


最後兩α和γ一結合就得到了本文提出的新損失函數focal loss:


從函數表達形式可以看出:如果p_t很小,

 

也就是與原來標準的交叉熵損失函數沒有什麼大的變化,若p_t較大,整體就趨於0,對loss貢獻就比較小(也就是容易分類的共享比較小)。最後作者在這篇論文裡面用了一個基於ResNet的FPN的網路結構來驗證了分類這個損失函數的有效性,這裡α=0.25和γ=2效果比較好。


上述涉及論文連接,感興趣的同學請自行下載
.鏈接: https://pan.baidu.com/s/1GTWY5LQvDSGlbZmxjxwSmg 密碼: jti6






喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |