深度學習之邊框回歸(Bounding Box Regression)

從rcnn, fast rcnn, faster rcnn, yolo, r-fcn, ssd,到cvpr的yolo9000。這些paper中損失函數都包含了邊框回歸,除了rcnn詳細介紹了,其他的paper都是一筆帶過,或者直接引用rcnn就把損失函數寫出來了。前三條網上解釋比較多,后面的兩條我看了很多paper,才得出這些結論。

  • 為什么要邊框回歸?
  • 什么是邊框回歸?
  • 邊框回歸怎么做的?
  • 邊框回歸為什么寬高,坐標會設計這種形式?
  • 為什么邊框回歸只能微調,在離Ground Truth近的時候才能生效?

為什么要邊框回歸?

這里引用王斌師兄的理解,如下圖所示:
在這里插入圖片描述

對于上圖,綠色的框表示 Ground Truth, 紅色的框為 Selective Search 提取的 Region Proposal。那么即便紅色的框被分類器識別為飛機,但是由于紅色的框定位不準(IoU<0.5), 那么這張圖相當于沒有正確的檢測出飛機。 如果我們能對紅色的框進行微調, 使得經過微調后的窗口跟 Ground Truth 更接近, 這樣豈不是定位會更準確。 確實,Bounding-box regression 就是用來微調這個窗口的。

邊框回歸是什么?

對于窗口一般使用四維向量 (x,y,w,h)(x,y,w,h)(x,y,w,h) 來表示, 分別表示窗口的中心點坐標和寬高。 對于下圖, 紅色的框 P 代表原始的 Proposal, 綠色的框 G 代表目標的 Ground Truth, 我們的目標是尋找一種關系使得輸入原始的窗口 P 經過映射得到一個跟真實窗口 G 更接近的回歸窗口 G^\hat{G}G^


邊框回歸的目的既是:給定 (Px,Py,Pw,Ph)(P_{x},P_{y},P_{w},P_{h})(Px?,Py?,Pw?,Ph?) 尋找一種映射 fff, 使得 f(Px,Py,Pw,Ph)=(Gx^,Gy^,Gw^,Gh^)f(P_{x},P_{y},P_{w},P_{h}) = (\hat{G_x},\hat{G_y},\hat{G_w},\hat{G_h})f(Px?,Py?,Pw?,Ph?)=(Gx?^?,Gy?^?,Gw?^?,Gh?^?) 并且(Gx^,Gy^,Gw^,Gh^)≈(Gx,Gy,Gw,Gh)(\hat{G_x},\hat{G_y},\hat{G_w},\hat{G_h}) \approx (G_{x},G_{y},G_{w},G_{h})(Gx?^?,Gy?^?,Gw?^?,Gh?^?)(Gx?,Gy?,Gw?,Gh?)

邊框回歸怎么做的?

RCNN論文:Region-based Convolution Networks for Accurate Object detection and Segmentation

作者在完成了的生成候選區域——CNN提取特征——SVM進行分類以后,為了進一步的提高定位效果,在文章的附錄C中介紹了 Bounding-box Regression 的處理。Bounding-box Regression 訓練的過程中,輸入數據為N個訓練對 (Pi,Gi),i=1,2,...,N{(P^{i},G^{i})},i=1,2,...,N(Pi,Gi),i=1,2,...,N,其中 pi=(pxi,pyi,pwi,phi)p^i=(p^i_x,p^i_y,p^i_w,p^i_h)pi=(pxi?,pyi?,pwi?,phi?) 為proposal的位置,前兩個坐標表示proposal的中心坐標,后面兩個坐標分別表示proposal的width和height,而 Gi=(Gx,Gy,Gw,Gh)G^i=(G_x,G_y,G_w,G_h)Gi=(Gx?,Gy?,Gw?,Gh?) 表示groundtruth的位置, regression的目標就是學會一種映射將P轉換為G。

