본문 바로가기

Computer Vision/Object Detection

YoloV5를 이용한 Pistol Obeject Detection

1. 데이터 & YoloV5 모델 준비하기

# ROBOFLOW에서 가져온 데이터 셋 가져오기

!curl -L 'https://public.roboflow.com/ds/LabxO8gNzT?key=RksyGgVimQ' > roboflow.zip ; unzip roboflow.zip


# yolov5 clone & yolov5 환경 및 버전 맞춰 설치하기

!git clone https://github.com/ultralytics/yolov5.git

pip install -r requirements.txt

 

2. glob을 이용하여 ROBOFLOW에서 가져온 데이터 셋 image들을 list로 만들어준다.

 
from glob import glob
img_list = glob('/content/export/images/*.jpg')

 

glob() 함수란?

glob.glob() 함수는 파라미터에 명시된 저장 경로와 패턴에 해당하는 파일명을 리스트 형식으로 반환한다.

단, 조건에 정규식을 사용할 수 없으며 *와 ? 같은 와일드카드만 지원한다.

*

file_path = glob.glob('dir/*.csv')

: dir폴더에 csv 파일들의 이름만 file_path에 리스트에 저장된다.

?

file_path = glob.glob('dir/file?.csv')

: dir폴더에 file_.csv 파일들의 이름만 file_path에 리스트에 저장된다.

3. data.yaml 파일의 학습 데이터와 테스트 데이터 경로 설정하기

4. img_list를 학습 데이터와 테스트 데이터를 분리하여 텍스트 파일로 저장한다.(경로 잘 보고 설정하기)

from sklearn.model_selection import train_test_split

train_img_list,test_img_list = train_test_split(img_list,test_size=0.2,random_state=0)

with open('/content/dataset/train.txt','w') as f:
  f.write('\n'.join(train_img_list) + '\n')

with open('/content/dataset/test.txt','w') as f:
  f.write('\n'.join(test_img_list) + '\n')

5. 데이터셋 학습시키기

!python train.py --img 416 --batch 16 --epochs 50 --data ../data.yaml --cfg /content/yolov5/models/yolov5s.yaml

 

img : input image 사이즈

batch : 배치 사이즈

epochs : 반복 횟수

data : data.yaml 경로

cfg : yolov5s 모델 초기 설정 yaml 파일

weights : 학습 모델 (나는 가장 작은 yolov5s 모델을 이용해보았다.)

name : 학습 결과가 저장될 이름(선택사항)

6. 학습결과 시각화

precision : 검출 결과들 중 옳게 검출한 비율

recall : 실제 옳게 검출된 결과물 중에서 옳다고 예측한 것의 비율

학습 결과가 어떤지 볼 수 있는 대표적인 지표로 mAP(Mean Average Precision)을 보는데, mAP이 클수록 정확도가 높고 작을수록 정확도가 낮다.

mAP의 그래프가 전체적으로 부드러운 우상향의 곡선이 나와야 하고 loss 그래프는 우하향 곡선이 나와야 한다. 어느정도 학습은 된 것으로 보인다.

7. 학습한 모델 사용해서 Pistol 구별하기

!python detect.py --weights './runs/train/exp3/weights/best.pt' --img 416 --conf 0.5 --source "Every Airsofter wants this pistol #shorts.mp4"

weights : 사용할 모델

source : 인식 대상

conf : 정확도 0.5이상만 검출