Object Detection

Custom YOLO project - custom data 학습

jwjwvison 2021. 8. 21. 19:43

 이번 포스팅에서는 이전에 세팅했던 darknet 환경을 이용해서 나만의 데이터를 가지고 yolo를 통해 object detection을 수행해 보겠다.

 

먼저 다시 쿠다를 설치해주고(초기화 되었으므로)

# install cuda
!tar -xzvf drive/My\ Drive/darknet/cuDNN/cudnn-11.0-linux-x64-v8.0.4.30.solitairetheme8 -C /usr/local/

쿠다를 사용할 수 있게 권한을 추가 해준다.

!chmod a+r /usr/local/cuda/include/cudnn.h

!chmod

 

 이제 DarkNet을 불러오자.

import os
if not os.path.exists('darknet'):
  os.makedirs('darknet')
%cd darknet # /content/darknet 으로 작업 위치 이동

 

 darknet 폴더에 있던(구글 드라이브) darknet을 현재 작업 위치에 불러오고 권한을 변경해준다.

!cp /content/drive/MyDrive/darknet/bin/darknet ./darknet

!chmod +x ./darknet

 

 다음으로 YOLO를 test하기 위해 드라이브에 있던 weights,cfg,data 파일들을 현재 작업 폴더에 불러온다.

!cp -r '/content/drive/MyDrive/darknet/weights' .
!cp -r '/content/drive/MyDrive/darknet/cfg' .
!cp -r '/content/drive/MyDrive/darknet/data' .
%ls

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

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)
  
def download(path):
  from google.colab import files
  files.download(path)

 

 이제 기존 yolo의 weight로 yolo를 실행시켜보자.

!./darknet detect cfg/yolov3.cfg weights/yolov3.weights data/fruit10.jpg
imShow('predictions.jpg')

 기존 yolo에는 귤의 데이터가 없기 때문에 위와같은 결과를 나타낸다.

 

 앞으로 할 일은 직접 yolo를 학습시키는 것이다. 앞에서 custom 데이터를 만들었던 custom 폴더를 가져온다.

!cp -r /'content/drive/MyDrive/darknet/custom' .

 이후 darknet53.conv.74로 학습시킨다. 이것은 학습을 위한 합성곱층들 이다.

os.makedirs('./backup')

!./darknet detector train custom/custom_data.data custom/custom-train-yolo.cfg weights/darknet53.conv.74 -dont_show

 backup 폴더를 만든 이유는 특정 에포크마다 weight를 저장해두기 때문이다. 학습이 끝난 후 가중치르 이용해 map를 측정한다.

!./darknet detector map custom/custom_data.data custom/custom-train-yolo.cfg backup/custom-train-yolo_final.weights

 

 이번에는 custom-yolo로 위 이미지를 다시 측정해보자.

!./darknet detector test custom/custom_data.data custom/custom-train-yolo.cfg backup/custom-train-yolo_final.weights data/fruit10.jpg -dont-show
imShow('predictions.jpg')

 측정이 아주 잘 된 것을 볼 수 있다.

 

 주의점!

 코랩이든 로컬이든 다음 부분에서

!./darknet detector test custom/custom_data.data custom/custom-train-yolo.cfg backup/custom-train-yolo_final.weights data/fruit10.jpg -dont-show

 빨간색 부분의 파일에 적혀있는 

classes = 2
train =/content/gdrive/My\Drive/darknet/custom/train.txt
valid =/content/gdrive/My\Drive/darknet/custom/test.txt
names =/content/gdrive/My\Drive/darknet/custom/classes.names
backup = backup 

 이 것들의 경로가 매우 중요하다. 나는 현재 작업폴더가 /content/darknet 이고, 여기에 custom 폴더가 있으므로 train,valid,names 의 경로가 ./custom/~로 고쳐줘야 했다.

 똑같이 test.txt와 train.txt에 들어있는 이미지들의 경로도 절대경로를 고려해서 작성해줘야 한다.