Deep Learning

YOLOv7 사용 및 학습해보기

씨주 2024. 9. 12. 16:53

참고 : https://foss4g.tistory.com/1796

 

📌 설치

딥러닝 공부를 하며 코드 구현을 해본 적이 아직까지 없는데 YOLOv7을 통해 연습해보려 한다.

YOLOv7은 공식적으로 코드가 오픈되어 있고 블로그 참고글이 많아 좋은 연습예제가 될 듯하다.

https://github.com/WongKinYiu/yolov7

 

GitHub - WongKinYiu/yolov7: Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time

Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors - WongKinYiu/yolov7

github.com

 

아래 코드를 이용해 YOLOv7과 필요한 프로그램을 설치하자.

git clone https://github.com/WongKinYiu/yolov7
pip install -r requirements.txt

 

 

YOLOv7은 COCO dataset으로 학습시킨 weights파일을 공유하고 있다.

이 중 yolov7.pt를 이용해보려 한다.

직접 다운로드 받는 방법, wget를 이용하여 받는 방법이 있으니 편한 방법으로 쓰면 될 듯하다.

https://github.com/WongKinYiu/yolov7/releases

 

Releases · WongKinYiu/yolov7

Implementation of paper - YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors - WongKinYiu/yolov7

github.com

import wget
wget.download('https://github.com/WongKinYiu/yolov7/releases/download/v0.1/yolov7.pt')

 

 

📌사용 방법

필요한 준비는 끝났으니 아래의 사진을 detection 해보자.

(/runs/detect/exp 폴더에서 사진을 확인할 수 있다.)

python detect.py --weights yolov7.pt --source example.jpg

왼쪽 원본 / 오른쪽 detection한 사진

 

여기서 motorcycle이 신뢰도 30%를 가지는데 임계치를 설정해줌으로써 detect되지 않도록 해줄 수 있다.

python detect.py --weights yolov7.pt --conf 0.4 --source example.jpg

왼쪽 신뢰도 25%(default) / 오른쪽 신뢰도 40%

 

📌 학습시켜보기

이 작업까지는 참고 블로그를 보며 실행하는데 문제가 없었으나 새로운 dataset을 학습시키는 과정에서 시간이 제법 소요되었다.

우선 roboflow(https://roboflow.com/)에서 새로운 데이터셋을 다운받았는데 여기서 문제가 생겼다.

BTS dataset을 활용하면 학습 후 image, video 모두 detect해볼 수 있을 것 같아 학습시켰는데 아무리 학습시켜도 detect가 되지 않는다..

 

✔️ 유의 1. METRICS

원인은 2가지정도로 보고 있는데 첫번째는 아래 사진과 같이 해당 dataset의 METRICS 수치가 낮은 걸 확인할 수 있다.

 

✔️ 유의 2. Argument

두번째는 train.py에서 epochs default값을 보면 300인 걸 볼 수 있는데 본인은 100으로 설정하여 학습이 잘 되지 않았던 것이 아닐까싶다.

더보기

epoch란?

에폭(epoch): 하나의 단위. 1에폭은 학습에서 훈련 데이터를 모두 소진했을 때의 횟수에 해당함.

미니 배치(mini batch): 전체 데이터 셋을 몇 개의 데이터 셋으로 나누었을 때, 그 작은 데이터 셋 뭉치

배치 사이즈(batch size): 하나의 미니 배치에 넘겨주는 데이터 갯수, 즉 한번의 배치마다 주는 샘플의 size

이터레이션(iteration): 하나의 미니 배치를 학습할 때 1iteration이라고 한다. 즉, 미니 배치 갯수 = 이터레이션 수

 

https://mole-starseeker.tistory.com/59

아무튼 이 2가지를 유의하고 학습을 시켜보도록 하자.

 

✔️ yaml 파일 수정

다운받은 dataset의 yaml 파일 경로를 확인하여 수정한다.

 

그 후 해당 dataset으로 학습을 시켰다.

이 때 GPU가 부족하더이다..ㅠ 

그럴 땐 batch나 image 사이즈를 줄여보자.

본인은 batch 사이즈를 16에서 8로 줄였더니 문제 없었다!

python train.py --img 640 640 --batch 8 --epochs 300 --data data/glasses.yaml --weights yolov7.pt

학습시킬수록 P(Precision), R(Recall), mAP(Mean Average Precision)가 올라가는 것을 확인할 수 있다.

 

학습이 완료되고나면 /runs/train/exp/weights/best.pt를 이용하여 detect하면 끝!

 

출처 : https://www.enewstoday.co.kr/news/articleView.html?idxno=400616