當前位置:
首頁 > 最新 > SSD多盒實時目標檢測教程

SSD多盒實時目標檢測教程

作者:Eddie Forson

編譯:weakish

編者按:Towards Data Science博主Eddie Forson直觀地解釋了SSD多盒目標檢測技術。

端到端目標檢測(來源:Microsoft)

本文的目的是構建一個SSD多盒目標檢測技術的直觀解釋。我嘗試儘可能少地使用數學,相反,緩慢地引導你了解整個架構的原則,包括解釋多盒演算法的作用。閱讀本文之後,我希望你更好地理解了SSD,並可以自行嘗試使用這一模型。

自從AlexNet在2012年ILSVRC上暴風般地佔領學術界之後,深度學習便成為圖像識別任務的首選方法,遠超文獻中更傳統的計算機視覺技術。在計算機視覺領域中,卷積神經網路在圖像分類(classification)方面表現出色。圖像分類任務中,給定待分類的圖片和一個分類(class)的集合(例如,貓、狗),然後讓網路決定圖像的最強(strongest)分類。

貓狗圖(來源:kaggle)

當前,深度學習網路在圖像分類方面的表現已經超過人類,這表明這一技術是多麼強大。然而,我們人類觀察世界和與世界交互時所做的遠不止分類圖片。我們同時定位(localize)分類(classify)視野內的每個元素。這些複雜得多的任務,機器仍在艱辛地努力達到和人類相當的表現。事實上,我主張,表現良好的目標檢測將使機器更接近真實場景理解。

圖像顯示了貓、狗,還是兩者皆有?(來源:kaggle)

基於區域的卷積神經網路(R-CNN)

幾年前,研究人員提出了R-CNN,以應對目標檢測、定位、分類任務。大體上說,R-CNN是一種特殊的CNN,可以定位和檢測圖像中的目標:輸出基本上是一組匹配檢測到的目標的包圍盒,以及對應的分類。下圖顯示了一個典型的R-CNN輸出的結果:

這一領域的論文很多,對有興趣深入的讀者,我推薦從下面的「三部曲」開始:

R-CNN

Fast-R-CNN

Faster-R-CNN

正如你可能猜到的那樣,Fast-R-CNN是對R-CNN的改進,而Faster-R-CNN又是對Fast-R-CNN的改進,以研髮針對實時目標檢測的更快的網路。上面的「三部曲」達到的成就真的很驚人,不過沒有一個架構成功構建了一個實時目標檢測器。這些網路存在以下問題(省略細節部分):

難以訓練,並且訓練時間過長

需要進行多階段訓練(例如,訓練候選區域和分類器)

網路在推理階段太慢(即處理非訓練數據)

幸運的是,最近提出了新的架構,以解決R-CNN的瓶頸。其繼任者足以進行實時目標檢測。其中最有名的是YOLO(You Only Look Once,你只看一次)和SSD多盒(SSD是Single Shot Detector單次檢測器的縮寫)。本文將討論SSD,因為相比YOLO,目前網上介紹SSD架構的文章不多。另外,一旦你理解了SSD,你會更容易理解YOLO.

單次多盒檢測器

C. Szegedy等人在2016年11月底發表的論文SSD: Single Shot MultiBox Detector在目標檢測任務中創造了新紀錄,在PascalVOC和COCO這樣的標準數據集上取得了74% mAP(mean Average Precision),59幀每秒的成績。為了更好地理解SSD,讓我們先從解釋這一架構命名的由來開始:

Single Shot(單次)這意味著目標定位和分類任務通過網路的單次前向傳播完成。

MultiBox(多盒)這是由Szegedy等開發的包圍盒回歸技術。

Detector(偵測器)該網路是一個目標偵測器,分類檢測到的目標。

架構

單次多盒偵測器架構(輸入 300x300x3)

如上圖所示,SSD的架構基於可敬的VGG-16架構,但拋棄了全連接層。使用VGG-16作為基礎網路(base network)的原因是其在高畫質圖像分類任務上的強力表現和在遷移學習有助於改善結果的任務上的流行性。架構沒有使用原VGG的全連接層,轉而加入了一組輔助卷積層(自開始),從而在不同尺度上提取特徵,並逐層遞減輸入的尺寸。

