一、概述
首先通過(guò)前面對(duì)計(jì)算機(jī)視覺(jué)領(lǐng)域中的卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行了解和學(xué)習(xí),我們知道,可以通過(guò)卷積神經(jīng)網(wǎng)絡(luò)對(duì)圖像進(jìn)行分類(lèi)。
如果還想繼續(xù)深入,會(huì)涉及到目標(biāo)定位(object location)的問(wèn)題。在圖像分類(lèi)的基礎(chǔ)上(Image classification)的基礎(chǔ)上,除了判斷圖像中的物體類(lèi)別是什么,還需要給出其在圖像中的位置,我們成為分類(lèi)和定位的問(wèn)題(Classification and localization)。但是相信你對(duì)目標(biāo)檢測(cè)問(wèn)題也有一定了解,對(duì)于目標(biāo)檢測(cè),它和前面兩個(gè)問(wèn)題就不是一個(gè)level了,目標(biāo)檢測(cè)需要識(shí)別圖像中所有待識(shí)別的物體,給出其類(lèi)別和位置。最大的不同點(diǎn)在于,目標(biāo)分類(lèi)和定位問(wèn)題在于圖像中僅僅只有一個(gè)物體,而目標(biāo)檢測(cè)并不是。
但是圖像分類(lèi)和目標(biāo)定位的知識(shí)也會(huì)對(duì)目標(biāo)檢測(cè)問(wèn)題有幫助。所以接下來(lái)我們?cè)倏匆幌路诸?lèi)問(wèn)題和定位問(wèn)題,它們也是學(xué)習(xí)目標(biāo)檢測(cè)的基礎(chǔ)。
1.1:圖像分類(lèi)和定位
我們看到下面標(biāo)準(zhǔn)的圖像分類(lèi)的流程
- 輸入具有單個(gè)目標(biāo)的圖像
- 通過(guò)卷積神經(jīng)網(wǎng)絡(luò),得到特征向量
- 輸送給softmax進(jìn)行分類(lèi)
當(dāng)需要對(duì)圖像中的物體在分類(lèi)基礎(chǔ)上,預(yù)測(cè)其位置時(shí),直接在全連接的輸出層加上一個(gè)預(yù)測(cè)bounding box預(yù)測(cè)層就行。
不看分類(lèi)的話,也就是相當(dāng)于預(yù)測(cè)四個(gè)連續(xù)值的回歸問(wèn)題,理論上肯定行得通。當(dāng)然我們知道,卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí)到的是圖片的局部特征,為什么能預(yù)測(cè)位置呢?好像有些牽強(qiáng)。我自己的理解是,雖然卷積神經(jīng)網(wǎng)絡(luò)好像只是學(xué)習(xí)到了一些局部的紋理特征,它肯定還是學(xué)習(xí)到了或者說(shuō)保存了特征的位置信息(比如你想一想,特征的位置不一樣,圖像中那個(gè)位置的響應(yīng)也不一樣)所以我個(gè)人目前的理解來(lái)說(shuō),我可以理解。
??后來(lái)我仔細(xì)查找資料的印證:
- 特征圖的生成: CNN通過(guò)一系列的卷積和池化操作,從原始圖像中提取有用的特征,并生成一個(gè)稱(chēng)為特征圖的輸出。特征圖實(shí)際上是源圖像的一個(gè)縮小版本,其中每個(gè)單元包含對(duì)應(yīng)于源圖像某一窗口的特征信息。這個(gè)特征圖可以用于定位,因?yàn)槊總€(gè)特征單元的位置信息可以映射回源圖像的相應(yīng)位置。
- 全連接層: 盡管卷積層和池化層能有效提取并保留空間信息,但通常我們?cè)诰W(wǎng)絡(luò)的最后幾層會(huì)使用全連接層來(lái)進(jìn)行精確的定位。全連接層能從前層提取的所有特征中命中目標(biāo),這有利于精準(zhǔn)的定位。全連接層中的每一個(gè)神經(jīng)元與前一層的所有神經(jīng)元都有連接。這意味著全連接層接收到的信息是全局的,每個(gè)神經(jīng)元能看到整個(gè)圖像,而不僅僅是像卷積層那樣看到圖像的一小部分。
接下來(lái)我們看一下,在這種問(wèn)題背景下,我們?cè)撊绾螌?duì)圖像進(jìn)行標(biāo)記呢?或者說(shuō),我們對(duì)訓(xùn)練過(guò)程中的真實(shí)值該如何表示呢?
-
Pc
:表示的其實(shí)就是置信度,在標(biāo)記中就只有0,1兩種,表示有無(wú)了(實(shí)際上對(duì)Pc為0的我們也沒(méi)有進(jìn)行標(biāo)記)。預(yù)測(cè)的結(jié)果就是0~1
之間 -
bx,by,bh,bw
:就是物體位置 -
c1,c2,c3
其實(shí)也是分類(lèi)預(yù)測(cè)softmax
確定的,表示屬于哪一類(lèi)(Pc
也是softmax那一層決定的,表示確定的這個(gè)類(lèi)的置信度)
根據(jù)標(biāo)簽中pc
是否為1,對(duì)于損失函數(shù)也有講究
- 如果
pc
為1
,那么就對(duì)其正常使用均方差或者設(shè)定好的的損失函數(shù) - 如果
pc
為0
,那么算均方差時(shí)我們只算(y預(yù)測(cè)-0)^2
,其他7個(gè)值我們并不關(guān)心,我只看pc
的預(yù)測(cè)有多準(zhǔn)
同時(shí),對(duì)于損失函數(shù)的選擇,你可以對(duì)dx,dy,w,h
選擇均方差的損失函數(shù),對(duì)c1c2,c3
選擇log
形式的損失函數(shù),這樣搭配使用,也是完全OK的。
????總結(jié)一下:
圖像分類(lèi)是最基礎(chǔ)的任務(wù),它的目標(biāo)是確定圖像中的主要內(nèi)容。例如,一個(gè)圖像分類(lèi)模型可能需要確定一個(gè)圖像是貓、狗還是車(chē)。
單目標(biāo)定位在圖像分類(lèi)的基礎(chǔ)上增加了空間信息,即不僅需要確定圖片中的主要內(nèi)容,還需要定位出這個(gè)主要內(nèi)容在圖片中的位置。這通常通過(guò)在圖像上放置一個(gè)邊界框來(lái)完成
- 特征提取:CNN架構(gòu)主體通常由交替的卷積層和池化層構(gòu)成,可以自動(dòng)地從輸入圖片中學(xué)習(xí)并提取有用的特征。
- 分類(lèi):在特征提取之后,最后一層通常是一個(gè)全連接層,用于分類(lèi)任務(wù)。這些特征送入全連接神經(jīng)網(wǎng)絡(luò)作為輸入,進(jìn)行最終的分類(lèi)處理。
- 單目標(biāo)定位:在單目標(biāo)定位任務(wù)中,CNN不僅進(jìn)行分類(lèi),還需要定位主要目標(biāo)的位置。在輸出層中,除了類(lèi)別概率,還會(huì)添加4個(gè)單元來(lái)預(yù)測(cè)物體的邊界框(中心點(diǎn)坐標(biāo)以及寬和高)。
1.2:關(guān)鍵特征點(diǎn)檢測(cè)
其實(shí)上文中,識(shí)別物體類(lèi)別,并且定位到四個(gè)關(guān)鍵點(diǎn)(方框的四個(gè)角點(diǎn))可以推廣到更普遍的情況。
1.3:我的困惑和解決
不論可解釋性的情況下,目標(biāo)檢測(cè)為什么不能一次性輸入圖片,然后像圖像分類(lèi)那樣通過(guò)一個(gè)卷積層,直接輸出所有預(yù)測(cè)結(jié)果?
首先我其實(shí)是沒(méi)有真正理解神經(jīng)網(wǎng)絡(luò)的本質(zhì)!我們目前學(xué)習(xí)到的神經(jīng)網(wǎng)絡(luò),或者說(shuō)一般的、用于預(yù)測(cè)的神經(jīng)網(wǎng)絡(luò),它的輸出都被設(shè)計(jì)為固定的,或者說(shuō)我們期待的預(yù)測(cè)結(jié)果的格式就是固定的,我們已經(jīng)知道只可能是有或者沒(méi)有物體!比如,上面圖像分類(lèi)和定位,就只有8個(gè)輸出,表示類(lèi)別、置信度和位置。這也是為什么對(duì)于目標(biāo)檢測(cè)這種,輸出結(jié)果不完全確定的,具體來(lái)說(shuō),目標(biāo)的個(gè)數(shù)以及位置不確定,不能用簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)來(lái)設(shè)計(jì)從而解決。
-
Q:如果不考慮可行性,真的下設(shè)計(jì)一個(gè)用簡(jiǎn)單神經(jīng)網(wǎng)絡(luò)輸出目標(biāo)檢測(cè),它的根本的不可行性在哪里,請(qǐng)說(shuō)的更直白透徹一些,結(jié)合卷積神經(jīng)網(wǎng)絡(luò)
-
A:確實(shí),我們可以理論上設(shè)計(jì)一個(gè)簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)用于目標(biāo)檢測(cè),但是會(huì)遇到一些根本的問(wèn)題,這是由卷積神經(jīng)網(wǎng)絡(luò)的固有屬性決定的。我將基于卷積神經(jīng)網(wǎng)絡(luò)(CNN)的工作原理和目標(biāo)檢測(cè)問(wèn)題的特性來(lái)說(shuō)明這個(gè)問(wèn)題。
- 輸出空間的固定性 vs 輸出空間的動(dòng)態(tài)變化性: 卷積神經(jīng)網(wǎng)絡(luò)一般被設(shè)計(jì)用于解 決具有固定大小輸出空間的問(wèn)題,如分類(lèi)、回歸等。對(duì)于分類(lèi)任務(wù),CNN的最后一層通常是全連接層,輸出空間的大小等于類(lèi)別的數(shù)量,這是固定的。然而,目標(biāo)檢測(cè)問(wèn)題的輸出空間大小是不確定的,因?yàn)槊繌垐D片中的目標(biāo)數(shù)量是變化的,每個(gè)目標(biāo)需要一個(gè)邊界框和一個(gè)類(lèi)別標(biāo)簽作為輸出,所以輸出空間大小是動(dòng)態(tài)的。
- 欠擬合和過(guò)擬合問(wèn)題: 簡(jiǎn)單的網(wǎng)絡(luò)模型在復(fù)雜任務(wù)上可能會(huì)出現(xiàn)“欠擬合”問(wèn)題。如果我們?cè)O(shè)計(jì)一個(gè)簡(jiǎn)單的CNN進(jìn)行目標(biāo)檢測(cè),可能會(huì)損失太多細(xì)節(jié)信息導(dǎo)致不足以檢測(cè)出所有目標(biāo)。相反,如果我們使模型變得更復(fù)雜,可能會(huì)導(dǎo)致"過(guò)擬合"問(wèn)題,使模型不能有效地泛化到新的未見(jiàn)過(guò)的數(shù)據(jù)。
- 位置不變性 vs 識(shí)別精度: CNN具有位置不變性,意味著無(wú)論目標(biāo)在圖像中的位置如何變化,網(wǎng)絡(luò)都可以檢測(cè)到。這在許多任務(wù)中是有用的,如圖像分類(lèi)。但在目標(biāo)檢測(cè)中,我們不僅要識(shí)別目標(biāo)的類(lèi)別,還要準(zhǔn)確地判斷出其在圖像中的位置。簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)可能在保持較高的識(shí)別精度的同時(shí),無(wú)法保證較高的定位精度。
- 尺度問(wèn)題: CNN的另一個(gè)特性是它對(duì)于較大的尺度變化不敏感,這意味著同樣的模型對(duì)于不同尺度的目標(biāo)可能會(huì)失效。在目標(biāo)檢測(cè)中,一個(gè)圖像中的目標(biāo)可能會(huì)有不同的尺度,且尺度的變化可能很大,簡(jiǎn)單的CNN由于其固有的尺度不變性,會(huì)很難在所有尺度上都檢測(cè)到目標(biāo)。
綜上所述,雖然我們可以嘗試用簡(jiǎn)單的卷積神經(jīng)網(wǎng)絡(luò)來(lái)進(jìn)行目標(biāo)檢測(cè),但由于上述的一些限制,僅用一個(gè)簡(jiǎn)單的CNN很難有效地處理目標(biāo)檢測(cè)問(wèn)題。這就是為什么我們通常需要用到更復(fù)雜的、專(zhuān)門(mén)設(shè)計(jì)用于處理目標(biāo)檢測(cè)問(wèn)題的網(wǎng)絡(luò)模型,如Faster-RCNN, YOLO, SSD等。
所以為什么講到錨框,也就是說(shuō),讓先生成一些大差不差的邊界框,然后把這些邊界框(或者理解成由邊界框裁剪后的圖片)輸入神經(jīng)網(wǎng)絡(luò),向上文講的圖像分類(lèi)和定位那樣,進(jìn)行分類(lèi)和位置預(yù)測(cè)。
所以到這里,我們可以把單目標(biāo)分類(lèi)和預(yù)測(cè),看作目標(biāo)檢測(cè)的一個(gè)子任務(wù)。事實(shí)上在二階段目標(biāo)檢測(cè)中用到的正是這種思想(當(dāng)然具體實(shí)現(xiàn)細(xì)節(jié)還需要探討,但大致思想是這樣)。
??總結(jié),目標(biāo)檢測(cè)網(wǎng)絡(luò)的主要任務(wù),可以分解為兩個(gè)部分:
- 一個(gè)是提議或生成潛在邊界框(稱(chēng)為候選框或區(qū)域提議)
- 另一個(gè)部分就是單目標(biāo)定位,將每個(gè)候選區(qū)域分類(lèi)并矯正其邊界框。所以,你看,目標(biāo)定位實(shí)際上就是嵌套在目標(biāo)檢測(cè)這個(gè)更復(fù)雜問(wèn)題中的一個(gè)關(guān)鍵子任務(wù)。
在更具體的視覺(jué),例如YOLO(You Only Look Once)或者Faster R-CNN等目標(biāo)檢測(cè)框架,單目標(biāo)定位就更顯其重要性。在YOLO中,整個(gè)圖像被劃分為SxS個(gè)格子,每個(gè)格子負(fù)責(zé)預(yù)測(cè)一個(gè)包含對(duì)象中心的邊界框;在Faster R-CNN中,RPN(Region Proposal Network,區(qū)域提議網(wǎng)絡(luò))輸出的各種候選框,會(huì)進(jìn)入ROI Pooling等一系列處理后,通過(guò)全連接層進(jìn)行邊界框回歸和類(lèi)別分類(lèi),這就是單目標(biāo)定位的部分。
因此,我們可以說(shuō),單目標(biāo)定位確實(shí)是目標(biāo)檢測(cè)中的一個(gè)子模塊。而目標(biāo)檢測(cè)可以理解為對(duì)單目標(biāo)定位的一種擴(kuò)展,它能夠處理任意數(shù)目和類(lèi)別的對(duì)象。
當(dāng)然這只是一個(gè)宏觀上的理解,我們差不多搞清楚了單目標(biāo)定位和分類(lèi)和目標(biāo)檢測(cè)的區(qū)別和聯(lián)系,也知道目標(biāo)檢測(cè)要比前者復(fù)雜很多,當(dāng)然部署一兩段話可以具體解釋清楚,下面就詳細(xì)來(lái)看把!
我個(gè)人學(xué)習(xí)后覺(jué)得核心在于兩點(diǎn)
- bounding box的生成方式
- 子任務(wù) (單目標(biāo)分類(lèi)和檢測(cè)) 是如何和目標(biāo)檢測(cè)問(wèn)題相鏈接或者說(shuō)組合的
二、目標(biāo)檢測(cè)
2.1:滑動(dòng)窗口算法
滑動(dòng)窗口是模板檢測(cè)過(guò)程中錨框生成的一種方式。
- 首先,我們定義一個(gè)固定尺寸的窗口,這個(gè)窗口的尺寸應(yīng)該與我們期望檢測(cè)的目標(biāo)的尺寸大致相同。
- 初始時(shí),我們將窗口放置在圖像的左上角,然后得到錨框窗口內(nèi)的圖像。將其用送入卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行分類(lèi),判斷是否包含我們關(guān)注的目標(biāo)。
- 然后,我們將窗口向右或者向下移動(dòng)一定的步長(zhǎng),這個(gè)步長(zhǎng)可以是窗口寬度或者高度的一半,也可以是更小的值。然后再對(duì)新窗口位置的圖像進(jìn)行同樣的分類(lèi)操作。
- 我們重復(fù)上面的步驟,直到窗口滑過(guò)整張圖像。
- 然后調(diào)整錨框尺寸,重復(fù)上述步驟。
但是這種滑動(dòng)錨框,獲得圖像,送入卷積神經(jīng)網(wǎng)絡(luò)的方法有一個(gè)很大的問(wèn)題。我們可以看到,對(duì)于同一張圖像,用這種暴力的方法可以生成上百萬(wàn)甚至更多的錨框,將其錨框內(nèi)剪裁得到的圖像,一個(gè)個(gè)單獨(dú)地送入卷積神經(jīng)網(wǎng)絡(luò)進(jìn)行預(yù)測(cè),計(jì)算機(jī)成本和存儲(chǔ)成本相當(dāng)之大! 你可能會(huì)想減少滑動(dòng)窗口滑動(dòng)的stride,但是這樣也會(huì)失去精準(zhǔn)性。
滑動(dòng)窗口在神經(jīng)網(wǎng)絡(luò)興起之前也有被應(yīng)用,那個(gè)時(shí)候,是將裁剪后的圖像送入一個(gè)簡(jiǎn)單的線性分類(lèi)器,這樣的成本會(huì)相對(duì)較小。但是我們都知道,卷積神經(jīng)網(wǎng)絡(luò)的精準(zhǔn)度肯定是要高于人工手動(dòng)設(shè)計(jì)特征的分類(lèi)器。
我們可以看到,先用錨框滑動(dòng)窗口,讓后裁剪圖片送入卷積神經(jīng)網(wǎng)絡(luò)。注意到,錨框滑動(dòng)窗口和卷積核滑動(dòng)窗口的過(guò)程十分類(lèi)似。實(shí)際上,可以把這個(gè)過(guò)程合二為一,減少一些計(jì)算量:
這個(gè)將滑動(dòng)窗口思想和卷積神經(jīng)網(wǎng)絡(luò)相融合從而進(jìn)行目標(biāo)檢測(cè),由Pierre Sermanet等人于2013年發(fā)表的論文,題為"Overfeat: Integrated Recognition, Localization and Detection using Convolutional Networks"所運(yùn)用。
首先,我們需要把得到全連接層也看成卷積的過(guò)程(在全連接層和卷積層之間加入適當(dāng)?shù)木矸e核):
于是,如下圖,對(duì)于原圖像進(jìn)行適當(dāng)?shù)奶畛?,我們可以看到最后結(jié)果為2x2x4
,其實(shí)就是代表有2x2
個(gè)錨框得到的結(jié)果。這樣將滑動(dòng)窗口思想和卷積稍微結(jié)合,從而通過(guò)一次向前傳播(端到端),而不是截取四個(gè)錨框分別向前傳播四次,就節(jié)省了很大的計(jì)算成本。
這個(gè)方法雖然提高了檢測(cè)效率,但是也有一些限制。例如,滑動(dòng)窗口通常是固定大小的(因?yàn)殄^框的得到其實(shí)是間接的,取決于最后一層輸出層映射到原圖像的大小,而這個(gè)映射關(guān)系是由網(wǎng)絡(luò)決定),這就意味著如果物體的尺度變化很大,那么滑動(dòng)窗口就很難覆蓋到所有物體。但是總的來(lái)說(shuō),滑動(dòng)窗口的思想開(kāi)啟了物體檢測(cè)的新篇章,并且對(duì)后續(xù)的YOLO,SSD等一系列算法產(chǎn)生了深遠(yuǎn)影響。
2.2:YOLO算法
2.2.1:邊界框的預(yù)測(cè)——YOLOv1概述
YOLOv1是屬于One Stage:端到端目標(biāo)檢測(cè)。下面我們對(duì)其如何生成bounding box
以及大致思路進(jìn)行了解。
?? 思路
-
首先將一幅圖像分成
SxS
個(gè)網(wǎng)格(grid cell)(相當(dāng)于將原圖像進(jìn)行SxS
的裁剪,得到SxS
個(gè)子圖像,每個(gè)子圖像進(jìn)行單目標(biāo)檢測(cè),不過(guò)這里的所有子圖像是并行處理)。哪個(gè) 目標(biāo)物體的中心落在這個(gè)網(wǎng)格中,則這個(gè)網(wǎng)格負(fù)責(zé)預(yù)測(cè)這個(gè)目標(biāo)。更具體來(lái)說(shuō),一張圖片,對(duì)應(yīng)有7×7
個(gè)lables
,7x7
表示有7x7
個(gè)子區(qū)域,每個(gè)lables
包括:有無(wú)物體、物體類(lèi)別、位置、置信度等,這些值的按照物體被分配到哪個(gè)子區(qū)域進(jìn)行填寫(xiě)!一個(gè)物體可能橫跨了多個(gè)子區(qū)域,但是它只在它的中心所在的那個(gè)子區(qū)域/網(wǎng)格的那個(gè)lable進(jìn)行標(biāo)記。 -
但是實(shí)際每個(gè)子區(qū)域輸入網(wǎng)絡(luò)時(shí),它還是按照單目標(biāo)定位進(jìn)行預(yù)測(cè),也就是說(shuō),預(yù)測(cè)結(jié)果可能其他子區(qū)域也會(huì)認(rèn)為存在物體,即使該物體的中心點(diǎn)不在此區(qū)域!
-
網(wǎng)絡(luò)的最終輸出是 7×7×30。還是以這個(gè)狗為例,7x7 很好理解,圖像分為 7x7 個(gè)區(qū)域進(jìn)行預(yù)測(cè).最終輸出 tensor 的前五個(gè)數(shù)值,分別是 bbox 的 x,y,w,h,c,即 bbox 的中心坐標(biāo) x,y,bbox 的寬高 w,h,bbox 的置信度。
-
可以看到,雖然在邏輯上是分成
7x7
個(gè)區(qū)域“獨(dú)立”完成目標(biāo)定位的,但是整個(gè)過(guò)程是一次卷積,也就是onstage
,端到端! -
一個(gè)中心點(diǎn),會(huì)檢測(cè) 2 個(gè) bbox ,這個(gè)操作可以減少漏檢,因?yàn)榭梢赃m應(yīng)不同形狀的 bbox,進(jìn)而提高bbox 的準(zhǔn)確率。2 個(gè) bbox 都會(huì)保留,最后通過(guò) NMS 選擇出最佳的 bbox
-
后面的 20 個(gè),就是類(lèi)別的概率,YOLO v1 是在 VOC 數(shù)據(jù)集上訓(xùn)練的,因此一共 20 個(gè)類(lèi)。
2.2.2:交并比(IOU)
交并比是衡量定位框是否準(zhǔn)確的一種方法:
一般會(huì)把閾值設(shè)置為0.5
,當(dāng)然為了提高準(zhǔn)確性,也可以將閾值設(shè)置為更高。
2.2.3:非極大值抑制(NMS)
作用:保證一個(gè)對(duì)象只對(duì)應(yīng)一個(gè)且是最優(yōu)的bounding box。
看下面這個(gè)例子,物體的中心點(diǎn)只存在于一個(gè)網(wǎng)格,但是其他網(wǎng)格(子區(qū)域)在進(jìn)行預(yù)測(cè)時(shí)也有可能認(rèn)為物體的中心在其中,或者說(shuō)預(yù)測(cè)到同一物體。這個(gè)時(shí)候,同一個(gè)物體會(huì)得到多個(gè)bounding box
而NMS做的就是,去除冗余框,得到最優(yōu)預(yù)測(cè)框。
那我們下面具體看看NMS是如何發(fā)揮作用的:
-
首先看每個(gè)框所給出的置信度
Pc
,現(xiàn)在有5個(gè)bounding box,記為A、B、C、D、E。并將其按照置信度,從大到小排序:A、D、C、E、B -
取出現(xiàn)在所有的bounding box置信度最大的那個(gè)框:A
-
遍歷剩下所有的bounding box:B、C、D、E,計(jì)算其與當(dāng)前置信度最高的那個(gè)bounding box之間的
IOU
。B、C與A的IOU超過(guò)閾值,那么就扔掉B、C;并標(biāo)記第一個(gè)矩形框A,是我們保留下來(lái)的。 -
從剩下的矩形框D、E中,選擇概率最大的D,然后判斷E與D的重疊度,重疊度大于一定的閾值,那么就扔掉;并標(biāo)記D是我們保留下來(lái)的第二個(gè)矩形框。
就這樣一直重復(fù),找到所有被保留下來(lái)的矩形框。
上面示例中,因?yàn)閳D像中只有一個(gè)類(lèi)別,所有運(yùn)行一次NMS就找出來(lái)最后的所有邊框。實(shí)際中,若有多個(gè)類(lèi)別,如
n
個(gè)類(lèi)別,則需要獨(dú)立的運(yùn)行n
次NMS。
最后,了解了過(guò)程,讓我們對(duì)非極大值抑制進(jìn)行總結(jié):非極大值抑制,即找到最大可能的邊框,而抑制那些非最大值的邊框,固稱(chēng)為非極大值抑制(non-max suppression)
2.2.4:錨框(anchor box)
我們上文講到y(tǒng)olov1算法存在一個(gè)局限:一個(gè)子區(qū)域限定預(yù)測(cè)一個(gè)物體。如果物體很小,一個(gè)子區(qū)域存在多個(gè)物體呢?通過(guò)對(duì)子區(qū)域添加錨框,可以解決這個(gè)問(wèn)題。這也是YOLOv2對(duì)v1的改進(jìn)之處。
可以看到,下面的兩個(gè)物體:people和car同時(shí)落在了一個(gè)網(wǎng)格/子區(qū)域中,上文我們知道,一個(gè)網(wǎng)格只能預(yù)測(cè)一個(gè)物體,那么此時(shí)就出現(xiàn)物體了。于是,為了改進(jìn)這一點(diǎn),對(duì)于一個(gè)網(wǎng)格我們提出2個(gè)(其實(shí)實(shí)際實(shí)現(xiàn)中不知2個(gè))錨框(anchor box),同時(shí)lables
和輸出向量的通道數(shù)也要隨之改變(如下圖y的兩個(gè)表示所示)。通過(guò)這種方式,一個(gè)網(wǎng)格(子區(qū)域)就可以預(yù)測(cè)多個(gè)物體了!
下面是對(duì)有無(wú)錨框前后的對(duì)比總結(jié):
2.2.5:整合:YOLO算法全流程
1、構(gòu)建訓(xùn)練集:Training
- 首先,將原圖像劃分為
SxS
網(wǎng)格 - 對(duì)于每個(gè)子區(qū)域進(jìn)行標(biāo)記(原則是根據(jù)我們手動(dòng)打的標(biāo)簽,代表真實(shí)物體的位置,從而判斷物體的中心落在了這個(gè)網(wǎng)格,且在這個(gè)網(wǎng)格中的某個(gè)錨框的IOU最大,則將其歸屬于這個(gè)網(wǎng)格的這個(gè)錨框)
- 比如在下面示例中,對(duì)于左上角藍(lán)色方框,沒(méi)有物體存在,所以兩個(gè)錨框的
Pc
都標(biāo)記為0
表示沒(méi)有一個(gè)錨框于物體相關(guān)聯(lián);對(duì)于綠色的網(wǎng)格,有物體存在,且在第二個(gè)錨框中的IOU
最大,于是將第二個(gè)錨框的Pc
標(biāo)記為1
,將bx,by,bh,bw
賦值為物體真實(shí)位置。
2、預(yù)測(cè)
根據(jù)物體真實(shí)位置構(gòu)建好訓(xùn)練集后,訓(xùn)練好模型,即可進(jìn)行預(yù)測(cè)。
3、非極大值抑制
得到預(yù)測(cè)結(jié)果會(huì)如下圖所示(這里每個(gè)網(wǎng)格會(huì)有2個(gè)bounding box),我們還需要進(jìn)行處理得到最終的結(jié)果。
- 首先,我們?nèi)サ?code>Pc小于
IOU
閾值的那些低置信度bounding box - 然后,使用NMS非極大值抑制,去除冗余的bounding box。這里有2個(gè)類(lèi)別,我們需要對(duì)每個(gè)類(lèi)別分別運(yùn)行一次NMS,得到最終結(jié)果
2.3:區(qū)域推薦網(wǎng)絡(luò)——RCNN算法
R-CNN算法最早在2013年被提出,它的出現(xiàn)打開(kāi)了運(yùn)用深度學(xué)習(xí)進(jìn)行目標(biāo)檢測(cè)的大門(mén),從此之后,目標(biāo)檢測(cè)的精準(zhǔn)度與實(shí)時(shí)性被不斷刷新。R-CNN系列算法自提出之際,就非常引人注目,以至于在之后的很多經(jīng)典算法中,如SSD、YOLO系列、Mask R-CNN中都能看到它的影子。
R-CNN、Fast R-CNN采用的還是傳統(tǒng)的SS(selective search)算法生成推薦區(qū)域,計(jì)算非常耗時(shí),達(dá)不到實(shí)時(shí)檢測(cè)的效果。直到Faster R-CNN才使用 RPN(region proposal network) 代替了原來(lái)的SS算法,才使得目標(biāo)檢測(cè)的時(shí)間大大縮短,達(dá)到實(shí)時(shí)性的效果。
2.3.0:Selective Search
來(lái)源于傳統(tǒng)的計(jì)算機(jī)視覺(jué)技術(shù)。在深度學(xué)習(xí)流行起來(lái)之前,傳統(tǒng)的計(jì)算機(jī)視覺(jué)技術(shù)(例如圖像分割、特征提取和局部普適性)常常被用來(lái)處理圖像識(shí)別的問(wèn)題。
下面是Selective Search的基本思路:
-
多尺度分割: 首先,基于不同的尺度進(jìn)行圖像分割,產(chǎn)生初始的區(qū)域。導(dǎo)出的每一個(gè)區(qū)域都被看作是潛在的目標(biāo)對(duì)象。
-
區(qū)域合并: 然后,對(duì)這些區(qū)域進(jìn)行合并,根據(jù)顏色相似性、紋理相似性、尺寸相似性和形狀相兼容性等特征,逐漸將相似的區(qū)域進(jìn)行合并。將合并生成的新區(qū)域也視為對(duì)象的候選區(qū)域。
-
利用多種策略: 在這個(gè)過(guò)程中,Selective Search會(huì)使用多種不同的搜索策略,包括顏色空間、相似度度量、起始區(qū)域等,以盡可能多地覆蓋到各種類(lèi)型的對(duì)象。
-
最后,這個(gè)步驟會(huì)生成大約2000個(gè)區(qū)域建議。然后,這些區(qū)域建議將作為RCNN模型的輸入,進(jìn)行深度學(xué)習(xí)目標(biāo)檢測(cè)。
但需要注意的是,雖然Selective Search方法提出了很多候選區(qū)域來(lái)增加檢測(cè)到物體的機(jī)會(huì),但這也增大了計(jì)算開(kāi)銷(xiāo),并且合并過(guò)程中可能會(huì)過(guò)度合并,導(dǎo)致目標(biāo)物體丟失。因此,后來(lái)的Fast R-CNN和Faster R-CNN都嘗試優(yōu)化這個(gè)步驟,提高檢測(cè)效率。
2.3.1:R-CNN
R-CNN(全稱(chēng)Regions with CNN features) ,是R-CNN系列的第一代算法,其實(shí)沒(méi)有過(guò)多的使用“深度學(xué)習(xí)”思想,而是將“深度學(xué)習(xí)”和傳統(tǒng)的“計(jì)算機(jī)視覺(jué)”的知識(shí)相結(jié)合。比如R-CNN pipeline中的第二步和第四步其實(shí)就屬于傳統(tǒng)的“計(jì)算機(jī)視覺(jué)”技術(shù)。使用selective search提取region proposals,使用SVM實(shí)現(xiàn)分類(lèi)。
?? 思路
- 首先用SS算法提出1000~2000多個(gè)候選區(qū)域(region proposal)
- 將每一個(gè)候選區(qū)域進(jìn)行wrap,送入CNN,進(jìn)行特征提取,得到1*4096的特征向量。
- 將特征向量送入每一類(lèi)的SVM,進(jìn)行分類(lèi),判斷是否屬于這一類(lèi)
- 對(duì)已經(jīng)分好類(lèi)的region proposal進(jìn)行線性回歸分類(lèi),得到更精細(xì)的bounding box
R-CNN算法的檢測(cè)效果很好,但是檢測(cè)速度很慢,因此總體效率不高。其主要原因在于:
?? 缺點(diǎn)
- 首先我們看到,生成的每一個(gè)候選區(qū)域都需要單獨(dú)的送入CNN進(jìn)行分類(lèi)和回歸,一張圖片有1000~2000個(gè)region proposal,那么就需要進(jìn)行1000~2000次向前傳播。
- 要單獨(dú)的訓(xùn)練3個(gè)模型,分開(kāi)訓(xùn)練,耗時(shí)耗力
- CNN:提取圖像特征
- SVM預(yù)測(cè)類(lèi)別
- 回歸器來(lái)修正bounding box
- selective search屬于傳統(tǒng)計(jì)算機(jī)視覺(jué),這個(gè)過(guò)程耗時(shí),大約需要
2s
2.3.2:Fast R-CNN
2015年,Ross Girshick等人在R-CNN的基礎(chǔ)上進(jìn)行了改進(jìn),解決了上述影響R-CNN效率的前兩個(gè)問(wèn)題。與R-CNN相比,訓(xùn)練速度快了9倍;測(cè)試速度快了213倍;在Pascal VOC數(shù)據(jù)集上,準(zhǔn)確率從62%提升到了66%。
?? 思路
- 依然首先用SS算法提出1000~2000多個(gè)候選區(qū)域(region proposal)
- 但是不是候選區(qū)域單獨(dú)輸入進(jìn)CNN,而是一次性將整個(gè)圖片輸入進(jìn)CNN,得到整張圖片的特征圖。
- 將region proposal對(duì)應(yīng)的區(qū)域和特征圖區(qū)域進(jìn)行映射,獲得每個(gè)候選區(qū)域在特征圖上的相應(yīng)特征矩陣
- 將每個(gè)特征矩陣進(jìn)行池化,到
7x7
,獨(dú)立的輸入進(jìn)全連接層,單獨(dú)的進(jìn)行分類(lèi)和回歸
?? Fast R-CNN的改進(jìn)點(diǎn):
- ROI Pooling層。 這個(gè)方法是針對(duì)R-CNN的第一個(gè)問(wèn)題提出來(lái)的,用來(lái)解決提取特征操作冗余的問(wèn)題,避免每個(gè)推薦區(qū)域都要送入CNN進(jìn)行前向計(jì)算。核心思路是:將圖像只輸入CNN提取特征,只進(jìn)行一次前向計(jì)算。得到的特征圖由全部推薦區(qū)域共享。然后再將推薦區(qū)域(SS算法得到)投影到特征圖上,獲得每個(gè)推薦區(qū)域?qū)?yīng)的特征圖區(qū)域。最后使用ROI Pooling層將每個(gè)特征圖區(qū)域下采樣到7*7大小。
- 將原來(lái)三個(gè)模型整合到一個(gè)網(wǎng)絡(luò),易與訓(xùn)練。R-CNN算法使用三個(gè)不同的模型,需要分別訓(xùn)練,訓(xùn)練過(guò)程非常復(fù)雜。在Fast R-CNN中,直接將CNN、分類(lèi)器、邊界框回歸器整合到一個(gè)網(wǎng)絡(luò),便于訓(xùn)練,極大地提高了訓(xùn)練的速度。
?? Fast R-CNN的瓶頸:
雖然Fast R-CNN算法在檢測(cè)速度和精確度上了很大的提升。但是它仍然不能滿足實(shí)時(shí)目標(biāo)檢測(cè),最大的原因在于:采用SS算法生成推薦區(qū)域的方法很耗時(shí),處理每張圖像大約需要消耗2秒,大大限制了目標(biāo)檢測(cè)的速度。
2.3.3:Faster R-CNN
2015年,由任少卿、何凱明、Ross Girshick、孫劍組成的微軟研究團(tuán)隊(duì),提出了Region Proposal Networks取代了原來(lái)的SS算法,幾乎不消耗計(jì)算時(shí)間,使得生成推薦區(qū)域過(guò)程變得非常高效,解決了Fast R-CNN的瓶頸問(wèn)題。
Faster R-CNN算法將Region Proposal Networks與Fast R-CNN進(jìn)一步合并為一個(gè)單個(gè)網(wǎng)絡(luò)。當(dāng)采用非常深的VGG-16模型作為骨干網(wǎng)絡(luò)時(shí),基于該方法的檢測(cè)系統(tǒng)在GPU上的幀速率為5fps,基本達(dá)到實(shí)時(shí)檢測(cè)的水平。同時(shí)在PASCAL VOC2007、2012和MS COCO數(shù)據(jù)集上,其檢測(cè)精度也達(dá)到了最好的水平。
如上圖所示,F(xiàn)aster R-CNN算法流程主要有以下4個(gè)步驟:
?? 思路
- Conv layers。首先將圖像輸入到CNN(VGG-16)提取圖像特征,得到的feature maps 將被共享用于后面的RPN和ROI Pooling。
- Region Proposal Networks。RPN用于生成推薦區(qū)域。該網(wǎng)絡(luò)通過(guò)softmax判斷anchors屬于positive還是negative,再利用邊界框回歸修正anchors獲得精確的推薦框proposals。
- ROI Pooling。該層以feature maps和proposals同時(shí)作為輸入,綜合這些信息后提取proposal feature maps,送入后續(xù)全連接層判定目標(biāo)類(lèi)別。
- Classifer。將proposal feature maps輸入全連接層與預(yù)測(cè)proposals的類(lèi)別;同時(shí)再次進(jìn)行邊界框回歸,獲得檢測(cè)框最終的精確位置。
RPN的工作過(guò)程如下:
- 特征提取: RPN首先接收一個(gè)輸入圖像,并通過(guò)一個(gè)共享的卷積神經(jīng)網(wǎng)絡(luò)(如VGG或ResNet)提取特征圖。這一特征提取過(guò)程與之前的R-CNN和Fast R-CNN相同。提取的特征圖包含了圖像的形狀和紋理信息。
- 生成一定數(shù)量的-錨框(Anchors): 在特征圖上的每個(gè)位置(對(duì)應(yīng)原圖的多個(gè)像素區(qū)域),RPN生成一系列預(yù)設(shè)尺度和比例的錨框。比如,可以在每個(gè)位置上生成3種尺度和3種寬高比的錨框,共9個(gè)錨框。這個(gè)步驟用于嘗試覆蓋到各種尺度和形狀的目標(biāo)。
- 預(yù)測(cè)候選區(qū)域: 對(duì)于每個(gè)錨框,RPN使用一個(gè)小網(wǎng)絡(luò)結(jié)構(gòu)(通常包含幾個(gè)卷積層和全連接層)獨(dú)立地預(yù)測(cè)兩個(gè)內(nèi)容:一個(gè)二元分類(lèi)判斷(即“是否含有目標(biāo)”),以及一個(gè)邊界框回歸(具體地調(diào)整位置和尺寸)。如果分類(lèi)預(yù)測(cè)為正(即含有目標(biāo)),則此錨框作為一個(gè)候選區(qū)域。
- NMS篩選: 由于生成的候選區(qū)域可能有大量的重疊,RPN會(huì)通過(guò)非極大值抑制(Non-Maximum Suppression,NMS)來(lái)消除冗余的候選區(qū)域。在NMS中,對(duì)所有候選區(qū)域按照分類(lèi)預(yù)測(cè)的分?jǐn)?shù)排序,取最高分的區(qū)域,并移除與其重疊度過(guò)高(如IoU超過(guò)0.7)的其他候選區(qū)域。然后重復(fù)這個(gè)過(guò)程,直到所有候選區(qū)域都判斷完畢。
- 輸出候選區(qū)域: 最終,RPN輸出經(jīng)過(guò)篩選的一定數(shù)量(如2000個(gè))的候選區(qū)域,限制輸出的候選區(qū)域數(shù)量,得到一定數(shù)量的候選框用于后續(xù)的對(duì)象檢測(cè)過(guò)程。
總的來(lái)說(shuō),RPN生成的錨框數(shù)量是固定的,但是通過(guò)分類(lèi)預(yù)測(cè)和NMS篩選后,輸出的候選區(qū)域數(shù)量是不固定的,依賴于具體的圖像和對(duì)象。
2.3.4:對(duì)比YOLO
Faster R-CNN和YOLO(You Only Look Once)是兩種不同的目標(biāo)檢測(cè)框架,而他們主要的時(shí)間成本差異在于處理候選區(qū)域的方式。
Faster R-CNN首先使用Region Proposal Network(RPN)生成候選區(qū)域(或稱(chēng)為Region of Interest, ROI),然后每個(gè)ROI都經(jīng)過(guò)ROI Pooling變?yōu)榻y(tǒng)一大小的特征圖,再輸入到全連接層進(jìn)行分類(lèi)和邊界框回歸。因此,Faster R-CNN必須對(duì)每個(gè)ROI進(jìn)行單獨(dú)處理,這就涉及一定數(shù)量的逐個(gè)操作,因此相對(duì)來(lái)說(shuō)會(huì)稍慢一些。
而YOLO則采用了一種全圖預(yù)測(cè)的策略:它將輸入圖像劃分為一個(gè)個(gè)格子,每個(gè)格子預(yù)測(cè)一定數(shù)量的邊界框和分類(lèi)概率。這個(gè)過(guò)程是全圖矩陣操作可以并行計(jì)算,因此相對(duì)于Faster R-CNN會(huì)快一些。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-828705.html
但是值得注意的是,這兩種方法在準(zhǔn)確率和召回率上可能存在差異。由于Faster R-CNN使用了RPN來(lái)生成候選區(qū)域,所以有可能在復(fù)雜背景和遮擋嚴(yán)重的情況下獲得更好的結(jié)果。而YOLO由于其對(duì)整個(gè)圖像的一次性處理,可能在處理小對(duì)象和大量對(duì)象時(shí)有更好的效果。具體使用哪種方法,可能需要根據(jù)具體任務(wù)和數(shù)據(jù)進(jìn)行選擇。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-828705.html
到了這里,關(guān)于【計(jì)算機(jī)視覺(jué)】目標(biāo)檢測(cè) |滑動(dòng)窗口算法、YOLO、RCNN系列算法的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!