티스토리 뷰

1. 초기 세팅

내 드라이브에 'yolov3' 폴더 생성

라벨링한 images.zip 을 yolov3폴더에 넣는다.

내 드라이브에 data 폴더를 넣어놓는다. (data 폴더는 아래 유튜브 링크에서 다운로드)

새로만들기>Google Colaboratory 생성

 

2. Colab GPU 세팅 바꾸기

런타임 > 런타임 유형 변경 > GPU

 

3. drive connect 

# Check if NVIDIA GPU is enabled
!nvidia-smi

from google.colab import drive
drive.mount('/content/drive')

from google.colab import drive
drive.mount('/content/gdrive')
!ln -s /content/gdrive/My\ Drive/ /mydrive
!ls /mydrive

 

4. Clone the Darknet

!git clone https://github.com/AlexeyAB/darknet

Darknet 프레임워크에는 yolov5까지 돌릴 수 있는 파일들이 있다.

여기서 우리가 이용할 건 yolov3

 

5. Compile Darknet using Nvidia GPU

# change makefile to have GPU and OPENCV enabled
%cd darknet
!sed -i 's/OPENCV=0/OPENCV=1/' Makefile
!sed -i 's/GPU=0/GPU=1/' Makefile
!sed -i 's/CUDNN=0/CUDNN=1/' Makefile
!make

 

6. Configure Darknet network for training YOLO V3

#!cp cfg/yolov3.cfg cfg/yolov3_training.cfg
!cp /mydrive/yolov3/data/yolov3_testing.cfg cfg/yolov3_training.cfg

내 드라이브의 data폴더 안의 yolov3_testing.cfg 파일을 다크넷 폴더 안으로 복사해온다.

사실 다크넷의 yolov3.cfg 파일을 우리가 훈련시킬 이미지에 맞게 변형 시키는 건데 내가 참고한 유튜브에서 감사하게도 cfg 파일을 올려주었다. 마침 내가 검출할 클래스도 2개여서 딱 맞았다.

 

** cfg 파일에서 변경해주어야 하는 사항 **

max_batches : ( class * 2000 ) + 200
한 클래스당 최대 2000 장으로 설정

-> 클래스 2개면 4200
steps : max_batches의 20%, 10%만큼 뺀 것 

쭉 내려가서 [yolo] 3군데 모두 고쳐주기
filters = (classes + 5) *3 
classes = 클래스 개수


obj.names는 클래스명들을 나열한 파일, obj.data는 클래스의 개수

!echo -e '' > data/obj.names
!echo -e '' > data/obj.data
!cp /mydrive/yolov3/data/obj.names data/obj.names
!cp /mydrive/yolov3/data/obj.data data/obj.data
!mkdir data/obj

다크넷 폴더 안의 obj.names와 obj.data를 내 드라이브에 있던 파일을 복사해서 대체해준다. (드라이브에 넣어놨던 data 파일이 있을 경우)

 

또는 obj.names에는 본인이 검출할 클래스명들을 엔터로 구분해주면서 나열하여 쓰고, obj.data에는 클래스 개수를 써준다. 

ex. obj.names 

apple

orange

banana

ex. obj.data

3

# Download weights darknet model 53
!wget https://pjreddie.com/media/files/darknet53.conv.74

그리고 나서 darknet model 53의 weights 파일을 다운로드해준다.

 

 

7. Extract Images

!unzip /mydrive/yolov3/images.zip -d data/obj

처음에 넣어놨던 images.zip파일을 colab에서 압축해제한다.

그러면 압축이 풀리면서 colab안에 폴더가 생성된다.

 

import glob
images_list = glob.glob("data/obj/*.jpg")
print(images_list)

이미지들을 image_list에 담아준다.

이때 image들은 모두 .jpg 로 동일해야 한다.

 

#Create training.txt file
file = open("data/train.txt", "w") 
file.write("\n".join(images_list)) 
file.close()

 

8. Start the training

!./darknet detector train data/obj.data cfg/yolov3_training.cfg darknet53.conv.74 -dont_show

이제 훈련만 시켜주면 끝이다! 

난 이미지를 50장 정도로 굉장히 적게 넣어주었기 때문에 15~20분 정도 걸렸다. 

제대로 훈련이 되려면 최소 300장은 넣어주어야 하고, 그러면 3~8시간 정도 걸린다.

 

훈련이 다 되면 weights 파일이 생성되어 내 드라이브의 yolov3 폴더 안에 위치한다.

 

9. Test the image

!./darknet detect cfg/yolov3_training.cfg yolov3_training_last.weights data/obj/12.jpg -dont_show

 

테스트를 해보면 아래와 같이 결과가 나오는 것을 확인할 수 있었다.

그런데 이미지 몇개는 결과가 나오지 않는 것으로 모아 모델 성능이 떨어지는 것을 짐작할 수 있었다.

 

하긴 훈련 이미지가 50장도 안되니 당연히 정확도나 성능이 떨어지지만..

일단 돌아가는 것을 확인했으니 앞으로 최소 500장 라벨링 해서 훈련을 시켜야지!

yolov3 외에 어떤 것이 성능이 좋은지도 확인해봐야겠다. 

 

 

 

나의 colab 주소 : https://colab.research.google.com/drive/1WTlNf3BfdvU31Af4WNRAwTvyWJEBRK_e?hl=ko#scrollTo=46Q6CJh8szhi 

 

Train_YoloV3 .ipynb

Colaboratory notebook

colab.research.google.com

 

 

 

 

참고 영상 :

https://www.youtube.com/watch?v=_FNfRtXEbr4&feature=youtu.be 

https://www.youtube.com/watch?v=51fZ2FTau7E <- data 파일 여기서 다운받을 수 있다. 클래스가 2개이신 분은 다운받으면 편할 것이다.

https://www.youtube.com/watch?v=zJDUhGL26iU  <- cfg 파일 손보는 건 이 분이 잘 가르쳐주신다. (6분~11분)

 

'프로그래밍' 카테고리의 다른 글

[JS] Object에 객체 추가 - Object Assign, ES6 spread  (0) 2022.08.16