輸入的圖片size為什么是32的倍數,yolo各個模型層說明。upsample+route過程

以上是filter之后size的計算過程,總共是5次計算,所以是2的5次方次變值所以是32。其余size沒有變值的沒有改變。此時module形態:stride是2
(conv_1): Conv2d(32, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
(batch_norm_1): BatchNorm2d(64, eps=1e-05, momentum=0.9, affine=True, track_running_stats=True)
(leaky_1): LeakyReLU(negative_slope=0.1)
size沒有改變的情況下,只有通道數改變,涉及到一個殘差過程,所以有一個只改變通道的過程:stride 是1
(1): Sequential(
(conv_1): Conv2d(32, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)
(batch_norm_1): BatchNorm2d(64, eps=1e-05, momentum=0.9, affine=True, track_running_stats=True)
(leaky_1): LeakyReLU(negative_slope=0.1)
)
(2): Sequential(
(conv_2): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)
(batch_norm_2): BatchNorm2d(32, eps=1e-05, momentum=0.9, affine=True, track_running_stats=True)
(leaky_2): LeakyReLU(negative_slope=0.1)
)
(3): Sequential(
(conv_3): Conv2d(32, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)
(batch_norm_3): BatchNorm2d(64, eps=1e-05, momentum=0.9, affine=True, track_running_stats=True)
(leaky_3): LeakyReLU(negative_slope=0.1)
)
只有在改變size大小的時候大幅提升通道數
64->128->512->1024
第一個youlo層前變換: Conv2d(1024, 255, kernel_size=(1, 1), stride=(1, 1)),size是12
route
當前輸出改為倒數第四個的輸出,為第二個yolo層進入的x輸入,這時候通道數改變了變成512
else if module_def["type"] == "route":
x = torch.cat([layer_outputs[int(layer_i)] for layer_i in module_def["layers"].
upsample+route過程

第一個yolo之后回route到yolo之前倒數第四個模型出來的x值。然后進行往下一層變換,到特定細節層之后,torch采樣函數變成和上邊某一層size一樣的層,然后用torch.cat拼接成新的層。這個新的層之后只做通道操作不改變size大小,這個新的層重新提取特征。

都是在一個yolo之后進行路由到之前層,然后用采樣函數和之前對應size層,cat住,再重新提取特征。進入下一個yolo層
1、通道數是可以確定的。
2、size數是分別是:imgsize/32的倍數,imgsize/16的倍數,imgsize/8的倍數
3、經過stride后會變換特征圖大小一共有5次,每次都是2倍所以確定imgsize大小要是2^5=32倍數