那么經過何種變換才能從上圖中的窗口 P 變為窗口 G^\hat{G}G^ 呢? 比較簡單的思路就是: 平移+尺度放縮

作者設計了四種坐標映射方法,其中前兩個表示對 proposal 中心坐標的尺度不變的平移變換,后面兩個則是對 proposal 的 width 和 height 的對數空間的變換,

  1. 先做平移 (Δx,Δy)(\Delta x,\Delta y)(Δx,Δy)Δx=Pwdx(P),Δy=Phdy(P)\Delta x = P_{w}d_{x}(P),\Delta y = P_{h}d_{y}(P)Δx=Pw?dx?(P),Δy=Ph?dy?(P) 這是R-CNN論文的:(d?(P)=w?TΦ5(P)=t?d_{ \ast }(P) = w_{ \ast }^{T}\Phi _{5}(P)=t_{ \ast }d??(P)=w?T?Φ5?(P)=t??)

G^x=Pwdx(P)+Px,(1)\hat{G}_{x} = P_{w}d_{x}(P) + P_{x},\text{(1)}G^x?=Pw?dx?(P)+Px?,(1)

G^y=Phdy(P)+Py,(2)\hat{G}_{y} = P_{h}d_{y}(P) + P_{y},\text{(2)}G^y?=Ph?dy?(P)+Py?,(2)

  1. 然后再做尺度縮放 (Sw,Sh)(S_{w},S_{h})(Sw?,Sh?), Sw=exp(dw(P)),Sh=exp(dh(P))S_{w} = exp(d_{w}(P)),S_{h} = exp(d_{h}(P))Sw?=exp(dw?(P)),Sh?=exp(dh?(P)), 對應論文中:

G^w=Pwexp(dw(P)),(3)\hat{G}_{w} = P_{w}exp(d_{w}(P)),\text{(3)}G^w?=Pw?exp(dw?(P)),(3)

G^h=Phexp(dh(P)),(4)\hat{G}_{h} = P_{h}exp(d_{h}(P)),\text{(4)}G^h?=Ph?exp(dh?(P)),(4)

觀察(1)-(4)我們發現, 邊框回歸學習就是 dx(P),dy(P),dw(P),dh(P)d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)dx?(P),dy?(P),dw?(P),dh?(P)這四個變換。下一步就是設計算法那得到這四個映射。

線性回歸就是給定輸入的特征向量 X, 學習一組參數 W, 使得經過線性回歸后的值跟真實值 Y(Ground Truth)非常接近. 即 Y≈WXY \approx WXYWX 。 那么 Bounding-box 中我們的輸入以及輸出分別是什么呢?

Input:

RegionProposal→P=(Px,Py,Pw,Ph)RegionProposal\rightarrow P = (P_{x},P_{y},P_{w},P_{h})RegionProposalP=(Px?,Py?,Pw?,Ph?),這個是什么? 輸入就是這四個數值嗎?不是,其實真正的輸入是這個窗口對應的 CNN 特征,也就是 R-CNN 中的 Pool5 feature(特征向量)。 (注:訓練階段輸入還包括 Ground Truth, 也就是下邊提到的 t?=(tx,ty,tw,th)t_{ \ast } = (t_{x},t_{y},t_{w},t_{h})t??=(tx?,ty?,tw?,th?)

Output:

outpue 為:需要進行的平移變換和尺度縮放 dx(P),dy(P),dw(P),dh(P)d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)dx?(P),dy?(P),dw?(P),dh?(P), 或者說是 Δx,Δy,Sw,Sh\Delta x,\Delta y,S_{w},S_{h}Δx,Δy,Sw?,Sh? 。 我們的最終輸出不應該是 Ground Truth 嗎? 是的, 但是有了這四個變換我們就可以直接得到 Ground Truth。

