slides 講得是相當清楚了:
http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf
配合中文翻譯來看:
https://www.cnblogs.com/cx2016/p/11385009.html
default boxes 核心點講解 及 .cpp 代碼見:https://www.cnblogs.com/sddai/p/10206929.html
小哥的后續論文:
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:
- 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的出現使得大家看到了實時高精度目標檢測的可行性。
一、網絡結構
SSD網絡主體設計的思想是特征分層提取,並依次進行邊框回歸和分類。因為不同層次的特征圖能代表不同層次的語義信息,低層次的特征圖能代表低層語義信息(含有更多的細節),能提高語義分割質量,適合小尺度目標的學習。高層次的特征圖能代表高層語義信息,能光滑分割結果,適合對大尺度的目標進行深入學習。所以作者提出的SSD的網絡理論上能適合不同尺度的目標檢測。
所以SSD網絡中分為了6個stage,每個stage能學習到一個特征圖,然后進行邊框回歸和分類。SSD網絡以VGG16的前5層卷積網絡作為第1個stage,然后將VGG16中的fc6和fc7兩個全連接層轉化為兩個卷積層Conv6和Conv7作為網絡的第2、第3個stage。接着在此基礎上,SSD網絡繼續增加了Conv8、Conv9、Conv10和Conv11四層網絡,用來提取更高層次的語義信息。如下圖3.1所示就是SSD的網絡結構。在每個stage操作中,網絡包含了多個卷積層操作,每個卷積層操作基本上都是小卷積。
骨干網絡:SSD前面的骨干網絡選用的VGG16的基礎網絡結構,如上圖所示,虛線框內的是VGG16的前5層網絡。然后后面的Conv6和Conv7是將VGG16的后兩層全連接層網絡(fc6, fc7)轉換而來。
另外:在此基礎上,SSD網絡繼續增加了Conv8和Conv9、Conv10和Conv11四層網絡。圖中所示,立方體的長高表示特征圖的大小,厚度表示是channel。
二、設計要點
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網絡總共增加了Conv8、Conv9、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
三、訓練策略
訓練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.1、0.3、0.5、0.7和0.9的patch,這些patch在原圖的大小的[0.1, 1]之間,相應的寬高比在[1/2, 2]之間。
- 隨機采取一個patch
四、實驗結果
1. PASCAL VOC 2007
2. 模型分析
3. PASCAL VOC 2012
五、參考文獻
[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的擴大倍數
}
- 1
- 2
- 3
- 4
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)筆記
為什么要學習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.
就是對於上述每一個不同尺度的特征圖(38x38、19x19、10x10、5x5、3x3、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