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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ssd网络结构_封藏的SSD(Single Shot MultiBox Detector)笔记

發(fā)布時間:2023/12/19 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ssd网络结构_封藏的SSD(Single Shot MultiBox Detector)笔记 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
關(guān)注oldpan博客,侃侃而談人工智能深度醞釀優(yōu)質(zhì)原創(chuàng)文!

閱讀本文需要xx分鐘 ?

前言

本文用于記錄學(xué)習(xí)SSD目標(biāo)檢測的過程,并且總結(jié)一些精華知識點。

為什么要學(xué)習(xí)SSD,是因為SSD和YOLO一樣,都是one-stage的經(jīng)典構(gòu)架,我們必須對其理解非常深刻才能舉一反三設(shè)計出更加優(yōu)秀的框架。SSD這個目標(biāo)檢測網(wǎng)絡(luò)全稱為Single Shot MultiBox Detector,重點在MultBox上,這個思想很好地利用了多尺度的優(yōu)勢,全面提升了檢測精度,之后的YOLOv2就借鑒了SSD這方面的思路才慢慢發(fā)展起來。

強烈建議閱讀官方的論文去好好理解一下SSD的原理以及設(shè)計思路。這里也提供了相關(guān)的pdf:http://www.cs.unc.edu/~wliu/papers/ssd_eccv2016_slide.pdf

當(dāng)然也有很多好的博客對其進行了介紹,在本文的最下方會有相關(guān)鏈接。本篇文章主要為自己的筆記,其中加了一些自己的思考。

網(wǎng)絡(luò)構(gòu)架

SSD的原始網(wǎng)絡(luò)構(gòu)架建議還是以論文為準(zhǔn),畢竟平時我們接觸到的都是各種魔改版(也就是所謂的換了backbone,例如最常見的SSD-mobilenetv2),雖然與原版大同小異,不過對于理解來說,會增大我們理解的難度,因此,完全有必要看一遍原始的論文描述。

SSD在論文中是采取的VGG網(wǎng)絡(luò)作為主干結(jié)構(gòu),但是去除了VGG中的最后幾層(也就是我們經(jīng)常說的分類層),隨后添加了一些新的內(nèi)容(在原文中叫做auxiliary structure),這些層分別是:

  • 額外的特征提取層(Extra Feature Layers),作用就是和原本backbone的層相結(jié)合共同提取出不同尺寸的特征信息,相當(dāng)于加強了之前的backbone,使其網(wǎng)絡(luò)更深,提取能力更加強大。
  • 分類層(classification headers),對之前網(wǎng)絡(luò)中的不同位置網(wǎng)絡(luò)層輸出的特征層(不同尺度),進行卷積得出每個特征圖中每個坐標(biāo)對應(yīng)的分類信息(每個坐標(biāo)對應(yīng)著許多default boxes)。
  • 坐標(biāo)位置回歸層(regression hearders),結(jié)構(gòu)與分類層相仿,只是輸出的通道略有不同,通過對不同尺度的特征圖進行卷積,輸出的是每個特征圖中每個坐標(biāo)對應(yīng)的default boxes的偏移坐標(biāo)(文章中稱為shape offset)。


總體來說,SSD網(wǎng)絡(luò)結(jié)構(gòu)其實有四部分組成,backbone部分、額外添加的特征提取層、分類層以及坐標(biāo)位置回歸層。注意當(dāng)初這篇SSD是出于Yolo一代之后二代之前,Yolo二代三代中不同尺度的特征圖思想是有借鑒于SSD的。

用于檢測的多尺度特征圖

多尺度特征圖具體表示就是SSD在整個網(wǎng)絡(luò)的不同位置,取出相應(yīng)的特征層進行預(yù)測,每個特征層因為尺度不一樣可以檢測的視野以及目標(biāo)物體的大小也不同。每個特征圖可以預(yù)測出分類信息和位置信息,如下圖中可以看到整個網(wǎng)絡(luò)使用從前到后使用了6個不同的特征圖,從38x38x512到1x1x256一共六個不同尺度的特征圖。

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

20170611145131140

那么default box是如何產(chǎn)生?

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),每一個特征圖中的坐標(biāo)中(cell)產(chǎn)生多個default box。對于每個default box,SSD預(yù)測出與真實標(biāo)定框的偏移(offsets,一共是4個數(shù)值,代表位置信息)以及對應(yīng)于每個類的概率confidence()。如果一共有c類,每一個坐標(biāo)產(chǎn)生k個box,那么我們在進行訓(xùn)練的時候,每個cell就會產(chǎn)生(c+4)k個數(shù)據(jù),如果特征圖大小為mxn,那么總共就是(c+4)kmn,例如3x3的特征圖,mxn就是3x3。

注意下,上述的那個offset不僅是相對于default box,換個角度來說,也是相對于真實標(biāo)定框的偏移,通俗了說就是default box加上offsets就是真實標(biāo)定框的位置。這個offsets是我們在訓(xùn)練學(xué)習(xí)過程中可以計算出來用于損失函數(shù)來進行優(yōu)化的。