這里有個問題需要注意, 根據(1)~(4)我們可以知道, P 經過 dx(P),dy(P),dw(P),dh(P)d_{x}(P),d_{y}(P),d_{w}(P),d_{h}(P)dx?(P),dy?(P),dw?(P),dh?(P) 得到的并不是真實值 G, 而是預測值 G^\hat{G}G^

在訓練時這四個值 Δx,Δy,Sw,Sh\Delta x,\Delta y,S_{w},S_{h}Δx,Δy,Sw?,Sh? 的真實值應該是經過 Ground Truth 和 Proposal 計算得到的真正需要的平移量 (tx,ty)(t_{x},t_{y})(tx?,ty?) 和尺度縮放 (tw,th)(t_{w},t_{h})(tw?,th?) 。 這也就是 R-CNN 論文中的(6)~(9):

tx=(Gx?Px)/Pw,(6)t_{x} = (G_{x}?P_{x})/ P_{w},(6)tx?=(Gx??Px?)/Pw?,(6)

ty=(Gy?Py)/Ph,(7)t_{y} = (G_{y}?P_{y})/ P_{h},(7)ty?=(Gy??Py?)/Ph?,(7)

tw=log??(Gw/Pw),(8)t_{w} = \log ?(G_{w}/ P_{w}),(8)tw?=log?(Gw?/Pw?),(8)

th=log??(Gh/Ph),(9)t_{h} = \log ?(G_{h}/ P_{h}),(9)th?=log?(Gh?/Ph?),(9)

目標函數

目標函數可以表示為 d?(P)=w?TΦ5(P)d_{ \ast }(P) = w_{ \ast }^{T}\Phi _{5}(P)d??(P)=w?T?Φ5?(P)Φ5(P)\Phi _{5}(P)Φ5?(P) 是輸入 Proposal 的特征向量,w?w_{ \ast }w??是要學習的參數(*表示 x,y,w,h, 也就是每一個變換對應一個目標函數) , d?(P)d_{ \ast }(P)d??(P) 是得到的預測值。 我們要讓預測值跟真實值 t?=(tx,ty,tw,th)t_{ \ast } = (t_{x},t_{y},t_{w},t_{h})t??=(tx?,ty?,tw?,th?)差距最小, 得到損失函數為:

Loss=∑iN(t?i?w^?T?5(Pi))2.Loss = \sum \limits_{i}^{N}(t_{ \ast }^{i}?\hat{w}_{ \ast }^{T}\phi _{5}(P^{i}))^2.Loss=iN?(t?i??w^?T??5?(Pi))2.

函數優化目標為:

W?=argminw?∑iN(t?i?w^?T?5(Pi))2+λ∣∣w^?∣∣2.W_{ \ast } = argmin_{w_{ \ast }} \sum \limits_{i}^{N}(t_{ \ast }^{i}?\hat{w}_{ \ast }^{T}\phi _{5}(P^{i}))^2 + \lambda ||\hat{w}_{ \ast }||^2.W??=argminw???iN?(t?i??w^?T??5?(Pi))2+λw^??2.

利用梯度下降法或者最小二乘法就可以得到 w?w_{ \ast }w??

最終在進行實驗時,lambda = 1000, 同時作者發現同一對中P和G相距過遠時通過上面的變換是不能完成的,而相距過遠實際上也基本不會是同一物體,因此作者在進行實驗室,對于 pair(P,G) 的選擇是選擇離P較近的G進行配對,這里表示較近的方法是需要P和一個G的最大的IoU要大于0.6,否則則拋棄該P。

為什么寬高尺度會設計這種形式?

重點解釋一下為什么設計的 tx,tyt_{x},t_{y}tx?,ty?為什么除以寬高,為什么 tw,tht_{w},t_{h}tw?,th?會有log形式!!!

首先CNN具有尺度不變性, 以下圖為例:
在這里插入圖片描述

x,y 坐標除以寬高

