在two stage中,比如R-CNN系列裡,先找出region proposal然後再把目標檢測問題變成分類問題來處理我明白。但是在One Stage目標檢測演算法中,比如YOLO,可以直接得到目標的中心點坐標,和歸一化的bounding box的寬度和長度是具體怎麼得到的?看了一些教程都沒有具體寫,只是介紹了下YOLO的結構。NG的課也只是說讓網路多輸出四個數值就可以得到坐標,也沒有說具體的過程。

比如就簡單說,經過卷積後可以得到3*3*8維度的feature map,然後3*3是劃分網格的大小,8就是3個分類+坐標(4)+置信度。可是沒有解釋為什麼這些維度就代表了這些意義。


這個問題不是很明白你意思,只能照著我大概理解的回答下。

  1. 神經網路提取的特徵為何可用來作坐標回歸? 可參見這篇論文deep neural networks for object detection(這是最早證明神經網路可以用來回歸目標坐標的一篇論文,這篇論文通過實驗效果證明了neural networks learned features which are not only good for classification, but also capture strong geometric information)(tip: 它其實預測的是object binary mask(分為full, bottom, top, left, right),這篇論文應該不是最早使用神經網路來作目標回歸,但是它解決了此類網路無法訓練的問題,得到了一個不錯的結果)
  2. DPM中也使用了bbox regression(這個我沒細看), DPM首先推導出part location,在此location上計算geometric features ,用這個特徵來做bbox regression
  3. yolo v1直接預測x, y, w, h,計算坐標loss使用平方差,yolo v1對w, h取了平方根,但是直接預測真實框的坐標值會導致定位不準確,原因是:假設這個loss為1,loss看起來很低,但是對於小框而言,輕微的坐標數值上的偏移,導致視覺上極大的預測偏差,假設這個loss為10,loss看起來很大,但是對於大框而言,很高的坐標數值上的偏移,導致視覺上很小的預測偏差,一句話總結:直接預測真實坐標所產生的loss並不能真正反映預測框的好壞(yolo v1對w, h取了平方根,可以有效緩解這個問題,但是並不能解決這個問題)
  4. RCNN進一步優化了論文1中的bbox regression,對x, y, w, h坐標進行log/exp變換防止出現負數,網路學習的其實是proposal box到gt box的變換係數(為何要學習變換係數,而不直接學習坐標差?比如學習Gx - Px, Gy - Py, 這是因為對於大物體和小物體,它們的差可能一樣,但是效果卻相差很多,比如大物體和預測大物體的框視覺上離的很近,但是它們的Gx - Px差可能很大),變換係數表示成tx, ty, tw, th,以G表示gt box, P表示proposal box,則tx = (Gx - Px) / Pw, ty = (Gy - Py) / Ph, tw = log(Gw/Pw), th = log(Gh/Ph),它的坐標回歸損失函數是加入正則化的均方誤差即嶺回歸
  5. 後續的faster RCNN, yolov2/v3, SSD中,將proposal box分別替換成了anchor box, prior box, default box, 同樣回歸的是坐標變換係數而非坐標,但是損失函數由加入正則的均方誤差變成smooth l1 loss

補充:我沒有正面回答你的問題,我補充了坐標回歸的發展歷史,你回顧下這些,應該對你的理解有幫助

第3點的直接預測坐標和第4點的預測坐標差會產生的問題是一樣的

2019.10.17 update

yolo v2中坐標編碼方式和上述有點區別:

yolo系列預測x_ctr, y_ctr都是相對於所處grid的歸一化值, 使用上文中介紹的tx, ty公式, 不能保證解碼出來的x_ctr處於當前gird, 可以偏移到任意grid, 這與yolo v1中設計grid初衷違背, 因此使用sigmoid函數處理偏移值:

bx = (sigmoid(tx) + cy) / W

by = (sigmoid(ty) + cy) / H

而bw, bh和上文中的tw, th公式一致


瀉藥,僅說我的理解。

