AI Research Topic/Object Detection

[Object Detection] darknet custom 학습하기

꾸준희 2019. 10. 16. 20:57
728x90
반응형

 

darknet 학습을 위해 이전에 처리해야할 과정들은 다음 포스팅을 참고 

 

[Object Detection] darknet custom 학습 준비하기 

https://eehoeskrap.tistory.com/367

 

[Object Detection] Darknet 학습 준비하기

환경 Ubuntu 16.04 GeForce RTX 2080 1. 학습 준비하기 1.1 COCO 데이터 세트를 이용한 학습 COCO 데이터는 2014 , 2017 로 나뉘어져 있는데, 홈페이지에서 다운 받을 수도 있지만, 크기가 너무 커서 유틸리티 cur..

eehoeskrap.tistory.com

 

 

1. Darknet 코드 다운받기 

 

Darknet 프레임워크를 이용하기 위한 github 는 크게 2가지가 있다. 

 

1.1 yolo v3 저자가 만든 github

https://github.com/pjreddie/darknet

 

pjreddie/darknet

Convolutional Neural Networks. Contribute to pjreddie/darknet development by creating an account on GitHub.

github.com

 

1.2 부가적인 기능을 사용하고자 할 때 많이 쓰는 github

(mAP 계산, 학습 시 Loss, iteration, mAP 를 그래프로 확인 등...)

https://github.com/AlexeyAB/darknet

 

AlexeyAB/darknet

Windows and Linux version of Darknet Yolo v3 & v2 Neural Networks for object detection (Tensor Cores are used) - AlexeyAB/darknet

github.com

필자는 둘 다 써본 결과, 간단히 학습을 돌릴 경우나 테스트해보고 싶고 이것 저것 설정하기 싫다면 1번을 추천하고

설정을 더 많이 해주되 공부 목적으로 mAP 및 Loss 값이 어떻게 바뀌는지 확인하며 학습을 시키고 싶다면 2번을 추천한다. 

 

공통적인 내용은 본 포스팅의 2번 참고

pjreddie의 darknet 학습을 원한다면 포스팅 3번 참고

AlexeyAB 의 darknet 학습을 원한다면 포스팅 4번 참고 

 

 

 

 

2. 공통 사항 

 

darknet을 학습하기 위해서는 아래와 같은 파일들의 설정이 필요하다

 

 

2.1 주요 사항

 

  • obj.data
    • 학습을 위한 내용이 담겨있는 파일
    • classes 개수, train.txt 와 valid.txt 의 경로, obj.names 의 경로, weight를 저장할 폴더의 경로로 이루어짐
  • obj.cfg
    • 모델 구조 및 train 과 관련된 설정이 들어있는 파일
    • batch 및 subdivisions 사이즈(Cuda Memory 관련), width 및 height 사이즈(입력 값 및 성능 관련)
    • augmentation(angle, saturation, exposure, hue) 설정
    • learning rate, burn_in, max_batches, policy, steps, scales 설정
    • filters : (4 + 1 + class 수) * 3 설정
    • classes : class 수 설정
    • anchors 및 mask 설정
  • weight file
    • 특정 미리 트레이닝된 모델(pre-trained model) 또는 기본적으로 darknet53.conv.74 등의 가중치 파일
    • fine-tuning을 위해 맨 아래 레이어를 제거(AlexeyAB darknet에 내장)한 가중치 파일을 사용할 수도 있음
  • obj.names
    • annotation에 포함되어있는 라벨링 이름 목록 즉, 검출하고자 하는 목록
  • images
    • 학습시킬 이미지들
    • .png or .jpg 등의 이미지로서 train image 및 val image 필요
      • 0000001.jpg
      • 0000002.jpg
      • ...
    • valid image 는 train image 의 10 ~ 20% 정도로 설정
  • annotation :
    • 학습시킬 이미지들에 대한 주석들
    • 주석 형식
      • [class_id] [center_x] [center_y] [w] [h]
        • 3 0.256 0.326 0.345 .643
        • 34 0.234 0.555 0.115 0.472
    • 각 이미지 마다 주석들이 담긴 텍스트 파일 필요
      • 0000001.txt
      • 0000002.txt
      • ...
  • train.txt
    • 학습 시킬 이미지들의 경로들이 담긴 리스트
  • valid.txt
    • 학습 시 validation 할 이미지들의 경로들이 담긴 리스트

 

 

 

 