上圖的兩個人具有不同的尺度,因為他都是人,我們得到的特征相同。假設我們得到的特征為 ?1,?2\phi _{1},\phi _{2}?1?,?2?,那么一個完好的特征應該具備 ?1=?\phi _{1} = \phi?1?=?。ok,如果我們直接學習坐標差值,以x坐標為例,xi,pix_{i},p_{i}xi?,pi? 分別代表第i個框的x坐標,學習到的映射為 fff, f(?1)=x1?p1f(\phi _{1}) = x_{1}?p_{1}f(?1?)=x1??p1?,同理 f(?2)=x2?p2f(\phi _{2}) = x_{2}?p_{2}f(?2?)=x2??p2?。從上圖顯而易見,x1?p1≠x2?p1x_{1}?p_{1} \neq x_{2}?p_{1}x1??p1??=x2??p1?。也就是說同一個x對應多個y,這明顯不滿足函數的定義。邊框回歸學習的是回歸函數,然而你的目標卻不滿足函數定義,當然學習不到什么。

寬高坐標Log形式

我們想要得到一個放縮的尺度,也就是說這里限制尺度必須大于0。我們學習的 tw,tht_{w},t_{h}tw?,th?怎么保證滿足大于0呢?直觀的想法就是EXP函數,如公式(3), (4)所示,那么反過來推導就是Log函數的來源了。

為什么IoU較大,認為是線性變換?

當輸入的 Proposal 與 Ground Truth 相差較小時(RCNN 設置的是 IoU>0.6), 可以認為這種變換是一種線性變換, 那么我們就可以用線性回歸來建模對窗口進行微調, 否則會導致訓練的回歸模型不 work(當 Proposal跟 GT 離得較遠,就是復雜的非線性問題了,此時用線性回歸建模顯然不合理)。這里我來解釋:

Log函數明顯不滿足線性函數,但是為什么當Proposal 和Ground Truth相差較小的時候,就可以認為是一種線性變換呢?大家還記得這個公式不?參看高數1。

limx=0log(1+x)=xlim_{x = 0}log(1 + x) = xlimx=0?log(1+x)=x

現在回過來看公式(8):

tw=log??(Gw/Pw)=log(Gw+Pw?PwPw)=log(1+Gw?PwPw)t_{w} = \log ?(G_{w}/ P_{w}) = log(\frac{G_{w} + P_{w}?P_{w}}{P_{w}}) = log(1 + \frac{G_{w}?P_{w}}{P_{w}})tw?=log?(Gw?/Pw?)=log(Pw?Gw?+Pw??Pw??)=log(1+Pw?Gw??Pw??)

當且僅當 Gw?Pw=0G_{w}?P_{w}=0Gw??Pw?=0的時候,才會是線性函數,也就是寬度和高度必須近似相等。

對于IoU大于指定值這塊,我并不認同作者的說法。我個人理解,只保證Region Proposal和Ground Truth的寬高相差不多就能滿足回歸條件。x,y位置到沒有太多限制,這點我們從YOLOv2可以看出,原始的邊框回歸其實x,y的位置相對來說對很大的。這也是YOLOv2的改進地方。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453802.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453802.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453802.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

2018 年,React 將獨占web前端框架鰲頭?

相比 Angular 和 Vue&#xff0c; React 是 2017 年的主要 JS 框架&#xff0c;尤其是 React Native 以前所未有的速度提升自己。 Stateofjs 2017前端框架調查結果 相比較 2016 年的調查結果 所以 &#xff0c;1 年過去了&#xff0c;Vue.js 顯然在前端框架中占據了領導地位&am…

ffmpeg的編譯(for x86,for arm)安裝及使用(網絡資料整理)

ffmpeg編譯及使用 1 ffmpeg介紹 ffmpeg是音視頻的分離&#xff0c;轉換&#xff0c;編碼解碼及流媒體的完全解決方案&#xff0c;其中最重要的就是libavcodec庫。它被mplayer或者xine使用作為解碼器。還有&#xff0c;國內比較流行的播放器影音風暴或MyMPC的后端ffdshow也是使…

