日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

python ssd目标检测_解读目标检测之SSD:Single Shot MultiBox Detector

發(fā)布時(shí)間:2025/3/15 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python ssd目标检测_解读目标检测之SSD:Single Shot MultiBox Detector 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

注:md文件,Typora書寫,md兼容程度github=CSDN>知乎,若有不兼容處麻煩移步其他平臺(tái),github文檔供下載。

發(fā)表在CSDN:https://blog.csdn.net/hancoder/article/

發(fā)表在知乎專欄:https://zhuanlan.zhihu.com/c_1088438808227254272

上傳在github:https://github.com/FermHan/Learning-Notes

[TOC]

SSD

SSD:Single Shot MultiBox Detector

作者:Wei Liu

前言

背景知識(shí):faster rcnn與YOLO,不熟悉可參考本人csdn。faster rcnn發(fā)展史:https://blog.csdn.net/hancoder/article/details/87917174 。YOLO:https://blog.csdn.net/hancoder/article/details/87994678 ,知乎專欄也有。

標(biāo)題解釋:SSD:Single Shot MultiBox Detector

Single shot:SSD是one-stage方法,單階段表示定位目標(biāo)和分類的任務(wù)是在網(wǎng)絡(luò)的一次前向傳遞中完成的。而faster rcnn是雙階段的,先通過CNN得到候選框roi,然后再進(jìn)行分類與回歸。 MultiBox:SSD是多框預(yù)測(cè)。 Detector:物體檢測(cè)器,并分類

在faster rcnn中,anchors只作用在最后的conv5_3的特征圖上,這對(duì)檢測(cè)小物體及位置來說是有不足的,所以SSD想在多個(gè)特征圖上用anchors回歸檢測(cè)物體。高層特征圖的語義信息豐富對(duì)分類有益,而低層特征圖語義信息少但位置信息多,利于定位。

SSD有多好:速度與mAP對(duì)比:

SSD:59 FPS with mAP 74.3% on VOC2007 test, Faster R-CNN: 7 FPS with mAP 73.2% YOLO: 45 FPS with mAP 63.4%

框架介紹

如圖,下半部分是YOLO的結(jié)果,他只利用conv5特征圖進(jìn)行回歸分類來目標(biāo)檢測(cè)。缺點(diǎn):小目標(biāo)丟失,位置信息有丟失。

結(jié)構(gòu)圖的上半部分是SSD采樣金字塔結(jié)構(gòu),綜合conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2這些層的feature map進(jìn)行目標(biāo)檢測(cè),同時(shí)進(jìn)行softmax分類和位置回歸。圖上用的是1個(gè)3×3整體卷積出來位置與分類,代碼里是2個(gè)3×3分別卷積,whatever,原理都一樣這也不是重點(diǎn)。加入了先驗(yàn)框。

什么是金字塔結(jié)構(gòu):這里無需復(fù)雜理解,只知道它如上圖結(jié)構(gòu)圖那樣,經(jīng)過池化后圖像逐漸縮小即可。想進(jìn)一步閱讀比SSD更復(fù)雜的金字塔結(jié)構(gòu)可以參考本人FPN博客:https://blog.csdn.net/hancoder/article/details/89048870

SSD創(chuàng)新點(diǎn)

單階段

YOLOv1也是單階段,但SSD比YOLO快還準(zhǔn)。

多特征圖上預(yù)測(cè)

YOLO主要利用conv5_3上的信息進(jìn)行預(yù)測(cè),而SSD利用了多個(gè)特征圖:conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2。

劃分特征圖

r如果是YOLO,會(huì)把特征圖均分成7×7,分割后的每個(gè)小塊叫一個(gè)cell單元,然后以每個(gè)cell單元為中心,像faster rcnn那樣,預(yù)設(shè)一些anchors。不同的是SSD中把a(bǔ)nchors錨稱作了priors或default boxes,而且SSD因?yàn)樵诤芎竺娴奶卣鲌D上操作,所以是以每個(gè)像素為單位劃分的。

prior的具體設(shè)置如下

| 特征圖 | feature_size | prior_per_cell | Total_num |

| ----------- | ------------ | ---------------------- | --------- |

| conv4_3 | 38×38 | 4 | 5776 |

