-
colab에서 custom data로 YOLO v3 train 하기( 주의점 및 학습 )졸업프로젝트(YOLOv3,Openpose) 2021. 5. 5. 16:18
이번 포스팅에서는 YOLO v3을 colab 환경에서
custom data로 학습하는 방법에 대해서 다뤄보도록 하겠다!
크게 총 6가지 단계이다!
0. darknet 파일 다운로드1. 바꾸어야 할 파일 목록
2. 데이터 셋 준비하기
----아래부터는 colab 환경에서 실행하는 단계-----
3. CUDA 버전 확인하기 및 upgrade or downgrade 하기 (*cuda세팅 시 주의사항)
4. darknet 압축 해제 및 train 을 준비하기위한 코드
5. 학습시키기
pjreddie/darknet
Convolutional Neural Networks. Contribute to pjreddie/darknet development by creating an account on GitHub.
github.com
0. darknet 파일 다운로드https://github.com/pjreddie/darknet
pjreddie/darknet
Convolutional Neural Networks. Contribute to pjreddie/darknet development by creating an account on GitHub.
github.com
위의 링크로 들어가서. 다크랩 파일을 노트북에 다운 받는다.
그리고 아래의 파일 커스텀 순서대로 다크넷 폴더에 위치한 파일들을 빠짐없이 변경해준 다음, 압축한다.
그리고 압축된 파일을 구글 드라이브에 업로드 하여 코랩에서 학습을 실행하는 방식을 사용하였다.
1. 바꾸어야 할 파일 목록
아래에서 보이는 것 처럼 1) yolov3_custom_train.cfg 2) yolo.data 3) yolo.names 4) train.txt 5) val.txt
총 다섯가지의 파일 항목들을 변경해주면 된다. (지금 보니, 1)에서 yolov3.cfg 파일을 custom 해주어도 될 것 같다!)
[Object Detection] darknet custom 학습하기
darknet 학습을 위해 이전에 처리해야할 과정들은 다음 포스팅을 참고 [Object Detection] darknet custom 학습 준비하기 https://eehoeskrap.tistory.com/367 [Object Detection] Darknet 학습 준비하기 환경 Ubu..
eehoeskrap.tistory.com
위의 링크를 참고하여 바꾸어야 할 것들을 바꾸어 주었다.
추가적으로, darknet 내부에 위치한 detector.h 파일을 사용하여 가중치(학습 시 저장되는 값)를 100단위로 다 저장하도록 변경해주었다.
코랩 자체가 런타임이 금방 끊기기 때문에, 중간중간 끊겼을때 끊긴부분부터 다시 학습을 이어나가기 위해서 가중치 저장 범위를 좁혔다 . 이 부분 관련 코랩 코드는 같은 포스트 5번에서 확인 할 수 있다.
(나름의 꿀팁입니다! 가중치 초기 부분들은 어차피 나중에 학습에 사용하지 않을 것이기 때문에 일정부분은 지워나가면서 학습해도 괜찮음)
또한, detection 정확도를 높이기 위해 yolov3_custom_train.cfg에서의 weight height를 각각 608로 키워주었다.
(아래의 사진들처럼 일단 이 다섯개는 필수로 변경해주어야한다!)
+ train.txt val.txt. 변경하기
나는 이 외에도 새로 custom 한 dataset 에 맞게 이용하여 train.txt와 val.txt.의 경로를 바꿔주기 위한 아래의 파이썬 파일 두 개를 사용하였다. (파일1.파일2)
경로만 본인의 이미지 데이터와 train.txt가 위치한 곳으로 바꾸어주면 된다.
또한 나는 train.txt에 모든 이미지 파일을들 다 적고, 8:2의 비율로 valid.txt에다가 train.txt에 있는 일부 경로를 직접 옮겨주었다. 이렇게 분할하는 코드도 많긴하지만, 나는 그냥 직접 복붙하였다.
파일1. data img들의 경로를 복사해서 txt 파일에 붇여주는 코드
#data img들의 경로를 복사해서 txt 파일에 붇여주는 코드
import os, glob
import os.path
filelist=[]
targerdir = r"C:/Users/Downloads/dataset/img"
f = open('C:/testsql/train2.txt', mode='wt', encoding='utf-8')
files = os.listdir(targerdir)
for i in files :
f.write(i)
f.write('\n')
f.close()파일2. colab에서 돌리기 위해 colab 의 경로로 train.txt 를 바꾸어주는 코드
#colab에서 돌리기 위해 train.txt 를 바꾸어주는 코드
import os
txt = open('C:/testyolo/train2.txt','r')
f = open('C:/testyolo/train.txt','w')
while True :
line = txt.readline()
fname= os.path.basename(line)
if not line:
break
f.write('/content/darknet/data/custom/images/'+fname)
txt.close()
f.close()2. 데이터 셋 준비하기
본인은 직접 데이터 라벨링을 통해 (YOLO_mark를 사용하였는데, 해당 방법은 다음 글에서 다루도록 하겠다. ) 데이터 셋을 준비하였지만, 생각보다 그 길은 고난의 길이니 (한 클래스마다 최소 15000장 이상 혼자 라벨링하기...) 최대한 COCO dataset이나 Kaggle을 활용하기를 바란다.
데이터 커스텀과, 변경하였던 파일들로 이루어진 다크넷 파일 압축이 다 되었다면,
지금부터는 colab 환경에서 진행할 것이다!drive.mount('/content/drive')
우선, 코랩을 사용하기에 가장 기본 단계인 마운트를 한다. (드라이브 접근 목적)
3. CUDA 버전 확인하기 및 upgrade or downgrade 하기 (cuda세팅 시 주의사항)
2021 5월 기준 현재, colab에서 지원하는 CUDA version은 YOLO v3을 학습하는데 지원가능하지 않다.(11.x였던 듯) 아마 컴파일 시 오류가 발생할 것이다.(내가 그랬음) 따라서 열심히 방법을 모색하던 중,
colab의 CUDA version을 10.0 으로 downgrade 하는 코드를 사용하면 된다.
(1)첫번째 항목은 기존의 CUDA를 삭제하는 것이고,
(2)두번째는 version 10.0을 downgrade 하는 코드이다.
(3) 마지막은 잘 설치가 되었나 버전을 확인해주는 코드이다. (10.0이라고 나와야한다.)
(1)
!apt-get --purge remove cuda nvidia* libnvidia-*
!dpkg -l | grep cuda- | awk '{print $2}' | xargs -n1 dpkg --purge
!apt-get remove cuda-*
!apt autoremove
!apt-get update
이런 창이 뜬다면....잘 진행되고 있는 것이다! (2)
#실행 시, 버전 관련 선택사항이 실행창에 뜰것이다 Y 를 쳐주어야 한다!! 꼭!!
#Download CUDA 10.0
!wget --no-clobber https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
#install CUDA kit dpkg
!dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
!sudo apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
#!apt-get update
!apt-get install cuda-10-0
이 부분에 꼭! Y 입력하자 (3)
!nvcc --version
4. darknet 압축 해제 및 train 을 준비하기위한 코드
#압축해제
!unzip "/content/drive/MyDrive/Colab Notebooks/yolo/darknet.zip"
#다크넷 컴파일 코드
%cd /content/darknet
!make
!chmod +x ./darknet
#가중치를 드라이브에 저장하기위한 코드
!rm /content/darknet/backup -r
!ln -s /content/drive/MyDrive/YOLOv3_weight/backup /content/darknet
!sudo apt install dos2unix
!dos2unix /content/darknet/data/train.txt
!dos2unix /content/darknet/data/val.txt
!dos2unix /content/darknet/data/yolo.data
!dos2unix /content/darknet/data/yolo.names
!dos2unix /content/darknet/cfg/yolov3_custom_train.cfg
5. 학습시키기
드디어! 학습을 시작하면 된다!
%cd /content/darknet
!./darknet detector train /content/darknet/data/yolo.data /content/darknet/cfg/yolov3_custom_train.cfg
위의 코드로 드디어 학습을 시작하면 된다!
.
중간에 런타임이 끊어진 경우,(분명 끊어질 것이다...코랩이니까...)
당황하지말고 가중치가 저장된 폴더에 가서 가장 마지막 가중치부터 다시 학습을 시켜주면 된다!
아래의 코드를 이용하면 된다.
#기존에 끊긴 연결 다시하기
!./darknet detector train data/yolo.data cfg/yolov3_custom_train.cfg /content/drive/MyDrive/YOLOv3_weight/backup/yolov3_custom_train_2400.weights -dont_show -map
학습이 끝나면, 아래와 같이 마지막 final 가중치가 저장된다! 6. 마무리.
다음 포스팅에는 train 이후, 저장된 가중치모델을 활용하는 포스팅을 올릴 계획이다.
이 yolo v3 학습 관련 포스트를 쓰는 데에도 참 많은 에러들과 궁금증을 지나왔다는 생각이 든다.
아무쪼록 나와 비슷한 고민을 하는 사람들에게 이 글이 도움이 되었기를!
'졸업프로젝트(YOLOv3,Openpose)' 카테고리의 다른 글
딥러닝 학습 시 batch size,mini-batch,epoch,iteration,batch 용어 정리 (0) 2021.07.19 #1 프로젝트에서 사용할 기술들과 웹캠과 Opencv 연결 in colab! (0) 2021.02.06