python中other_Python other

最新項目django tinymcewrapper允許您輕松地將tinymce小部件添加到其他應用程序管理表單中&#xff0c;而無需修改其他應用程序。此包Python名稱&#xff1a;djang ...2020-12-24已閱讀: n次##這是什么&#xff1f;愚蠢的服務器可以幫助您模擬一些尚未實現的http服務&#xff0…

python 第三方模塊之 pandas 操作 excel

python 解析 excel 對比 包版本xls讀xlsx讀xls寫xlsx寫備注xlrd1.1.0&#xff08;2017年8月22日&#xff09;√√2.0 之后不支持xlsxxlwt1.3.0&#xff08;2017年8月22日&#xff09;√openpyxl2.6.2&#xff08;2019年3月29日&#xff09;√√XlsxWriter1.2.1&#xff08;201…

JMeter響應斷言詳解

響應斷言 &#xff1a;對服務器的響應進行斷言校驗 &#xff08;1&#xff09;應用范圍: main sample and sub sample&#xff0c; main sample only &#xff0c; sub-sample only &#xff0c; jmeter variable    關于應用范圍&#xff0c;我們大多數勾選“main sample on…

YUV / RGB 格式及快速轉換

YUV是指亮度參量和色度參量分開表示的像素格式&#xff0c;而這樣分開的好處就是不但可以避免相互干擾&#xff0c;還可以降低色度的采樣率而不會對圖像質量影響太大。 YUV是一個比較籠統地說法&#xff0c;針對它的具體排列方式&#xff0c;可以分為很多種具體的格式。轉載一篇…

交換機分布緩存_交換機網絡嗅探方法 如何欺騙交換機緩存

嗅探(sniff)&#xff0c;就是竊聽網絡上流經的數據包&#xff0c;而數據包里面一般會包含很多重要的私隱信息&#xff0c;如&#xff1a;你正在訪問什么網站&#xff0c;你的郵箱密碼是多少&#xff0c;你在和哪個MM聊QQ等等......而很多攻擊方式(如著名的會話劫持)都是建立在嗅…

深度學習之 SSD(Single Shot MultiBox Detector)

目標檢測近年來已經取得了很重要的進展&#xff0c;主流的算法主要分為兩個類型&#xff1a; &#xff08;1&#xff09;two-stage方法&#xff0c;如R-CNN系算法&#xff0c;其主要思路是先通過啟發式方法&#xff08;selective search&#xff09;或者CNN網絡&#xff08;RP…

短時程突觸可塑性(short-term synaptic plasticity)

介紹神經元的突觸可塑性一般被認為是大腦學習與記憶的分子生物學機制&#xff0c;它是指突觸傳遞效率增強或減弱的變化現象。若這種變化只持續數十毫秒到幾分&#xff0c;便稱之為短時程突觸可塑性&#xff0c;其中效率增強與減弱分別叫做短時程增強&#xff08;short-term enh…

windows平臺下vlc編譯

轉自:http://jeremiah.blog.51cto.com/539865/114190Jeremiah剛剛工作幾個月&#xff0c;參與的第一個項目是與視頻監控有關&#xff0c;分配給我的任務就是用開源的vlc做一個自己的播放器。對于開源項目來說&#xff0c;搭建起編譯環境是第一步也是最重要的一步。Jeremiah在歷…

python xgboost安裝_win7 64 python2 xgboost安裝

綜述&#xff1a;安裝Python3 環境下的xgboost 可以通過pip install &#xff0c; 在網址中下載對應版本&#xff1a; http://www.lfd.uci.edu/~gohlke/pythonlibs/#xgboost 來進行安裝。但Python2在該網址下并沒有相應的包&#xff0c;所以要下載xgboost源代碼 然后編譯。很麻…

深度學習之卷積神經網絡 AlexNet

