하드웨어가 좋지 않을 대 구글의 코랩colab을 이용하면 이미지의 훈련을 빠르고 편하게 할 수 있다.
https://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형태에 맞는 데이터를 만들 수 있다.
labelImg를 사용하여 데이터 만드는 방법
https://kyoungin90.tistory.com/498
다음은 위 링크의 방법으로 레이블된 이미지와 레이블데이터이다. train 에는 64개 val 에는 10개의 조니뎁이미지가 레이블링 되어 있다. train과 val 을 구글 드라이브에 만들어진 yolov7폴더에서 data파일에 넣어준다.
데이터를 학습할 수 있도록 YOLOv7 설정하기
먼저 yolov7 -> data 폴더에서 coco.yaml을 복사해 이름을 custom-data.yaml로 바꿔주고 안의 내용을 변경해준다. 기존 coco 데이터는 80의 객체를 라벨링한 데이터이지만 우리 데이터는 조니댑 한명을 이용해 라벨링 했으므로 파일의 위치와 객체의 숫자, 이름을 바꿔주면된다. ( 구글드라이브에서 파일의 오른쪽을 눌러 text editor를 사용하면 파일을 수정할 수 있다.)
# 학습에 필요한 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
가중치의 주소는 깃허브에 들어가 performance에 있는 네트워크모델 이름의 오른쪽을 클릭해서 주소를 복사하면 된다.
훈련하기
모든 설정이 완료됐으니 이제 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
'프로그래밍 > 비전' 카테고리의 다른 글
(미완)yolo v7 로컬에서 학습 데이터 만들기 (2) (yolov7 네트워크 설정 및 훈련) (2) | 2022.12.08 |
---|---|
아나콘다 가상환경 변경 (0) | 2022.12.07 |
yolo v7 로컬에서 학습 데이터 만들기 (1) (환경설정, 이미지데이터 다운 후 라벨링 하기) (1) | 2022.12.06 |