在實際預(yù)測中,我們要預(yù)測出每個default box的category以及對應(yīng)的offset。

TIM截圖20190429161151

這部分我看到更好的介紹,所以這里不進行贅述,可以直接看這里:解讀SSD中的Default box(Prior Box)。

訓(xùn)練過程

不光要從論文中理解一個網(wǎng)絡(luò)的細(xì)節(jié)部分,還需要詳細(xì)了解一下訓(xùn)練的具體過程:

因為我們要在特征圖上生成default box,那么在訓(xùn)練階段我們就需要將GT(Ground Truth)與default box相對應(yīng)才能進行訓(xùn)練,怎么個對應(yīng)法,SSD中使用了一個IOU閾值來控制實際參與計算的default box的數(shù)量,這一步驟發(fā)生在數(shù)據(jù)準(zhǔn)備中

TIM截圖20190506164015

首先要保證每個GT與和它度量距離最近的(就是iou最大)default box對應(yīng),這個很重要,可以保證我們訓(xùn)練的正確性。另外,因為我們有很多很多的default box,所以不只是iou最大的default box要保留,iou滿足一定閾值大小的也要保留下來。

也就是說,訓(xùn)練的過程中就是要判斷哪個default boxes和具體每一張圖中的真實標(biāo)定框?qū)?yīng),但實際中我們在每個特征圖的每個cell中已經(jīng)產(chǎn)生了很多default boxes,SSD是將所有和真實標(biāo)定框的IOU(也就是jaccard overlap)大于一定閾值(論文中設(shè)定為0.5)的default boxes都保留下來,而不是只保留那個最大IOU值的default box(為什么要這么做,原論文中說這樣有利于神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí),也就是學(xué)習(xí)難度會降低一些)。

這樣我們就在之前生成的default boxes中,精挑細(xì)選出用于訓(xùn)練的default boxes(為了方便,實際訓(xùn)練中default boxes的數(shù)量是不變的,只不過我們直接將那些iou低于一定閾值的default boxes的label直接置為0也就是背景)。

損失函數(shù)

損失函數(shù)也是很簡單,一共有倆,分別是位置損失以及分類損失:

其中為matched default boxes的數(shù)量,這個就是訓(xùn)練過程一開始中精挑細(xì)選出來的default boxes。當(dāng)為0的時候,此時總體的損失值也為0。而是通過交叉驗證最終得到的權(quán)重系數(shù),論文中的值為1。

位置損失

其中表示當(dāng)前defalut box是否與真實的標(biāo)定框匹配(第個defalut box與第個真實的標(biāo)定框,其中類別是),經(jīng)過前面的match步驟后,有大于等于1。

注意,上式中的是進行變化后的GroundTruth,變化過程與default box有關(guān),也就是我們訓(xùn)練過程中使用的GroundTruth值是首先通過default box做轉(zhuǎn)換,轉(zhuǎn)化后的值,分別為,這四個值,分別是真實的標(biāo)定框對應(yīng)default box的中心坐標(biāo)以及寬度和高度的偏移量。

也就是下面四個轉(zhuǎn)換關(guān)系,稍微花一點心思就可以看明白,在訓(xùn)練的時候?qū)嶋H帶入損失函數(shù)的就是下面這四個轉(zhuǎn)化后的值:

同理,既然我們在訓(xùn)練過程中學(xué)習(xí)到的是default box -> GroundTruth Box的偏移量,那么我們在推測的時候自然也要有一個相反的公式給計算回來,將上面的四個公式反轉(zhuǎn)一下即可。

分類損失

分類損失使用交叉熵?fù)p失,

需要注意一點就是代表此時的預(yù)測box是否與真實標(biāo)定框匹配,匹配則為1,也就是說分類損失前半部分只考慮與label匹配的,也就是positive boxes。而后半部分則表示背景分類的損失,即negative boxes的損失,想要讓越大(背景正確被分為背景),就必須讓后半部分的損失越小。

Hard negative mining

這個過程發(fā)生在實際訓(xùn)練過程中,因為圖像中預(yù)測出來的box有很多,而且大部分是negative boxes,所以這里將消除大部分的negative boxes從而使positive與negative的比例達到1:3。首先對之前經(jīng)過match步驟,精挑細(xì)選之后的default boxes計數(shù)。這些default boxes算是positive default boxes,算出此時positive的數(shù)量,然后乘以3則是negative boxes的數(shù)量。

那么如何去挑選合適數(shù)量的negative boxes?SSD中的挑選規(guī)則是:挑選loss最大的boxes,也就是最難學(xué)的boxes,根據(jù)預(yù)測出來的confidence來判斷(這段部分的實現(xiàn)可能與論文中會有所不同),那么什么算最難學(xué)的,因為我們首先已經(jīng)根據(jù)label(這個label是之前matching過程后的label,label的數(shù)量與整張?zhí)卣鲌D中的boxes數(shù)量相同,只不過其中的label已經(jīng)根據(jù)matching步驟進行了調(diào)整)得到了positive boxes,這些positive boxes與實際目標(biāo)都滿足一定的條件,而且其中很大概率都有物體。那么最難學(xué)的boxes該如何挑選呢?