這個沒什麼特別大的原理,只能說是數據驅動下訓練的結果。但是這種網路搭建的方案還是符合motivation的。因為諸如RPN,回歸結果是通過1x1 conv算出來的(yolo是通過FC),比如主幹網路是VGG-16網路,這個1x1的結果對應感受野是原圖92x92(沒記錯的話,vgg的感受野是這個值)的區域(yolo的感受野則是全圖,理論上對大目標更好),所以你可以理解為通過看這92x92的區域,讓神經網路學習生成一個框去框這92x92區域內/外的東西。

至於它學習的結果為什麼能把框框住,我之前與實驗室的同僚討論過。做目標檢測的同學可視化過feature maps給我看過,基本上是有目標的區域很亮,沒有目標的區域很暗,所以神經網路基本上可以說是根據特徵圖的明亮程度生成一個框把目標框住。

另外你說的網路輸出怎麼知道那幾個維度上的數是什麼意義這件事,是因為訓練就是這樣訓的。現在目標檢測有很成熟的一套iou guided的訓練策略,你可以看看yolo原文或者rcnn系列的論文進行更深入的研究。


說一下我的理解,歡迎指正。

目標檢測演算法為什麼能夠直接獲得目標的位置坐標?這是網路訓練的結果,在訓練的時候,圖片上每個目標的位置坐標都是已知的,這是通過事先標註得到的,稱之為真實框位置,網路最終的目標是要預測一個與真實框位置盡量接近的預測框位置,最理想的情況是,預測框位置跟真實框位置相等,這樣準確率就是100%了,但實際情況下這是不可能發生的,預測框位置跟真實框位置不可能100%重合,肯定會存在一個誤差,我們能夠做的就是盡量減少這個誤差,誤差越小預測框位置就越准。

那麼,如何減少誤差?可以將這個誤差值寫成一個loss函數,接下來優化這個loss函數就行了。神經網路其實就是一個函數,如y=ax+b,x是輸入,y是輸出,a、b是需要確定的參數(即權重),神經網路的訓練過程實質就是確定參數a、b的過程,一旦a、b確定了,那麼通過函數y=ax+b,給定x就能計算得到y,具體到目標的位置檢測,這裡的x就是指圖片中的某個目標,而y就是這個目標對應的位置信息。也就是說,我們希望能夠找到一組足夠好的參數a和b,這組參數a和b對於所有圖片中的所有目標來說,都能通過y=ax+b計算出某個目標x對應的位置信息y。

那麼如何找到這組牛逼哄哄的參數a和b呢?

剛開始時,參數a、b都是隨機初始化的,此時當給定一個x,計算得到的位置預測值y跟真實位置肯定是相差十萬八千里的,但是沒關係,在loss函數的指揮下,通過反向傳播,可以一點點地更新和修正參數a,b,經過無數次的訓練和更新,參數a和b變得越來越牛逼,網路預測的位置信息y跟真實位置之間的誤差越來越小,預測的位置信息越來越接近真實位置,於是當誤差小到一定程度,我們就可以將這組a和b當成已知量直接拿來用,也就是說函數y=ax+b中,a,b都是已知的,那麼在一張測試圖片中(注意,這個時候測試圖片中所有目標的位置信息都是未知的),將該圖片中的某個目標x輸入到函數中,通過一次前向計算就能得到或者預測出該目標的足夠準確的位置信息。

說到這裡,你可能還有疑問,上面只是解釋了得到目標位置信息的過程,但好像並沒有解釋為什麼能夠到得到這個位置信息。

那就再解釋一下。

首先,有一個前提就是,對於某一類目標來說,肯定會有某個獨一無二的特徵,貓之所以是貓而不是狗,其實質內涵就是貓必定有與狗或其他目標不同的內在特徵,這個特徵很難用一兩個詞語或一兩句話描述出來,但是儘管如此,我們不得不承認,每類目標的這種內在特徵肯定是客觀存在的,而神經網路牛逼的地方,就是能夠找到這種內在特徵。理解了這一點,再回到目標的位置檢測,其實網路訓練的過程,就是根據訓練圖片種的一個個目標逐步更新參數a、b的過程,每一類目標都被被訓練了無數次,而由於不同類別的目標之間具有各自獨特的內在特徵,因此每一類目標中各個獨立目標的位置信息可以通過具有相同的參數a、b的函數y=ax+b計算或預測出來,一隻貓雖然在不同的圖片中可能處於不同的位置,但由於不論其處於哪個位置,貓始終是一隻貓而不是一隻狗,利用這一類別的確定性,就可以通過預先訓練好的參數a、b和函數y=ax+b計算出貓的位置信息。