VGG架構(輸入 224x224x3)

多盒

SSD的包圍盒回歸技術受到了Szegedy在多盒方面的工作的啟發。多盒是一種快速分類不可知(class-agnostic)包圍盒坐標提議的方法。有趣的是,多盒使用的是Inception風格的卷積神經網路。下圖中的1x1卷積有助於降維,因為維度將下降(但「寬度」和「高度」將保持不變)。

多盒架構

多盒的損失函數同樣組合了兩個關鍵的組件,這也為SSD所吸收:

置信度損失(Confidence Loss)衡量網路對計算出的包圍盒的objectness的置信度。使用類別交叉熵計算這一損失。

定位損失(Location Loss)衡量網路預測的包圍盒和訓練集的標準答案相差多遠。這裡使用了L2正則化。

不過多深究數學的話,(如果你很好奇並想了解更嚴謹的概念,請閱讀論文)損失的表達式如下:

其中,項幫助我們平衡定位損失的貢獻。

多盒先驗和IoU

涉及包圍盒生成的邏輯實際上比我之前陳述的要複雜。不過別怕:它仍在能力範圍之內。

多盒中的先驗(prior)(Faster-R-CNN術語中的錨(anchor))是提前計算的固定尺寸包圍盒,匹配原標準答案包圍盒的分布。事實上,這些先驗的選取方式使得它們和標準答案包圍盒的交並比(IoU,有時稱為Jaccard指數)大於0.5. 從下圖可以推測,0.5的交並比仍然不夠好,但是它確實為包圍盒回歸演算法提供了一個強力的開始——這是一個比隨機坐標要好得多的策略!因此,多盒從將先驗作為預測開始,試圖回歸逼近標準答案包圍盒。

IoU示意部分取自維基百科

最終所得的架構(參考前文提及的多盒架構示意圖),每個特徵映射細胞(8x8、6x6、4x4、3x3、2x2)包含11個先驗,而1x1特徵映射僅包含一個先驗,即每張圖像共有1420個先驗,從而在輸入圖像上達到不同比例的穩健覆蓋,以檢測不同尺寸的目標。

最後,多盒僅僅保留最好的K個預測,這些預測同時最小化定位(LOC)損失和置信度(CONF)損失。

SSD的改進

回到SSD,SSD加入了一些調整,提升了該網路定位和分類目標的能力。

固定先驗和多盒不同,每個特徵映射細胞關聯一組尺寸和長寬比不同的默認包圍盒。這些先驗是手工(精心)選擇的,而在多盒中,先驗是基於與相應的標準答案包圍盒的交並比超過0.5選擇的。在理論上這使得SSD可以概括任何種類的輸入,無需生成先驗的預訓練階段。例如,假定我們為每個特徵映射細胞的每個默認包圍盒b配置了兩個對角點和,然後需要基於個分類進行分類,而給定的特徵映射尺寸為,那麼,SSD將為該特徵映射計算值。

定位損失SSD使用平滑L1正則化(smooth L1-Norm)計算定位損失。儘管不如L2正則化那樣精確,這仍然非常有效,也給了SSD更多取巧的空間,因為SSD的包圍盒預測並不追求「像素完美」(對許多人而言,一些像素的差異很難察覺)。

分類多盒並不執行目標分類,而SSD進行分類。因此,SSD為每個預測的包圍盒、數據集中的每個可能的分類計算分類預測的集合。

訓練並運行SSD

數據集

我們將訓練和測試帶有標準答案包圍盒及相應的分類標籤(每個包圍盒有一個分類標籤)的數據集。Pascal VOC和COCO數據集是一個很好的開始。

Pascal VOC數據集圖像

默認包圍盒

建議配置一組多樣化的包圍盒,包括不同的比例和長寬比,確保可以捕捉到大多數目標。在SSD論文中,每個特徵映射單元有6個包圍盒。

特徵映射