| conv7 | 19×19 | 6 | 2166 |

| conv8_2 | 10×10 | 6 | 600 |

| conv9_2 | 5×5 | 6 | 150 |

| conv10_2 | 3×3 | 4 | 36 |

| conv11_2 | 1×1 | 4 | 4 |

| 輸入300×300 | | 總和對(duì)應(yīng)的即圖上的8732 | 8732 |

此外,因?yàn)閒aster rcnn中是在單個(gè)特征圖conv5_3上放置anchors,所以anchors所在特征圖相對(duì)原圖的比例是不變的,都是1/16。所以faster rcnn的scale統(tǒng)一定3個(gè)值即可。但是SSD是在多個(gè)特征圖上進(jìn)行的,所以后文我們需要介紹在不同特征圖上的priors的scale是如何定義的。

prior的scale與ratio

下面來看下SSD選擇anchor的方法。首先每個(gè)點(diǎn)cell都會(huì)有一大一小兩個(gè)正方形的anchor,小方形的邊長(zhǎng)用min_size來表示,大方形的邊長(zhǎng)用sqrt(min_size*max_size)來表示(min_size與max_size的值每一層都不同)。同時(shí)還有多個(gè)長(zhǎng)方形的anchor,長(zhǎng)方形anchor的數(shù)目在不同層級(jí)會(huì)有差異,他們的長(zhǎng)寬可以用下面的公式來表達(dá),ratio的數(shù)目就決定了某層上每一個(gè)點(diǎn)對(duì)應(yīng)的長(zhǎng)方形anchor的數(shù)目。

在faster rcnn中有scale和ratio兩個(gè)數(shù)值,而SSD中,每個(gè)feature map上的scale的算法是

$s_k=s_{min}+ {{s_{max}-s_{min}}over{m-1}}(k-1),k∈[1,m]$m代表預(yù)測(cè)時(shí)feature map的數(shù)量,如SSD300的m=6,分別是conv4_3、conv7、conv8_2、conv9_2、conv10_2、conv11_2。
在faster rcnn中scale可能是一個(gè)具體的大小,SSD中代表的是相對(duì)輸入圖像的比例。
smax和smin代表最低層和最高層分別有scale:0.2和0.9。$s_{min}=0.2,s_{max}=0.9$。例如最高層回歸出的每個(gè)基礎(chǔ)框的尺寸大小是0.9×300=370。
第k層的min_size=Sk,第k層的max_size=Sk+1。(注意區(qū)分smin和min_size是不同的東西)

SSD按照如下規(guī)則生成prior box:

  • 以feature map上每個(gè)點(diǎn)的中點(diǎn)為中心,生成N(4或6)個(gè)同心的prior box
  • 兩個(gè)正方形prior box變成分別為: $minsize,sqrt{minsize×maxsize}$,其中 $minsize_k=s_k300 , maxsize_k=s_{k+1}*300?$
  • 此外還有4個(gè)正方形,長(zhǎng)寬為:$width=minsize×sqrt{ratio} , heitght=minsize×1/sqrt{ratio}$,其中$ratio={2,3,1/2,1/3}$。(論文中的1是正方形)

注:以上是作者論文中給的計(jì)算各層anchor尺寸的方法,但在作者源碼中給的計(jì)算anchor方法有點(diǎn)差異,沒有和論文的方法完全對(duì)應(yīng)上。管他呢,反正這個(gè)東西都是超參數(shù),差不多就行。

| 特征圖 | min_size | max_size |

| -------- | -------- | -------- |

| conv4_3 | 30 | 60 |

| conv7 | 60 | 111 |

| conv8_2 | 111 | 162 |

| conv9_2 | 162 | 213 |

| conv10_2 | 213 | 264 |

| conv11_2 | 264 | 315 |

預(yù)設(shè)好anchoris后的如何卷積訓(xùn)練

如結(jié)構(gòu)圖,上半部分的橫線上有3×3×(N×(classes+4))的字樣(N為4或6),指的是在各個(gè)特征圖上用3×3卷積,得出的通道數(shù)代表:每個(gè)cell預(yù)設(shè)了N個(gè)框,每個(gè)框有classes個(gè)類別,每個(gè)框有4個(gè)位置坐標(biāo)信息。從這里我們也可以得知SSD與YOLOv1不同,SSD對(duì)于每個(gè)單元的每個(gè)先驗(yàn)框,其都輸出一套獨(dú)立的檢測(cè)值,

