-
訓練程序:
注意:以下提到的坐標都是以影像左上角為原點(0,0)來計算的 -
①先讀取圖片資訊,然后根據標簽標注的物體中心點將一張圖片不是物體中心點的地方全部設為0即黑化,這時就得到了一張熱圖(heatmap),但此時還未將高斯分布撒在這張熱圖上,
-
②求高斯分布的半徑,根據IOU(即假設框與真實框的交并比),求出符合這個IOU偏移范圍的半徑(radiu),也就是說如果以這個圓的圓心為中心點,那么在這個圓的范圍內,離圓心越遠的點,偏移程度越大,相應的高斯值越低,超出這個圓范圍的高斯值為0,
-
③求高斯分布圖(那個小亮點),根據求出來的半徑,先代入高斯公式求得一個圓形高斯分布(一個小亮點,即類似下面的矩陣),

-
④限制范圍(限制熱圖(masked_heatmap)和高斯分布圖(masked_gaussian)的范圍),先根據標注求出物體的中心坐標(center[0],center[1]),然后根據半徑和物體中心點的坐標判斷以物體中心點坐標為圓心,radiu為半徑所畫的圓是否超出了熱圖的邊界范圍,以此來劃定范圍,這個范圍被保存在四個變數里面,分別是:left,right,top,bottom(即上下左右)
根據masked_heatmap = heat_map[y-top : y+bottom,x-left : x+right]
將熱圖上需要覆寫高斯圖的部分保存了下來
根據
masked_gaussian = gaussian[radius - top:radius + bottom, radius - left:radius + right]
將限制好范圍的高斯圖保存了下來,也就是說可能對原有的高斯圖進行了切割,也可能原封不動,
再通過混合比大函式,將高斯圖分布在熱圖
np.maximum(masked_heatmap, masked_gaussian * k, out=masked_heatmap)
(out引數的意思是把輸出當做masked_heatmap變數,前提是masked_heatmap的維度相同或者支持廣播條件)
(該函式的作用是挨個比較兩個張量里面元素的大小,取兩個元素之中最大的元素,形成一個新的張量)
熱圖全是0,所以就等于把高斯圖覆寫在了熱圖上,
(注意:masked_heatmap = heat_map[y-top : y+bottom,x-left : x+right]
這一步其實不單只是單純的把heat_map賦給masked_heatmap, 而是創建一個masked_heatmap,這個maked_heatmap和heat_map屬于同一個物件,所以兩者中任意一個發生改變,另一個也會隨之改變,)
–
- 預測程序:
利用3x3最大池化求峰值的程序:
通過卷積網路預測得到的熱圖:

- ①首先,把預測出來的熱圖(其中一層)傳進函式里面

在 _nms() 函式里面利用3x3最大池化求出來hmax,也就是剛剛經過最大池化的圖:

- ②然后經過keep = (hmax == heat1).float() 這一步來求極大值(峰值),
原理是:heat經過maxpool之后有的元素的值變化了,有的元素的值沒變化,沒變化說明這個值是比相鄰的八個值都大或者與八個值中最大的值相等,因此才不會被maxpool改變, keep = (hmax == heat1).float() 這一步的作用是將沒變化的值變為1,變化了的值變為0,這就使得峰值變為了1,不是峰值的地方變為了0,于是便求得了峰值圖heat*keep


轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/231094.html
標籤:AI
上一篇:靜態路由實驗
