【目標檢測】SSD:

 

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. QiWei LiuChenxia WuHao 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 FuWei LiuJana Kosecka, and Alexander C. Berg 
3DV 2016.
SSD: Single Shot MultiBox Detector [pdf] [arXiv] [code] [video] [slides (pdf)] [slides (keynote)] 
Wei LiuDragomir AnguelovDumitru ErhanChristian Szegedy
Scott ReedCheng-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

數據加強:

圖左是expand方法

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(Single Shot MultiBox Detector)筆記》

前言

本文用於記錄學習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)。

TIM截圖20190502103338

整體來講,SSD網絡結構其實有四部分組成,backbone部分、額外添加的特徵提取層、分類層以及座標位置迴歸層。注意當初這篇SSD是出於Yolo一代以後二代以前,Yolo二代三代中不一樣尺度的特徵圖思想是有借鑑於SSD的。

用於檢測的多尺度特徵圖

多尺度特徵圖具體表示就是SSD在整個網絡的不一樣位置,取出相應的特徵層進行預測,每一個特徵層由於尺度不同能夠檢測的視野以及目標物體的大小也不一樣。每一個特徵圖能夠預測出分類信息和位置信息,以下圖中能夠看到整個網絡使用從前到後使用了6個不一樣的特徵圖,從38x38x5121x1x256一共六個不一樣尺度的特徵圖。

也就是使用低層feature map檢測小目標,使用高層feature map檢測大目標,是SSD的突出貢獻。

20170611145131140

那麼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。

TIM截圖20190429161151

這部分我看到更好的介紹,因此這裏不進行贅述,能夠直接看這裏:解讀SSD中的Default box(Prior Box)

訓練過程

不光要從論文中理解一個網絡的細節部分,還須要詳細瞭解一下訓練的具體過程:

由於咱們要在特徵圖上生成default box,那麼在訓練階段咱們就須要將GT(Ground Truth)與default box相對應才能進行訓練,怎麼個對應法,SSD中使用了一個IOU閾值來控制實際參與計算的default box的數量,這一步驟發生在數據準備中:

TIM截圖20190506164015

首先要保證每一個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步驟後,有∑ixijpixijp大於等於1。

Lloc(x,l,g)=∑i∈P os m∈{cx,cy,w,h}N∑(cx,cy,w,h}xijksmooth⁡L1(lim−g^jm)Lloc(x,l,g)=iP os m{cx,cy,w,h}N(cx,cy,w,h}xijksmoothL1(limg^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=(gjcxdicx)/diwg^jcy=(gjcydicy)/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)=iPosNxijplog(c^ip)iNeglog(c^i0) where c^ip=pexp(cip)exp(cip)

須要注意一點就是xijpxijp表明此時的預測box是否與真實標定框匹配,匹配則爲1,也就是說分類損失前半部分只考慮與label匹配的,也就是positive boxes。然後半部分c^i0c^i0則表示背景分類的損失,即negative boxes的損失,想要讓c^i0c^i0越大(背景正確被分爲背景),就必須讓後半部分的損失越小。

Hard negative mining

這個過程發生在實際訓練過程當中,由於圖像中預測出來的box有不少,並且大部分時negative boxes,因此這裏將消除大部分的negative boxes從而使positive與negative的比例達到1:3。首先對以前通過match步驟,精挑細選以後的default boxes計數。這些default boxes算是positive default boxes,算出此時positive的數量,而後乘以3則是negative boxes的數量。

那麼如何去挑選合適數量的negative boxes?SSD中的挑選規則是:挑選loss最大的boxes,也就是最難學的boxes,根據預測出來的confidence來判斷(這段部分的實現可能與論文中會有所不一樣),那麼什麼算最難學的,由於咱們首先已經根據label(這個label是以前matching過程後的label,label得數量與整張特徵圖中的boxes數量相同,只不過其中的label已經根據matching步驟進行了調整)獲得了positive boxes,這些positive boxes與實際目標都知足必定的條件,並且其中很大機率都有物體。那麼最難學的boxes該如何挑選呢?

