最近在使用YOLO,請問它輸出的檢測框坐標信息,(x,y,w,h)這些代表什麼意思呢?單位是像素嗎?想問一下和相機的解析度有關係嗎?


Box的坐標位置,一般兩種形式,一種是左上角和右下角坐標點,或者就是一個點加寬高,其他參數有置信度


跟相機解析度沒關係,圖片大小都沒關係,因為送進網路的圖片都會縮放到一定的尺寸,比如416,416。

你所說的坐標其實是網路最後的輸出信息,這個信息如何映射回原圖呢?我想這纔是你關注的問題。

首先yolo系列最後輸出的是一系列特徵圖,舉個例子yolo3的其中一張特徵圖尺寸為8x8x255,那麼這個特徵圖的長寬是8x8,這個網格信息首先就給了初始的位置信息。比如第一行第一列的網格,假設原圖是800x800的尺寸,那就代表了這個網格負責判斷在原圖(0,0),(100,100)的rect 的附近物體的檢測,但是這樣還是無法完全映射回原圖,只能說明該網格的物體映射回去的大概位置,那如何得到精確的位置信息呢?這時候就要用到你提到的x,y,w,h,首先每個網格都有預設的3個錨框(anchor),每個錨框都有固定的尺寸,這個尺寸是通過聚合訓練級(kmeans)得出來的。然後你提到的x,y,w,h就是基於這個預設的錨框的坐標和尺寸做的一個偏移。通過這個偏移量結合網格的坐標得知預測物體的坐標,而w,h結合這個錨框預設的尺寸和原圖的尺寸得到最終的物體的尺寸,這就是這個網格的3個錨框中的其中一個錨框(預測框)的最終結果。這個結果結合原圖尺寸就是真實的坐標信息。

關於偏移量的計算(解碼過程)

b系列就是結果值,t系列是網路預測值,c是網格基於特徵圖的坐標,p系列的值就是錨框的預設尺寸

拿其中bx舉例,bx是網路輸出的bbox的其中一維坐標信息,然後σ就是sigmoid激活函數,使網路的輸出取到[0,1]之間,這個值是當前物體的中心坐標基於網格的坐標的一個偏移(注意,最多就是1,也就是說不可能超出該網格的位置),cx為該網格的坐標,比如網格的x坐標是3,網路預測的cx是0.5,那麼該預測框解碼出的物體的中心坐標就是3.5。但這個值是基於特徵圖的坐標,還需要根據原圖尺寸的採樣率進行映射。比如3.5的輸出坐標,8x8的特徵圖,800x800的原圖,那麼:

[公式]

順便貼一下yolo關於這部分的源碼:

紅框是對x,y的輸出的sigmoid激活,注意只對x和y的輸出做了sigmoid激活

下面的紅框區域就是把x,y,w,h變成基於特徵圖的真實歸一化信息,後續只要根據原圖尺寸映射回去即可

然後回過頭來看yolo的特徵圖8x8x255,我們可以通過計算數值來加強理解。我們關注通道維255這個數字,怎麼得出來的,yolo是基於coco的數據集做的開發,coco有80類,也就說需要有80維的分類置信度,然後還需要x,y,w,h這4維位置信息,然後還需要一維的是否存在目標置信度,這樣一個錨框一共有80+4+1=85維。然後一共有3個錨框,也就是說一個網格一共需要255維來表示他的3個錨框的真實信息,這就是上面8x8x255中的通道維,而這個8x8一共有64個網格,也就是涵蓋了整個圖片中的所有區域。至於不同尺度的物體的問題怎麼解決呢?首先8x8的特徵圖的3個錨框就可以預測3種尺寸的物體了,然後還有另外2個不同尺寸的特徵圖,又能繼續預測6個不同尺寸的物體。

所以yolo這種onestage的模型其實就是很暴力的提前把所有可能出現的情況都考慮進去了,然後通過梯度下降來擬合數據集,實現對特定數據集的預測。

碼字不易啊,看完有幫助的話,麻煩動動手幫忙點贊關注一波唄


代表了模型檢測出的目標框的中心點(x,y),w和h分別代表了目標框的寬高


你是問模型的直接輸出還是處理後的輸出?不同的場景有不同的處理方法,我說下模型的直接輸出。

x,y是yolo輸出層網格化後左上角的坐標(這是固定的),再加上目標位置相對於左上角的偏離(這是模型預測給出的結果),單位是x像素(三層yolo層x分別為8,16,32)

w,h是目標框的大小,單位是像素


一般情況表示為(x,y,w,h),即預測框中心坐標的偏移量和長寬的偏移量,最終預測框的輸出值還需要結合自動生成的中心坐標和長寬。


推薦閱讀:
相關文章