1. 程式人生 > >ssd演算法解讀

ssd演算法解讀

開篇放下論文地址https://arxiv.org/abs/1512.02325,可以自行參考論文。

接著放下我使用pytorch復現的版本地址https://github.com/acm5656/ssd_pytorch,如果這篇部落格或者程式碼有幫到你,麻煩給個星哈。

程式碼解讀的部落格連結如下https://www.cnblogs.com/cmai/p/10080005.html,歡迎大家前來閱讀。

模型圖

首先來介紹下ssd模型:

模型圖如下:

  在圖中,我們可以大概看下模型的結構,前半部分是vgg-16的架構,作者在vgg-16的層次上,將vgg-16後邊兩層的全連線層(fc6,fc7)變換為了卷積層,conv7之後的層則是作者自己新增的識別層。

  我們可以在模型圖中觀察到在conv4_3層,有一層Classifier層,使用一層(3,3,(4*(Classes+4)))卷積進行卷積(Classes是識別的物體的種類數,代表的是每一個物體的得分,4為x,y,w,h座標,乘號前邊的4為default box的數量),這一層的卷積則是提取出feature map,什麼是feature map呢,我們在下文會介紹,這時候我們只需要簡單的瞭解下。不僅在conv4_3這有一層卷積,在Conv7、Conv8_2、Conv9_2、Conv10_2和Conv11_2都有一層這樣的卷積層,因此最後提取到6個feature map層。那麼細心的小夥伴會發現,最後的Detections:8732 per Class是怎麼算出來的呢?具體的計算如下:

  Conv4_3  得到的feature map大小為38*38:38*38*4 = 5776

  Conv7      得到的feature map大小為19*19:19*19*6 = 2166

  Conv8_2  得到的feature map大小為10*10:10*10*6 = 600

  Conv9_2  得到的feature map大小為5 * 5  :5 * 5 * 6 = 150

  Conv10_2得到的feature map大小為3 * 3  :3 * 3 * 4 = 36

  Conv11_2得到的feature map大小為1 * 1  :1 * 1 * 4 = 4

  最後結果為:8732

  這時候會有小夥伴會疑惑,為什麼要乘以4或者6,這個是default box數量,這個會在下文將feature map時介紹到。

  那麼ssd則是在這8732個結果中找到識別的物體。

default box 和 feature map

  講完模型圖,這就來填之前的留下的兩個坑,什麼是feature map和default box呢?

  先看下論文中的圖

  

  feature map則是剛才指的Classifier產生的結果,如圖(b)和(c) b是大小8*8的feature map,c是大小4*4的feature map,其中每一個小個子都包含多個box,同時每個box對應loc(位置座標)和conf(每個種類的得分),default box長寬比例預設有四個和六個,四個default box是長寬比為(1:1)、(2:1)、(1:2)、(1:1)這四個,六個則是添加了(1:3)、(3:1)這兩個,這時候有小夥伴會問,為什麼會有兩個(1:1)呢。這時候就要講下論文中Choosing scales and aspect ratios for default boxes這段內容了。作者認為不同的feature map應該有不同的比例,這是什麼意思呢,代表的是default box中這個1在原圖中的尺寸是多大的,計算公式如下所示:

公式Sk即代表在300*300輸入中的比例,m為當前的feature map是第幾層,k代表的是一共有多少層的feature map,Smin和Smax代表的是第一層和最後一層所佔的比例,在ssd300中為0.2-0.9。那麼S怎麼用呢,作者給出的計算方法是,wk = Sk√ar,hk = Sk / √ar,其中ar代表的是之前提到的default box比例,即(1,2,3,1/2,1/3),對於default box中心點的值取值為((i+0.5) / |fk|,(j+0.5)/|fk|),其中i,j代表在feature map中的水平和垂直的第幾格,fk代表的是feature map的size。那麼重點來了,還記得之前有一個小疑問,為什麼default box的size有兩個1嗎?作者在這有引入了一個Sk' = √Sk*Sk+1,多出來的那個1則是通過使用這個Sk'來計算的,有的小夥伴可能會有疑問,這有了k+1則需要多出來一部分的Sk啊,是的沒錯,作者的程式碼中就添加了兩層,第一層取0.1,最後一層取1。到這位置,基本上模型和default box是解釋清楚了。

損失函式

講完之前的所有內容,模型我們大概都有了瞭解,最後則是損失函式部分了。先放出來論文中的損失函式。

Lconf和Lloc分別代表的是得分損失函式和位置損失函式,N代表的數量,接下來將兩個函式分開來看下:

其中Xijk代表的是第i個default box,第j個box的比例,k代表的是第k個種類,X的值為{0,1},gj代表的是ground truth box,即圖片中類別的位置,有四個,分別為cx,cy,w,h,di則對應的是之前default box計算的大小,然後根據上述公式轉換算出所有的g',使用預測的l進行做差,使用smoothL1損失函式計算損失。

Lconf函式則相對比較簡單,通過使用sigmod求出Cip的正比和反比,求log相加即可。

結束

到此整個ssd模型大體上算是講清楚了,從model到match box到loss函式,算是整體過了一遍,其中還有一些不清楚的地方,可以參考下篇講程式碼實現的部落格。在論文中作者還使用了data argumentation,擴大資料,具體的做法在此不詳細講解了,筆者以後有時間會加以瞭解並講解的。