데이터도 준비 됐으니! 지금부터 본격적으로 학습을 시켜보자.
누구나 할 수 있다!
1. Darknet Clone하기
욜로 학습하자 했잖아!
욜로 학습하자 했잖아!
욜로 학습하자 했잖아!
근데 웬 Darknet????
이라고 물으실 수도 있겠다!
Darknet은 YOLO학습을 진행하기 위해 YOLO의 원작자 조셉이 개발한 프레임워크다!
요새는 Alexey가 개발한 YOLOv4버전의 다크넷을 많이 사용하긴 하지만...
그래서 우리도 Alexey가 개발한 다크넷을 다운받을 것이다.
https://github.com/AlexeyAB/darknet
터미널을 사용하여 본인이 개발할 폴더에 들어가서... 다음과 같이 Clone해주면 된다.
가. 개발할 폴더는 어떻게 들어가요?
살짝 당황스럽지만...
저는 이 글 작성을 위해 C:\Users\jjh63\Desktop\학교생활\3학년_2학기\산학프로젝트2\Blog
경로에 Darknet을 다운받을건데요, cmd 프롬프트에 다음과 같이 작성해주시면 해당 경로로 들어가게 됩니다.
cd C:\Users\jjh63\Desktop\학교생활\3학년_2학기\산학프로젝트2\Blog
나. Clone은 어떻게 하나요?
그냥 이렇게 써주시면 된다!
git clone https://github.com/AlexeyAB/darknet.git
혹은 CLI환경이 공포스러우신 분들은 ZIP파일로 다운받아서 압축을 풀어주셔도 되겠다.
2. Darknet폴더 살펴보기
우리가 이 폴더에서 만질 것은,
Data폴더와 cfg폴더 뿐이다.
우선, Data폴더에 들어가자.
2-1 Data 폴더에 들어가기
이 폴더에 들어가면 다음과 같이 휑~~하다.
나도 처음에 엥??? data폴더면 모름지기 image데이터 넣을 폴더는 있어야 하는거 아녀?? 싶었다.
그래서! images폴더를 만들어주자.
data/images폴더 만들기.
별거 없다! 그냥 폴더 하나를 만들어주면 된다.
이제 우리의 이미지 데이터와, anotation파일을 넣어주면 된다.
anotation파일은, 저번 포스팅에서 우리가 라벨링 붙였던 txt파일이다!
여기서 주의해야할 점은, 이미지 데이터와 anotation파일이 images폴더 안에 같이 있어야 한다는 것이다.
내 폴더를 예로 들면,
이런 식이다!
이미지 데이터와 labeling한 anotation파일이 data/images안에 같이 있어야 한다!
나의 경우에는 roboflow에서 augmentation하고 나오니 파일 명이 지저분해졌다....
이제 다시, data폴더로 나오자.
2-2. data폴더 내부에 list폴더를 만들기
여러분의 현재 폴더 상태는 이와 같아야 한다.
이제 list폴더 하나를 만들어주자.
list폴더에 들어가서, 세가지 파일을 만들어준다.
test.txt
train.txt
valid.txt
이와 같은 모습이다.
이걸 왜 만들어줬느냐!!
여기서 우리는 각각의 test에 쓸 데이터 경로, train에 쓸 데이터 경로, valid에 쓸 데이터 경로를 지정할 것이다(이거 세개 쓰는데 복붙안하고 정성스럽게 썼음).
어떤 식이냐면... 이렇게!
test.txt의 내용은 다음과 같다.
아놔.... 이걸 언제 다 지정하고 앉았지??
심지어 모두 다 jpg인것도 아니고 png jpeg등등 섞여있는데???
걱정 마시라! 그래서 사용자가 지정한 비율대로 파일을 print해주는 파이썬 코드를 작성했다!
list폴더를 빠져나와,
반드시 data폴더에 들어가신 후(왜냐면 상대경로로 데이터 셋을 뽑기 때문에 data폴더 아래에서 실행해주셔야 함),
파이썬 파일을 하나 만들어 다음 코드를 복붙해주시면 된다.
import os
import math
###########################################################################
# 당신의 데이터 셋 비율을 조정합니다.
# 세 변수의 합이 100이 되도록 해주세요.
train_set_ratio = 70
validation_set_ratio = 10
test_set_ratio = 20
############################################################################
# file_path는 조정해주세요. 현 상태는 data/SplitDatAsTXT.py가 있고, data/images 안에 이미지들이 있습니다.
file_path = 'images\\'
# 역슬래쉬가 아닌 /로 구분하기 위해 변경해줍니다.
file_path_as_originSlash = file_path[:-1] + "/"
file_names = os.listdir(file_path)
file_len = len(file_names)
i=0
while i<file_len:
temp_fileName = file_names[i]
if temp_fileName[-4:] == ".txt":
file_names.pop(i)
file_len = len(file_names)
#print(str(i) + " " + str(file_len) + " " + temp_fileName)
else: i += 1
# 1. Test Set 목록
print("****************** 1. Train Set 목록(비율: " + str(train_set_ratio) + "%) ******************")
for i in range(0, math.ceil(file_len * (train_set_ratio / 100))):
print('data/' + file_path_as_originSlash + file_names[i])
final_index = math.ceil(file_len * (train_set_ratio / 100))
# 2. Validation Set 목록
print("****************** 2. Validation Set 목록(비율: " + str(validation_set_ratio) + "%) ******************")
for i in range(final_index, final_index+ math.ceil(file_len * (validation_set_ratio / 100))):
print('data/' + file_path_as_originSlash + file_names[i])
final_index = final_index + math.ceil(file_len * (validation_set_ratio / 100))
# 3. Test Set 목록
print("****************** 3. Test Set 목록(비율: " + str(test_set_ratio) + "%) ******************")
for i in range(final_index, file_len):
print('data/' + file_path_as_originSlash + file_names[i])
이 블로그대로 폴더 생성을 하셨으면, 수정하실 부분은 데이터 셋 부분밖에 없다.
나는 Train 셋은 70%, Validation 셋은 10%, Test 셋은 20%로 설정했다.
실행을 해주시면,
이런 식으로 print되는데,
아까 만들었던 list/test.txt와 list/train.txt와 list/valid.txt에 각각 넣어주시면 된다!
이제 다시, data 폴더로 빠져나오자.
2-3. .data파일과 .names파일 만들기
다시 data폴더로 나왔으면, 다음과 같은 모습이어야 한다.
우리는 이제 .data파일과 .name파일을 만들어줘야 한다.
가) .data파일 만들기
이 파일의 내용에는 모델에 쓰일 모든 자료의 위치가 들어있어야한다.
아무이름이나 지정하고, 확장자를 .data로 해준다.
나같은 경우에는 킥보드 데이터라는 의미로
kbDatas.data
를 생성해주었다.
이 파일을 만들어주시고, 열어주면 다음과 같은 정보를 입력해주시면 된다.
만약 어떤 프로그램으로 열지 안물어보고 바로 메모장으로 연다면, txt파일 형식이 뒤에 숨어있는 것이니, 제대로 .data형식을 가진 파일을 만들어주세요.
우리는 두개의 객체를 구분할 것이기 때문에 classes = 2로 설정해주었다.
나머지는 그대로 입력해주면 된다.
경로에 없는 파일들도 나중에 설정해줄 것이다.
나) .names파일 만들기
역시 data폴더 내부에 아무이름이나 지정해주고, 확장자를 .names으로 해준다.
나같은 경우에는,
ClassNames.names
로 생성하였다.
이 파일에는 클래스 명이 들어가야 한다.
라벨링을 할 때, 0, 1로 클래스를 구분하였지 않은가?
이 파일에 들어가는 내용이 클래스 명을 결정한다.
주의해야 할 점:
각 행이 Class 명으로 인식되니, 추가 여백이 있으면 안됨.
...
하이고, 설정할 것들이 참 많다.
그럼 이제 다음 포스팅으로 고고~~
'머신러닝 > JetsonNANO와 YOLO!' 카테고리의 다른 글
(하) Colab과 Darknet으로 YOLO를 학습시켜보자! (28) | 2021.11.17 |
---|---|
(중) Colab과 Darknet으로 YOLO를 학습시켜보자! (1) | 2021.11.17 |
YOLO Darknet을 학습해야 하는데 XML이나 Json으로 라벨을 붙인 나를 위한 Roboflow! (9) | 2021.10.04 |
이미지 라벨링 쉽게하기! Labelme (0) | 2021.10.03 |
[YOLO 논문 리뷰] 그래서 YOLO가 뭔데??? (0) | 2021.10.03 |