slides 講得是至關清楚了:php
http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdfhtml
配合中文翻譯來看:python
https://www.cnblogs.com/cx2016/p/11385009.htmlgit
default boxes 核心點講解 及 .cpp 代碼見:https://www.cnblogs.com/sddai/p/10206929.htmlgithub
小哥的後續論文:
web
PUBLICATIONS
 |
Frustum PointNets for 3D Object Detection from RGB-D Data [arXiv] [code] [KITTI benchmark] Charles R. Qi, Wei Liu, Chenxia Wu, Hao Su and Leonidas J. Guibas CVPR 2018 |
 |
DSSD : Deconvolutional Single Shot Detector [arXiv] [demo] Cheng-Yang Fu*, Wei Liu*, Ananth Ranga, Ambrish Tyagi, and Alexander C. Berg arXiv preprint arXiv:1701.06659, *=Equal Contribution |
 |
Fast Single Shot Detection and Pose Estimation [pdf] [arXiv] Patrick Poirson, Phil Ammirato, Cheng-Yang Fu, Wei Liu, Jana Kosecka, and Alexander C. Berg 3DV 2016. |
 |
SSD: Single Shot MultiBox Detector [pdf] [arXiv] [code] [video] [slides (pdf)] [slides (keynote)] Wei Liu, Dragomir Anguelov, Dumitru Erhan, Christian Szegedy, Scott Reed, Cheng-Yang Fu, and Alexander C. Berg ECCV 2016 Oral. |
研究領域:算法
I did a great internship at Google Mountain View in 2014 summer. Our team GoogLeNet won the classification and detection challenge in ILSVRC2014. My research speciality is computer vision. The main focus of my current research include:markdown
- Abrige the semantic gap of image understanding with deep neural networks
- 用深度神經網絡縮小圖像理解的語義 gap
- Recognize and detect objects from large scale image and video dataset
- 從大規模圖像和視頻數據集中識別和檢測物體
這篇把核心的contrib點講清楚了網絡
基於」Proposal + Classification」的Object Detection的方法,RCNN系列(R-CNN、SPPnet、Fast R-CNN以及Faster R-CNN)取得了很是好的效果,由於這一類方法先預先回歸一次邊框,而後再進行骨幹網絡訓練,因此精度要高,這類方法被稱爲two stage的方法。但也正是因爲此,這類方法在速度方面還有待改進。由此,YOLO[8]應運而生,YOLO系列只作了一次邊框迴歸和打分,因此相比於RCNN系列被稱爲one stage的方法,這類方法的最大特色就是速度快。可是YOLO雖然能達到實時的效果,可是因爲只作了一次邊框迴歸並打分,這類方法致使了小目標訓練很是不充分,對於小目標的檢測效果很是的差。簡而言之,YOLO系列對於目標的尺度比較敏感,並且對於尺度變化較大的物體泛化能力比較差。框架
針對YOLO和Faster R-CNN的各自不足與優點,WeiLiu等人提出了Single Shot MultiBox Detector,簡稱爲SSD。SSD整個網絡採起了one stage的思想,以此提升檢測速度。而且網絡中融入了Faster R-CNN中的anchors思想,而且作了特徵分層提取並依次計算邊框迴歸和分類操做,由此能夠適應多種尺度目標的訓練和檢測任務。SSD的出現使得你們看到了實時高精度目標檢測的可行性。
[目標檢測]SSD:Single Shot MultiBox Detector
基於」Proposal + Classification」的Object Detection的方法,RCNN系列(R-CNN、SPPnet、Fast R-CNN以及Faster R-CNN)取得了很是好的效果,由於這一類方法先預先回歸一次邊框,而後再進行骨幹網絡訓練,因此精度要高,這類方法被稱爲two stage的方法。但也正是因爲此,這類方法在速度方面還有待改進。由此,YOLO[8]應運而生,YOLO系列只作了一次邊框迴歸和打分,因此相比於RCNN系列被稱爲one stage的方法,這類方法的最大特色就是速度快。可是YOLO雖然能達到實時的效果,可是因爲只作了一次邊框迴歸並打分,這類方法致使了小目標訓練很是不充分,對於小目標的檢測效果很是的差。簡而言之,YOLO系列對於目標的尺度比較敏感,並且對於尺度變化較大的物體泛化能力比較差。
針對YOLO和Faster R-CNN的各自不足與優點,WeiLiu等人提出了Single Shot MultiBox Detector,簡稱爲SSD。SSD整個網絡採起了one stage的思想,以此提升檢測速度。而且網絡中融入了Faster R-CNN中的anchors思想,而且作了特徵分層提取並依次計算邊框迴歸和分類操做,由此能夠適應多種尺度目標的訓練和檢測任務。SSD的出現使得你們看到了實時高精度目標檢測的可行性。
1、網絡結構
SSD網絡主體設計的思想是特徵分層提取,並依次進行邊框迴歸和分類。由於不一樣層次的特徵圖能表明不一樣層次的語義信息,低層次的特徵圖能表明低層語義信息(含有更多的細節),能提升語義分割質量,適合小尺度目標的學習。高層次的特徵圖能表明高層語義信息,能光滑分割結果,適合對大尺度的目標進行深刻學習。因此做者提出的SSD的網絡理論上能適合不一樣尺度的目標檢測。
因此SSD網絡中分爲了6個stage,每一個stage能學習到一個特徵圖,而後進行邊框迴歸和分類。SSD網絡以VGG16的前5層卷積網絡做爲第1個stage,而後將VGG16中的fc6和fc7兩個全鏈接層轉化爲兩個卷積層Conv6和Conv7做爲網絡的第二、第3個stage。接着在此基礎上,SSD網絡繼續增長了Conv八、Conv九、Conv10和Conv11四層網絡,用來提取更高層次的語義信息。以下圖3.1所示就是SSD的網絡結構。在每一個stage操做中,網絡包含了多個卷積層操做,每一個卷積層操做基本上都是小卷積。