特徵映射(即卷積塊的結果)是不同尺度上圖像的主導特徵的表示,因此在不同特徵映射上運行多盒增加了逐漸檢測、定位、分類任何目標(大目標和小目標)的概率。下圖顯示了網路是如何在特徵映射上「看到」給定圖像的:

VGG特徵映射可視化(圖片來源 Brown Uni)

Hard Negative Mining

在訓練中,由於大多數包圍盒的IoU較低,會被視作負面訓練樣本,我們最終的訓練集可能會有不成比例的負面樣本。因此,建議不要使用所有的負面預測,將負面樣本和正面樣本的比例保持在3:1. 我們需要保留負面樣本的原因是網路同樣需要學習什麼構成了錯誤檢測。

圖片來源 Jamie Kang

數據增強

SSD的作者說,和許多深度學習應用一樣,數據增強是非常重要的部分,使網路能夠學習更穩健地應對輸入中的不同目標尺寸。為了達到這一目標,他們生成了額外的訓練樣本,包括不同IoU的補丁(例如,0.1、0.3、0.5等),以及隨機補丁。此外,每張圖像基於0.5的概率隨機水平翻轉,從而確保潛在目標出現在左側和右側的概率相同。

水平翻轉的圖像,來源:Behavioural Cloning

非極大值抑制(NMS)

在推理階段,SSD的前向傳播中生成了數量巨大的包圍盒,因此應用非極大值抑制(non-maximum suppression)技術修剪大多數包圍盒很有必要:置信度損失低於閾值ct(例如,0.01),IoU低於閾值lt(例如,0.45)的包圍盒被拋棄了,僅保留最高的N個預測。這確保只有最可能的預測被網路保留,而移除了大多數雜訊。

NMS的例子(來源:DeepHub)

SSD的補充說明

SSD提出了以下觀察:

更多的默認包圍盒導致更精確的檢測,不過這會影響速度。

在多層上使用多盒同樣能帶來更好的檢測效果,這是因為檢測器在不同尺度的特徵上運行。

80%的時間花在基礎VGG-16網路上:這意味著使用一個速度更快的同樣精確的網路,SSD的性能會更好。

相似類別的目標會迷惑SSD(例如,動物)。這大概是因為不同分類的位置相同。

SSD-500(使用512x512輸入圖像的SSD最高解析度變體)在Pascal VOC2007上達到了最佳mAP(76.8%),不過相應的代價是速度,幀率降至22 fps. 因此,SSD-300是一個更好的折衷(74.3% mAP、59 fps)。

SSD在較小的目標上表現較差,因為較小的目標可能不在所有特徵映射上出現。增加輸入圖像解析度緩解了這一問題,但並沒有完全解決它。

嘗試SSD

網上有一些SSD實現,包括論文作者的Caffe代碼。我選用的是Paul Balan?a的TensorFlow實現。代碼和論文都值得一讀,以便更好地理解所有東西是如何結合在一起的。

我最近決定基於SSD重新實現一個基於傳統計算機視覺技術的車輛檢測項目。下面的gif表明SSD的效果非常好:

GIF

SSD之外

這一領域最近產生了一些新成果,我會建議打算在這一領域了解更多的人閱讀如下兩篇論文:

YOLO9000:更好、更快、更強(這是論文的標題;我可沒開玩笑)

Mask R-CNN 非常精準的像素級實例分割

烏拉!我們結束了單次多盒偵測的旅途。我嘗試以簡單的術語解釋這一技術背後的概念,同時運用了許多圖片進一步闡明這些概念,以幫助你理解。我強烈建議閱讀論文(如果你和我一樣是個慢性子的話,也許要多讀幾遍 ;-) 包括形成這一技術中的一些數學背後的良好直覺,以加深理解。如果本文中的部分章節有助於理解論文,你可以時不時參考一下本文。祝成功!

原文地址:https://towardsdatascience.com/understanding-ssd-multibox-real-time-object-detection-in-deep-learning-495ef744fab


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 論智 的精彩文章:

基於Keras實現加密卷積神經網路
基於Numpy實現神經網路:反向傳播

TAG:論智 |