1. 程式人生 > >第二十五節,目標定位、特征點檢測依據目標檢測

第二十五節,目標定位、特征點檢測依據目標檢測

回顧 邏輯 預測 簡單 AS 其中 輸入 操作 功能

一 目標定位

對象檢測,它是計算機視覺領域中一個新興的應用方向,相比前兩年,它的性能越來越好。在構建對象檢測之前,我們先了解一下對象定位,首先我們看看它的定義。

技術分享圖片

圖片分類任務我們已經熟悉了,就是算法遍歷圖片,判斷其中的對象是不是汽車,這就是圖片分類。這節我們要學習構建神經網絡的另一個問題,即定位分類問題。這意味著,我們不僅要用算法判斷圖片中是不是一輛汽車,還要在圖片中標記出它的位置,用邊框或紅色方框把汽車圈起來, 這就是定位分類問題。 其中“定位”的意思是判斷汽車在圖片中的具體位置。這周後面幾天,我們再講講當圖片中有多個對象時,應該如何檢測它們,並確定出位置。比如,你正在做一個自動駕駛程序,程序不但要檢測其它車輛,還要檢測其它對象,如行人、摩托車等等,稍後我們再詳細講。

這節我們要研究的分類定位問題,通常只有一個較大的對象位於圖片中間位置,我們要對它進行識別和定位。而在對象檢測問題中,圖片可以含有多個對象,甚至單張圖片中會有多個不同分類的對象。因此,圖片分類的思路可以幫助學習分類定位,而對象定位的思路又有助於學習對象檢測,我們先從分類和定位開始講起。

圖片分類問題你已經並不陌生了,例如,輸入一張圖片到多層卷積神經網絡。這就是卷積神經網絡,它會輸出一個特征向量,並反饋給 softmax 單元來預測圖片類型。

技術分享圖片


如果你正在構建汽車自動駕駛系統,那麽對象可能包括以下幾類:行人、汽車、摩托車和背景,這意味著圖片中不含有前三種對象,也就是說圖片中沒有行人、汽車和摩托車,輸出結果會是背景對象,這四個分類就是 softmax 函數可能輸出的結果。

這就是標準的分類過程,如果你還想定位圖片中汽車的位置, 該怎麽做呢?我們可以讓神經網絡多輸出幾個單元,輸出一個邊界框。具體說就是讓神經網絡再多輸出 4 個數字,標記為bx,by,bh和bw,這四個數字是被檢測對象的邊界框的參數化表示。

我們先規定符號。圖片左上角的坐標為(0,0),右下角標記為(1,1)。要確定邊界框的具體位置,需要指定紅色方框的中心點,這個點表示為(bx,by),邊界框的高度為bh,寬度為bw。因此訓練集不僅包含神經網絡要預測的對象分類標簽,還要包含表示邊界框的這四個數字,接著采用監督學習算法,輸出一個分類標簽,還有四個參數值,從而給出檢測對象的邊框位置。此例中, bx的理想值是 0.5,因為它表示汽車位於圖片水平方向的中間位置; by

大約是 0.7,表示汽車位於距離圖片底部0.3 的位置; bh約為 0.3,因為紅色方框的高度是圖片高度的 0.3 倍; bw約為 0.4,紅色方框的寬度是圖片寬度的 0.4 倍。

技術分享圖片

下面我再具體講講如何為監督學習任務定義目標標簽y。

技術分享圖片

請註意,這有四個分類,神經網絡輸出的是這四個數字和一個分類標簽,或分類標簽出現的概率。目標標簽y的定義如下:

技術分享圖片

它是一個向量,第一個組件pc表示是否含有對象,如果對象屬於前三類(行人、汽車、摩托車),則pc = 1,如果是背景,則圖片中沒有要檢測的對象,則pc = 0。我們可以這樣理解pc,它表示被檢測對象屬於某一分類的概率,背景分類除外。

如果檢測到對象,就輸出被檢測對象的邊界框參數bx,by,bh和bw。最後,如果存在某個對象,那麽pc = 1,同時輸出c1、 c2和c3,表示該對象屬於 1-3 類中的哪一類,是行人,汽車還是摩托車。鑒於我們所要處理的問題,我們假設圖片中只含有一個對象,所以針對這個分類定位問題,圖片最多只會出現其中一個對象。

技術分享圖片

我們再看幾個樣本,假如這是一張訓練集圖片,標記為x,即上圖的汽車圖片。而在y當中,第一個元素pc = 1,因為圖中有一輛車, bx,by,bh和bw會指明邊界框的位置,所以標簽訓練集需要標簽的邊界框。圖片中是一輛車,所以結果屬於分類 2,因為定位目標不是行人或摩托車,而是汽車,所以c1 = 0, c2 = 1, c3 = 0, c1、 c2和c3中最多只有一個等於 1。

這是圖片中只有一個檢測對象的情況,如果圖片中沒有檢測對象呢?如果訓練樣本是這樣一張圖片呢?

技術分享圖片