骨幹網絡:SSD前面的骨幹網絡選用的VGG16的基礎網絡結構,如上圖所示,虛線框內的是VGG16的前5層網絡。而後後面的Conv6和Conv7是將VGG16的後兩層全鏈接層網絡(fc6, fc7)轉換而來。
另外:在此基礎上,SSD網絡繼續增長了Conv8和Conv九、Conv10和Conv11四層網絡。圖中所示,立方體的長高表示特徵圖的大小,厚度表示是channel。
2、設計要點
1. Default Boxes生成
在目標檢測網絡設計中,Default Boxes生成都是重中之重,也許直接決定了網絡能針對的任務以及檢測的性能。在SSD中,做者充分的吸收了Faster R-CNN中的Anchors機制,在每一個Stage中根據Feature Map的大小,按照固定的Scale和Radio生成Default Boxes。這裏爲了方便闡述,選取了Conv9的Feature Map,輸出大小爲5x5。SSD網絡中做者設置Conv9的每一個點默認生成6個box,以下圖所示。所以在這一層上,共生成了5x5x6=150個boxes。

2. 特徵向量生成
在每張特徵圖上獲得許多Default Box後還須要生成相應的特徵向量,用來進行邊框迴歸和分類。對於邊框迴歸,只須要4維向量便可,分別表明邊框縮放尺度(座標軸兩個方向)和平移向量(座標軸兩個方向)。對於分類,SSD網絡採起爲每一個類別進行打分的策略,也就是說對於每一個Default Box,SSD網絡會計算出相應的每一個類別的分數。假設數據集類別數爲c,加上背景,那麼總的類別數就是c+1類。SSD網絡採用了c+1維向量來分別表明該Default Box對於每一個類別所獲得的分數。這裏,假設是VOC數據集,那麼每一個Default Box將生成一個20 + 1 + 4 = 25維的特徵向量。一樣,以Conv9輸出特徵圖5x5爲例。