AlexNet 是 2012年ILSVRC 比賽冠軍&#xff0c;遠超第二名的CNN&#xff0c;比LeNet更深&#xff0c;用多層小卷積疊加來替換單個的大卷積&#xff0c;結構如下圖所示。 ?? 結構 預處理 原始圖片&#xff1a;256?256?3256*256*3256?256?3 圖像處理&#xff1a; 1.隨機…

jstl處理欄目與子欄目_芬頓氧化法廢水處理工程技術規范(征求意見稿)

日前&#xff0c;生態環境部印發《芬頓氧化法廢水處理工程技術規范(征求意見稿)》&#xff0c;詳情如下&#xff1a;各有關單位&#xff1a;為貫徹《中華人民共和國環境保護法》和《中華人民共和國水污染防治法》等法律法規&#xff0c;防治環境污染&#xff0c;改善環境質量&a…

深度學習之卷積神經網絡 ZF Net

ZFNet出自論文《 Visualizing and Understanding Convolutional Networks》&#xff0c;作者Matthew D. Zeiler和Rob Fergus——顯然ZFNet是以兩位作者名字的首字母命名的。ZFNet通常被認為是ILSVRC 2013的冠軍方法&#xff0c;但實際上ZFNet排在第3名&#xff0c;前兩名分別是…

SIP與RTP綜合應用5-RTP解包過程

RTP接收部分比較簡單(不用考慮jitterbuffer等)&#xff0c;先從這里入手。 其實主要就3步&#xff1a; 1 創建一個udp&#xff0c;監聽一個端口&#xff0c;比如5200。 2 收到RTP包&#xff0c;送到解包程序&#xff0c;繼續收第 二個。 3 收齊一幀后&#xff0c;或保存文件&am…

JavaScript eval() 函數,計算某個字符串,并執行其中的的 JavaScript 代碼。

JavaScript eval() 函數&#xff0c;計算某個字符串&#xff0c;并執行其中的的 JavaScript 代碼。 適合用于計算器的計算&#xff0c;等。 例子&#xff1a; eval("x10;y20;document.write(x*y)") document.write(eval("22")) var x10 document.write(eva…

vb整合多個excel表格到一張_[Excel]同一工作簿中多個工作表保存成獨立的表格

一個工作簿中有多個表格&#xff0c;如何將其表格單獨保存成一個獨立的文檔呢&#xff1f;如果表格少&#xff0c;操作如下&#xff1a;選中要導出表格的標簽名--鼠標郵件--移動或復制表格--新建工作簿。當如果表格太多呢&#xff0c;以上方法就太羅嗦了。簡單方法用VBA,步驟如…

sqlserver字符串多行合并為一行

1 --創建測試表2 CREATE TABLE [dbo].[TestRows2Columns](3 [Id] [int] IDENTITY(1,1) NOT NULL,4 [UserName] [nvarchar](50) NULL,5 [Subject] [nvarchar](50) NULL,6 [Source] [numeric](18,0) NULL7 )8 GO9 10 --插入測試數據 11 INSERT INTO [TestRows2C…

OpenCore 的代碼結構

OpenCore的代碼結構 以開源Android 的代碼為例&#xff0c;Open Core 的代碼在Android 代碼的External/Opencore 目錄 中。這個目錄是OpenCore 的根目錄&#xff0c;其中包含的子目錄如下所示&#xff1a; android&#xff1a;這里面是一個上層的庫&#xff0c;它基于PVPlaye…

深度學習之卷積神經網絡 GoogleNet

GoogLeNet Incepetion V1 這是GoogLeNet的最早版本&#xff0c;出現在2014年的《Going deeper with convolutions》。之所以名為“GoogLeNet”而非“GoogleNet”,文章說是為了向早期的LeNet致敬。 深度學習以及神經網絡快速發展&#xff0c;人們不再只關注更給力的硬件、更大…