這種情況下, pc = 0, y的其它參數將變得毫無意義, 這裏我全部寫成問號, 表示“毫無意義”的參數, 因為圖片中不存在檢測對象, 所以不用考慮網絡輸出中邊界框的大小, 也不用考慮圖片中的對象是屬於c1、 c2和c3中的哪一類。針對給定的被標記的訓練樣本,不論圖片中是否含有定位對象,構建輸入圖片 x 和分類標簽Yy的具體過程都是如此。這些數據最終定義了訓練集。

最後,我們介紹一下神經網絡的損失函數,其參數為類別y和網絡輸出y_hat,如果采用平方誤差策略,則L(y_hat , y) = (y1_hat ? y1)2 + (y2_hat ? y2)2 + ? (y8_hat ? y8)2 ,損失值等於每個元素相應差值的平方和。

技術分享圖片

如果圖片中存在定位對象,那麽y1 = 1,也就是pc =1,同樣地,如果圖片中存在定位對象,pc = 1,損失值就是不同元素的平方和。

另一種情況是,y1 = 0,也就是pc = 0,損失值是(y1_hat ? y1)2,因為對於這種情況,我們不用考慮其它元素,只需要關註神經網絡輸出pc的準確度。

回顧一下,當y1 = 1時,也就是這種情況(編號 1) ,平方誤差策略可以減少這 8 個元素預測值和實際輸出結果之間差值的平方。如果y1 = 0,y矩陣中的後 7 個元素都不用考慮(編號 2),只需要考慮神經網絡評估y1(即pc)的準確度。

為了讓大家了解對象定位的細節,這裏我用平方誤差簡化了描述過程。實際應用中,你可以不對c1 、c2 、c3 和 softmax 激活函數應用對數損失函數,並輸出其中一個元素值,通常做法是對邊界框坐標應用平方差或類似方法,對pc應用邏輯回歸函數,甚至采用平方預測誤差也是可以的。

以上就是利用神經網絡解決對象分類和定位問題的詳細過程,結果證明,利用神經網絡輸出批量實數來識別圖片中的對象是個非常有用的算法。

二 特征的檢測

上面,我們講了如何利用神經網絡進行對象定位,即通過輸出四個參數值bx,by,bh和bw給出圖片中對象的邊界框。更概括地說,神經網絡可以通過輸出圖片上特征點的(x,y)坐標來實現對目標特征的識別,我們看幾個例子。

技術分享圖片

假設你正在構建一個人臉識別應用,出於某種原因,你希望算法可以給出眼角的具體位置。眼角坐標為(x,y),你可以讓神經網絡的最後一層多輸出兩個數字lx和ly,作為眼角的坐標值。如果你想知道兩只眼睛的四個眼角的具體位置,那麽從左到右,依次用四個特征點來表示這四個眼角。對神經網絡稍做些修改,輸出第一個特征點(l1x,l1y))第二個特征點(l2x,l2y),依此類推,這四個臉部特征點的位置就可以通過神經網絡輸出了。

技術分享圖片

也許除了這四個特征點,你還想得到更多的特征點輸出值,這些(圖中眼眶上的紅色特征點)都是眼睛的特征點,你還可以根據嘴部的關鍵點輸出值來確定嘴的形狀,從而判斷人物是在微笑還是皺眉,也可以提取鼻子周圍的關鍵特征點。為了便於說明,你可以設定特征點的個數,假設臉部有 64 個特征點,有些點甚至可以幫助你定義臉部輪廓或下頜輪廓。選定特征點個數,並生成包含這些特征點的標簽訓練集,然後利用神經網絡輸出臉部關鍵特征點的位置。

具體做法是,準備一個卷積網絡和一些特征集,將人臉圖片輸入卷積網絡,輸出1或0,1表示有人臉,0表示沒有人臉,然後輸出(l1x,l1y) ……直到(l64x,l64y)。這裏我用l代表一個特征,這裏有 129個輸出單元,其中1表示圖片中有人臉,因為有 64個特征,64×2=128,所以最終輸出 128+1=129 個單元,由此實現對圖片的人臉檢測和定位。這只是一個識別臉部表情的基本構造模塊,如果你玩過 Snapchat 或其它娛樂類應用,你應該對 AR(增強現實)過濾器多少有些了解, Snapchat 過濾器實現了在臉上畫皇冠和其他一些特殊效果。檢測臉部特征也是計算機圖形效果的一個關鍵構造模塊,比如實現臉部扭曲,頭戴皇冠等等。當然為了構建這樣的網絡,你需要準備一個標簽訓練集,也就是圖片和標簽的集合,這些點都是人為辛苦標註的。

技術分享圖片

最後一個例子,如果你對人體姿態檢測感興趣,你還可以定義一些關鍵特征點,如胸部的中點,左肩,左肘,腰等等。然後通過神經網絡標註人物姿態的關鍵特征點,再輸出這些標註過的特征點,就相當於輸出了人物的姿態動作。當然,要實現這個功能,你需要設定這些關鍵特征點,從胸部中心點(l1x,l1y)一直往下,直到(l32x,l32y)。