3. 新增卷積網絡
SSD網絡在VGG基礎上新增長了幾個卷積網絡(如網絡結構中所述)。SSD網絡總共增長了Conv八、Conv九、Conv10和Conv11四個卷積網絡層。新增的這些網絡都是經過一些小的卷積核操做。引用論文所說,這些小的卷積核操做是SSD網絡性能優秀的核心。下面本報告將簡單的闡述一下做者對於卷積網絡的簡單配置。
卷積核配置
- 假設Feature Map通道數爲P,SSD網絡中每一個Stage的卷積核大小統一爲33P。其中padding和stride都爲1。保證卷積後的Feature Map和卷積前是同樣大小。
卷積濾波器
- 每一個Feature Map上mxn個大小的特徵點對應K個Default Boxes,假設類別數+背景=c,最終經過卷積濾波器獲得c+4維特徵向量。那麼一個Feature Map上的每一個點就須要使用kx(c+4)個這樣的濾波器。
4. 聯合LOSS FUNCTION

3、訓練策略
訓練SSD和基於region proposal方法的最大區別就是:SSD須要精確的將ground truth映射到輸出結果上。這樣才能提升檢測的準確率。文中主要採起了如下幾個技巧來提升檢測的準確度。
- 匹配策略
- Default boxes生成器
- Hard Negative Mining
- Data Augmentation
1. 匹配策略
這裏的匹配是指的ground truth和Default box的匹配。這裏採起的方法與 Faster R-CNN中的方法相似。主要是分爲兩步:第一步是根據最大的overlap將ground truth和default box進行匹配(根據ground truth找到default box中IOU最大的做爲正樣本),第二步是將default boxes與overlap大於某個閾值(目標檢測中一般選取0.5,Faster R-CNN中選取的是0.7)的ground truth進行匹配。
2. Default Boxes生成器


3. Hard Negative Mining
通過匹配策略會獲得大量的負樣本,只有少許的正樣本。這樣致使了正負樣本不平衡,通過試驗代表,正負樣本的不均衡是致使檢測正確率低下的一個重要緣由。因此在訓練過程當中採用了Hard Negative Mining的策略,根據Confidence Loss對全部的box進行排序,使得正負樣本的比例控制在1:3以內,通過做者實驗,這樣作能提升4%左右的準確度。
4. Data Augmentation
爲了模型更加魯棒,須要使用不一樣尺度目標的輸入,做者對數據進行了加強處理。
- 使用整張圖像做爲輸入
- 使用IOU和目標物體爲0.一、0.三、0.五、0.7和0.9的patch,這些patch在原圖的大小的[0.1, 1]之間,相應的寬高比在[1/2, 2]之間。
- 隨機採起一個patch
4、實驗結果
1. PASCAL VOC 2007

2. 模型分析


3. PASCAL VOC 2012

