Darknet은 Joseph Redmon이 독자적으로 개발한 신경망 프레임워크로서 DNN을 학습시키고 실행시킬 수 있다. 그리고 yolo는 학습된 신경망모델 중 하나이다.
Darknet을 이용하면 yolo 뿐만 아니라 AlexNet, VGG-16, Resnet, Densenet 등 기존의 DNN모델들도 돌려 볼 수 있다.
darknet에서 yolo 모델을 학습하기 위해서는 6개의 파일이 더 필요하다
1 ~ 4번 파일까지는 파이썬 스크립트로 생성이 가능하다.
#PYTHON
import os
current_path = os.path.abspath(os.curdir)
COLAB_DARKNET_ESCAPE_PATH = '/content/drive/My\ Drive/darknet'
COLAB_DARKNET_PATH = '/content/drive/My Drive/darknet'
YOLO_IMAGE_PATH = current_path + '/custom'
YOLO_FORMAT_PATH = current_path + '/custom'
class_count = 0
test_percentage = 0.2
paths = []
with open(YOLO_FORMAT_PATH + '/' + 'classes.names', 'w') as names, \
open(YOLO_FORMAT_PATH + '/' + 'classes.txt', 'r') as txt:
for line in txt:
names.write(line)
class_count += 1
print ("[classes.names] is created")
with open(YOLO_FORMAT_PATH + '/' + 'custom_data.data', 'w') as data:
data.write('classes = ' + str(class_count) + '\n')
data.write('train = ' + COLAB_DARKNET_ESCAPE_PATH + '/custom/' + 'train.txt' + '\n')
data.write('valid = ' + COLAB_DARKNET_ESCAPE_PATH + '/custom/' + 'test.txt' + '\n')
data.write('names = ' + COLAB_DARKNET_ESCAPE_PATH + '/custom/' + 'classes.names' + '\n')
data.write('backup = backup')
print ("[custom_data.data] is created")
os.chdir(YOLO_IMAGE_PATH)
for current_dir, dirs, files in os.walk('.'):
for f in files:
if f.endswith('.jpg'):
image_path = COLAB_DARKNET_PATH + '/custom/' + f
paths.append(image_path + '\n')
paths_test = paths[:int(len(paths) * test_percentage)]
paths = paths[int(len(paths) * test_percentage):]
with open(YOLO_FORMAT_PATH + '/' + 'train.txt', 'w') as train_txt:
for path in paths:
train_txt.write(path)
print ("[train.txt] is created")
with open(YOLO_FORMAT_PATH + '/' + 'test.txt', 'w') as test_txt:
for path in paths_test:
test_txt.write(path)
#### print ("[test.txt] is created")
추후에 구글 colab에서 darknet환경을 구축하고 yolo학습을 진행 할 것이다.
그렇기 때문에 이 스크립트의 모든 path들은 colab환경을 기준으로 설정해주었다.
파이썬 스크립트가 실행되는 워킹디텍토리를 기준으로 라벨링한 모든 데이터셋들은 custom이라는 하위디렉터리를 생성해서 그곳으로 옮겨주었다.
위 파이썬 스크립트를 실행시키면
그전 포스팅의 labelImg에서 생성했던 classes.txt 파일을 이용해서 1. classes.names파일을 생성한다.
그리고 [custom_data].data라는 파일에 COLAB_DARKNET_ESCAPE_PATH에 설정해둔 path를 기준으로 custom이라는 하위디렉터리로 train, valid, test 데이터들의 path를 저장하는데 .data파일의 이름은 아무거나 지정해도 상관없다.
나는 test말고 valid에 text.txt를 설정하였다.
classes는 익은 딸기, 덜익은 딸기 2가지 클래스 밖에 없고 그다음
train, valid 경로를 설정한 뒤 classes파일로 먼저 생성한 classes.names의 경로, 그리고 마지막으로 학습이 진행되면서 중간에 1000epoches 마다 학습된 모델을 저장할 backup 경로까지 설정해주는
2. custum_data.data파일을 생성한다.
그 다음은 알아서 처음에 설정해둔 test_percentage 라는 변수에 저장해 둔 값에 맞게 랜덤으로 비율을 나눠서 데이터 셋을 분할하여
3. train.txt, 4. test.txt파일을 생성한다.
이렇게 1. ~ 4. 까지의 파일은 생성을 완료하였다.
5. yolo.cfg, 6. yolo.weights파일은 Darknet 홈페이지에서 다운받을 수 있다.
여기서 나는 라즈베리파이에서 모델을 실행할 것이기 때문에, YOLO의 경량화 모델인 YOLOv3-tiny의 Cfg파일과 Weights파일을 다운받았다.
적절하게 학습을 하기 위해서는 본인이 원하는 클래스의 수에 맞게 Cfg파일을 수정해줘야 한다.
이 과정이 끝난다면 1번부터 6번파일 까지 yolo모델을 학습시키기 위한 데이터셋 준비가 모두 끝났다.