咱們在其他的boxes中,由於其他的這些boxes已經不可能包含目標(由於有目標的在matching中都已經被挑選了,這些是剩下的),因此這些boxes的label理應被預測爲background也就是背景,因此這些boxes關於背景的損失值應該是比較小的,也就是模型較爲正確預測了背景。那麼咱們要選最難識別的boxes,也就是最難識別爲背景的boxes,這些叫作negative boxes,首先咱們將其他的這些boxes關於背景的loss排序,而後選取前面必定數量(與positive boxes的比值是3:1)的boxes做爲negative boxes便可。

這段描述可能有些抽象,配上代碼可能更好看一些:

def hard_negative_mining(loss, labels, neg_pos_ratio): """ It used to suppress the presence of a large number of negative prediction. It works on image level not batch level. For any example/image, it keeps all the positive predictions and cut the number of negative predictions to make sure the ratio between the negative examples and positive examples is no more the given ratio for an image. Args: loss (N, num_priors): the loss for each example. labels (N, num_priors): the labels. neg_pos_ratio: the ratio between the negative examples and positive examples. """ pos_mask = labels > 0 num_pos = pos_mask.long().sum(dim=1, keepdim=True) num_neg = num_pos * neg_pos_ratio loss[pos_mask] = -math.inf # put all positive loss to -max _, indexes = loss.sort(dim=1, descending=True) # sort loss in reverse order (bigger loss ahead) _, orders = indexes.sort(dim=1) neg_mask = orders < num_neg return pos_mask | neg_mask 

圖像加強

SSD中已經採起了一些比較好的圖像加強方法來提高SSD檢測不一樣大小不一樣形狀的物體,那就是randomly sample,也就是隨機在圖像片進行crop,提早設定一些比例,而後根據這個比例來對圖像進行crop,可是有一點須要注意那就是這個randomly sample中須要考慮到IOU,也就是咱們crop出來的圖像必須和原始圖像中的GT box知足必定的IOU關係,另外crop出來的圖像也必須知足必定的比例。

經過randomly sample後的圖像其中一定包含原始的GT boxes(不必定全包含),並且crop後的boxes也是正確的。

這部分提及來比較抽象,能夠看看這篇文章,我本身懶得進行演示了:

學習率設置

  • 官方:優化器使用SGD,初始的學習率爲0.001momentum0.9weight-decay0.0005batch-size32
  • 我我的和官方使用的優化器相同,只不過在學習率上經過multi-step的方式(具體能夠看Pytorch相關實現部分),在80和150個epoch階段將學習率衰減至以前的1/10。一共訓練300個epoch。

訓練部分的係數設置僅供參考,不一樣數據的訓練係數略有不一樣。

預訓練權重

我的使用mobilenetv2-SSD的構架對本身的數據進行了訓練,在全部超參數和訓練係數不變的狀況下,若是採用預訓練好的mobilenetv2的權重(在ImageNet上),那麼訓練速度和最終的訓練精度都會高出一截(相同epoch下),因此採用預訓練好的權重信息很重要。

總結

SSD是一個優雅的目標檢測結構,到如今依然爲比較流行的目標檢測框架之一,值得咱們學習,可是SSD對小目標的檢測效果有點差,召回率不是很高,這與SSD的特徵圖以及semantic語義信息有關,另外SSD中也提到了一些對於提高mAP的緣由,其中很大部分是由於圖像加強部分,以前提到的random patch能夠變相地理解爲對圖像進行"zoom in"或者"zoom out",也就是方法或者縮小,這樣加強了網絡監測大目標和小目標的能力(但監測小目標的能力仍是稍微差一點)。

對於SSD的更多討論,我這裏也收集了一些其餘優秀的文章,這裏就不贅述了:

參考連接

https://arleyzhang.github.io/articles/786f1ca3/
https://www.cnblogs.com/sddai/p/10206929.html

相關文章
相關標籤/搜索