ssd算法論文理解

這篇博客主要是講下我在閱讀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,擴大數據,具體的作法在此不詳細講解了,筆者之後有時間會加以瞭解並講解的。

相關文章
相關標籤/搜索