訓(xùn)練與loss

給priors賦label

訓(xùn)練時(shí)每個(gè)框要有g(shù)t才能訓(xùn)練,即每個(gè)框要有l(wèi)abel。關(guān)于給框賦label的操作我在我之前的論文Faster rcnn、FPN和YOLO中已多次提及了,這里簡(jiǎn)單引用一下我之前寫的,賦label的原理都是一樣的,不管是在RPN前背景分類還是在fast rcnn具體分類中。

RPN訓(xùn)練時(shí)需要有anchor的前背景類標(biāo)。對(duì)anchor進(jìn)行l(wèi)abel的原理和Faster R-CNN里一模一樣,詳情可以去本人博客https://blog.csdn.net/hancoder/article/details/87917174的RPNlabel部分查看。反正就是與gt的IoU>0.7就是正類label=1,IoU<0.3是負(fù)類背景l(fā)abel=0,其余介于0.3和0.7直接的都扔掉不參與訓(xùn)練label=-1。在faster rcnn中拿256個(gè)anchors訓(xùn)練后得到W×H×9個(gè)roi。

loss的計(jì)算:

SSD的loss和常規(guī)目標(biāo)檢測(cè)的loss一樣:分類loss+位置回歸loss

N是匹配的默認(rèn)框的個(gè)數(shù),$alpha=1$

confidence類別loss:采用交叉熵?fù)p失

$x_{ij}^p=1$代表第i個(gè)default框與第j個(gè)真實(shí)框關(guān)于類別p相匹配,不匹配的$x_{ij}^p=0$。前半個(gè)式子是pisitive,后半個(gè)是negative
根據(jù)上面的賦label策略,一定有$Sigma_ix_{ij}^p>=1?$,這個(gè)式子的物體含義是任一編號(hào)為 j 的框gt,至少有1個(gè)默認(rèn)框與其匹配,即每個(gè)gt框可能賦給了多個(gè)默認(rèn)框。
SSD的類別是1背景+c個(gè)類別,1+c個(gè)置信度,第一個(gè)置信度指的是不含目標(biāo)或者屬于背景的評(píng)分。后面的c個(gè)累唄置信度其實(shí)包含1個(gè)背景,即實(shí)際類別c-1個(gè),自己注意體會(huì)即可。置信度最高的類別即邊框的類別。

location位置loss:

定位誤差即fast rcnn里的smooth L1 loss,坐標(biāo)分別算的是中心坐標(biāo)與寬高。l是預(yù)測(cè)框相關(guān)的數(shù)值,g^是真實(shí)框g相關(guān)的數(shù)值。d是默認(rèn)default框$d=(d^{cx},d^{cy},d^w,d^h)$,預(yù)測(cè)框?yàn)?b=(b^{cx},b^{cy},b^w,b^h)$
無論是l還是g都是需要編碼的,即我們超參默認(rèn)框之后,我們的g^和l都是相對(duì)于默認(rèn)框的位置來進(jìn)行編碼,可以理解為與默認(rèn)框的距離/默認(rèn)框的長(zhǎng)度,這種編碼方式文中叫做offset。具體編碼方式如下

上面稱為編碼encode,預(yù)測(cè)時(shí)我們需要反向這個(gè)過程,即進(jìn)行解碼decode,從預(yù)測(cè)值l中得到邊界框的真實(shí)位置b

variance_encoded_in_target來控制兩種模式,當(dāng)其為True時(shí),表示variance被包含在預(yù)測(cè)值中,就是上面那種情況。但是如果是Fasle(大部分采用這種方式,訓(xùn)練更容易?),就需要手動(dòng)設(shè)置超參數(shù)variance,用來對(duì)ll的4個(gè)值進(jìn)行放縮,此時(shí)邊界框需要這樣解碼:

SSD的其他一些trick

Hard negative mining負(fù)樣本挖掘

