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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

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

閱讀本文需要xx分鐘 ?

前言

本文用于記錄學習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的突出貢獻。

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.

就是對于上述每一個不同尺度的特征圖(38x38、19x19、10x10、5x5、3x3、1x1),每一個特征圖中的坐標中(cell)產生多個default box。對于每個default box,SSD預測出與真實標定框的偏移(offsets,一共是4個數值,代表位置信息)以及對應于每個類的概率confidence()。如果一共有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也就是背景)。

損失函數

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

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

位置損失

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

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

也就是下面四個轉換關系,稍微花一點心思就可以看明白,在訓練的時候實際帶入損失函數的就是下面這四個轉化后的值:

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

分類損失

分類損失使用交叉熵損失,

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

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?????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也是正確的。

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

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

學習率設置

  • 官方:優化器使用SGD,初始的學習率為0.001,momentum為0.9,weight-decay為0.0005,batch-size為32。
  • 我個人和官方使用的優化器相同,只不過在學習率上通過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的更多討論,我這里也收集了一些其他優秀的文章,這里就不贅述了:

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

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

來者是客

如果你喜歡這里的內容

如果你覺得很有收獲

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

不妨留個言吧

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

長按關注?

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。