2019/07/31 - [머신러닝/YOLO] - Object Detection / YOLOv3 : train_detector - 1
이어지는 내용입니다!
n = n->next;
n은 [net]다음인 [convolutional] 정보를 나타낸다.
fprintf로 출력 테이블 틀을 잡는다.
n만큼 반복문이 돈다.
params.index에는 0이 들어간다.
s에는 type이 [convolution]이고, options는 6줄이 들어간다.
LAYER_TYPE은 s->type을 [] 없이 대문자로 만들어준다. [convolution] -> CONVOLUTION
그리고 나서 해당 layer type의 parse 함수로 들어간다.
yolov3-voc.cfg 파일에 따르면 yolov3에서는 convolution, yolo, route, upsample, shortcut 만 사용된다.
먼저 parse_convolutional을 살펴보자.
거의 options, params 세팅이다.
그 중 make_convolutional_layer에 들어가보면
인자값이 엄청 많다..
batch = 4, steps = 1, h = 416, w = 416, c = 3, n =32, groups = 1, size = 3, stride = 1, dilation = 1, padding = 1, activation = LEAKY,
batch_normalize = 1, binary = 0, xnor = 0, adam = 0, use_bin_output = 0, index = 0, share_layer = NULL 로 넘어온다.
h : 입력 높이, w : 입력 너비, c : 채널 수, n : 필터 수, size : 필터 크기
layer l 에 인자값들을 세팅해주고, l.share_layer가 NULL이므로 else 문이 실행된다.
l.weights, l.weight_updates를 l.nweights(= 864) 만큼 동적할당 해준다.
biases, bias_updates를 n(= 32) 만큼 동적할당 해준다.
scale = 0.272165537 이다.. sqrt(2/3*3*3)
rand_unifrom()의 반환 값은
((float)rand() / RAND_MAX * (max - min)) + min;
RAND_MAX = 2147483647
rand() : 0 ~ RAND_MAX 사이의 값
out_height/width 계산은 아래와 같이 진행된다.
(416 + 2 - 3) / 1 + 1
415 / 1 + 1 = 416 그대로 416x416 유지된다.
l.output과 l.delta는 batch * out_h * out_w * out_c 만큼 동적할당 된다.
이 부분 부터 디버깅이 불가능
forward_convolutional_layer는 convolutional_layer.c/forward_convolutional_layer 로가고
backward_convolutional_layer는 convolutional_layer.c/backward_convolutional_layer 로가고
update_convolutional_layer는 convolutional_layer.c/update_convolutional_layer 로간다.
1. convolutional_layer.c/forward_convolutional_layer
함수의 gemm은 해당 convolution 문을 실행하는 데 사용됩니다. a, b, c는 각각 가중치, 입력, 출력을 가리키는 포인터입니다.
'머신러닝 > YOLO' 카테고리의 다른 글
Object Detection / YOLOv3 : train_detector - 3 (0) | 2019.08.01 |
---|---|
Object Detection / YOLOv3 : train_detector - 1 (0) | 2019.07.31 |
Object Detection / YOLOv3 : test_detector (0) | 2019.07.10 |
텐서란 무엇인가? (0) | 2019.06.03 |