吳恩達深度學習課程筆記 11

2022-06-19 06:45:15 字數 3996 閱讀 8962

目標檢測(detection)其實是乙個非常困難的問題,一幅待檢測中可能包含許多目標,這些目標的類別多種多樣,同一類別的目標數目可能也不唯一。

可以從乙個簡化的問題去入手,那就是分類定位(classification with location)。這個問題只在影象分類任務上更進一步,不僅要分類,還要框出主要目標,且一張只有乙個目標。

解決上面這個問題最直接的思路就是設定神經網路同時輸出類別和位置的多個實數(\( b_x, b_y, b_h, b_w \))。

比如目標的類別有四種:行人、汽車、電單車和背景。可以這樣設定網路的輸出和樣本的標籤:\( \begin p_c \\ b_x \\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \end \)

\( p_c \)表示是否存在物體,如果為0後面的值都沒用了;\( c_1, c_2, c_3 \) 表示類別。

有了上面的經驗,可以繼續想,我們想要的神經網路輸出的也可以是別的東西,比如特徵點(landmark)。對於人臉來說,可以是眼角或者臉頰上的一些關鍵點:

比如要確定64個特徵點,可以這麼設定網路的輸出:\( \begin face \\ l_ \\ l_ \\ \vdots \\ l_ \\ l_ \\ \end \),其中\( c \)表示是否是人臉。

經過前面的鋪墊,下面要正式討論目標檢測這個問題了,首先是傳統做法:

我們訓練分類器的資料是醬嬸的:

所以在進行目標檢測任務時,可以用滑動視窗滑過整個影象,對每乙個視窗中的影象進行分類。可以選擇不同大小的視窗,不同的步長:

這樣做主要的問題就是計算代價,早期的分類器都是很簡單的分類器,可能影響不大,但進入深度學習時代後,神經網路的速度其實相對比較慢的,這樣的做法不再合適。

在介紹檢測方法之前,我們先看如何將之前講的卷積神經網路轉換為全卷積網路。

我們知道卷積神經網路其實是全連線網路的稀疏連線版本,又或者說全連線網路可以看作卷積神經網路的一種特殊情況(沒有稀疏性)。所以全連線層可以用卷積表示:

可以看到全連線層用乙個包含400個\( 5 \times 5 \times 16 \)的卷積核的卷積層代替。

滑動視窗方法的乙個問題就是大量的重複計算。比如訓練分類網路時的輸入尺寸是\( 14 \times 14 \times 3 \),而待檢測的影象尺寸是\( 16 \times 16 \times 3 \),如果採用滑動視窗需要對4個\( 14 \times 14 \times 3 \)的視窗進行分類,這其中有大量重疊區域重複計算,索性我們直接把\( 16 \times 16 \times 3 \)的影象直接輸入到原網路(全卷積版本),可以得到最後的輸出是\( 4 \times 4 \times 1 \),那麼這4個輸出就可以看作原來的4個視窗分別通過卷積網路計算的結果,但是這樣節省了很多計算。換成更大的也同理。

這樣做減少了計算量,但是還有乙個問題,就是目標的邊框不夠準確。這點顯然,因為輸出的每個值都對應原影象中固定大小的一塊區域,但是實際的物體可能有大有小,形狀也或長或方。

下面再介紹一種方法,也是著名的yolo演算法採用的方法。

回想最開始講的分類定位問題思路:輸入一張,網路直接輸出物體的類別、檢測框的位置和大小。因為檢測框是用輸出的一組實數來表示,所以準確度會更高,而不是像滑動視窗或全卷積網路那樣固定大小的檢測框。這是乙個非常好的思路,問題在於這是乙個過度簡化的問題,假設了中只存在乙個物體,而如果存在數量不定的多個物體,那麼網路的輸出維度就沒辦法確定。

以上圖為例,如果將一張分成9個小圖,每個小圖的輸出和訓練標籤都是\( 8 \times 1 \)的向量,各個維度的含義:\( \begin p_c \\ b_x \\ b_y \\ b_h \\ b_w \\ c_1 \\ c_2 \\ c_3 \end \),\( p_c = 0 \)表示這個小圖中沒有檢測目標,否則將給出檢測框和類別。

所以這一張經過網路之後應該輸出乙個\( 3 \times 3 \times 8 \)的矩陣,我們將這個矩陣看作每個小圖的檢測結果。

