본문 바로가기

머신러닝/YOLO

Object Detection / YOLOv3 : train_detector - 2

반응형

2019/07/31 - [머신러닝/YOLO] - Object Detection / YOLOv3 : train_detector - 1

 

Object Detection / YOLOv3 : train_detector - 1

./darknet detector train cfg/voc.data cfg/yolov3-voc.cfg darknet53.conv.74 (-flags) 위의 명령어를 darknet.c/main의 input 값으로 사용했다. datacfg 는 "cfg/voc.data", cfgfile 는 "cfg/yolov3-voc.cfg",..

jainkku.tistory.com

이어지는 내용입니다!

 

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 사이의 값

 

l.weights 배열

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는 각각 가중치, 입력, 출력을 가리키는 포인터입니다.

 

반응형