2.2 cfg 파일 설정

 

기본 yolov3.cfg 의 파일은 아래와 같다.

[net]
# Testing
#batch=1
#subdivisions=1
# Training
batch=64
subdivisions=16
width=416
height=416
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1

learning_rate=0.001
burn_in=1000
max_batches = 500200
policy=steps
steps=400000,450000
scales=.1,.1

...

 

학습을 위해서 다음과 같이 값을 조절한다.

 

  • batch
    • 기본 값은 64
  • subdivisions
    • 배치 사이즈인 64를 얼마나 쪼개서 학습을 할건지에 대한 설정 값
    • 기본 값은 8 이지만 Out of memory 에러가 날 경우 16 또는 32 또는 64 로 조절하여 학습을 시도함
  • width 및 height
    • 기본 값은 416 이지만 608로 변경하여 학습 할 수 있음
    • 608로 변경 시 정확도가 좋아질 수 있음
  • 입력되는 데이터로부터 다양한 데이터를 학습하기 위한 설정 값
    • angle
      • augmentation에 관련된 값으로서, 이미지를 - + 몇 도 돌릴 것인지에 대한 설정 값
      • 보통 0으로 두거나, 다양한 각도에서 학습하고 싶은 경우 30 ~ 45 정도, 경우에 따라 90도 가능함
    • saturation
      • augmentation에 관련된 값으로서 이미지에 채도를 추가하고자 할 때 설정하는 값
    • exposure
      • augmentation에 관련된 값으로서 노출 값을 추가하고자 할 때 설정하는 값
    • hue
      • augmentation에 관련된 값으로서 색상을 변경하고자 할 때 설정하는 값

 

  • learning_rate
    • 보통 0.001 
    • multi-gpu 사용 시 학습률을 0.001 / gpu 수 만큼 조절하기도 함
      • 예를 들어 GPU 2장을 이용한 학습 시 0.001 / 2 = 0.0005 값을 사용
  • burn_in
    • 보통 1000 
    • multi-gpu 사용 시 몇 만큼의 iteration 이 지날 때 마다 학습률을 조정 할 것인지에 대한 값
    • multi-gpu 사용 시 1000 * gpu 수 만큼 조절함
      • 예를 들어 GPU 2장의 경우 1000 * 2 = 2000 으로 설정
  • max_batches
    • 언제까지 iteration을 돌건지 설정하는 값
    • 보통 class 수 * 2000 으로 설정 (넉넉하게 4000을 곱하는 경우도 있음)
      • 1 class 의 경우 (1 * 2000) + 200 = 2200
      • 80 class 의 경우 (80 * 2000) + 200 = 160,200 
      • 뒤에 붙인 200 값은 전 후로 알맞은 가중치를 얻기 위함임 
  • policy
    • 보통 steps
  • steps
    • 위에서 설정한 max_batches 사이즈(200을 더하지 않은..)의 80% 와 90%를 설정
      • 예를 들어 80 class 의 경우 128000,144000 으로 설정
  • scales
    • 보통 .1,.1

 

 

위에서 학습과 관련된 설정을 마쳤다면 이제 네트워크의 값들을 조정해줄 차례이다.

classes 와 filters 의 값을 조정해주면 된다.

 

  • classes
    • 클래스 의 수
    • 1개 클래스 : classes=1
    • 80개 클래스 : classes=80
  • filters
    • 필터 수
    • (4 + 1 + 클래스 수) * 3
      • 1개 클래스 : filters=18
      • 80개 클래스 : filters=255

 

