본문 바로가기
프로그래밍/비전

colab에서 yolov7 커스텀데이터 만들기

by 훨훨날아 2022. 12. 10.

하드웨어가 좋지 않을 대 구글의 코랩colab을 이용하면 이미지의 훈련을 빠르고 편하게 할 수 있다. 

https://colab.research.google.com

 

Google Colaboratory

 

colab.research.google.com

 

구글 코랩을 이용한 yolov7 커스텀데이터 만드는 방법
1. 구글드라이브를 연결한다.
2. YOLOv7 github에서 자료를 복사한다.
3. 데이터로 사용할 이미지를 구글드라이브에 올려준다.
4. YOLOv7에서 사용할 네트워크를 설정한다.
5. 파라미터를 설정한 뒤 데이터를 훈련시킨다.
6. 결과를 확인한다.

구글 드라이브 연결 및 YOLOv7 자료복사

 

# 코랩에 구글드라이브를 연결한다.

from google.colab import drive
drive.mount("/content/gdrive")

# 구글드라이브에서 내 드라이브로 들어간다.
%cd /content/gdrive/MyDrive


# 구글드라이브에서 파일을 만들수 있는 os라이브러리를 설치하고
import os

# 원하는 이름으로 작업이 진행될 폴더를 만든다.
if not os.path.isdir("TheCodingBug"):   #반복적으로 만들어지는 것을 방지하기 위해 확인
  os.makedirs("TheCodingBug")

# 만들어진 폴더로 들어가 작업을 진행한다.
%cd TheCodingBug


# yolov7 깃허브로 들어가 자료를 복사한다.
!git clone https://github.com/WongKinYiu/yolov7.git

# 데이터가 복사되면 현재 위치에서 yolov7 폴더가 만들어지고 yolov7의 자료가 복사된다.

 

 

데이터 라벨링하기

데이터를 라벨링하는 방법이 여러가지 있지만 라벨링을 쉽게 도와주는 서비스를 이용하면 간단하게 만들 수 있다.  labelImg, CVAT, roboflow에서 제공하는 프로그램을 사용하는 방법이 있다. 그중 roboflow를 사용하면 조금 빠르고 간단하게 yolo형태에 맞는 데이터를 만들 수 있다.

https://roboflow.com/

 

Roboflow: Give your software the power to see objects in images and video

With just a few dozen example images, you can train a working, state-of-the-art computer vision model in less than 24 hours.

roboflow.com

 

labelImg를 사용하여 데이터 만드는 방법

https://kyoungin90.tistory.com/498

 

yolo v7 로컬에서 학습 데이터 만들기 (1) (환경설정, 이미지데이터 다운 후 라벨링 하기)

https://www.youtube.com/watch?v=-QWxJ0j9EY8 ※ 기초부터 알고 따라하는 것이 아니라 중간중간 잘못된 설명이 있을 수도 있습니다 ※ 다음 유튜브를 보고 YOLO v7을 colab이 아닌 로컬컴퓨터(개인컴퓨터)에서

kyoungin90.tistory.com

 

다음은 위 링크의 방법으로 레이블된 이미지와 레이블데이터이다. train 에는 64개 val 에는 10개의 조니뎁이미지가 레이블링 되어 있다. train과 val 을 구글 드라이브에 만들어진 yolov7폴더에서 data파일에 넣어준다.

train.zip
17.78MB
val.zip
2.77MB

 

 

데이터를 학습할 수 있도록 YOLOv7 설정하기

먼저 yolov7 -> data 폴더에서 coco.yaml을 복사해 이름을 custom-data.yaml로 바꿔주고 안의 내용을 변경해준다. 기존 coco 데이터는 80의 객체를 라벨링한 데이터이지만 우리 데이터는 조니댑 한명을 이용해 라벨링 했으므로 파일의 위치와 객체의 숫자, 이름을 바꿔주면된다. ( 구글드라이브에서 파일의 오른쪽을 눌러 text editor를 사용하면 파일을 수정할 수 있다.)

기존 coco.yaml

 

# 학습에 필요한 train과 val 이미지의 위치 
train: ./data/train
val: ./data/val

# number of classes = 라벨링에 적용된 객체의 숫자
nc: 1

# class names = 라벨링에 적용된 객체의 이름, 순서대로 , 를 이용해서 나누면 된다.
names: [ 'Johnny Depp' ]

 