注意:關於影象切分後分別進行分類定位的做法純是我們的想法,是我們美好的願望,我們希望神經網路這麼幹,但實際網路是怎麼想的只有上帝知道!我們輸入網路的不是切分的,而是完整的,通過標籤和損失函式對網路進行約束,訓練它輸出每個網格上目標檢測框的引數,它實際怎麼學到的不清楚,只需要知道它的輸出滿足了我們這種網格化設計的要求即可。所以每個網格上**的檢測框尺寸並不侷限於所在的那個網格,這點要理解!

還有一些細節:

我們通常用交並比(intersectioni over union, iou)來衡量物體檢測的效果,顧名思義,就是演算法輸出與實際標註的檢測框交集與並集之比。

一般取iou > 0.5算作正確檢測,當然也可以選擇更高的閾值。

非極大值抑制(non-max suppression, nms)是一種常用的方法,很簡單,從字面理解就是:不是極大值的都會被抑制。

注意兩點:第一,是極大值而不是最大值;第二,抑制就是拋棄。

做個不是特別恰當的模擬,期末考試後老師給班上的同學發獎狀,但是只發給單科狀元,這就叫極大值抑制。每一科我只承認第一名,其它的都是垃圾不算數。

對於目標檢測來說,當檢測結果出來之後,首先拋棄\(p_c\)值低於一定閾值的結果,然後開始處理各個極大值。非極大值抑制就是指當檢測結果出現單個目標有多個檢測框重疊時,先取\( p_c \)最大的框(置信度最高),然後將其它和這個框高度重疊的檢測結果拋棄。

中存在多個目標類別時,要對每個類別都獨立的採取極大值抑制。

如果再仔細思考,就會發現前面的演算法還是有問題:每個網格只能**乙個目標。如果不幸的,兩個目標的中心恰好落在了乙個網格中,網路就無能為力了。

解決方法是引入 anchor boxes.

簡單的說,上面的問題是由於我們前面規定網路的輸出比如\( 3 \times 3 \times 8 \)只能表示乙個檢測框,如果我們事先規定一些檢測框並按形狀進行分類,這樣對於每個網格就可以用多種不同的檢測框進行檢測,這樣就可以輸出多個檢測結果。比如規定兩種檢測框的網路輸出可以是\( 3 \times 3 \times 2 \times 8 \)或\( 3\times 3\times 16 \),每個網格對應的16個分量就可以表示兩個目標了。

這種預設的框就叫做anchor box。

以前我們只需要將目標分配到其邊框中心點所在的網格,現在還要計算其邊框與該網格不同anchor box的交並比大小,並依此進一步分配到網格的某個achor上,也就是上圖中那個長向量的某一段。

將前面所介紹的組合起來就是yolo演算法了。

首先你要準備訓練集,要按照前面的要求準備每個網格的向量,訓練網路;

然後做出**,過濾掉那些置信度低的框,再對每個類別的框進行非極大值抑制,的到最後的結果。

我以為會講r-cnn路徑的一些方法,其實只是粗略的提了一下。

關於r-cnn和yolo之爭,其實就是目標檢測領域的兩步法和一步法之爭。r-cnn等需要先想辦法提出目標的一些候選框,然後再進行後面的工作,準確率更高;而yolo等強調一步完成,速度更快。

吳恩達老師看好一步法。

吳恩達深度學習課程筆記

一直以為機器學習的重點在於設計精巧 神秘的演算法來模擬人類解決問題。學了這門課程才明白如何根據實際問題優化 調整模型更為重要。事實上,機器學習所使用的核心演算法幾十年來都沒變過。什麼是機器學習呢?以二類分類監督學習為例,假設我們已經有了一堆訓練資料,每個訓練樣本可以看作n維空間裡的乙個點,那麼機器學...

吳恩達深度學習筆記

2.02 紅色為小標題,藍色比較重要 第四講第二週 4.2.1 為什麼要進行例項 4.2.2 經典網路 lenet 5網路當時還沒有padding,所以在卷積過程當中越來越小 也沒有relu函式,當時這個例子用的是sigmoid函式。超級引數不是很多。這個典型的網路有padding,使用的是relu...

吳恩達深度學習筆記

目錄導數的細節 向量化python中的廣播 第二部分深度學習內容 吳恩達講深度學習 1.資料量更大 2.演算法越來越優 3.業務場景越來越多樣化 4.學術界or工業界越來越卷 私以為 邏輯回歸是最簡單的二分類模型,也可以說是後續深度神經網路的基礎框架.達叔的演算法知識第一課.邏輯回歸的引數是w和b,...