1. 程式人生 > >Pytorch--yolov3

Pytorch--yolov3

一、讀取cfg檔案,根據cfg檔案構建網路。

[convolutional]
batch_normalize=1
filters=64
size=3
stride=2
pad=1
activation=leaky

儲存為如下格式:

[{"type":convolutional, "batch_normalize":1, "filters":64, "size":3, 
"Stride":2, "pad":=1, "activation":leaky},...]

 遍歷所有模組,利用torch.nn.Sequential構建網路結構。block的儲存順序與網路順序一致,所以可以用block重新構建網路。

model = torch.nn.Sequential()
conv = torch.nn.Conv2d(prev_filters, filters, kernel_size, stride, pad, bias=bias)
model.add_model("conv_{0}".format(index), conv)
  • yolov3中,若存在batch_normalization,則無bias,反之亦然。
  • Conv1d:一維卷積層,輸入的尺度是(N, C_in,L),輸出尺度( N,C_out,L_out);Conv2d:二維卷積層, 輸入的尺度是(N, C_in,H,W),輸出尺度(N,C_out,H_out,W_out)。
  • BatchNorm2d:對小批量(mini-batch)3d資料組成的4d輸入進行批標準化(Batch Normalization)操作。
  • Upsample:bilinear,雙線性差值。
  • route,shortcut layer,構建nn.Module類的空層,在後面對輸出層進行操作。
  • yolo層為detection layer,所用anchors不同,所以構建detection layer時,將anchors作為引數。

二.將預測結果,進行格式轉換

預測輸出的shape為:

(batch_size, num_anchors*bbox_attracs, grid_size*grid_size)

轉換為:

(batch_size, grid_size*grid_size*num_anchors, bbox_attracs)
      x        y       w      h    objectness                                  confidence score

\\b_{x} = \delta (t_{x})+c_{x}\\b_{y} = \delta (t_{y})+c_{y} \\b_{w} = p_{w}e^{t_{w}} \\ b_{h} = p_{h}e^{t_{h}}

根據以上處理prediction。

  • 注意squeeze與unsqueeze的利用,對於Tensor進行操作,一定要注意維度。

三.NMS。

遍歷batch中的圖片,分別進行以下操作:

  1. 根據object_score進行判斷,將小於閾值的置零。
  2. 統計圖片所有類別,即每個Bbox的預測結果,將每類分別處理,按confidence進行排序,得到索引值。根據NMS原理,逐步消除無用的bbox。
  • 統計類別,用到np.unique()函式,先將Tensor轉為numpy操作,最後再轉回Tensor。
  • 消除bbox時,遍歷排好序的bbox,先判斷與confidence最大的bbox的IOU,等到下一次迴圈,會選擇除上一個之外的confidence最大的bbox繼續進行操作。
  • 消除小於閾值的bbox的方法,即利用torch.nonzero()函式,得到非零值的索引。