찔끔찔끔씩😎

[Yolov5] 자율주행 데이터 사물인식 실습 본문

Study/인공지능

[Yolov5] 자율주행 데이터 사물인식 실습

댕경 2022. 5. 16. 20:32
728x90
roboflow에서 제공하는 Udacity Self Driving Car Dataset 을 이용하였고,
Colab 환경에서 진행하였다.
모든 이미지 파일들은 라벨링이 되어있는 상태이다.

1. roboflow에서 제공하는 images 받아오기

roboflow에서 원하는 데이터를 선택한뒤 Yolo v5 PyTorch로 Export 시킨다.

# roboflow에서 제공하는 images 받아오기
!curl -L "https://public.roboflow.com/ds/0Q4TDaIgXT?key=v8qXdebOxZ" > roboflow.zip; unzip roboflow.zip; rm roboflow.zip

 

2. yolo v5 clone 해오기

# yolov5 clone 해오기
%cd /content
!git clone https://github.com/ultralytics/yolov5.git

 

3. 필요한 라이브러리들을 install 해준다.

%cd /content/yolov5/
!pip install -r requirements.txt

 

4. data.yaml 파일을 확인해보자

아래 코드 입력전에, dataset 이라는 이름의 폴더를 만들고 클론받은 것들을 옮겨주자.

%cat /content/dataset/data.yaml

[ 출력 ]

train: ../train/images

val: ../valid/images

 

해야할 일

1) train, val 경로를 재설정하기.

2) train, test 데이터를 나눠주기.

 

5. 앞서서 이미지가 잘 불어와 지는지, glob을 사용하여 확인해보자

%cd /
from glob import glob

img_list = glob('/content/dataset/export/images/*.jpg')
print(len(img_list))

 

6. train, test data 나누기

train_test_split 을 사용할 거고 이의 형태는 다음과 같다.

train_test_split(data, target, test_size=0.2, shuffle=True, stratify=target, random_state=34)

  • test_size: 테스트 셋의 비율
    • test_size= 0.2: 전체의 20%를 테스트 셋으로 지정
  • shuffle: split 이전에 섞어줄 것인지 여부
    • default = True
  • stratify: classification 시에 매우 중요한 옵션값이다. 한쪽에 쏠려서 분배되는 것을 방지
    • default = None
  • random_state: 세트를 섞을 때 int값을 보고 섞으며, 하이퍼 파라미터를 튜닝시 이 값을 고정해두고 튜닝해야 매번 데이터셋이 변경되는 것을 방지할 수 있다.
# train, test data 나누기
from sklearn.model_selection import train_test_split

train_img_list, val_img_list = train_test_split(img_list, test_size=0.2, random_state=2000)

print(len(train_img_list), len(val_img_list))

 

7. 두 img를 txt 파일로 저장해준다.

리스트로 되어있는 넘을 join을 사용하여 txt 파일로 저장해준다.

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

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

 

8. yaml 파일에서 train, val의 위치를 7.에서 만든 txt로 변경해준다.

import yaml

with open('/content/dataset/data.yaml', 'r') as f: #read
  data = yaml.safe_load(f) # 문자열 -> 파이썬데이터로

print(data)

data['train'] = '/content/dataset/train.txt'
data['val'] = '/content/dataset/val.txt'

with open('/content/dataset/data.yaml', 'w') as f: #write
  yaml.dump(data, f) # 파이썬데이터 -> yaml 형태로

print(data)

[ 출력 ] 

{'train': '../train/images', 'val': '../valid/images', 'nc': 11, 'names': ['biker', 'car', 'pedestrian', 'trafficLight', 'trafficLight-Green', 'trafficLight-GreenLeft', 'trafficLight-Red', 'trafficLight-RedLeft', 'trafficLight-Yellow', 'trafficLight-YellowLeft', 'truck']}

{'train': '/content/dataset/train.txt', 'val': '/content/dataset/val.txt', 'nc': 11, 'names': ['biker', 'car', 'pedestrian', 'trafficLight', 'trafficLight-Green', 'trafficLight-GreenLeft', 'trafficLight-Red', 'trafficLight-RedLeft', 'trafficLight-Yellow', 'trafficLight-YellowLeft', 'truck']}

 

9. 학습 시키기

시간 상 epocs 를 10으로 설정하여 학습을 진행했다.

%cd /content/yolov5/

!python train.py --img 416 --batch 16 --epochs 10 --data /content/dataset/data.yaml --cfg ./models/yolov5s.yaml --weights yolov5s.pt --name self_driving_car_yolov5_result

 


결과 

1. 텐서보드로 결과 확인하기

%load_ext tensorboard
%tensorboard --logdir /content/yolov5/runs/

코드로 확인하지 않아도 results.png로 저장되어있을 것이다!

 

2. 나누어 둔 테스트 데이터로 결과 확인하기

아래 코드에선 나누어둔 val_img_list 중 5번째 이미지로 테스트 해본 결과이다.

from IPython.display import Image
import os

val_img_path = val_img_list[5]

!python detect.py --weights /content/yolov5/runs/train/self_driving_car_yolov5_result2/weights/best.pt --img 416 --conf 0.5 --source "{val_img_path}"

Image(os.path.join('/content/yolov5/inference/output', os.path.basename(val_img_path)))

 

Comments