ctrl + f 로 [yolo] 를 검색하여 세 군데를 수정해준다.

 

클래스 수가 1개일 경우 

[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
[convolutional]
size=1
stride=1
pad=1
filters=18
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=1
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

 

 

클래스 수가 80개일 경우

[convolutional]
size=1
stride=1
pad=1
filters=255
activation=linear

[yolo]
mask = 6,7,8
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=80
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
[convolutional]
size=1
stride=1
pad=1
filters=255
activation=linear

[yolo]
mask = 3,4,5
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=80
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1
[convolutional]
size=1
stride=1
pad=1
filters=255
activation=linear

[yolo]
mask = 0,1,2
anchors = 10,13,  16,30,  33,23,  30,61,  62,45,  59,119,  116,90,  156,198,  373,326
classes=80
num=9
jitter=.3
ignore_thresh = .5
truth_thresh = 1
random=1

 

 

 

 

2.3 obj.names 파일 설정

person
bicycle
car
motorcycle
airplane
bus
train
truck
boat
traffic light
fire hydrant
stop sign
parking meter
bench
bird
cat
dog
horse
sheep
cow
elephant
bear
zebra
giraffe
backpack
umbrella
handbag
tie
suitcase
frisbee
skis
snowboard
sports ball
kite
baseball bat
baseball glove
skateboard
surfboard
tennis racket
bottle
wine glass
cup
fork
knife
spoon
bowl
banana
apple
sandwich
orange
broccoli
carrot
hot dog
pizza
donut
cake
chair
couch
potted plant
bed
dining table
toilet
tv
laptop
mouse
remote
keyboard
cell phone
microwave
oven
toaster
sink
refrigerator
book
clock
vase
scissors
teddy bear
hair drier
toothbrush

 

 

 

 

 

2.4 train/val 이미지 및 주석 파일 설정

  • 학습 이미지와 주석 파일은 같은 폴더 내에 위치해야한다.
    • 왜냐하면 .jpg 들의 리스트를 읽어서 똑같은 파일 명으로 주석인 .txt 를 읽기 때문
    • 이 과정이 잘못될 경우 학습 시 데이터 파일을 읽을 수 없다는 에러를 내뱉는다.
  • train 이미지 파일들을 읽어 이미지 경로들의 리스트 저장 필요
  • train.txt / valid.txt 설정
    • validation 하고싶은 이미지들을 직접 긁어서 valid.txt 를 만들 수도 있고
    • train / valid 리스트를 나눠주는 코드를 사용할 수도 있음 (인터넷에 치면 많이 나옴)

train.txt 생성 코드

import glob

def file_path_save():

	filenames = []

	files = sorted(glob.glob("./obj/*.jpg"))

	for i in range(len(files)): 
		f = open("./train.txt", 'a')
		f.write(files[i] + "\n")
	
if __name__ == '__main__':

	file_path_save()

 

  • 참고로 train/val/test 이미지의 비율은 7:2:1 or 6:2:2 로 나눈다고 함 

 

 

 

 

 

2.5 obj.data 파일 설정

 

  • classes
    • 클래스 수
  • train
    • 위에서 설정한 train.txt 경로
  • valid
    • 위에서 설정한 valid.txt 경로
  • names
    • 위에서 설정한 obj.names 경로
  • backup
    • 100, 200, 300, ... , 1000, 2000, ... , 10000, 11000, 12000, ... iteration을 거치면서 weight 가 저장될 공간 
classes = 80
train  = /darknet/train.txt
valid  = /darknet/valid.txt
names = /darknet/obj.names
backup = /darknet/backup/

 

 

 

 

 

2.5 weight 파일

 

기본적으로 weight 파일은 darknet을 내려받으면 저장되는 darknet53.conv.74 파일을 이용한다.

 

때에 따라 yolo 공식 홈페이지에 나와있는 미리 훈련된 가중치 파일들을 이용할 수도 있으며

fine-tuning을 하고 싶을 때 AlexeyAB darknet 에 들어있는 partial 을 이용하여 마지막 레이어를 삭제하고 

모델 파일과 가중치 파일을 이용하여 darknet53.conv.74 처럼 가중치 파일을 생성 할 수도 있다. 

 

 

 

 

 

3. pjreddie 의 Darknet 학습하기

 

3.1 학습 실행하기

 

2번에서 설정한 그대로를 반영하여 darknet 폴더에서 아래와 같은 내용이 써져있는 train.sh 파일을 실행

./darknet detector train cfg/obj.data cfg/obj.cfg darknet53.conv.74 

 

필자는 log 를 남기기 위해서 아래와 같이 실행

$ nohup ./train.sh &

 

 

 

 

3.2 학습 확인하기

 

그러면 ./ 위치에 nohup.out 파일이 생성된다. 이 파일은 계속 로그가 쌓이기 때문에 gedit 으로 열지말고 ...

$ vi nohup.out

 

아래와 같은 내용들이 반복될 것이다. 


...

Region 82 Avg IOU: 0.159935, Class: 0.647959, Obj: 0.538580, No Obj: 0.613149, .5R: 0.000000, .75R: 0.000000,  count: 2
Region 94 Avg IOU: 0.588561, Class: 0.339215, Obj: 0.546665, No Obj: 0.517001, .5R: 1.000000, .75R: 0.000000,  count: 1
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.415087, .5R: -nan, .75R: -nan,  count: 0
Region 82 Avg IOU: 0.176771, Class: 0.524222, Obj: 0.189057, No Obj: 0.617779, .5R: 0.000000, .75R: 0.000000,  count: 1
Region 94 Avg IOU: 0.206775, Class: 0.321565, Obj: 0.501500, No Obj: 0.518449, .5R: 0.000000, .75R: 0.000000,  count: 4
Region 106 Avg IOU: 0.083679, Class: 0.520515, Obj: 0.340668, No Obj: 0.417908, .5R: 0.000000, .75R: 0.000000,  count: 13
Region 82 Avg IOU: 0.250109, Class: 0.642870, Obj: 0.364224, No Obj: 0.625760, .5R: 0.333333, .75R: 0.000000,  count: 6
Region 94 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.518308, .5R: -nan, .75R: -nan,  count: 0
Region 106 Avg IOU: -nan, Class: -nan, Obj: -nan, No Obj: 0.415534, .5R: -nan, .75R: -nan,  count: 0

...

 

  • Shift + g 쳐서 맨 밑줄로 이동 가능
  • 검색은 / 이용 
    • 예를 들면 /1000: 치고 엔터 

 

 

각 값들이 의미하는 바는 다음과 같다. 

 

  • Region 82
    • 가장 큰 Mask, Prediction Scale 을 이용하는 레이어이지만 작은 객체를 예측 할 수 있음
  • Region 94
    • 중간 단계 Mask, Prediction Scale 
  • Region 106
    • 가장 작은 Mask, Prediction Scale 을 이용하는 레이어이지만 마스크가 작을 수록 큰 객체 예측 가능
  • Avg IOU 
    • 현재의 subdivision에서 이미지의 평균 IoU
    • 실제 GT와 예측된 bbox의 교차율을 뜻함
    • 1에 가까울 수록 좋음
  • Class : 1에 가까운 값일 수록 학습이 잘 되고 있다는 것
  • No Obj : 값이 0이 아닌 작은 값이어야 함
  • .5R : recall/conut 
  • .75R : 0.000000
  • count 
    • 현재 subdivision 이미지들에서 positive sample 들을 포함한 이미지의 수 

 

 

 

 

 

 

3.3 올바른 weight 값 선택하기

 

아래 포스팅 참고

https://eehoeskrap.tistory.com/354

 

[Object Detection] Darknet 학습 시 적절한 Weight 고르기

When should I stop training: Usually sufficient 2000 iterations for each class(object). But for a more precise definition when you should stop training, use the following manual: During training, yo..

eehoeskrap.tistory.com

 

nohup.out 에 중간중간 나타나는 값들을 확인해보면 아래와 같은 결과를 볼 수 있다. 

여기서 중요시 봐야 할 값은 3열에 있는 (684.418823 avg 값 등) avg 값을 계속 확인하면 된다. 

1: 684.418823, 684.418823 avg, 0.000000 rate, 2.401813 seconds, 128 images
2: 678.632324, 683.840149 avg, 0.000000 rate, 2.491026 seconds, 256 images
...
50: 933.722168, 793.217163 avg, 0.000000 rate, 3.360414 seconds, 6400 images
...
200: 428.237793, 658.209473 avg, 0.000000 rate, 2.682613 seconds, 25600 images
...
600: 48.824303, 58.622269 avg, 0.000008 rate, 6.009916 seconds, 76800 images
...
1000: 8.727833, 11.282127 avg, 0.000063 rate, 4.095974 seconds, 128000 images
...
5000: 4.771876, 4.347374 avg, 0.001000 rate, 4.046257 seconds, 640000 images
...
10000: 7.235677, 6.246171 avg, 0.001000 rate, 2.745736 seconds, 1280000 images
...
29000: 7.568831, 6.998726 avg, 0.001000 rate, 3.048933 seconds, 3712000 images
30000: 5.528426, 6.289570 avg, 0.001000 rate, 4.078836 seconds, 3840000 images
...

 

  • Loss
    • iteration 이 증가할 수록 loss avg 값이 줄어드는 현상을 볼 수 있다.
    • 중간에 증가할 수도 있고, 계속 감소할 수 도 있다. 하지만 계속 증가만 한다면 학습이 잘못된 것이다.
    • 많은 데이터 세트의 경우 loss 값이 3.xxx 까지 떨어지며 더 이상 떨어지지 않는 현상을 볼 수 있고
    • 적은 데이터 세트의 경우 loss 값이 0.6 정도 까지 떨어진다고 한다. 그 이하로 떨어질 수도 있다.

 

더 이상 Loss 값이 떨어지지 않을 때 학습을 멈춘다.

하지만 권장 iteration (= 클래스 수 * 2000) 만큼 학습하는 것을 추천한다.

 

 

 

 

 

 

 

 

 

 

3.4 학습 결과 확인하기

 

batch 및 subdivisions 사이즈를 1로 조정하고,

예측 결과를 향상 시키기 위해 width 와 height 를 608 사이즈로 변경하여 cfg 파일을 수정한다.

 

obj_test.cfg 생성

[net]
# Testing
batch=1
subdivisions=1
# Training
#batch=64
#subdivisions=16
width=608
height=608

 

test.sh 생성

./darknet detector test cfg/obj.data cfg/obj_test.cfg obj160000.weights ./image/val/000000371699.jpg 0.50 

 

test.sh 실행

$ ./obj_test.sh

 

 

 

 

4. AlexeyAB 의 Darknet 학습하기

 

 

포스팅 예정 

 

 

 

 

 

 

 

 

 

 

 

참고자료 1

http://www.programmersought.com/article/9858453147/

 

Output parameter meaning during YOLO v3 training - Programmer Sought

Output parameter meaning during YOLO v3 training yolov3-voc Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005 Resizing 384 Loaded: 0.000077 seconds Region 82 Avg IOU: 0.293486, Class: 0.443128, Obj: 0.680025, No Obj: 0.532993, .5R: 0.142857, .75R: 0.00000

www.programmersought.com

 

 

 

 

728x90

 

728x90
반응형