一旦了解如何用二維坐標系定義人物姿態,操作起來就相當簡單了,批量添加輸出單元,用以輸出要識別的各個特征點的(x,y)坐標值。要明確一點,特征點1的特性在所有圖片中必須保持一致,就好比,特征點 1 始終是右眼的外眼角,特征點 2 是右眼的內眼角,特征點3 是左眼內眼角,特征點 4 是左眼外眼角等等。所以標簽在所有圖片中必須保持一致,假如你雇用他人或自己標記了一個足夠大的數據集,那麽神經網絡便可以輸出上述所有特征點,你可以利用它們實現其他有趣的效果,比如判斷人物的動作姿態,識別圖片中的人物表情等等。

三 目標檢測

學過了對象定位和特征點檢測,我們來構建一個對象檢測算法。我們將學習如何通過卷積網絡進行對象檢測,采用的是基於滑動窗口的目標檢測算法。

技術分享圖片

假如你想構建一個汽車檢測算法,步驟是,首先創建一個標簽訓練集,也就是x和y表示適當剪切的汽車圖片樣本,這張圖片(編號 1)x是一個正樣本. ,因為它是一輛汽車圖片,這幾張圖片(編號 2、 3)也有汽車,但這兩張(編號 4、 5)沒有汽車。出於我們對這個訓練集的期望,你一開始可以使用適當剪切的圖片,就是整張圖片幾乎都被汽車占據,你可以照張照片,然後剪切,剪掉汽車以外的部分,使汽車居於中間位置,並基本占據整張圖片。有了這個標簽訓練集,你就可以開始訓練卷積網絡了,輸入這些適當剪切過的圖片(編號 6),卷積網絡輸出y, 0 或 1 表示圖片中有汽車或沒有汽車。訓練完這個卷積網絡,就可以用它來實現滑動窗口目標檢測,具體步驟如下:

技術分享圖片

假設這是一張測試圖片,首先選定一個特定大小的窗口,比如圖片下方這個窗口,將這個紅色小方塊輸入卷積神經網絡,卷積網絡開始進行預測,即判斷紅色方框內有沒有汽車。

技術分享圖片

滑動窗口目標檢測算法接下來會繼續處理第二個圖像,即紅色方框稍向右滑動之後的區域,並輸入給卷積網絡,因此輸入給卷積網絡的只有紅色方框內的區域,再次運行卷積網絡,然後處理第三個圖像,依次重復操作,直到這個窗口滑過圖像的每一個角落。為了滑動得更快,我這裏選用的步幅比較大,思路是以固定步幅移動窗口,遍歷圖像的每個區域,把這些剪切後的小圖像輸入卷積網絡,對每個位置按 0 或 1 進行分類,這就是所謂的圖像滑動窗口操作。

技術分享圖片

重復上述操作,不過這次我們選擇一個更大的窗口,截取更大的區域,並輸入給卷積神經網絡處理,你可以根據卷積網絡對輸入大小調整這個區域,然後輸入給卷積網絡,輸出 0或 1。

技術分享圖片

再以某個固定步幅滑動窗口,重復以上操作,遍歷整個圖像,輸出結果。

技術分享圖片

然後第三次重復操作,這次選用更大的窗口。
如果你這樣做,不論汽車在圖片的什麽位置,總有一個窗口可以檢測到它。

技術分享圖片

比如,將這個窗口(編號 1)輸入卷積網絡,希望卷積網絡對該輸入區域的輸出結果為1,說明網絡檢測到圖上有輛車。

這種算法叫作滑動窗口目標檢測,因為我們以某個步幅滑動這些方框窗口遍歷整張圖片,對這些方形區域進行分類,判斷裏面有沒有汽車。

滑動窗口目標檢測算法也有很明顯的缺點,就是計算成本,因為你在圖片中剪切出太多小方塊,卷積網絡要一個個地處理。如果你選用的步幅很大,顯然會減少輸入卷積網絡的窗口個數,但是粗糙間隔尺寸可能會影響性能。反之,如果采用小粒度或小步幅,傳遞給卷積網絡的小窗口會特別多,這意味著超高的計算成本。

所以在神經網絡興起之前,人們通常采用更簡單的分類器進行對象檢測,比如通過采用手工處理工程特征的簡單的線性分類器來執行對象檢測。至於誤差,因為每個分類器的計算成本都很低,它只是一個線性函數,雖然滑動窗口目標檢測算法表現良好,是個不錯的算法。然而,卷積網絡運行單個分類人物的成本卻高得多,像這樣滑動窗口太慢。除非采用超細粒度或極小步幅,否則無法準確定位圖片中的對象。

不過,慶幸的是,計算成本問題已經有了很好的解決方案,大大提高了卷積層上應用滑動窗口目標檢測器的效率,關於它的具體實現,我們在下節再講。

第二十五節,目標定位、特征點檢測依據目標檢測