實作yolov1

計算layer輸出

image info{: w=”700” h=”200” }

  • 首先可以看到輸入的圖片是448 x 448,然後經過7 x 7 x 64 stripe 2 的conv layer,以及2 x 2 stripe 2 的Maxpool layer。
    如果直接計算輸出的dimension,會發現計算有問題!!因為$${ 輸入寬度 - kernel寬度 \over stripe} \ne 224$$。查詢後發現如果去看yolov1.cfg,第一層的padding=1,也就是這層conv有paddind。
    首先先看到darknet/src/parser.cparse_convolutional可以發現if(pad) padding = size/2;,也就是如果cfg的padding=1,padding的大小就是$$\lfloor {kernel \ size \over 2} \rfloor$$ 取整數。所以第一層的padding是$$\lfloor {7 \over 2} \rfloor$$取整數3。
    再去看darknet/src/convolutional_layer.cmake_convolutional_layer呼叫的convolutional_out_width,就可以看到詳細計算。conv的輸出尺寸是

$$\lfloor{ {輸入長(寬) + 2 \times padding - kernel \ 長(寬)} \over stride}\rfloor + 1 = \lfloor{447 \over 2}\rfloor + 1 = 224$$

  • 接下來是2 x 2 Maxpool layer,輸出尺寸為112,輸出channel是64!!不過如果直接對照圖看,會發現圖上寫112 x 112 x 192,這很可能是論文的圖寫錯了,因為如果用darknet幫你計算每一層的輸出的話應該是如下圖。
    image info{: w=”700” h=”200” }

  • 1 x 1 的conv稱為reduction layers

Pytorch實作

下面以圖片作為輸入來舉例

  • CONV2D: 輸入的tensor每一個維度所對應的是$$(N,C_{in},H,W)$$
    • $$N$$: 照片張數,一次一張照片為1
    • $$C_{in}$$:照片channel,彩色照片為3
    • $$H$$: 照片高度
    • $$W$$: 照片寬度

darknet的conv layer程式碼疑問:

1
for(i = 0; i < l.nweights; ++i) l.weights[i] = scale*rand_normal(); #209

其他紀錄

計算總共有多少個weights

layer定義

h:輸入高
w:輸入寬
c:輸入channel
n:輸出channel
size:kernel size
nweights = (c / groups) * n * size * size

darknet載入權重

src -> parser.c -> load_convolutional_weights

  1. 讀取biases,每一個conv的filter都有一個,如yolov1第一層有64個
  2. 讀取batch_normalize
    1. 讀取scales,數量等於輸出channel
    2. 讀取rolling_mean,數量等於輸出channel
    3. 讀取rolling_variance,數量等於輸出channel
  3. 讀取weights

計算weight數量

史丹佛cs231n這張圖解釋得非常清楚,權重的總數為
輸入channel x kernel 寬 x kernel 高 x 輸出channel

local layer

參考:

Dive into Deep learning
https://d2l.ai/chapter_convolutional-neural-networks/padding-and-strides.html#stride

CS231
https://cs231n.github.io/convolutional-networks/#comp

Deep learning
http://neuralnetworksanddeeplearning.com

caculate weights number : Convolution Demo
https://cs231n.github.io/convolutional-networks/

Batch-Normalization
https://towardsdatascience.com/batch-normalization-in-3-levels-of-understanding-14c2da90a338

Locally Connected Layers說明
https://www.cs.toronto.edu/~lczhang/aps360_20191/lec/w03/convnet.html

Understanding Convolutions
http://colah.github.io/posts/2014-07-Understanding-Convolutions/

local connected layer
http://sintesis.ugto.mx/WintemplaWeb/01Neural%20Lab/09Convolutional%20NN/10Locally%20Connected/index.htm

local connected layer 實作
https://github.com/pytorch/pytorch/pull/1583/files

local connected layer 實作
https://github.com/nsoul97/yolov1_pytorch/blob/main/code/model.py

local connected layer 實作
https://github.com/pytorch/pytorch/issues/499

GDB
https://cotonne.github.io/gdb/2019/07/14/gdb-beginner-guide.html

GDB https://condor.depaul.edu/glancast/373class/docs/gdb.html

Math Syntax
https://www.rapidtables.com/math/symbols/Basic_Math_Symbols.html

GDB指令:
p sizeof(array)/sizeof(*array) ptype array 印出array長度
印出指標array的長度
p *l.biases@10 印出array的前10個元素

Author

Steven

Posted on

2022-11-08

Updated on

2025-01-14

Licensed under

Comments