日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

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

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

注:md文件,Typora書寫,md兼容程度github=CSDN>知乎,若有不兼容處麻煩移步其他平臺,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

前言

背景知識: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,然后再進行分類與回歸。 MultiBox:SSD是多框預(yù)測。 Detector:物體檢測器,并分類

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

SSD有多好:速度與mAP對比:

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特征圖進行回歸分類來目標(biāo)檢測。缺點:小目標(biāo)丟失,位置信息有丟失。

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

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

SSD創(chuàng)新點

單階段

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

多特征圖上預(yù)測

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

劃分特征圖

r如果是YOLO,會把特征圖均分成7×7,分割后的每個小塊叫一個cell單元,然后以每個cell單元為中心,像faster rcnn那樣,預(yù)設(shè)一些anchors。不同的是SSD中把anchors錨稱作了priors或default boxes,而且SSD因為在很后面的特征圖上操作,所以是以每個像素為單位劃分的。

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 | | 總和對應(yīng)的即圖上的8732 | 8732 |

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

prior的scale與ratio

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

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

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

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

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

注:以上是作者論文中給的計算各層anchor尺寸的方法,但在作者源碼中給的計算anchor方法有點差異,沒有和論文的方法完全對應(yīng)上。管他呢,反正這個東西都是超參數(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),指的是在各個特征圖上用3×3卷積,得出的通道數(shù)代表:每個cell預(yù)設(shè)了N個框,每個框有classes個類別,每個框有4個位置坐標(biāo)信息。從這里我們也可以得知SSD與YOLOv1不同,SSD對于每個單元的每個先驗框,其都輸出一套獨立的檢測值,

訓(xùn)練與loss

給priors賦label

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

RPN訓(xùn)練時需要有anchor的前背景類標(biāo)。對anchor進行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是負類背景l(fā)abel=0,其余介于0.3和0.7直接的都扔掉不參與訓(xùn)練label=-1。在faster rcnn中拿256個anchors訓(xùn)練后得到W×H×9個roi。

loss的計算:

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

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

confidence類別loss:采用交叉熵損失

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

location位置loss:

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

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

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

SSD的其他一些trick

Hard negative mining負樣本挖掘

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

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

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

Data augmentation數(shù)據(jù)增強

實驗部分

a trous Algorithm

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

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

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

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

另附兩個關(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 時,不是進行upsampling,而是采用了 hole algorithm,就是在 pool4 和 pool 5層,步長由 2 變成 1,必然輸出的 score map 變大了,但是 receptive field 也變小了,為了不降低 receptive field,怎么做呢?利用 hole algorithm,將卷積 weights 膨脹擴大,即原來卷積核是 3x3,膨脹后,可能變成 7x7 了,這樣 receptive field 變大了,而 score map 也很大,即輸出變成 dense 的了。
這么做的好處是,輸出的 score map 變大了,即是 dense 的輸出了,而且 receptive field 不會變小,而且可以變大。這對做分割、檢測等工作非常重要。

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

既想利用已經(jīng)訓(xùn)練好的模型進行 fine-tuning,又想改變網(wǎng)絡(luò)結(jié)構(gòu)得到更加 dense 的 score map.
這個解決辦法就是采用 Hole 算法。如下圖 (a) (b) 所示,在以往的卷積或者 pooling 中,一個 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 嚇著了,其實 2 個 padding 不會同時和一個 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會帶來更精確的檢測,但耗時增加
  • 由于detector以多種分辨率運行于特征上,因此在多個圖層上使用MultiBox也會導(dǎo)致更好的檢測
  • 80%的時間花在基礎(chǔ)VGG-16網(wǎng)絡(luò)上:這意味著,使用更快,同樣精確的網(wǎng)絡(luò),SSD的性能可能會更好
  • SSD將具有相似類別的對象(例如動物)混淆。這可能是因為定位是基于多個類的
  • SSD-500(使用512x512輸入圖像的最高分辨率版本)在Pascal VOC2007上實現(xiàn)了最佳的mAP,達到了76.8%,但是速度降低到22 fps。因此SSD-300在59 fps下具有74.3 mAP更好的折衷。
  • SSD在較小的對象上產(chǎn)生較差的性能,因為它們可能不會出現(xiàn)在所有功能地圖中。增加輸入圖像分辨率緩解了這個問題,但并未完全解決這個問題

代碼

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

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

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

x

特征抽取

fc6

給conv4_3加上了個L2:因為該層比較靠前,其norm較大,所以在其后面增加了一個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)備,分別讓最后一個維度為類別數(shù),4個坐標(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ù)測結(jié)果合并

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

總結(jié)

SSD雖然在多個特征圖上進行分類回歸,但是對小目標(biāo)的識別仍比較差,還達不到faster rcnn的水準(zhǔn)。這主要是因為小尺寸的目標(biāo)多用較低層級的anchor來訓(xùn)練(因為小尺寸目標(biāo)在較低層級IOU較大),較低層級的特征非線性程度不夠,無法訓(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

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

各個方法對比: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的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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