在生成一系列的 predictions 之后,會(huì)產(chǎn)生很多個(gè)符合 ground truth box 的 predictions boxes,但同時(shí),不符合 ground truth boxes 也很多,而且這個(gè) negative boxes,遠(yuǎn)多于 positive boxes。這會(huì)造成 negative boxes、positive boxes 之間的不均衡。訓(xùn)練時(shí)難以收斂。

解決措施:先隨機(jī)抽取一定數(shù)目負(fù)框,然后排序抽得分高的若干個(gè)框。選擇最高的幾個(gè),保證最后 negatives、positives 的比例在 3:1。

本文通過實(shí)驗(yàn)發(fā)現(xiàn),這樣的比例可以更快的優(yōu)化,訓(xùn)練也更穩(wěn)定。

Data augmentation數(shù)據(jù)增強(qiáng)

實(shí)驗(yàn)部分

a trous Algorithm

此部分內(nèi)容借鑒了其他博客。

基于VGG16,預(yù)訓(xùn)練過。移除掉drpoout層和FC8,用SGD以0.001學(xué)習(xí)率,0.9動(dòng)量,0.0005權(quán)重衰減,32batch size微調(diào)。

然后借鑒了DeepLab-LargeFOV,分別將VGG16的全連接層fc6和fc7轉(zhuǎn)換成3×3卷積層conv6和1×1卷積層conv7,同時(shí)

將池化層pool5由原來的2×2?s2變成3×3?s1(猜想是不想reduce特征圖大小),為了配合這種變化,采用了一種a trous Algorithm(hole filling algorithm),其實(shí)就是conv6采用擴(kuò)展卷積或帶孔卷積(Dilation Conv),其在不增加參數(shù)與模型復(fù)雜度的條件下指數(shù)級(jí)擴(kuò)大卷積的視野,其使用擴(kuò)張率(dilation rate)參數(shù),來表示擴(kuò)張的大小,如下圖7所示,(a)是普通的3×3卷積,其視野就是3×3,(b)是擴(kuò)張率為2,此時(shí)視野變成7×7,(c)擴(kuò)張率為4時(shí),視野擴(kuò)大為15×15,但是視野的特征更稀疏了。Conv6采用3×3大小但dilation rate=6的擴(kuò)展卷積。

另附兩個(gè)關(guān)于a trous Algorithm(hole filling algorithm)的解讀

博客 1:http://www.cnblogs.com/jianyingzhou/p/5386222.html

最早用的就是 deeplab 的文章了,Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFS 這篇文章和 fcn 不同的是,在最后產(chǎn)生 score map 時(shí),不是進(jìn)行upsampling,而是采用了 hole algorithm,就是在 pool4 和 pool 5層,步長(zhǎng)由 2 變成 1,必然輸出的 score map 變大了,但是 receptive field 也變小了,為了不降低 receptive field,怎么做呢?利用 hole algorithm,將卷積 weights 膨脹擴(kuò)大,即原來卷積核是 3x3,膨脹后,可能變成 7x7 了,這樣 receptive field 變大了,而 score map 也很大,即輸出變成 dense 的了。
這么做的好處是,輸出的 score map 變大了,即是 dense 的輸出了,而且 receptive field 不會(huì)變小,而且可以變大。這對(duì)做分割、檢測(cè)等工作非常重要。

博客 2:http://blog.csdn.net/tangwei2014/article/details/50453334

既想利用已經(jīng)訓(xùn)練好的模型進(jìn)行 fine-tuning,又想改變網(wǎng)絡(luò)結(jié)構(gòu)得到更加 dense 的 score map.
這個(gè)解決辦法就是采用 Hole 算法。如下圖 (a) (b) 所示,在以往的卷積或者 pooling 中,一個(gè) filter 中相鄰的權(quán)重作用在 feature map 上的位置都是物理上連續(xù)的。如下圖 (c) 所示,為了保證感受野不發(fā)生變化,某一層的 stride 由 2 變?yōu)?1 以后,后面的層需要采用 hole 算法,具體來講就是將連續(xù)的連接關(guān)系是根據(jù) hole size 大小變成 skip 連接的(圖 (c) 為了顯示方便直接畫在本層上了)。不要被 (c) 中的 padding 為 2 嚇著了,其實(shí) 2 個(gè) padding 不會(huì)同時(shí)和一個(gè) filter 相連。