5、參考文獻
[1]He K, Zhang X, Ren S, et al. Spatial pyramid pooling in deep convolutional networks for visual recognition[C]//European Conference on Computer Vision. Springer, Cham, 2014: 346-361.
[2]Redmon J, Divvala S, Girshick R, et al. You only look once: Unified, real-time object detection[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 779-788.
[3] Liu W, Anguelov D, Erhan D, et al. Ssd: Single shot multibox detector[C]//European conference on computer vision. Springer, Cham, 2016: 21-37.
[4] https://zhuanlan.zhihu.com/p/24954433
[5] github源碼地址
數據增廣:
目標檢測:SSD的數據加強算法
代碼地址
https://github.com/weiliu89/caffe/tree/ssd
論文地址
https://arxiv.org/abs/1512.02325
數據加強:

SSD數據加強有兩種新方法:(1)expand ,左圖(2)batch_sampler,右圖
expand_param {
prob: 0.5 //expand發生的機率
max_expand_ratio: 4 //expand的擴大倍數
}
expand是指對圖像進行縮小,圖像的其他區域補0,下圖是expand的方法。我的認爲這樣作的目的是在數據處理階段增長多尺度的信息。大object經過expand方法的處理能夠變成小尺度的物體訓練。提升ssd對尺度的泛化性。

annotated_data_param {//如下有7個batch_sampler
batch_sampler {
max_sample: 1
max_trials: 1
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1
min_aspect_ratio: 0.5
max_aspect_ratio: 2
}
sample_constraint {
min_jaccard_overlap: 0.1
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1
min_aspect_ratio: 0.5
max_aspect_ratio: 2
}
sample_constraint {
min_jaccard_overlap: 0.3
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1
min_aspect_ratio: 0.5
max_aspect_ratio: 2
}
sample_constraint {
min_jaccard_overlap: 0.5
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1
min_aspect_ratio: 0.5
max_aspect_ratio: 2
}
sample_constraint {
min_jaccard_overlap: 0.7
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1
min_aspect_ratio: 0.5
max_aspect_ratio: 2
}
sample_constraint {
min_jaccard_overlap: 0.9
}
max_sample: 1
max_trials: 50
}
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1
min_aspect_ratio: 0.5
max_aspect_ratio: 2
}
sample_constraint {
max_jaccard_overlap: 1
}
max_sample: 1
max_trials: 50
}
batch_sampler是對圖像選取一個知足限制條件的區域(注意這個區域是隨機抓取的)。限制條件就是抓取的patch和GT(Ground Truth)的IOU的值。
步驟是:先在區間[min_scale,max_sacle]內隨機生成一個值,這個值做爲patch的高Height,而後在[min_aspect_ratio,max_aspect_ratio]範圍內生成ratio,從而獲得patch的Width。到此爲止patch的寬和高隨機獲得,而後在圖像中進行一次patch,要求知足與GT的最小IOU是0.9,也就是IOU>=0.9。若是隨機patch知足這個條件,那麼張圖會被resize到300300(**在SSD300300中**)送進網絡訓練。以下圖。
batch_sampler {
sampler {
min_scale: 0.3
max_scale: 1
min_aspect_ratio: 0.5
max_aspect_ratio: 2
}
sample_constraint {
min_jaccard_overlap: 0.9
}
max_sample: 1
max_trials: 50
}

SSD數據增廣中的圖像變換與裁剪
SSD在數據增广部分作了不少工做,處理方法集中在load_batch函數中,首先是對每一幀圖像,即每一個datum作DistortImage處理,DistortImage包括亮度、飽和度,色調,顏色灰度扭曲等變換,再進行ExpandImage處理
>>>:如今的方法基本上就是靠大量訓練數據(&negative sampling >>> 題外話:負採樣效果好,有沒有理論上的一些分析,好比稀疏、低維流形啥的),而後「分類」 ;
而人類識別感受是提取到了這類物體的 backbone/sketch,後續再加上各類顏色上的交換等,是瓜熟蒂落的 —— 是否能搞一種 attention 機制;或者是 orthogonal 疊加的機制( 形狀骨架 + 換膚主題,而後再疊加)
另外總以爲 2-D 目標檢測是僞命題——可否將calibration、透視變換、parts 組合成 object ... 這些結構性的機制引入進來?
seems like a fertile field
可能標註數據集也須要修正;

在DistortImage函數中,首先用OpenCV的 cv_img = DecodeDatumToCVMat(datum, param_.force_color())函數將圖像從Datum數據中解碼出來,數據的變形是針對圖片來作的,在ApplyDistort(const cv::Mat& in_img, const DistortionParameter& param)函數中,輸入一個Mat格式的圖片,輸出一個通過DistortionParameter參數所變換後的圖像,其中包括隨機亮度失真變換,隨機對比度失真變換,作隨機飽和度失真變換,隨機色調失真變換和隨機圖像通道變換,這裏是一種排列組合的方法,變換的順序不一樣,獲得的圖片結果也不一樣,根據隨機數是否大於0.5來肯定對比度和色調失真變換的順序。代碼以下:

返回變換後的圖片,再將其編碼成Datum的格式,編碼函數EncodeCVMatToDatum(const cv::Mat& cv_img, const string& encoding, Datum* datum),其中用到了一個opencv圖像編碼的接口cv::imencode("."+encoding, cv_img, buf);再把數據寫入datum中。代碼以下:

接着是ExpandImage(distort_datum, expand_datum)的操做,這個操做是按照百分之五十的機率發生的。ExpandImage能夠理解爲裁剪操做,在SSD中做者也提到裁剪至關與zoom in放大效果,可使網絡對尺度更加不敏感,所以能夠識別小的物體。經過將原圖縮小放到一個畫布上再去裁剪達到縮小的效果。在原文中的Fig.6提到了在數據加強以後SSD網絡確實對小物體識別能力有很大提高。裁剪後的圖像至少一個 groundtruth box 的中心(centroid) 位於該圖像塊中.這樣就能夠避免不包含明顯的前景目標的圖像塊不用於網絡訓練(只有包含明顯的前景目標的圖像塊採用於網絡訓練.)同時,保證只有部分前景目標可見的圖片用於網絡訓練.例如,下面圖像中,Groundtruth box 表示爲紅色,裁剪的圖像塊表示爲綠色. 因爲是隨機裁剪(機率百分之五十),所以有些圖像是包含擴展的畫布,有些則不包含.


在代碼中實現ExpandImage的方法是,先按(1:max_expand_ratio)隨機產生一個比例係數expand_ratio,創造一個expand_ratio*原圖大小的0填充圖,再按照代碼裏的方式肯定一個頂點,用於將原圖粘貼到所創造的「畫布」中,而且肯定好須要這張圖須要裁剪的區域expand_bbox(這個區域我不太懂),而後用平均值進行畫布填充,獲得一張較大的圖,用於後期的裁剪,這樣作的緣由,上文提到了(參考別人說的)

接着就是把填充的圖片編碼成expand_datum,而後進入TransformAnnotation函數,在上面的ExpandImage中,不存在任何對原數據中的AnnotationGroup的處理,即這裏所生成的expand_datum僅僅是圖片的裁剪的datum格式,expand_datum中的Annotation並無作任何賦值或者更新,這一部分工做在TransformAnnotation函數中進行,主要是將原圖的AnnotationGroup中的NormalizedBBox,經過映射變換後,複製到expand_datum的annotation中,注意這裏所取的原圖NormalizedBBox有條件,得知足這個框的中心點在裁剪圖之中,其餘在裁剪框以外的NormalizedBBox就直接捨棄。代碼以下:

這裏就解讀到ExpandImage函數,下一篇將解讀Samples這塊兒的操做。
SSD(Single Shot MultiBox Detector)筆記
Oldpan 2019年5月21日 1條評論 1,043次閱讀 0人點贊
爲何要學習SSD,是由於SSD和YOLO同樣,都是one-stage
的經典構架,咱們必須對其理解很是深入才能觸類旁通設計出更加優秀的框架。SSD這個目標檢測網絡全稱爲Single Shot MultiBox Detector
,重點在MultBox
上,這個思想很好地利用了多尺度的優點,全面提高了檢測精度,以後的YOLOv2就借鑑了SSD這方面的思路才慢慢發展起來。

