카테고리 없음

[DeepLearning] Google Colab에서 YOLO v4 커스텀 학습 해보기(+ darknet, yolo mark 사용)

코딩콩 2021. 7. 31. 23:51

이번 여름방학때 현장실습 간 곳은 영상 분석 프로젝트를 진행 중이었고 저의 주업무는 인공지능 학습을 위한 데이터 라벨링이었습니다.

차장님께서 너무 배워가는 게 없는 것 같다고 지금 라벨링 하고 있는 이미지를 활용해서 간단하게 번호판에 번호 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이상인 것만 표시되도록 하는 설정입니다.

 

[결과]

뿌듯.....ㅎ