[DeepLearning] Google Colab에서 YOLO v4 커스텀 학습 해보기(+ darknet, yolo mark 사용)
이번 여름방학때 현장실습 간 곳은 영상 분석 프로젝트를 진행 중이었고 저의 주업무는 인공지능 학습을 위한 데이터 라벨링이었습니다.
차장님께서 너무 배워가는 게 없는 것 같다고 지금 라벨링 하고 있는 이미지를 활용해서 간단하게 번호판에 번호 object detection 구현해보라고 하셔서 해보았습니다.
yolo 키워드만 던져주셔서 너무 막막하고 다 생소했는데 역시 구글링하면 다~~~~알려줘서 배우고 구현하는 데 8시간정도 걸렸습니다!
사용하고 있는 컴퓨터에 GPU가 없어서 Colab을 이용했습니다. Colab에서는 GPU를 사용할 수 있는 가상머신를 제공해줍니다.
코드는 전적으로 아래 튜토리얼을 보고 따라했습니다..ㅎhttps://colab.research.google.com/drive/1_GdoqCJWXsChrOiY8sZMr_zbr_fH-0Fg?usp=sharing#scrollTo=O2w9w1Ye_nk1
YOLOv4_Training_Tutorial.ipynb
Colaboratory notebook
colab.research.google.com
제가 한 실습 노트
https://colab.research.google.com/drive/1hndI1txCFrISBhXB4LEI1PtgZtlTexaM?usp=sharing
yolo4.ipynb
Colaboratory notebook
colab.research.google.com
[세부사항 및 주의할 것]
- custom 라벨링은 yolo mark 사용
- 경로 설정 잘하기!!!!!
- 10개 학습시키는 데에 2시간정도
- Colab의 GPU는 할당량이 있으니 하루종일 학습시키는 건 불가능합니다.12시간에 한 번 준다고 하는데 정확히는 모르겠습니다. 어쨌든 할당량이 있다는 거!!!
[colab에서 작업환경 만들기]
- 우선 colab을 이용하려면 당연히 구글 로그인이 필요합니다.
- 새 노트
- 런타임 > 런타임 유형 변경 > GPU로 변경
[쭈욱 따라해주세요]
아래 과정은 그냥 복붙만 하시면 돼요! 경로설정 하실 것도 없고 그냥!
저는 튜토리얼에서 테스트 하는 것은 뺏습니다.
# clone darknet repo
# darknet : 오픈 소스 신경망 프레임워크
!git clone https://github.com/AlexeyAB/darknet
# 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
!sed -i 's/CUDNN_HALF=0/CUDNN_HALF=1/' Makefile
# verify CUDA
# CUDA : GPU에서 수행하는 병렬 처리 알고리즘을 C를 비롯한 산업 표준 언어를 사용하여 작성할 수 있도록하는 GPGPU 기술
!/usr/local/cuda/bin/nvcc --version
# make darknet (builds darknet so that you can then use the darknet executable file to run or train object detectors)
!make
# define helper functions
def imShow(path):
import cv2
import matplotlib.pyplot as plt
%matplotlib inline
image = cv2.imread(path)
height, width = image.shape[:2]
resized_image = cv2.resize(image,(3*width, 3*height), interpolation = cv2.INTER_CUBIC)
fig = plt.gcf()
fig.set_size_inches(18, 10)
plt.axis("off")
plt.imshow(cv2.cvtColor(resized_image, cv2.COLOR_BGR2RGB))
plt.show()
# use this to upload files
def upload():
from google.colab import files
uploaded = files.upload()
for name, data in uploaded.items():
with open(name, 'wb') as f:
f.write(data)
print ('saved file', name)
# use this to download a file
def download(path):
from google.colab import files
files.download(path)
[구글 드라이브 연결]
%cd ..
from google.colab import drive
drive.mount('/content/gdrive')
여기서 인증 코드 넣고 엔터 눌러주셔야 합니다. 이거 너무 당연한가요? 저는 인증코드 넣고 계속 로딩 중이라 좀 걸리네....ㅎ 하고 인증코드 두번 정도 다시 넣고 그러다가 엔터 눌러야 되나? 하고 눌렀어요...ㅎ
# this creates a symbolic link so that now the path /content/gdrive/My\ Drive/ is equal to /mydrive
!ln -s /content/gdrive/My\ Drive/ /mydrive
!ls /mydrive
자 저는 yolov4 폴더를 만들었고 저런 파일들을 넣어둔 거에요. 여러분도 만드셔야 하는데... 여기 좀 골치 아팠어요....
[yolov4 폴더에 넣을 것]
- backup : 학습된 weights 파일이 들어갈 폴더에요.
- generate_train.py, generate_test.py : 학습시킬 이미지와 테스트할 이미지의 파일 경로를 텍스트로 만들어주는 파이썬 파일(train.txt, test.txt) 파일을 만들어준답니다.
여기서 다운 다 받으셨죠???
- obj.data, obj.names : 이거는 튜토리얼 참조해서 만들어주세요.
- yolov4-obj.cfg : 이거는 아래 블로그를 참조해서 만들어주세요.
https://hanryang1125.tistory.com/16
Darknet으로 YOLO 커스텀 모델 학습시키기 (Windows)
본인은 로컬에서 학습시키다가 너무 오래 걸려서 colab으로 학습시켰지만 방법은 같음 classes: 학습시킬 클래스 갯수 train: 학습용 이미지들의 경로가 적혀있는 텍스트 파일 valid: 검증용 이미지들
hanryang1125.tistory.com
- obj.zip : 이미지와 라벨링 텍스트 파일이 들어있는 폴더 압축한 거!!
- test.zip : 테스트 할 이미지
[yolo mark로 라벨링 == obj.zip 파일 만들기]
자 이제 yolo mark로 요론 거 만드시는 거에요....
yolo mark 쓰는 건 아래 유튜브 참조해주세요(22:38부터 yolo mark 관련입니다.)
https://www.youtube.com/watch?v=5No1Ge8IAok
자 여기까지 하셨으면 yolov4 구성 파일은 다 준비 되신 거죠?????????
[진짜 마자막으로 학습 전!!]
다시 한 번 구성파일 잘 있는지 확인해주시구
!ls /mydrive/yolov4
!cp /mydrive/yolov4/obj.zip ../ !cp /mydrive/yolov4/test.zip ../
!unzip ../obj.zip -d data/ !unzip ../test.zip -d data/
# upload the custom .cfg back to cloud VM from Google Drive !cp /mydrive/yolov4/yolov4-obj.cfg cfg/
# upload the obj.names and obj.data files to cloud VM from Google Drive !cp /mydrive/yolov4/obj.names data !cp /mydrive/yolov4/obj.data data
# upload the generate_train.py and generate_test.py script to cloud VM from Google Drive !cp /mydrive/yolov4/generate_train.py ./ !cp /mydrive/yolov4/generate_test.py ./
!python generate_train.py !python generate_test.py
여기서 주의하실 점이 generate_train이 data/obj 폴더에 있는 이미지의 경로를 만들어주는 건데 PNG는 안 됩니다!!!! jpg 파일만 가능해요!!!! 저는 대충 구글에 치면 제일 위에 나오는 곳에서 변환했습니다.
https://png2jpg.com/ko/
PNG 파일을 JPG로
PNG 이미지를 JPG 포맷으로 온라인에서 올바른 압축기법을 사용하여 무료 전환 하세요
png2jpg.com
!ls data/
저런 파일들이 생겼나, 내용은 잘 써있나 봐주시면 됩니다.
!wget https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v3_optimal/yolov4.conv.137
[진짜 드디어 학습시키기!!!]
# train your custom detector! (uncomment %%capture below if you run into memory issues or your Colab is crashing) # %%capture !./darknet detector train /darknet/data/obj.data /darknet/cfg/yolov4-obj.cfg yolov4.conv.137 -dont_show -map
/darknet/data/obj.data와 /darknet/cfg/yolov4-obj.cfg는 저 파일의 경로를 쓰는 건데 저와 경로가 다를 수도 있으니 잘 맞춰서 해주세요~~!
전 10장 학습시키는 데에 2시간 걸렸습니다!
[학습된 weights 파일의 위치]
obj.data에 backup에 쓰신 경로로 저장됩니다!!! 저의 obj.data는 이렇게 되어있고
classes=11 train=data/train.txt test=data/test.txt names=data/obj.names backup=/mydrive/yolov4/backup
이렇게 두개의 파일이 생성됩니다.
[테스트 해보기]
# need to set our custom cfg to test mode %cd cfg !sed -i 's/batch=64/batch=1/' yolov4-obj.cfg !sed -i 's/subdivisions=16/subdivisions=1/' yolov4-obj.cfg %cd ..
# run your custom detector with this command (upload an image to your google drive to test, thresh flag sets accuracy that detection must be in order to show it) !./darknet detector test data/obj.data cfg/yolov4-obj.cfg /mydrive/yolov4/backup/yolov4-obj_last.weights data/test/test_plate2.jpg -thresh 0.7 imShow('predictions.jpg')
wieghts 파일 경로는 각자에 맞춰서!! data/test/test_plate2.jpg도 각자 테스트 이미지 경로에 맞춰서!!!
-thresh 0.7은 정확도가 0.7이상인 것만 표시되도록 하는 설정입니다.
[결과]
뿌듯.....ㅎ