前言
本文用於記錄學習SSD目標檢測的過程,而且總結一些精華知識點。
爲何要學習SSD,是由於SSD和YOLO同樣,都是one-stage
的經典構架,咱們必須對其理解很是深入才能觸類旁通設計出更加優秀的框架。SSD這個目標檢測網絡全稱爲Single Shot MultiBox Detector
,重點在MultBox
上,這個思想很好地利用了多尺度的優點,全面提高了檢測精度,以後的YOLOv2就借鑑了SSD這方面的思路才慢慢發展起來。
強烈建議閱讀官方的論文去好好理解一下SSD的原理以及設計思路。這裏也提供了相關的pdf:http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf
固然也有不少好的博客對其進行了介紹,在本文的最下方會有相關連接。本篇文章主要爲本身的筆記,其中加了一些本身的思考。
網絡構架
SSD的原始網絡構架建議仍是以論文爲準,畢竟平時咱們接觸到的都是各類魔改版(也就是所謂的換了backbone,例如最多見的SSD-mobilenetv2),雖然與原版大同小異,不過對於理解來講,會增大咱們理解的難度,所以,徹底有必要看一遍原始的論文描述。
SSD在論文中是採起的VGG網絡做爲主幹結構,可是去除了VGG中的最後幾層(也就是咱們常常說的分類層),隨後添加了一些新的內容(在原文中叫作auxiliary structure),這些層分別是:
- 額外的特徵提取層(Extra Feature Layers),做用就是和本來
backbone
的層相結合共同提取出不一樣尺寸的特徵信息,至關於增強了以前的backbone,使其網絡更深,提取能力更增強大。
- 分類層(classification headers),對以前網絡中的不一樣位置網絡層輸出的特徵層(不一樣尺度),進行卷積得出每一個特徵圖中每一個座標對應的分類信息(每一個座標對應着許多default boxes)。
- 座標位置迴歸層(regression hearders),結構與分類層相仿,只是輸出的通道略有不一樣,經過對不一樣尺度的特徵圖進行卷積,輸出的是每一個特徵圖中每一個座標對應的default boxes的偏移座標(文章中稱爲shape offset)。

整體來講,SSD網絡結構其實有四部分組成,backbone部分、額外添加的特徵提取層、分類層以及座標位置迴歸層。注意當初這篇SSD是出於Yolo一代以後二代以前,Yolo二代三代中不一樣尺度的特徵圖思想是有借鑑於SSD的。
用於檢測的多尺度特徵圖
多尺度特徵圖具體表示就是SSD在整個網絡的不一樣位置,取出相應的特徵層進行預測,每一個特徵層由於尺度不同能夠檢測的視野以及目標物體的大小也不一樣。每一個特徵圖能夠預測出分類信息和位置信息,以下圖中能夠看到整個網絡使用從前到後使用了6個不一樣的特徵圖,從38x38x512
到1x1x256
一共六個不一樣尺度的特徵圖。
也就是使用低層feature map檢測小目標,使用高層feature map檢測大目標,是SSD的突出貢獻。

那麼default box是如何產生?
default box
論文中的原話是這樣的:
We associate a set of default bounding boxes with each feature map cell, for multiple feature maps at the top of the network. The default boxes tile the feature map in a convolutional manner, so that the position of each box relative to its corresponding cell is fixed. At each feature map cell, we predict the offsets relative to the default box shapes in the cell, as well as the per-class scores that indicate the presence of a class instance in each of those boxes.
就是對於上述每個不一樣尺度的特徵圖(38x3八、19x1九、10x十、5x五、3x三、1x1),每個特徵圖中的座標中(cell)產生多個default box。對於每一個default box,SSD預測出與真實標定框的偏移(offsets,一共是4個數值,表明位置信息)以及對應於每一個類的機率confidence(c1,c2,...,cpc1,c2,...,cp)。若是一共有c類,每個座標產生k個box,那麼咱們在進行訓練的時候,每一個cell就會產生(c+4)k個數據,若是特徵圖大小爲mxn,那麼總共就是(c+4)kmn,例如3x3的特徵圖,mxn就是3x3。
注意下,上述的那個offset不只是相對於default box
,換個角度來講,也是相對於真實標定框的偏移,通俗了說就是default box
加上offsets就是真實標定框的位置。這個offsets是咱們在訓練學習過程當中能夠計算出來用於損失函數來進行優化的。
在實際預測中,咱們要預測出每一個default box的category以及對應的offset。

