為期一周結合ssd原始碼對ssd的細節進行梳理,其實有些地方仍然不是很明白,但是還是要對自己一周的工作進行總結。
ssd演算法,其英文全名是single shot multibox detector,屬於one-stage方法,multibox指明了ssd演算法是多框**,是相對於rcnn系列目標檢測演算法,yolo系列目標檢測演算法的改進演算法,ssd演算法在準確度和速度上都比yolo要好很多,對於faster r-cnn,首先通過cnn得到候選框,然後再進行分類與回歸,而yolo與ssd可以一步到位完成檢測。相比yolo,ssd採用cnn來直接進行檢測,而不是像yolo那樣在全連線層之後做檢測。其實採用卷積直接做檢測只是ssd相比yolo的其中乙個不同點,另外還有兩個重要的改變,一是ssd提取了不同尺度的特徵圖來做檢測,大尺度特徵圖(較靠前的特徵圖)可以用來檢測小物體,而小尺度特徵圖(較靠後的特徵圖)用來檢測大物體;二是ssd採用了不同尺度和長寬比的先驗框(prior boxes, default boxes,在faster r-cnn中叫做錨,anchors)。yolo演算法缺點是難以檢測小目標,而且定位不准,但是這幾點重要改進使得ssd在一定程度上克服這些缺點。下面我們詳細講解sdd演算法的原理。
ssd是採用vgg16作為基礎網路的,然後在vgg16的基礎上新增了卷積層來獲得更多的特徵圖以用於檢測。ssd的網路結構如圖所示。在**中將ssd和yolo的網路結構進行對比,可以明顯看到ssd利用了多尺度的特徵圖做檢測,模型的輸入大小是300×300。
採用vgg16做基礎模型,首先vgg16是在ilsvrc cls-loc資料集預訓練。然後借鑑了deeplab-largefov,分別將vgg16的全連線層fc6和fc7轉換成 3×3 卷積層 conv6和 1×1卷積層conv7,同時將池化層pool5由原來的stride=2的 2×2 變成stride=1的 3×3 (猜想是不想reduce特徵圖大小),為了配合這種變化,採用了一種atrous algorithm,其實就是conv6採用擴充套件卷積或帶孔卷積(dilation conv),其在不增加引數與模型複雜度的條件下指數級擴大卷積的視野,其使用擴張率(dilation rate)引數,來表示擴張的大小,如下圖6所示,(a)是普通的 3×3 卷積,其視野就是 3×3,(b)是擴張率為1,此時視野變成 7×7 , (c) 擴張率為3時,視野擴大為 15×15,但是視野的特徵更稀疏了。conv6採用 3×33×3 大小但dilation rate=6的擴充套件卷積。
多尺度指的是採用不同大小的特徵圖,結合ssd的網路結構和上圖可以看出,ssd採用了特徵金字塔結構進行檢測,即檢測時用到了conv4-3,conv7,conv6-2,comv7-2,conv8_2,conv9_2這些大小不同的faeture maps,在多個feature maps上同時進行softmax分類和位置的回歸。ssd使用6個不同特徵圖檢測不同尺度的目標。低層**小目標,高層**大目標。
在ssd中引入了prior box,實際上與anchor非常類似,就是一些目標的預選框,後續通過softmax分類+bounding box regression獲得真實目標的位置。ssd按照如下規則生成prior box:
以feature map上每個點的中點為中心(offset=0.5),生成一系列同心的prior box(然後中心點的座標會乘以step,相當於從feature map位置對映回原圖位置)
prior box的長寬以及個數的計算主要根據以下原則,結合網路結構來說明:
其中ar = aspect_ratio=2、3、1/2、1/3
所以中心點所能產生的prior_box的數量為cout(min_size)*1+cout(max_size)*1+cout(aspect_ratio)*n,n為aspect_ratio的個數。
ssd在訓練階段進行了資料預處理,對資料進行了裁剪,放大,縮小,旋轉等操作。
ssd中使用了兩種資料增強的方式:
放大操作: 隨機crop,patch與任意乙個目標的iou為0.1,0.3,0.5,0.7,0.9,每個patch的大小為原圖大小的[0.1,1],寬高比在1/2到2之間。能夠生成更多的尺度較大的目標。
縮小操作: 首先建立16倍原圖大小的畫布,然後將原圖放置其中,然後隨機crop,能夠生成更多尺度較小的目標。
當 groundtruth box 的 中心(center)在取樣的 patch 中且在取樣的 patch中 groundtruth box面積大於0時,我們保留cropimage。
在這些取樣步驟之後,每乙個取樣的 patch 被 resize 到固定的大小,並且以 0.5 的概率隨機的 水平翻轉(horizontally flipped,翻轉不翻轉看prototxt,預設不翻轉)
這樣乙個樣本被諸多batch_sampler取樣器取樣後會生成多個候選樣本,然後從中隨機選乙個樣本送入網路訓練。
和faster rcnn的基本一樣,由分類和回歸兩部分組成,可以參考faster rcnn,這裡不細講。總之,回歸部分的loss是希望**的box和prior box的差距盡可能跟ground truth和prior box的差距接近,這樣**的box就能盡量和ground truth一樣。
上面得到的8732個目標框經過jaccard overlap篩選剩下幾個了;其中不滿足的框標記為負數,其餘留下的標為正數框。緊隨其後:
訓練過程中的 prior boxes 和 ground truth boxes 的匹配,基本思路是:讓每乙個 prior box 回歸並且到 ground truth box,這個過程的調控我們需要損失層的幫助,他會計算真實值和**值之間的誤差,從而指導學習的走向。
ssd 訓練的目標函式(training objective)源自於 multibox 的目標函式,但是在**中將其拓展,使其可以處理多個目標類別。具體過程是我們會讓每乙個 prior box 經過jaccard係數計算和真實框的相似度,閾值只有大於 0.5的才可以列為候選名單;假設選擇出來的是n個匹配度高於百分之五十的框吧,我們令 i 表示第 i個預設框,j表示第 j個真實框,p表示第p個類。那麼x_^p表示 第 i 個 prior box 與 類別 p 的 第 j 個 ground truth box 相匹配的jaccard係數,若不匹配的話,則x_^p=0。總的目標損失函式(objective loss function)就由 localization loss(loc) 與 confidence loss(conf) 的加權求和:
caffe ssd訓練流程
資料處理 1.準備資料集放於 work ssd caffe data traindata裡面jpegimages,annotations 修改引數1 txt.py 裡的 tv 引數,表示 訓練用了多少資料,剩下的就是測試資料。修改引數2 labelmap voc.prototxt裡的標籤 item ...
致曾經遇到的你們 細節梳理
1.按鈕input與button的區別 button在表單中不寫type button 會預設為submit型別,相當於 2.蘋果手機拖動螢幕會阻止程式中的定時器 使用iscroll.js來避免 3.一行字型分上下兩半截顯示 給元素設定高 4.css3實現動畫通過動畫幀替換不同的背景時,ios手機不...
caffe ssd訓練kitti lisa資料集
目的 將kitti lisa資料集合並,進行訓練 一 資料集準備,將兩種資料集準備成voc格式 kitti資料集 車輛行人等 lisa資料集 47種交通標誌 1 準備kitti資料集 建立vocdevkit traffic,並為其建立子目錄 annotations,imagesets,jpegima...