這篇博客主要是講下我在閱讀ssd論文時對論文的理解,而且自行使用pytorch實現了下論文的內容,並測試能夠用。html
開篇放下論文地址https://arxiv.org/abs/1512.02325,能夠自行參考論文。ios
接着放下我使用pytorch復現的版本地址https://github.com/acm5656/ssd_pytorch,若是這篇博客或者代碼有幫到你,麻煩給個星哈。git
代碼解讀的博客連接以下https://www.cnblogs.com/cmai/p/10080005.html,歡迎你們前來閱讀。github
模型圖架構
首先來介紹下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這有一層卷積,在Conv七、Conv8_二、Conv9_二、Conv10_2和Conv11_2都有一層這樣的卷積層,所以最後提取到6個feature map層。那麼細心的小夥伴會發現,最後的Detections:8732 per Class是怎麼算出來的呢?具體的計算以下:spa
Conv4_3 獲得的feature map大小爲38*38:38*38*4 = 57763d
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,擴大數據,具體的作法在此不詳細講解了,筆者之後有時間會加以瞭解並講解的。