我們在其余的boxes中,因為其余的這些boxes已經(jīng)不可能包含目標(biāo)(因為有目標(biāo)的在matching中都已經(jīng)被挑選了,這些是剩下的),所以這些boxes的label理應(yīng)被預(yù)測為background也就是背景,所以這些boxes關(guān)于背景的損失值應(yīng)該是比較小的,也就是模型較為正確預(yù)測了背景。那么我們要選最難識別的boxes,也就是最難識別為背景的boxes,這些叫做negative boxes,首先我們將其余的這些boxes關(guān)于背景的loss排序,然后選取前面一定數(shù)量(與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?????return?pos_mask?|?neg_mask

圖像增強

SSD中已經(jīng)采取了一些比較好的圖像增強方法來提升SSD檢測不同大小不同形狀的物體,那就是randomly sample,也就是隨機在圖像片進行crop,提前設(shè)定一些比例,然后根據(jù)這個比例來對圖像進行crop,但是有一點需要注意那就是這個randomly sample中需要考慮到IOU,也就是我們crop出來的圖像必須和原始圖像中的GT box滿足一定的IOU關(guān)系,另外crop出來的圖像也必須滿足一定的比例。

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

這部分說起來比較抽象,可以看看這篇文章,我自己懶得進行演示了:

  • 目標(biāo)檢測:SSD的數(shù)據(jù)增強算法(https://blog.csdn.net/zbzb1000/article/details/81037852)

學(xué)習(xí)率設(shè)置

  • 官方:優(yōu)化器使用SGD,初始的學(xué)習(xí)率為0.001,momentum為0.9,weight-decay為0.0005,batch-size為32。
  • 我個人和官方使用的優(yōu)化器相同,只不過在學(xué)習(xí)率上通過multi-step的方式(具體可以看Pytorch相關(guān)實現(xiàn)部分),在80和150個epoch階段將學(xué)習(xí)率衰減至之前的1/10。一共訓(xùn)練300個epoch。

訓(xùn)練部分的系數(shù)設(shè)置僅供參考,不同數(shù)據(jù)的訓(xùn)練系數(shù)略有不同。

預(yù)訓(xùn)練權(quán)重

個人使用mobilenetv2-SSD的構(gòu)架對自己的數(shù)據(jù)進行了訓(xùn)練,在所有超參數(shù)和訓(xùn)練系數(shù)不變的情況下,如果采用預(yù)訓(xùn)練好的mobilenetv2的權(quán)重(在ImageNet上),那么訓(xùn)練速度和最終的訓(xùn)練精度都會高出一截(相同epoch下),所以采用預(yù)訓(xùn)練好的權(quán)重信息很重要。

總結(jié)

SSD是一個優(yōu)雅的目標(biāo)檢測結(jié)構(gòu),到現(xiàn)在依然為比較流行的目標(biāo)檢測框架之一,值得我們學(xué)習(xí),但是SSD對小目標(biāo)的檢測效果有點差,召回率不是很高,這與SSD的特征圖以及semantic語義信息有關(guān),另外SSD中也提到了一些對于提升mAP的原因,其中很大部分是因為圖像增強部分,之前提到的random patch可以變相地理解為對圖像進行"zoom in"或者"zoom out",也就是方法或者縮小,這樣增強了網(wǎng)絡(luò)監(jiān)測大目標(biāo)和小目標(biāo)的能力(但監(jiān)測小目標(biāo)的能力還是稍微差一點)。

對于SSD的更多討論,我這里也收集了一些其他優(yōu)秀的文章,這里就不贅述了:

  • SSD究竟如何實現(xiàn)功能以及如何優(yōu)化--個人探討(https://zhuanlan.zhihu.com/p/63700297)
  • 為什么SSD(Single Shot MultiBox Detector)對小目標(biāo)的檢測效果不好?(https://www.zhihu.com/question/49455386/answer/135983998)

本文為SSD系列第一篇,主要講解一些原理,之后還會有SSD具體實戰(zhàn)部署以及加速相關(guān)文章,以及對Anchor的代碼級別詳細(xì)講解,請關(guān)注??

來者是客

如果你喜歡這里的內(nèi)容

如果你覺得很有收獲

如果你和我一樣有著相似的想法

不妨留個言吧

往期回顧?
  • OpenVino初探(實際體驗)
  • 一個Tensor的生命歷程(Pytorch版)-上篇
  • 解密Deepfake(深度換臉)-基于自編碼器的(Pytorch代碼)換臉技術(shù)
  • 利用TensorRT對深度學(xué)習(xí)進行加速
  • 深度學(xué)習(xí)快一年,作為研究生,談?wù)勛约旱母惺?/li>
這么快就看到這里了如果你與我志同道合于此,很愿意與你交流如果你喜歡我的內(nèi)容,歡迎關(guān)注和支持

長按關(guān)注?

總結(jié)

以上是生活随笔為你收集整理的ssd网络结构_封藏的SSD(Single Shot MultiBox Detector)笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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