摘要:我盡可能對(duì)深度學(xué)習(xí)目標(biāo)檢測(cè)器的組成做一個(gè)概述,包括使用預(yù)訓(xùn)練的目標(biāo)檢測(cè)器執(zhí)行任務(wù)的源代碼。當(dāng)我們理解了什么是目標(biāo)檢測(cè)時(shí),隨后會(huì)概述一個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)器的核心模塊。方法傳統(tǒng)的目標(biāo)檢測(cè)技術(shù)路線第一個(gè)方法不是純端到端的深度學(xué)習(xí)目標(biāo)檢測(cè)器。
目標(biāo)檢測(cè)技術(shù)作為計(jì)算機(jī)視覺的重要方向,被廣泛應(yīng)用于自動(dòng)駕駛汽車、智能攝像頭、人臉識(shí)別及大量有價(jià)值的應(yīng)用上。這些系統(tǒng)除了可以對(duì)圖像中的每個(gè)目標(biāo)進(jìn)行識(shí)別、分類以外,它們還可以通過(guò)在該目標(biāo)周圍繪制適當(dāng)大小的邊界框來(lái)對(duì)其進(jìn)行定位。本文作者從圖像識(shí)別與目標(biāo)檢測(cè)的區(qū)別開始,進(jìn)一步簡(jiǎn)單介紹了目標(biāo)檢測(cè)的基本模塊與實(shí)現(xiàn)方法。本文是目標(biāo)檢測(cè)的一般指南,它并沒(méi)有詳細(xì)介紹主流的目標(biāo)檢測(cè)算法,這些算法讀者可參考從 RCNN 到 SSD,這應(yīng)該是最全的一份目標(biāo)檢測(cè)算法盤點(diǎn)?
本文受 PyImageSearch 的讀者 Ezekiel 的啟發(fā),他上個(gè)星期在郵件中咨詢道:
Adrian 你好,
我仔細(xì)地瀏覽了您之前關(guān)于深度學(xué)習(xí)目標(biāo)檢測(cè) 的文章及其跟進(jìn)的實(shí)時(shí)深度學(xué)習(xí)目標(biāo)檢測(cè) 。感謝你做的這一切,我在自己的樣例項(xiàng)目中使用了你的源代碼,但是我有兩個(gè)問(wèn)題:
1. 我該如何過(guò)濾/忽略那些我不感興趣的類?
2. 我如何才能向自己的目標(biāo)檢測(cè)器中增加新類別?有這個(gè)可能嗎?
如果你能就這兩個(gè)問(wèn)題寫一篇文章,我將不勝感激。
Ezekiel 并不是受此問(wèn)題困擾的讀者。事實(shí)上,如果你仔細(xì)瀏覽了我最近關(guān)于深度目標(biāo)檢測(cè)兩篇文章的評(píng)論,你會(huì)發(fā)現(xiàn)最常見的問(wèn)題可以被表述為:
我該如何修改你的源代碼來(lái)包含我自己的類別?
由于這是一個(gè)如此常見的問(wèn)題,并且是關(guān)于神經(jīng)網(wǎng)絡(luò)/深度學(xué)習(xí)目標(biāo)檢測(cè)器實(shí)際工作的一個(gè)誤解,所以我決定在今天的博客中重溫深度學(xué)習(xí)目標(biāo)檢測(cè)的話題。
具體地,你將在這篇文章中學(xué)到以下內(nèi)容:
圖像分類和目標(biāo)檢測(cè)的區(qū)別
深度學(xué)習(xí)目標(biāo)檢測(cè)器的組成:包含不同目標(biāo)檢測(cè)架構(gòu)的區(qū)別和基本模型之間的區(qū)別
如何使用預(yù)訓(xùn)練模型進(jìn)行深度學(xué)習(xí)目標(biāo)檢測(cè)
如何從一個(gè)深度學(xué)習(xí)模型中過(guò)濾或者忽略一些預(yù)測(cè)類別
向深度神經(jīng)網(wǎng)絡(luò)增加類別或從中刪除類別時(shí)常見的誤區(qū)和誤解
為了更多地了解深度學(xué)習(xí)目標(biāo)檢測(cè),并解釋清楚我們對(duì)基于深度學(xué)習(xí)的目標(biāo)檢測(cè)的一些誤區(qū)和誤解,請(qǐng)繼續(xù)閱讀本文。
想要查看本文相關(guān)的源碼?請(qǐng)查看原文的下載鏈接:https://www.pyimagesearch.com/2018/05/14/a-gentle-guide-to-deep-learning-object-detection/#
深度學(xué)習(xí)目標(biāo)檢測(cè)的一般指南
今天的博客是對(duì)基于深度學(xué)習(xí)的目標(biāo)檢測(cè)的簡(jiǎn)單介紹。我盡可能對(duì)深度學(xué)習(xí)目標(biāo)檢測(cè)器的組成做一個(gè)概述,包括使用預(yù)訓(xùn)練的目標(biāo)檢測(cè)器執(zhí)行任務(wù)的源代碼。
你可以使用這份指南來(lái)幫助學(xué)習(xí)深度學(xué)習(xí)目標(biāo)檢測(cè),但是也要意識(shí)到,目標(biāo)檢測(cè)是高度細(xì)節(jié)化的工作,我不可能在一篇文章中包含關(guān)于深度學(xué)習(xí)目標(biāo)檢測(cè)的所有細(xì)節(jié)。
這篇文章將從討論圖像分類和目標(biāo)檢測(cè)之間的本質(zhì)區(qū)別開始,其中包括判斷一個(gè)圖像分類網(wǎng)絡(luò)是否可以用于目標(biāo)檢測(cè),以及在什么情況下可以這樣使用等話題。
當(dāng)我們理解了什么是目標(biāo)檢測(cè)時(shí),隨后會(huì)概述一個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)器的核心模塊。它一般包括目標(biāo)檢測(cè)架構(gòu)和基本模型,不熟悉目標(biāo)檢測(cè)的讀者可能會(huì)誤解這兩個(gè)部分。
在這里,我們將使用 OpenCV 來(lái)實(shí)現(xiàn)實(shí)時(shí)深度學(xué)習(xí)目標(biāo)檢測(cè)。我也會(huì)展示如何在不修改網(wǎng)絡(luò)架構(gòu)或者重新訓(xùn)練的情況下忽略或者過(guò)濾一些不感興趣的目標(biāo)類別。最后,我們通過(guò)討論如何從深度學(xué)習(xí)目標(biāo)檢測(cè)器中增加或者刪除類別來(lái)總結(jié)本文。
圖像分類和目標(biāo)檢測(cè)的區(qū)別
圖 1: 圖像分類(左)和目標(biāo)檢測(cè)(右)的區(qū)別是比較直觀和簡(jiǎn)單的。在圖像分類中,整幅圖像被分類為單一的標(biāo)簽。而在目標(biāo)檢測(cè)中,我們的神經(jīng)網(wǎng)絡(luò)還要找出圖像中目標(biāo)的位置(有可能是多個(gè))。
在進(jìn)行標(biāo)準(zhǔn)的圖像分類時(shí),我們將一張給定的圖像輸入到神經(jīng)網(wǎng)絡(luò),然后得到一個(gè)最可能的標(biāo)簽,而且也許會(huì)同時(shí)得到相關(guān)的概率。
這個(gè)類別標(biāo)簽用來(lái)表征整個(gè)圖像的內(nèi)容,或者至少是圖像最主要的可見內(nèi)容。例如,上面的圖 1 中,給定輸入圖像(左),我們的 CNN 給它的標(biāo)簽是「比格犬」。所以我們可以認(rèn)為圖像分類具有以下特點(diǎn):
一張圖像輸入
一個(gè)類別標(biāo)簽輸出
無(wú)論是通過(guò)深度學(xué)習(xí)還是其他計(jì)算機(jī)視覺技術(shù)的目標(biāo)檢測(cè),都是基于圖像分類構(gòu)建的,只不過(guò)需要較精確定位每個(gè)對(duì)象在圖像中出現(xiàn)的位置。在進(jìn)行目標(biāo)檢測(cè)的時(shí)候,給定一張輸入圖像,我們期望得到:
一個(gè)邊界框列表,或者一幅圖像中每個(gè)對(duì)象的(x,y)坐標(biāo)
與每個(gè)邊界框關(guān)聯(lián)的類別標(biāo)簽
與每個(gè)邊界框和類別標(biāo)簽關(guān)聯(lián)的概率或者置信度得分
圖 1(右)展示了一個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)的例子。請(qǐng)注意,人物和狗都被用邊界框找出了位置,同時(shí)類標(biāo)簽也被預(yù)測(cè)到了。
所以,目標(biāo)檢測(cè)允許我們:
向網(wǎng)絡(luò)輸入一張圖像
得到多個(gè)邊界框以及類別標(biāo)簽
深度學(xué)習(xí)圖像分類可以被用于目標(biāo)檢測(cè)嗎?
圖 2:非端到端深度學(xué)習(xí)的目標(biāo)檢測(cè)器使用一個(gè)滑動(dòng)窗口(左)+圖像金字塔(右)相結(jié)合的方法來(lái)分類。
所以現(xiàn)在你理解了圖像分類和目標(biāo)檢測(cè)的根本區(qū)別:
在進(jìn)行圖像分類時(shí),我們輸入一張圖像,得到一個(gè)輸出類別
然而在進(jìn)行目標(biāo)檢測(cè)時(shí),我們輸入一張圖像,得到多個(gè)邊界框以及類別標(biāo)簽的輸出
這自然引發(fā)這么一個(gè)問(wèn)題:
我們可以拿一個(gè)已訓(xùn)練的分類網(wǎng)絡(luò),將其用于目標(biāo)檢測(cè)嗎?
這個(gè)答案有些棘手,因?yàn)檫@在技術(shù)上是可以的,但是理由并不太明顯。解決方案涉及:
1. 應(yīng)用基于計(jì)算機(jī)視覺的標(biāo)準(zhǔn)目標(biāo)檢測(cè)方法(非深度學(xué)習(xí)方法),例如滑動(dòng)窗口和圖像金字塔等方法通常被用在 HOG+基于線性 SVM 的目標(biāo)檢測(cè)器。
2. 采用預(yù)訓(xùn)練的網(wǎng)絡(luò),并將其作為深度學(xué)習(xí)目標(biāo)檢測(cè)架構(gòu)的基本網(wǎng)絡(luò)(例如 Faster R-CNN, SSD, YOLO)。
方法 #1: 傳統(tǒng)的目標(biāo)檢測(cè)技術(shù)路線
第一個(gè)方法不是純端到端的深度學(xué)習(xí)目標(biāo)檢測(cè)器。相反,我們使用:
1. 固定尺寸的滑動(dòng)窗口,它從左到右,自上而下滑動(dòng),來(lái)定位不同位置的對(duì)象。
2. 圖像金字塔,用來(lái)檢測(cè)不同尺度的對(duì)象
3. 一個(gè)預(yù)訓(xùn)練(分類)的 CNN 來(lái)分類
在滑動(dòng)窗和對(duì)應(yīng)圖像金字塔每一次停留的時(shí)候,我們會(huì)提取 ROI(感興趣區(qū)域),將其輸入到 CNN 中,得到對(duì) RIO 的分類。
如果標(biāo)簽 L 的分類概率比某個(gè)閾值 T 高,我們就將這個(gè) ROI 的邊界框標(biāo)記為該標(biāo)簽(L)。對(duì)滑動(dòng)窗和圖像金字塔的每次停留都重復(fù)這個(gè)過(guò)程,我們就得到了目標(biāo)檢測(cè)器的輸出。最終,我們對(duì)邊界框應(yīng)用非極大值抑制(NMS),得到最終輸出的檢測(cè)結(jié)果:
圖 3:應(yīng)用 NMS 會(huì)抑制重疊的和置信度不高的邊界框。這個(gè)方法在一些特定的用例中是有效的,但是它通常比較慢和繁瑣,也容易出錯(cuò)。
然而,這個(gè)方法也是值得學(xué)習(xí)的,因?yàn)樗梢詫⑷我鈭D像分類網(wǎng)絡(luò)轉(zhuǎn)換為一個(gè)目標(biāo)檢測(cè)器,而不需要顯式地訓(xùn)練一個(gè)端到端的深度學(xué)習(xí)目標(biāo)檢測(cè)器。這個(gè)方法可以節(jié)省大量的時(shí)間和精力,且效率的高低具體取決于你的用例。
方法 #2:目標(biāo)檢測(cè)架構(gòu)的基本網(wǎng)絡(luò)
第二個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)的方法允許我們將一個(gè)預(yù)訓(xùn)練的分類網(wǎng)絡(luò)作為深度學(xué)習(xí)目標(biāo)檢測(cè)架構(gòu)(例如 Faster R-CNN、SSD 或者 YOLO)的基本網(wǎng)絡(luò)。
這個(gè)方法的好處是:你可以創(chuàng)建一個(gè)基于深度學(xué)習(xí)的復(fù)雜端到端目標(biāo)檢測(cè)器。
而其不足之處是:它需要一些關(guān)于深度學(xué)習(xí)目標(biāo)檢測(cè)器如何工作的知識(shí),我們將在后面的部分中討論這個(gè)問(wèn)題。
深度學(xué)習(xí)目標(biāo)檢測(cè)器的模塊
圖 4: VGG16 基本網(wǎng)絡(luò)是 SSD 深度學(xué)習(xí)目標(biāo)檢測(cè)框架的一個(gè)特征抽取模塊。
深度學(xué)習(xí)目標(biāo)檢測(cè)器有很多模塊,子模塊以及更小的子模塊,但是我們今天要重點(diǎn)關(guān)注的是深度學(xué)習(xí)入門讀者所困惑的兩個(gè):
1. 目標(biāo)檢測(cè)框架(不包括 Faster R-CNN, SSD, YOLO)
2. 適合目標(biāo)檢測(cè)框架的基本網(wǎng)絡(luò)
你可能已經(jīng)比較熟悉基本網(wǎng)絡(luò)(只是你之前并沒(méi)聽到它被稱作基本網(wǎng)絡(luò)而已)?;揪W(wǎng)絡(luò)就是你常用的分類 CNN 架構(gòu),包括:
VGGNet
ResNet
MobileNet
DenseNet
通常這些網(wǎng)絡(luò)在大數(shù)據(jù)集上進(jìn)行預(yù)訓(xùn)練來(lái)進(jìn)行分類,例如 ImageNet,它們可以學(xué)習(xí)到很多具有鑒別能力的濾波器。
目標(biāo)檢測(cè)框架由很多組成部分和子模塊構(gòu)成。例如,F(xiàn)aster R-CNN 框架包括:
候選區(qū)域網(wǎng)絡(luò)(RPN)
一組錨點(diǎn)
ROI 池化模塊
最終基于區(qū)域的卷積神經(jīng)網(wǎng)絡(luò)
在使用 SSD(單步檢測(cè)器,single shot detectors)時(shí),具有以下的組成部分:
多框(MultiBox)
先驗(yàn)(Priors)
固定先驗(yàn)(Fixed priors)
請(qǐng)記住,基本網(wǎng)絡(luò)只是整個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)框架的眾多組件之一,上文圖 4 描述了 SSD 框架內(nèi)部的 VGG-16 網(wǎng)絡(luò)。通常,我們需要在基本網(wǎng)絡(luò)上進(jìn)行「網(wǎng)絡(luò)手術(shù)」。這種修改:
讓它變成全卷積的形式,并接受任意輸入維度。
剪除了基本網(wǎng)絡(luò)中更深層的卷積和池化層,將它們以一系列新層(SSD)、新模塊(Faster R-CNN),或者這兩者的一些組合代替。
這里的「網(wǎng)絡(luò)手術(shù)」是一種口語(yǔ)化的說(shuō)法,它的意思是移除基本網(wǎng)絡(luò)中的一些原始卷積層,將它們用新層替代。網(wǎng)絡(luò)手術(shù)也是講究策略的,我們移除一些不需要的部分,然后用一組新的部分來(lái)替代它們。
然后,當(dāng)我們開始訓(xùn)練我們的框架進(jìn)行目標(biāo)檢測(cè)時(shí),(1)新層、模塊和(2)基本網(wǎng)絡(luò)的權(quán)重都被修改了。
再?gòu)?qiáng)調(diào)一次,綜述關(guān)于不同深度學(xué)習(xí)目標(biāo)檢測(cè)框架是如何工作的(包括基本網(wǎng)絡(luò)所起的作用)并不屬于本文的探討范圍。
如果你對(duì)深度學(xué)習(xí)目標(biāo)檢測(cè)的完整綜述(包括理論和實(shí)現(xiàn))感興趣,請(qǐng)參考機(jī)器之心曾經(jīng)發(fā)過(guò)的文章:從 RCNN 到 SSD,這應(yīng)該是最全的一份目標(biāo)檢測(cè)算法盤點(diǎn) 。
我是如何計(jì)算一個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)器的準(zhǔn)確度的?
在評(píng)價(jià)目標(biāo)檢測(cè)器的性能時(shí)我們使用了一個(gè)叫做均值平均精度(mAP)的指標(biāo),它是以我們數(shù)據(jù)集中所有類別的交并比(IoU)為基礎(chǔ)的。
交并比(IoU)
圖 5: 在這個(gè)交并比的可視化例子中,標(biāo)注邊界框(綠色)可以與預(yù)測(cè)的邊界框(紅色)進(jìn)行對(duì)比。IoU 與 mAP 一起被用來(lái)評(píng)價(jià)一個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)器的精度。計(jì)算 IoU 的簡(jiǎn)單方程如圖 5(右)所示。
你通常會(huì)發(fā)現(xiàn) IoU 和 mAP 被用于評(píng)價(jià) HOG+線性 SVM 檢測(cè)器、Haar cascades 以及基于深度學(xué)習(xí)的方法的性能;但是請(qǐng)記住,實(shí)際用于生成預(yù)測(cè)邊界框的算法并不是那么重要。
任何一個(gè)以預(yù)測(cè)邊界框作(以及可選擇的標(biāo)簽)為輸出的算法都可以用 IoU 來(lái)評(píng)價(jià)。更一般的地,為了使用 IoU 來(lái)評(píng)價(jià)任意一個(gè)目標(biāo)檢測(cè)器,我們需要:
1. 真實(shí)的邊界框(也就是測(cè)試集中表明我們的目標(biāo)在圖像的哪個(gè)位置的人工標(biāo)簽)
2. 模型預(yù)測(cè)到的邊界框
3. 如果你想一起計(jì)算召回率和精度,那么還需要真實(shí)類別標(biāo)簽和預(yù)測(cè)類別標(biāo)簽
在圖 5(左)中,我展示了真實(shí)邊界框(綠色)與預(yù)測(cè)邊界框(紅色)相比的可視化例子。IoU 的計(jì)算可以用圖 5 右邊的方程表示。
仔細(xì)檢查這個(gè)方程你會(huì)發(fā)現(xiàn),IoU 就是一個(gè)比值。在分子項(xiàng)中,我們計(jì)算了真實(shí)邊界框和預(yù)測(cè)邊界框重疊的區(qū)域。分母是一個(gè)并集,或者更簡(jiǎn)單地說(shuō),是由預(yù)測(cè)邊界框和真實(shí)邊界框所包括的區(qū)域。兩者相除就得到了最終弄的得分:交并比。
平均精度均值(MAP)
圖 6:為了計(jì)算目標(biāo)檢測(cè)器的 [email protected],我們執(zhí)行了以下計(jì)算。對(duì)于所有被標(biāo)記為「正檢測(cè)」(positive detection)、具備至少 0.5 的交并比(IoU)的對(duì)象,我們對(duì)所有 N 個(gè)類別計(jì)算 IoU (>0.5) 均值,然后對(duì) N 個(gè)均值再求平均。這個(gè)指標(biāo)就是 [email protected]。
為了在我們的數(shù)據(jù)集中評(píng)估目標(biāo)檢測(cè)器,我們需要同時(shí)基于以下兩者的 IoU 來(lái)計(jì)算 mAP:
1. 基于每個(gè)類別(也就是說(shuō)每個(gè)類別的平均 IoU);
2. 數(shù)據(jù)集中所有類別(也就是說(shuō)所有類別平均 IoU 的均值,所以這個(gè)術(shù)語(yǔ)就是平均精度均值)。
為了計(jì)算每個(gè)類別的平均精度,我們?cè)谒械臄?shù)據(jù)點(diǎn)上計(jì)算某個(gè)類別的 IoU。一旦我們計(jì)算出了一個(gè)類別在每個(gè)數(shù)據(jù)點(diǎn)的 IoU,我們對(duì)它們求一次平均(第一次平均)。
為了計(jì)算 mAP,我們對(duì)所有的 N 個(gè)類別計(jì)算平均 IoU,然后對(duì)這 N 個(gè)平均值取平均值(均值的平均)。
通常我們使用 [email protected],表示測(cè)試集中要被標(biāo)記為「正檢測(cè)」的目標(biāo)必須具備的條件,真值不小于 0.5 的 IoU(并可以被正確地標(biāo)記)。這里的 0.5 是可以調(diào)整的,但是在所有的目標(biāo)檢測(cè)數(shù)據(jù)集和挑戰(zhàn)中,0.5 是一個(gè)相對(duì)標(biāo)準(zhǔn)的數(shù)值。
再次強(qiáng)調(diào),這只是一個(gè)關(guān)于目標(biāo)檢測(cè)評(píng)價(jià)指標(biāo)的快速指南,所以我將整個(gè)過(guò)程簡(jiǎn)化了一些。
使用 OpenCV 進(jìn)行基于深度學(xué)習(xí)的目標(biāo)檢測(cè)
我們已經(jīng)在本文以及之前的博客中討論了深度學(xué)習(xí)和目標(biāo)檢測(cè)。出于完整性考慮,我們將在本文中概述實(shí)際的代碼。
我們的例子包含以 MobileNet 作為基礎(chǔ)模型的單次檢測(cè)器(SSD)。該模型由 GitHub 用戶 chuanqi305(https://github.com/chuanqi305/MobileNet-SSD)在 COCO 數(shù)據(jù)集上訓(xùn)練得到。更多細(xì)節(jié)請(qǐng)瀏覽我之前的文章(https://www.pyimagesearch.com/2017/09/11/object-detection-with-deep-learning-and-opencv/),這篇文章介紹了該模型以及相關(guān)的背景信息。
讓我們回到 Ezekiel 在本文開始提出的第一個(gè)問(wèn)題上。
1. 我該如何過(guò)濾/忽略那些我不感興趣的類?
我會(huì)在下面的示例代碼中回答這個(gè)問(wèn)題,但是首先你需要準(zhǔn)備一下系統(tǒng):
你需要在 Python 虛擬環(huán)境中安裝版本不低于 3.3 的 OpenCV(如果你在使用 python 虛擬環(huán)境的話)。OpenCV 3.3+ 包含運(yùn)行以下代碼所需的 DNN 模塊。確保使用鏈接中的 OpenCV 安裝教程之一(https://www.pyimagesearch.com/opencv-tutorials-resources-guides/),要額外注意你下載和安裝的 OpenCV 版本。
你還應(yīng)該安裝我的 imutils 包(https://github.com/jrosebr1/imutils)。為了在 Python 虛擬環(huán)境中安裝/更新 imutils,簡(jiǎn)單地使用以下命令即可: pip install --upgrade imutils。
系統(tǒng)準(zhǔn)備好之后,創(chuàng)建一個(gè)新文件,命名為 filter_object_detection.py。下面讓我們開始:
在第 2 到 8 行中,我們導(dǎo)入了所需的包和模塊,尤其是 imultils 和 OpenCV。我們會(huì)使用我的 VideoStream 類處理從攝像頭獲取的幀。
我們已經(jīng)具備了所需的工具,接著我們來(lái)解析命令行參數(shù):
我們的腳本在運(yùn)行時(shí)需要兩個(gè)命令行參數(shù):
--prototxt : The path to the Caffe prototxt file which defines the model definition.
--model : Our CNN model weights file path.
--prototxt:Caffe prototxt 文件的路徑,它定義了模型的定義。
--model:CNN 模型權(quán)重的文件路徑。
你還可以有選擇性地指定--confidence,這是過(guò)濾弱檢測(cè)的閾值。
我們的模型可以預(yù)測(cè) 21 個(gè)對(duì)象類別:
CLASSES 列表包含該網(wǎng)絡(luò)訓(xùn)練時(shí)的所有類別標(biāo)簽(也就是 COCO 中的標(biāo)簽)。
對(duì) CLASSES 列表的一個(gè)常見誤解是你可以:
1. 向列表增加一個(gè)新的類別標(biāo)簽;
2. 或者從列表移除一個(gè)類別標(biāo)簽。
……以及以為網(wǎng)絡(luò)可以自動(dòng)「了解」你想要完成的任務(wù)。
不是這樣的。
你不能簡(jiǎn)單地修改文本標(biāo)簽列表,讓網(wǎng)絡(luò)自動(dòng)修改自己,在非訓(xùn)練所用數(shù)據(jù)上學(xué)習(xí)、增加或者移除模式。這并不是神經(jīng)網(wǎng)絡(luò)的運(yùn)行方式。
也就是說(shuō),有一個(gè)快速的技巧,你可以使用它來(lái)過(guò)濾或者忽略你不感興趣的預(yù)測(cè)。
解決方案就是:
1. 定義一個(gè) IGNORE 標(biāo)簽集合(即網(wǎng)絡(luò)是在這個(gè)類別標(biāo)簽列表上進(jìn)行訓(xùn)練的,但你現(xiàn)在想忽略這些標(biāo)簽)。
2. 對(duì)一個(gè)輸入圖像/視頻幀進(jìn)行預(yù)測(cè)。
3. 忽略類別標(biāo)簽存在于 IGNORE 集合中的所有預(yù)測(cè)結(jié)果。
在 Python 中實(shí)現(xiàn)時(shí),IGNORE 集合是這樣的:
這里我們忽略所有具有類別標(biāo)簽「person」的預(yù)測(cè)對(duì)象(用于過(guò)濾的 if 語(yǔ)句會(huì)在后續(xù)內(nèi)容中介紹)。
你可以很容易地增加額外的元素(CLASS 列表中的類別標(biāo)簽)來(lái)忽略該集合。
接下來(lái),我們將生成隨機(jī)的類別/框顏色,加載模型,然后啟動(dòng)視頻流:
第 27 行中名為 COLORS 的隨機(jī)數(shù)組為 21 個(gè)類別中的每一個(gè)隨機(jī)生成顏色。這些顏色會(huì)在后邊用于顯示。
第 31 行中使用 cv2.dnn.readNetFromCaffe 函數(shù)加載我們的 Caffe 模型,我們所需的兩個(gè)命令行參數(shù)作為參數(shù)被傳遞。
然后我們將 VideoStream 對(duì)象實(shí)例化為 vs,并開始 fps 計(jì)數(shù)(36-38 行)。2 秒鐘的 sleep 讓我們的攝像頭有足夠的預(yù)熱時(shí)間。
現(xiàn)在我們已經(jīng)準(zhǔn)備好在來(lái)自攝像頭的視頻幀中進(jìn)行循環(huán),并將它們發(fā)送到我們的 CNN 目標(biāo)檢測(cè)器中:
在第 44 行,我們抓取 1 幀,然后重新調(diào)整它的大小并保留用于顯示的長(zhǎng)寬比(第 45 行)。
我們從中提取高度和寬度,稍后會(huì)用到(第 48 行)。
第 48 行和 49 行從這一幀中生成 blob。要了解更多 blob,以及如何使用 cv2.dnn.blobFromImage 函數(shù)構(gòu)建 blob,請(qǐng)?jiān)谝郧暗牟┪闹胁榭此屑?xì)節(jié)(https://www.pyimagesearch.com/2017/11/06/deep-learning-opencvs-blobfromimage-works/)。
下一步,我們將 blob 發(fā)送到神經(jīng)網(wǎng)絡(luò)中來(lái)檢測(cè)目標(biāo)(54-55 行)。
循環(huán)檢測(cè):
從第 58 行開始檢測(cè)循環(huán)。
對(duì)于每一次檢測(cè),我們都提取 confidence(#61 行),然后將它與置信度閾值進(jìn)行比較(#65 行)。當(dāng) confidence 超過(guò)最小值(默認(rèn)的 0.5 可以通過(guò)命令行參數(shù)進(jìn)行修改),我們可以認(rèn)為這次檢測(cè)是一次積極有效的檢測(cè),可以繼續(xù)進(jìn)行處理。
首先,我們從 detections 中提取類別標(biāo)簽索引(#68)。
然后,回到 Ezekiel 的第一個(gè)問(wèn)題,我們可以忽略 INGNORE 集合中的類別(#72—73)。如果這個(gè)類別是要被忽略的,我們只需返回到頂部的檢測(cè)循環(huán)(不會(huì)顯示這個(gè)類別的標(biāo)簽或邊界框)。這符合我們的「quick hack」解決方案。
否則,我們檢測(cè)到的目標(biāo)就在白名單中,我們需要在該幀中顯示對(duì)應(yīng)的類別標(biāo)簽和矩形框:
在這段代碼中,我們提取出了邊界框的坐標(biāo)(#77-78),然后畫出這幀的標(biāo)簽和矩形框(#81-87)。
每個(gè)類別的標(biāo)簽和矩形框都是同樣的顏色,也就是說(shuō),同一類別的對(duì)象都會(huì)具有相同的顏色(即視頻中所有的「boats」都具有相同顏色的標(biāo)簽和邊界框)。
最后,仍然在這個(gè) while 循環(huán)中,我們將結(jié)果顯示在屏幕上:
我們顯示出這一幀,并且捕捉按鍵(#90-91)。
如果 q 鍵被按下,則我們通過(guò)跳出循環(huán)來(lái)結(jié)束程序(#94-95)。
否則,我們會(huì)繼續(xù)更新 fps 計(jì)數(shù)(#98),并且繼續(xù)抓取并分析視頻幀。
在后面幾行中,當(dāng)循環(huán)中斷后,我們會(huì)顯示時(shí)間+fps(幀每秒)指標(biāo)然后清空。
運(yùn)行你的深度學(xué)習(xí)目標(biāo)檢測(cè)器
為了運(yùn)行今天的腳本,你需要滾動(dòng)到下面的「下載」部分來(lái)抓取文件。
當(dāng)你提取到文件之后,打開一個(gè)終端,切換到已下載代碼+模型的路徑。并在這里執(zhí)行以下命令:
圖 6: 使用同一個(gè)模型的實(shí)時(shí)深度學(xué)習(xí)目標(biāo)檢測(cè)演示,在右邊的視頻中我在程序中忽略了某些目標(biāo)類別。
在上邊的動(dòng)圖中,你在左邊可以看到「person」類別被檢測(cè)到了。這是由于 IGNORE 是空的。在右邊的動(dòng)圖中,你可以看到我沒(méi)有被檢測(cè)到,這是由于我把「person」增加到了 IGNORE 集合了。
盡管我們的深度學(xué)習(xí)目標(biāo)檢測(cè)器仍然從技術(shù)上檢測(cè)到了「person」類別,但是我們的后期處理代碼將它過(guò)濾出來(lái)了。
也許你在運(yùn)行這個(gè)深度學(xué)習(xí)目標(biāo)檢測(cè)器的時(shí)候會(huì)遇到錯(cuò)誤?
排除故障的第一步是檢查你是否連接了攝像頭。如果這個(gè)是正常的,也許你會(huì)在你的終端中看到以下錯(cuò)誤信息:
如果你看到這個(gè)信息,那說(shuō)明你沒(méi)有向程序傳遞「命令行參數(shù)」。如果他們不熟悉 Python、argparse 以及命令行參數(shù)的話(https://www.pyimagesearch.com/2018/03/12/python-argparse-command-line-arguments/)。
這是 PyImageSearch 讀者最常遇見的問(wèn)題。查看一下這個(gè)鏈接,看看你是否存在這個(gè)問(wèn)題。帶有注釋的完整視頻在這里:https://youtu.be/5cwFBUQb6_w
如何向深度學(xué)習(xí)目標(biāo)檢測(cè)器添加或者刪除類別?
圖7:深度學(xué)習(xí)目標(biāo)檢測(cè)的微調(diào)過(guò)程和遷移學(xué)習(xí)。
正如我在這份指南中前期所提到的,你不能在 CLASS 列表中簡(jiǎn)單地增加或者刪除類別,基礎(chǔ)的網(wǎng)絡(luò)并沒(méi)有改變。
你所能做的,較好就是修改一個(gè)能夠列出所有類別標(biāo)簽的文本文件。
此外,如果你想顯式地在神經(jīng)網(wǎng)絡(luò)中增加或者刪除類別,你需要做的工作有:
1. 從零開始訓(xùn)練
2. 進(jìn)行微調(diào)
從零開始訓(xùn)練通常會(huì)比較耗時(shí)間,是一個(gè)代價(jià)昂貴的操作,所以我們盡可能避免,但是在一些情況下是無(wú)法避免的。另一個(gè)選擇就是進(jìn)行微調(diào)。微調(diào)是一種遷移學(xué)習(xí)的形式,它是這樣的過(guò)程:
1. 刪除負(fù)責(zé)分類/打標(biāo)簽的全連接層
2. 并用全新的、隨機(jī)初始化的全連接層替代
我們也可以選擇性地修改網(wǎng)絡(luò)中的其它層(包括在訓(xùn)練過(guò)程中凍結(jié)一些層的權(quán)重,以及解凍它們)。
準(zhǔn)確來(lái)說(shuō),如何訓(xùn)練你自己的定制的深度學(xué)習(xí)目標(biāo)檢測(cè)器(包括微調(diào)和從零開始訓(xùn)練)是比較高級(jí)的話題,并不屬于本文的討論范圍,但是閱讀下面的部分可以有助于你開始這項(xiàng)工作。
我可以在哪里學(xué)到更多關(guān)于深度學(xué)習(xí)目標(biāo)檢測(cè)的內(nèi)容?
圖 8: 汽車前后視角的實(shí)時(shí)深度學(xué)習(xí)目標(biāo)檢測(cè)
正如我們?cè)谶@篇博文中討論過(guò)的,目標(biāo)檢測(cè)并不是像圖像分類一樣簡(jiǎn)單,其細(xì)節(jié)和復(fù)雜度超出了本文的范圍(我已經(jīng)啰嗦了好多遍了)。
本教程肯定不是我在深度學(xué)習(xí)目標(biāo)檢測(cè)方方面的最后一篇文章(毫無(wú)疑問(wèn),我會(huì)在未來(lái)寫更多關(guān)于深度學(xué)習(xí)目標(biāo)檢測(cè)的文章),但是如果你對(duì)學(xué)習(xí)以下內(nèi)容感興趣:
1. 為目標(biāo)檢測(cè)準(zhǔn)備你的數(shù)據(jù)集。
2. 在你的數(shù)據(jù)集上精調(diào)并訓(xùn)練你自己的定制化目標(biāo)檢測(cè)器,包括 Faster R-CNN 和 SSD。
3. 了解我的較好的實(shí)踐做法、技術(shù)和過(guò)程,并使用它們來(lái)訓(xùn)練自己的深度學(xué)習(xí)目標(biāo)檢測(cè)器。
... 然后,你可能會(huì)想看一下我的新書(https://www.pyimagesearch.com/deep-learning-computer-vision-python-book/)。在《Deep Learning for Computer Vision with Python》一書中,我會(huì)一步一步地指導(dǎo)你構(gòu)建自己的深度學(xué)習(xí)目標(biāo)檢測(cè)器。
總結(jié)
這篇博客簡(jiǎn)單介紹了深度學(xué)習(xí)目標(biāo)檢測(cè)所涉及的一些難點(diǎn)。我們以概述圖像分類和目標(biāo)檢測(cè)之間的本質(zhì)區(qū)別作為開始,包括如何將一個(gè)圖像分類的神經(jīng)網(wǎng)絡(luò)用于目標(biāo)檢測(cè)。
然后我們概述了深度學(xué)習(xí)目標(biāo)檢測(cè)器的核心組成:
1. 檢測(cè)框架
2. 基本模型
基本模型通常是一個(gè)預(yù)訓(xùn)練的(分類)網(wǎng)絡(luò),為了學(xué)習(xí)到一系列具有辨識(shí)能力的濾波器,一般是在大型圖像數(shù)據(jù)集(例如 ImageNet)上進(jìn)行訓(xùn)練的。
我們也可以從零開始訓(xùn)練基本網(wǎng)絡(luò),但是,對(duì)于目標(biāo)檢測(cè)器而言,為了達(dá)到較合理的準(zhǔn)確率。這通常需要更長(zhǎng)的訓(xùn)練時(shí)間。
在絕大多數(shù)情況下,你應(yīng)該以一個(gè)預(yù)訓(xùn)練的基本模型作為開始,而不是嘗試著從零開始訓(xùn)練。
當(dāng)我們對(duì)深度學(xué)習(xí)目標(biāo)檢測(cè)器有了充分的理解之后,我們就可以在 OpenCV 中實(shí)現(xiàn)能夠?qū)崟r(shí)運(yùn)行的目標(biāo)檢測(cè)器。
我還概述了如何過(guò)濾或者忽略那些不感興趣的類別標(biāo)簽。
最后,我們了解到:實(shí)際地向深度學(xué)習(xí)目標(biāo)檢測(cè)器增加一個(gè)類別標(biāo)簽,或者從深度學(xué)習(xí)目標(biāo)檢測(cè)器中刪除一個(gè)類別標(biāo)簽并不是像從硬編碼的標(biāo)簽列表張?jiān)黾踊蛘邉h除標(biāo)簽一樣簡(jiǎn)單。
神經(jīng)網(wǎng)絡(luò)本身并不在乎你是否修改了類別標(biāo)簽,相反,你需要:
1. 通過(guò)刪除全連接目標(biāo)預(yù)測(cè)層并進(jìn)行調(diào)整來(lái)修改網(wǎng)絡(luò)結(jié)構(gòu)
2. 或者從零開始訓(xùn)練目標(biāo)檢測(cè)網(wǎng)絡(luò)框架
對(duì)于更多的深度學(xué)習(xí)目標(biāo)檢測(cè)項(xiàng)目,你需要從一個(gè)基于目標(biāo)檢測(cè)任務(wù)(例如 COCO)的預(yù)訓(xùn)練深度學(xué)習(xí)目標(biāo)檢測(cè)器開始。然后基于預(yù)訓(xùn)練模型進(jìn)行微調(diào),以得到你自己的檢測(cè)器。
訓(xùn)練一個(gè)端到端的定制深度學(xué)習(xí)目標(biāo)檢測(cè)器并不屬于本文的范疇,所以,如果你對(duì)探索如何訓(xùn)練自己的目標(biāo)檢測(cè)器感興趣,請(qǐng)參考我的書籍《deep learning for computer vision with python》。
在這本書中,我描述了一些深度學(xué)習(xí)目標(biāo)檢測(cè)的例子,包括為以下任務(wù)訓(xùn)練你自己的深度學(xué)習(xí)目標(biāo)檢測(cè)器:
1. 檢測(cè)交通標(biāo)志,例如 Stop 標(biāo)志,人行橫道標(biāo)志等等。
2. 汽車的前后視角
原文鏈接:
https://www.pyimagesearch.com/2018/05/14/a-gentle-guide-to-deep-learning-object-detection/
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價(jià)值的辦法,實(shí)際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉(cāng)庫(kù),數(shù)據(jù)挖掘工具,報(bào)表系統(tǒng)等全方位知識(shí)
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/4783.html
摘要:基于候選區(qū)域的目標(biāo)檢測(cè)器滑動(dòng)窗口檢測(cè)器自從獲得挑戰(zhàn)賽冠軍后,用進(jìn)行分類成為主流。一種用于目標(biāo)檢測(cè)的暴力方法是從左到右從上到下滑動(dòng)窗口,利用分類識(shí)別目標(biāo)。這些錨點(diǎn)是精心挑選的,因此它們是多樣的,且覆蓋具有不同比例和寬高比的現(xiàn)實(shí)目標(biāo)。 目標(biāo)檢測(cè)是很多計(jì)算機(jī)視覺任務(wù)的基礎(chǔ),不論我們需要實(shí)現(xiàn)圖像與文字的交互還是需要識(shí)別精細(xì)類別,它都提供了可靠的信息。本文對(duì)目標(biāo)檢測(cè)進(jìn)行了整體回顧,第一部分從RCNN...
摘要:谷歌在年國(guó)際消費(fèi)電子展以及今年的開發(fā)峰會(huì)上首次展示了他們的,然后于三月份發(fā)布了。樹莓派上性能的局限性不幸的是,業(yè)余愛好者最喜歡樹莓派無(wú)法充分發(fā)揮加速器的功能和速度。使用端口,目前的樹莓派設(shè)備沒(méi)有或,而只能使用速度較慢的。 Edge AI是什么?它為何如此重要? 傳統(tǒng)意義上,AI解決方案需要強(qiáng)大的并行計(jì)算處理能力,長(zhǎng)期以來(lái),AI服務(wù)都是通過(guò)聯(lián)網(wǎng)在線的云端基于服務(wù)器的計(jì)算來(lái)提供服務(wù)。但是具...
摘要:這一切始于年的一篇論文,其使用了稱為的算法用來(lái)提取感興趣候選區(qū)域,并用一個(gè)標(biāo)準(zhǔn)的卷積神經(jīng)網(wǎng)絡(luò)去分類和調(diào)整這些區(qū)域。 本文詳細(xì)解釋了 Faster R-CNN 的網(wǎng)絡(luò)架構(gòu)和工作流,一步步帶領(lǐng)讀者理解目標(biāo)檢測(cè)的工作原理,作者本人也提供了 Luminoth 實(shí)現(xiàn),供大家參考。Luminoth 實(shí)現(xiàn):https://github.com/tryolabs/luminoth/tree/master/l...
摘要:從標(biāo)題上可以看出,這是一篇在實(shí)例分割問(wèn)題中研究擴(kuò)展分割物體類別數(shù)量的論文。試驗(yàn)結(jié)果表明,這個(gè)擴(kuò)展可以改進(jìn)基準(zhǔn)和權(quán)重傳遞方法。 今年10月,何愷明的論文Mask R-CNN摘下ICCV 2017的較佳論文獎(jiǎng)(Best Paper Award),如今,何愷明團(tuán)隊(duì)在Mask R-CNN的基礎(chǔ)上更近一步,推出了(以下稱Mask^X R-CNN)。這篇論文的第一作者是伯克利大學(xué)的在讀博士生胡戎航(清華...
摘要:摘要背景深度學(xué)習(xí)是一種表示學(xué)習(xí)方法,非常適合用來(lái)處理數(shù)字病理學(xué)中的圖像分析問(wèn)題。優(yōu)質(zhì)的注釋樣本是深度學(xué)習(xí)重要的先決條件,但是處理數(shù)字病理學(xué)中最大的挑戰(zhàn)就是獲取高質(zhì)量的注釋樣本。本文使用的深度學(xué)習(xí)主要由四個(gè)模塊組成。 Deep learning for digital pathology image analysis: A comprehensive tutorial with sele...
閱讀 3639·2023-04-26 02:24
閱讀 972·2023-04-25 14:47
閱讀 2571·2021-11-24 11:16
閱讀 1762·2021-11-24 09:38
閱讀 1607·2021-11-18 10:07
閱讀 2097·2021-09-22 15:49
閱讀 1622·2019-08-30 15:55
閱讀 916·2019-08-26 13:38