본문 바로가기

AI Research Topic/Object Detection

[Object Detection] darknet custom 학습하기

 

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

 

  • 이경준 2020.02.20 10:41

    'Research Topic > Object Detection' 카데고리를 2번째 정독 중이네요. ^^
    너무너무 정리를 잘 해 주셔서 감사합니다.
    TensorRT 정리 또한 너무 좋구요 많이 배우고 있습니다.

    "4. AlexeyAB 의 Darknet 학습하기" 포스팅 기대하고 있겠습니다.

    혹시 darknet pjreddie, AlexeyAB YOLOv3 두 개 모두 동영상을 장시간 돌리면 메모리가 계속 증가(메모리 릭?)하는데 혹시 이유를 아시거나 경험해 보셨나요? 최신 파일로 컴파일해서 돌렸는데도 그러네요...ㅜㅜ

    • 꾸준희 2020.02.20 23:44 신고

      혹시 다크넷 자체에 있는 load_image 사용하여 영상 받아오나요? 이거말고 opencv 로 동영상 프레임 받아서 돌려보세요! 여기 참고하세요

      https://github.com/pjreddie/darknet/issues/549

  • 이경준 2020.02.21 09:22

    답변 감사드립니다.

    Makefile에서 opencv 활성화 시키고 컴파일 하였습니다.
    GPU=1
    CUDNN=1
    OPENCV=1
    OPENMP=0
    DEBUG=0

    저는 단지 github에서 darknet pjreddie, AlexeyAB YOLOv3 최신버전을 내려받고 Makefile을 위와 같이 수정한 후 가중치 파일(yolov3.Weights)을 다운받아 실행 하였을 뿐인데 장시간 프로그램을 구동시키고 ps를 쳐보면 VSZ 값이 증가합니다.(소스코드는 건들지 않았습니다.)

    ./darknet detector demo cfg/coco.data cfg/yolov3.cfg yolov3.weights ../video/highway.mp4

    열심히 삽질하다보면 답이 나오겠죠.ㅜㅜ

    다시 한번 답변 달아 주셔서 정말 감사합니다.

    • 꾸준희 2020.02.23 11:55 신고

      .sh 파일로 실행하지마시고 python 폴더에 있는 darknet.py 로 실행해보세요! darknet.py 로 실행하실때는 load_image 함수 사용하지 마시고 opencv cap read 사용해서 동영상 돌려보세요 ㅜㅜ

    • 이경준 2020.02.24 13:57

      답변 감사드립니다. 좋은 하루 되세요.^^

  • KDY 2020.04.13 11:27

    2.4에서 train/val 이미지 및 주석 파일 설정
    단계에서 학습이미지와 주석파일은 같은 폴더 내에 위치해야한다는 의미는 이해했는데요 ㅠ
    학습시키고자 하는 2천개 정도의 .jpg파일을 직접 라벨링을 해서 얻은 txt파일 과 같이 넣는건지
    아니면 .jpg 파일들을 가지고 train.txt생성 코드를 쳐서 한번에 얻는건지 모르겠습니다!

    • 꾸준희 2020.04.14 11:19 신고

      한 폴더 내에 .jpg 파일들과 그에 해당하는 주석파일인 .txt 파일들을 넣어두시고
      train.txt 에는 그 해당 폴더에 들어있는 jpg 리스트들의 경로를 적어주시면됩니다.

    • KDY 2020.04.16 14:35

      답변해주셔서 감사합니다.
      제가 3.1을 진행하고 있는데
      ./ darknet detect~ 라고 써있는 코드를 pjreddie의 파일에서 보이지 않아서 AlexeyAB의 파일에서 .sh파일 가지고와 3.1의 코드를 입력해서 저장해 놨는데요 이렇게 진행해도 괜찮을까요?
      또 실행한다고 되어있는데 실행할때 쓰는 프로그램은 혹시 어떤거를 쓰시나요?!
      Visual Studio로 해보려고하니까 안되는데 prompt창에서 하면 되나요?
      (죄송합니다 너무 초보자라 따라하기도 힘드네요)

    • 꾸준희 2020.04.16 14:39 신고

      .sh 파일 가지고 오셔서 진행해도 됩니다!

      저는 리눅스 환경이라서 터미널에서 진행하였습니다~ 윈도우는 아나콘다 프롬프트 창이나 cmd 사용하시면 될 것 같네요!

    • KDY 2020.04.16 17:46

      제가 윈도우 환경이라서 windows.git으로 유닉스버전을 통해 $ nohup ./train.sh &을 입력하니까 train.sh와 같은 경로상에nohup.out 파일이 만들어졌는데
      $ vi nohup.out을 입력하니까 nohup.out.swp라는 파일이 만들어지는 과정에서 ~ 표시만 뜨고 Region이나 Avg같은 수치들이 나오지 않고 있습니다.
      이게 train.sh 파일의 경로가 잘못되어 뜨는건가요??

    • 꾸준희 2020.04.17 11:46 신고

      nohup 으로 로그 확인하기 전에
      그냥 ./train.sh 명령어 입력해서 학습 되는지 cmd 창에서 확인해보시겠어요?

  • SJD 2020.04.28 01:22

    안녕하세요. valid.txt 부분에서 validation 하고싶은 이미지 라는게 어떤 뜻인가요?
    어떤 이미지를 넣어 주어야 할지를 잘 모르겠습니다.
    그리고 valid.txt 의 이미지도 라벨링을 해 주어야 하나요

  • 만두 2020.06.17 01:45

    정말 갓벽한 글입니다 욜로를 사용했지만 이해가 안가는 부분도 있었는데 글을 읽으며 이해가 정말 잘 되었어요 !!!!!!!!!!! 좋은글 감사합니다

  • 딸기 2020.06.18 01:14

    기존에 있는 coco데이터에서 사람과 차만 인식하게 할 수는 없을까요? 그냥 custom으로 만들어야 될까요?

  • Raccoon_ 2020.07.26 23:03 신고

    안녕하세요 제가 yolov3으로 클래스 하나짜리 학습 하는데
    -----------------------------------------------------------------------------
    [yolo] params: iou loss: mse (2), iou_norm: 0.75, cls_norm: 1.00, scale_x_y: 1.00
    Total BFLOPS 140.022
    avg_outputs = 1111765
    Loading weights from data/yolov3.weights...
    seen 64, trained: 32013 K-images (500 Kilo-batches_64)
    Done! Loaded 107 layers from weights-file
    Learning Rate: 0.001, Momentum: 0.9, Decay: 0.0005
    Detection layer: 82 - type = 27
    Detection layer: 94 - type = 27
    Detection layer: 106 - type = 27
    Resizing, random_coef = 1.40
    Create
    64 896 x 896
    permanent cpu-threads
    Loaded: 0.000260 seconds
    v3 (mse loss, Normalizer: (iou: 0.75, cls: 1.00) Region 82 Avg (IOU: 0.000000, GIOU: 0.000000), Class: 0.000000, Obj: 0.000000, No Obj: 0.000563, .5R: 0.000000, .75R: 0.000000, count: 1, class_loss = 0.063131, iou_loss = 0.000000, total_loss = 0.063131
    v3 (mse loss, Normalizer: (iou: 0.75, cls: 1.00) Region 94 Avg (IOU: 0.461262, GIOU: 0.461262), Class: 0.248555, Obj: 0.000084, No Obj: 0.000085, .5R: 0.000000, .75R: 0.000000, count: 4, class_loss = 1.616351, iou_loss = 0.889148, total_loss = 2.505498
    v3 (mse loss, Normalizer: (iou: 0.75, cls: 1.00) Region 106 Avg (IOU: 0.000000, GIOU: 0.000000), Class: 0.000000, Obj: 0.000000, No Obj: 0.012290, .5R: 0.000000, .75R: 0.000000, count: 1, class_loss = 18.615206, iou_loss = 0.000000, total_loss = 18.615206
    total_bbox = 4, rewritten_bbox = 0.000000 %
    -------------------------------------------------------------------------
    이렇게 나오고있으면 잘되고있는건가요 아니면 잘 안나오고있는건가요??

    • 꾸준희 2020.07.27 16:36 신고

      좀 더 지켜봐야 알겠지만... 위 로그를 봐서는 잘되고 있는 듯 싶습니다 ^^
      지금은 어떻게 되셨나요?

    • Raccoon_ 2020.07.27 17:26 신고

      중간에 컴퓨터가 꺼져서 좀전에 다시 학습 시작하고있습니다 ㅠㅠ
      아 그리고 혹시 제가 지금 GTX760 2G 사용중인데
      GPU로 학습을 시작하면 바로 아웃오브 메모리 뜨는데 어떤식으로 cfg값을 조절해야지 학습을 시킬수있을까요??

    • 꾸준희 2020.07.27 17:26 신고

      cfg 파일에서
      batch 랑 subdivisions 사이즈 줄여보세요 !

    • Raccoon_ 2020.07.28 10:05 신고

      감사합니다~ 해결했습니다 ㅎㅎ
      아 그리고 혹시 이거 제가 학습 시킨거 차트인데 원래 이렇게나오나요??
      https://imgur.com/wy1ehV8

    • 꾸준희 2020.07.28 10:07 신고

      iteration num 1200 이전 수치가 아마 0.0x 보다 높았겠죠? 맞는 듯 싶습니다 ㅎㅎ

  • 박종문 2020.07.29 16:50

    안녕하세요 다크넷 프레임워크에서 yolo_mark이용해서 가중치 학습시키는 연습하는 학생입니다. 글을 보다가 "filters : (4 + 1 + class 수) * 3 설정"이나 "보통 class 수 * 2000 으로 설정"같은 공식을 보았는데 이런 내용은 어느 원문에서 나온 내용인가요?

    • 꾸준희 2020.07.29 17:09 신고

      클래스 설정 관련 해서는 아래 글을 참고 하였구요

      https://gitee.com/small_zhao_single_assists/darknet

      사견이지만, 클래스 수 * 2000은 권장이고, 학습 결과를 보면서 조절하는 것을 추천 드립니다, 감이 안오시는 분들을 위해 대략적인 수치를 알려주는 듯 하는 것 같네요!

      그리고 필터 수 설정 관련해서는 원래는 아래 내용인데,
      (classes+1+coords)*mask
      논문 내용도 그렇고, 다크넷 욜로 구현부 보시면 될 듯 합니다.

    • 박종문 2020.07.30 07:33

      답변 고맙습니다.제가 올려주신 링크말고도 다른 게시글에서도 살펴보았는데 공식을 설정해라 정도만 나오고 왜 그런 설정을 권장하는지에 대한 설명은 안나와있는데 혹시 그런 설명이 나와있는 참고 문헌이 있으신가요? 그리고 언급하신 논문 게재명을 알 수 있을까요?

    • 꾸준희 2020.07.30 10:08 신고

      혹시 yolo v3 논문은 읽어보셨는지요?

      darknet repo 중에서 AlexeyAB 의 깃허브 보시면
      https://github.com/AlexeyAB/darknet

      iteration 설정을 (class num * 2000) 이상 설정해주어야 한다는 것과 관련된 글은 아래와 같이 나와있고요, (학습 시켰던 경험에 의한 것 같은데) class num * 2000 정도 주어야 충분하다는 내용이 있습니다.

      So desirable that your training dataset include images with objects at diffrent: scales, rotations, lightings, from different sides, on different backgrounds - you should preferably have 2000 different images for each class or more, and you should train 2000*classes iterations or more


      필터 수 설정 관련해서는 Yolo v3 논문 보시면 됩니다.

      YOLOv3: An Incremental Improvement

      다크넷 yolo 를 이용하여 학습하시려면 당연히 읽어보셨을수도 있겠지만

      yolo v3 와 같은 경우 FPN 스타일의 네트워크를 이용하여 3개의 다른 scale 에서 bounding box를 예측하기 때문에,

      feature extractor 과정에서 몇개의 conv layer 가 추가 되는데, 마지막 레이어에서는 bounding box, objectness, class prediction 이 3d tensor encoding 을 예측하게 되기 때문에

      (4 + 1 + class num) * 3
      위 식에서
      4는 bounding box 의 offset 이며
      1은 objectness prediction 이며
      3은 3 differenct scale의 mask가 적용된 설정입니다.

      참고로 yolo v2 에서는 *3 이 없는걸로 알고있습니다.

    • 박종문 2020.08.01 18:39

      친절한 답변 감사해요. 아직 1학년인지라 테크 리포트는 한번 읽어서는 이해가 안가더군요. 좋은 글하고 답변 다시한번 감사드려요

  • 풍월량 2020.08.11 13:40 신고

    정말 많은 도움이 되었습니다. 감사합니다!

  • 상민 2020.08.11 14:08

    글 잘 읽었습니다.
    Object Detection쪽 공부하고 있는 학생입니다.
    YOLO로 클래스 2개짜리를 하는건 효율이 좋지 않다고 생각하는데 그거에 대한 생각이 어떠신지 궁금합니다.