1. 程式人生 > >SSD 演算法詳解 及其 keras 實現(上)

SSD 演算法詳解 及其 keras 實現(上)

https://blog.csdn.net/remanented/article/details/79943418

(看原文吧,我就不進行截圖了)

看了幾天的SSD的論文和keras實現的程式碼,對SSD也有了一定的理解,把這幾天的學習成果記錄下來。可能是因為之前學習了Mask R-CNN 和 YOLOV1、V2,所以SSD一路看下來還是蠻順利的。

SSD:Single Shot Multibox Detector   

演算法原理介紹:
演算法摘要:
    目前基於深度學習的object detection 演算法主要分為了one-stage和two-stage,基於R-CNN系列的是two-stage,先得到proposal,再得到bounding box 和class;而SSD是直接在單個神經網路中直接完成了bounding box 和class的預測。相比於其他的檢測演算法,在處理不同大小的物體檢測的時候,是將影象轉換成不同的大小,分別處理之後再合成在一塊,SSD則是直接使用神經網路(VGG)提取到的多層feature map 來解決不同大小物體的檢測。演算法中與引入了一個新的概念:default box,其實和Faster R-CNN中的anchors的概念很類似。


演算法分部介紹:
basenetwork:

    baseNetwork是用來提起圖片的特徵的,基於VGG16,但在VGG16的基礎上有所改變,把兩個全連線層FC6和FC7換成了兩個卷積網路,並且再加上了4個卷積網路用來構成整個模型的框架。


 

    可以看出其中的6個feature map都用於預測bounding box 和class,並且加起來預測的box的總數為8732個,如此大的數量,可以看出SSD相當於密集取樣,從而能到達較好的檢測效能。與YOLO不同的是,SSD使用的都是卷積來預測。在keras的實現程式碼中有和論文中一定的不同。

defaultbox

    default box 是在每一層feature map中預先計算好的box,用於之後的訓練和預測。在理解default box之前先介紹一下feature cell 的概念,下圖中的有兩層的feature map ,大小分別為8*8和4*4,其中featurecell可以認為是其中的一個方格。在每個feature cell中再進行default box的定義,根據不同的scale和aspectratio來確定defaultbox的形狀。例如在下圖(b)、(c)中,每一個featurecell中有4個defaultbox,並且每個default box的shape是不一樣的,但是它們的scale是一樣的。當然,除了一個,注意觀察在feature cell的中心有一個比feature cell還要小的default box。


    直觀上能夠感覺到4*4的feature map中default box 要比8*8的feature map中default box要大,這也不難理解,因為在隨著卷積的加深,feature map就越來越小,feature map中每一個feature cell是由原圖中更大的感受域得到的,所以越小,它的default box的scale就越大。

給出瞭如下的公式用於計算每一層的scale:


  

    其中Smin=0.2,Smax=0.9,m為feature map的數量,k代表屬於具體的哪一層。可得,最低層的scale=0.2,最高層的scale=0.9,當然,它們都是歸一化最後的值,故在[0,1]之間。之前我對scale的理解存在一定的偏差,以為scale是面積,然而scale的平方才是面積 

    每層中的aspect ratio為5中,每種如下:

       

    所以每個default box的寬計算公式如下:

       

    每個default box的長計算公式如下:

    

    這兩個計算公式也是比較好理解,計算得到的長寬相乘就得到了scale的平方。

    論文提到了當aspect ratio=1的時候,再添加了另外一個scale計算公式:

    


    所以對於每一層feature map中的feature cell理論上都是存在6種defaultbox的,當然在實際的程式碼中還是會選擇性的舍取一些的,因為對於某些aspect ratio 對應的default box 的scale可能會超過原來圖片的大小。每個feature cell的default box的中心點分佈在各個feature cell的中心。

這也是SSD演算法與YOLO的很大不同之處,在很多層的featuremap(每層feature map的resolution也是不同的)上設定大量不同尺寸的default box來檢測不同大小的物體。

在官方給你的caffe程式碼中,6層feature map的default box 對應的實際的scale計算方法如下:

第一層:S1=Smin/2=0.1,scale= S1*img_size = 0.1*300=30

之後的2-6層按照上面公式進行計算:

對公式中的Sk進行100的擴大來計算步長:ceil((ceil(0.9*100)-ceil(0.2*100))/(5-1))=17。且第二層擴到後scale=20,其他的依次為37,54,71,88。然後再除以100回到歸一化的scale上,最終再乘以img_size300 得到60,111,162,213,264。所以6層的實際scale依次為:30、60、111、 162、213、264。最後再根據aspect ratio來調整defaul tbox的具體shape。

在圖C中每個defaultbox預測了4個location值,分別為cx,cy,w,h,以及預測了每個類(c1,c2.....cp)。其中是經過以下的公式編碼之後得到的值。其中b為bounding box 的實際值, d為defaul tbox的實際值。

    


   

    在預測的過程中要得到實際的bounding box 需要進行解碼,解碼的公式也就是編碼的逆過程:

       

    在實際的程式碼中還加入了4個variance值來幫助訓練,如果存在variance,則解碼公式如下有所改變:


    綜上所述,對於一個大小m*n的特徵圖,共有mn個feature cell,每個feature cell設定的default box記為k,那麼每個cell共需要(c+4)k個預測值,所有的cell共需要(c+4)kmn個預測值,由於SSD採用卷積做檢測,所以就需要(c+4)k個3*3的卷積核完成這個特徵圖的檢測過程。檢測的示意圖如下:


Matching the groud truth and default boxes


    在圖中,綠框代表的是groud truth,其他顏色的框是default box。利用每一個groud truth去和所有的default box進行match,計算兩者的IOU,如果IOU大於一個閾值如:0.5,則認為這個defaultbox是對應於該groudtruth,認為是正樣本,否則認為是負樣本。如示意圖中紅色框就存在兩個正樣本和一個負樣本,對於藍色框而言,應該是屬於dog的正樣本,所以一個groud truth可以對應多個default box,但是反過來是不行的。

    因為正負樣本數量差距是很大的,如果直接用於訓練的話會帶來很大的不平衡,也不容易收斂,所以需要進行一定的取樣來控制正負樣本的數量比例為1:3。對負樣本取樣的方式是:把match的誤差進行排序,然後取所需要的負樣本數量top-k即可。


損失函式:


    訓練樣本確定了,然後就是損失函數了。損失函式定義為位置誤差(locatization loss, loc)與置信度誤差(confidence loss, conf)的加權和:

其中N是先驗框的正樣本數量。這裡為一個指示引數,當時表示第i個先驗框與第j個ground truth匹配,並且ground truth的類別為p。c為類別置信度預測值。l為先驗框的所對應邊界框的位置預測值,而g是ground truth的位置引數。對於位置誤差,其採用SmoothL1 loss,定義如下:


    由於的存在,所以位置誤差僅針對正樣本進行計算。值得注意的是,要先對groundtruth的g進行編碼得到,因為預測值 l 也是編碼值,若需要使用到variance,編碼時要加上variance:

對於置信度誤差,其採用softmaxloss:

權重係數a通過交叉驗證設定為1。

資料增廣
    為了達到更好的效能,對資料進行一定增廣,來增加資料量。主要採用的技術有水平翻轉(horizontal flip),隨機裁剪加顏色扭曲(random crop & color distortion),隨機採集塊域(Randomly sample a patch)(獲取小目標訓練樣本),如下圖所示

   隨機剪下具有較大的優勢可以認為是因為:對於小物體,具有放大的作用;對於大物體,具有展現更多細節的作用。


預測過程:
    預測過程比較簡單,對於每個預測框,首先根據類別置信度確定其類別(置信度最大者)與置信度值,並過濾掉屬於背景的預測框。然後根據置信度閾值(如0.5)過濾掉閾值較低的預測框。對於留下的預測框進行解碼,根據先驗框得到其真實的位置引數(解碼後一般還需要做clip,防止預測框位置超出圖片)。解碼之後,一般需要根據置信度進行降序排列,然後僅保留top-k(如400)個預測框。最後就是進行NMS演算法,過濾掉那些重疊度較大的預測框。最後剩餘的預測框就是檢測結果了。

可能原理這塊講的不太好,可以跳轉到了keras具體實現的博文中,裡面詳細的介紹了各個部分的實現:SSD keras實現
--------------------- 
作者:remanented 
來源:CSDN 
原文:https://blog.csdn.net/remanented/article/details/79943418 
版權宣告:本文為博主原創文章,轉載請附上博文連結!