pool4 的 stride 由 2 變?yōu)?1,則緊接著的 conv5_1, conv5_2 和 conv5_3 中 hole size 為 2。接著 pool5 由 2 變?yōu)?1 , 則后面的 fc6 中 hole size 為 4。

Additional Notes On SSD

SSD的論文還作了以下的觀察:

  • 更多的default boxes會(huì)帶來更精確的檢測(cè),但耗時(shí)增加
  • 由于detector以多種分辨率運(yùn)行于特征上,因此在多個(gè)圖層上使用MultiBox也會(huì)導(dǎo)致更好的檢測(cè)
  • 80%的時(shí)間花在基礎(chǔ)VGG-16網(wǎng)絡(luò)上:這意味著,使用更快,同樣精確的網(wǎng)絡(luò),SSD的性能可能會(huì)更好
  • SSD將具有相似類別的對(duì)象(例如動(dòng)物)混淆。這可能是因?yàn)槎ㄎ皇腔诙鄠€(gè)類的
  • SSD-500(使用512x512輸入圖像的最高分辨率版本)在Pascal VOC2007上實(shí)現(xiàn)了最佳的mAP,達(dá)到了76.8%,但是速度降低到22 fps。因此SSD-300在59 fps下具有74.3 mAP更好的折衷。
  • SSD在較小的對(duì)象上產(chǎn)生較差的性能,因?yàn)樗鼈兛赡懿粫?huì)出現(xiàn)在所有功能地圖中。增加輸入圖像分辨率緩解了這個(gè)問題,但并未完全解決這個(gè)問題

代碼

keras代碼地址:https://github.com/pierluigiferrari/ssd_keras/blob/master/models/keras_ssd300.py

代碼只大概閱讀,沒有進(jìn)行逐行研究,這里給出僅供參考。

基礎(chǔ)網(wǎng)絡(luò)

x

特征抽取

fc6

給conv4_3加上了個(gè)L2:因?yàn)樵搶颖容^靠前,其norm較大,所以在其后面增加了一個(gè)L2 Normalization層

# Feed conv4_3 into the L2 normalization layer conv4_3_norm = L2Normalization(gamma_init=20, name='conv4_3_norm')(conv4_3)

分類與定位

### Build the convolutional predictor layers on top of the base network

anchors

### Generate the anchor boxes (called "priors" in the original Caffe/C++ implementation, so I'll keep their layer names)

reshape

### Reshape 為后面concat做準(zhǔn)備,分別讓最后一個(gè)維度為類別數(shù),4個(gè)坐標(biāo),

concatenate

### Concatenate the predictions from the different layers

置信度softmax

# The box coordinate predictions will go into the loss function just the way they are,

預(yù)測(cè)結(jié)果合并

# Concatenate the class and box predictions and the anchors to one large predictions vector

總結(jié)

SSD雖然在多個(gè)特征圖上進(jìn)行分類回歸,但是對(duì)小目標(biāo)的識(shí)別仍比較差,還達(dá)不到faster rcnn的水準(zhǔn)。這主要是因?yàn)樾〕叽绲哪繕?biāo)多用較低層級(jí)的anchor來訓(xùn)練(因?yàn)樾〕叽缒繕?biāo)在較低層級(jí)IOU較大),較低層級(jí)的特征非線性程度不夠,無法訓(xùn)練到足夠的精確度。

參考:

解析:https://blog.csdn.net/xiaohu2022/article/details/79833786

https://www.jianshu.com/p/0903b160d554

解析推薦:https://blog.csdn.net/u010167269/article/details/52563573

a trous algorithm: http://liangchiehchen.com/projects/DeepLab.html

解析:https://blog.csdn.net/u010167269/article/details/52563573

各個(gè)方法對(duì)比:http://host.robots.ox.ac.uk:8080/leaderboard/displaylb.php?cls=mean&challengeid=11&compid=4

各個(gè)方法對(duì)比:https://handong1587.github.io/deep_learning/2015/10/09/object-detection.html

代碼:https://github.com/pierluigiferrari/ssd_keras/blob/master/models/keras_ssd300.py

總結(jié)

以上是生活随笔為你收集整理的python ssd目标检测_解读目标检测之SSD:Single Shot MultiBox Detector的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。