그 다음 yolov7 -> cfg -> training 폴더에 들어가서 사용하고자 하는 yolov7 네트워크의 yaml을 복사해서 안의 내용을 우리의 데이터와 맞춰줘야한다. 여기에서는 yolov7x 네트워크를 사용하기 위해 yolov7x.yaml을 복사해서 yolov7x-custom.yaml로 바꿔준다. 여기에서 가장 첫번째줄의 nc를 80에서 데이터에 맞도록 1로 바꿔준다. (이 파일에 있는 yolov7x의 네트워크 구조를 결정한다) 

 

다시 colab 파일로 들어가 미리 설정된 yolov7의 가중치를 다운 받는다. 

!wget https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7x.pt

 

 

훈련하기

모든 설정이 완료됐으니 이제 train.py를 실행시켜 데이터를 학습시키면된다. 

!python train.py --device 0 --batch-size 16 --epochs 100 --img 640 640 --data data/custom_data.yaml --hyp data/hyp.scratch.custom.yaml --cfg cfg/training/yolov7x-custom.yaml --weights yolov7x.pt --name yolov7x-custom

!python train.py  : 현재 폴더에 있는 train.py를 실행시킨다.
--device 0  : 현재 설정된 하드웨어를 설정한다.
--batch-size 16  : 한번학습시 진행되는 batch사이즈를 설정한다. 크면클수록 빨리 학습할 수 있지만 너무 크면 중간에 메모리가 부족하여 학습이 중단될 수 있다.
--epochs 100  : 전체 데이터를 반복하는 횟수를 나타낸다. 클수록 좋지만 일정 수준이상으로 진행되면 과적합이 생겨 좋아지지 않는다.
--img 640 640 : 네트워크 모델에서 설정된 이미지의 크기를 나타낸다. 위 표의 test size를 참고하여 설정
--data data/custom_data.yaml  : data가 들어있는 위치, 클래스, 이름에 대한 정보가 있는 yaml의 위치를 설정한다.
--hyp data/hyp.scratch.custom.yaml  : 하이퍼파라미터가 들어간 yaml의 위치를 설정한다.
--cfg cfg/training/yolov7x-custom.yaml   :  모델의 구조가 들어간 yaml의 위치를 설정한다.
--weights yolov7x.pt  : 초기 훈련 가중치가 들어간 위치를 설정한다.
--name yolov7x-custom : 훈련뒤 만들어지는 데이터를 저장할 폴더의 이름을 설정한다.

 

네트워크 구조가 만들어지고 훈련데이터의 정보가 보여지고 훈련이 시작된다.

훈련이 완료되면 최적 가중치가 설정된 폴더에 저장된다.

 

훈련이 끝나면 yolov7 -> runs -> train -> 설정한이름폴더에 test에 사용된 이미지, 결과, 가중치들이 저장된다.

 

모델 데스트하기

커스텀 데이터로 만들어진 yolov7의 모델을 실제로 사용하기 위해 훈련으로 만들어진 best 가중치를 이용하여 결과를 확인할 수 있다.

!python detect.py --weights runs/train/yolov7x-custom2/weights/best.pt --conf 0.3 --img-size 640 --source test.jpeg --no-trace

!python detect.py  : detect.py를 실행하고
--weights runs/train/yolov7x-custom2/weights/best.pt  : 훈련가중치중 가장 좋은 가중치를 선택하고
--conf 0.3  : 정확도가 몇프로 이상인 것들을 표시하고
--img-size 640  : 이미지는 네트워크모델에 맞도록 설정하고
--source test.jpeg  : 테스트하고자하는 이미지의 위치를 설정하고
--no-trace : 이게 없으면 뭔가 정보를 model을 convert해서 traced model을 저장한다고 하는데 큰 차이는 없다.

 

테스트된 결과는 runs -> detect 폴더에 저장된다. 저장된 위치를 복사해서 opencv로 확인하면 다음과 같은 결과를 볼 수 있다.

import cv2
from google.colab.patches import cv2_imshow

img = cv2.imread('runs/detect/exp12/test.jpeg')
cv2_imshow(img)

 

 

참고

https://www.youtube.com/watch?v=_fXABNYlZhY&list=PLUE9cBml08yiahlgN1BDv_8dAJFeCIR1u&index=5 

 

반응형