這部分我看到更好的介紹,因此這裏不進行贅述,能夠直接看這裏:解讀SSD中的Default box(Prior Box)。
訓練過程
不光要從論文中理解一個網絡的細節部分,還須要詳細瞭解一下訓練的具體過程:
由於咱們要在特徵圖上生成default box
,那麼在訓練階段咱們就須要將GT(Ground Truth)與default box相對應才能進行訓練,怎麼個對應法,SSD中使用了一個IOU閾值來控制實際參與計算的default box的數量,這一步驟發生在數據準備中:

首先要保證每一個GT與和它度量距離最近的(就是iou最大)default box對應,這個很重要,能夠保證咱們訓練的正確性。另外,由於咱們有不少狠多的default box,因此不僅是iou最大的default box要保留,iou知足必定閾值大小的也要保留下來。
也就是說,訓練的過程當中就是要判斷哪一個default boxes
和具體每一張圖中的真實標定框對應,但實際中咱們在每一個特徵圖的每一個cell中已經產生了不少default boxes
,SSD是將全部和真實標定框的IOU(也就是jaccard overlap)大於必定閾值(論文中設定爲0.5)的default boxes都保留下來,而不是隻保留那個最大IOU值的default box
(爲何要這麼作,原論文中說這樣有利於神經網絡的學習,也就是學習難度會下降一些)。
這樣咱們就在以前生成的default boxes中,精挑細選出用於訓練的default boxes(爲了方便,實際訓練中default boxes的數量是不變的,只不過咱們直接將那些iou低於必定閾值的default boxes的label直接置爲0也就是背景)。
損失函數
損失函數也是很簡單,一共有倆,分別是位置損失以及分類損失:
L(x,c,l,g)=1N(Lconf(x,c)+αLloc(x,l,g))L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
其中NN爲matched default boxes的數量,這個NN就是訓練過程一開始中精挑細選出來的default boxes。當NN爲0的時候,此時整體的損失值也爲0。而αα是經過交叉驗證最終獲得的權重係數,論文中的值爲1。
位置損失
其中xijp={1,0}xijp={1,0}表示當前defalut box
是否與真實的標定框匹配(第ii個defalut box
與第jj個真實的標定框,其中類別是pp),通過前面的match步驟後,有∑ixijp∑ixijp大於等於1。
Lloc(x,l,g)=∑i∈P os m∈{cx,cy,w,h}N∑(cx,cy,w,h}xijksmoothL1(lim−g^jm)Lloc(x,l,g)=i∈P os m∈{cx,cy,w,h}∑N(cx,cy,w,h}∑xijksmoothL1(lim−g^jm)
注意,上式中的g^jmg^jm是進行變化後的GroundTruth,變化過程與default box
有關,也就是咱們訓練過程當中使用的GroundTruth值是首先經過default box
作轉換,轉化後的值,分別爲g^jcx,g^jcy,g^jw,g^jhg^jcx,g^jcy,g^jw,g^jh,這四個值,分別是真實的標定框對應default box
的中心座標x,yx,y以及寬度ww和高度hh的偏移量。
也就是下面四個轉換關係,稍微花一點心思就能夠看明白,在訓練的時候實際帶入損失函數的就是下面這四個轉化後的值:
g^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dihg^jcx=(gjcx−dicx)/diwg^jcy=(gjcy−dicy)/dih
g^jw=log(gjwdiw)g^jh=log(gjhdih)g^jw=log(diwgjw)g^jh=log(dihgjh)
同理,既然咱們在訓練過程當中學習到的是default box -> GroundTruth Box
的偏移量,那麼咱們在推測的時候天然也要有一個相反的公式給計算回來,將上面的四個公式反轉一下便可。
分類損失
分類損失使用交叉熵損失,
Lconf(x,c)=−∑i∈PosNxijplog(c^ip)−∑i∈Neglog(c^i0) where c^ip=exp(cip)∑pexp(cip)Lconf(x,c)=−i∈Pos∑Nxijplog(c^ip)−i∈Neg∑log(c^i0) where c^ip=∑pexp(cip)exp