私以為說One-stage目標檢測直接回歸目標的坐標不太準確,不如說是回歸邊框的坐標。論文《CornerNet:Detecting Objects as Paired Keypoints》指出基於One-stage和Two-stage的目標檢測框的標註並沒有和目標特徵產生直接的聯繫,而網路實際上回歸的是檢測框的坐標和尺寸。我心目中嚴格來說直接回歸目標坐標的是CornerNet及其衍生的「端到端可訓練」的網路。這是第一點。

然後回歸到問題本身,YOLO的作者在論文《You Only Look Once: Unified,Real-Time Object Detection》中指出:卷積層的任務是從圖像中提取特徵,全連接層負責預測輸出概率和坐標。YOLOv1中的例子的輸出維度是7 * 7 *(5 * 2 + 20),以YOLOv1論文為例,題目中所說定義輸出維度的意義分別是:

圖像分割為了7 * 7個grid,每個grid預測兩個bounding box,總預測分類為20類。其中每個bounding box包含的信息是邊框的中心坐標(x, y),邊框尺寸長寬(w, h)以及置信度C。YOLO9000和YOLOv3等其他one-stage detectors可以類似地分析,詳見他們對應的論文。

最後暗自揣測一下題主究竟糾結的其實並不是以上定義,因為定義的問題題主的舉例也說明是知道的,真正糾結的是「這些特徵是如何來的」。這就涉及到了卷積網路的設計思路,在論文中也有所體現。仍然以YOLO v1為例,大致的流程為:

1. 系統將輸入的圖像切分成一個S*S的網路,如果一個目標的中心在這個網格中,那麼這個網格就負責檢測這個目標。

2. 每個單元格預測B個邊界框和這些框的置信度的得分。這些置信度的得分反應了模型預測這個框包含目標的置信度,以及模型的預測這些框的準確度。單元格不存在目標時,置信度為0,即Pr(Object) = 0

3. 每一個邊界框包含5個預測值,x,y,w,h以及置信度。(x,y)坐標表示相對於網格邊界框的中心,高度h和寬度w是相對於整個圖像而言。最後置信度的預測值代表預測框和真實框之間的交並比IOU。

4. 每一個網格預測還預測C條件類概率,Pr(Classi|Object)。這些概率取決於包含目標的網格單元,並且只是預測每個網格單元的一組類別概率,不管框的數量。這麼做有一個好處就是,2、3和4得出的參數放在一起可以同時反映出目標屬於某一類的可能性以及預測框對目標的擬合情況:

??5. 利用這些概率構建損失函數,進行訓練損失函數。損失函數形式如下:

關於這種形式的損失函數設計,論文在2.2章節進行了描述,直接貼出一個我覺得對損失函數講得比較清楚的博客:https://blog.csdn.net/u014381600/article/details/55505231

接下來的事情就很好理解了,就是通過反向傳播修正網路參數,這樣就完成了一個目標特徵提取的過程了。

參考資料:

論文

《CornerNet:Detecting Objects as Paired Keypoints》

《You Only Look Once: Unified,Real-Time Object Detection》

博客

https://blog.csdn.net/u014381600/article/details/55505231

還有部分來自於個人在csdn博客上的學習筆記整理,文采學識都很有限,就不貼出來獻醜了。


或許你的困惑就是一點:為什麼接的8個維度可以代表 4coord 3classes 1conf?

我的理解是:

原因是:網路這麼搭,才能通過參數不斷的更新,學習,得到合適的值,以提取到「合適」的特徵區分類別,擬合4個坐標點 的目的。


推薦閱讀:
相关文章