7.Object Detection(YoloV5)
7-1. 실습 데이터 준비
Pascal VOC 2007 분류와 객체 검출을 위해 만들어진 데이터셋. 객체 분할도 가능하지만, 더 최신 버전의 데이터셋을 사용 권장함. http://host.robots.ox.ac.uk/pascal/VOC/index.html 클래스: 총 20개 Person: person Animal: bird, cat, cow, dog, horse, sheep Vehicle: aeroplane, bicycle, boat, bus, car, motorbike, train Indoor: bottle, chair, dining table, potted plant, sofa, tv/monitor 학습데이터 train: 2501장 val: 2510장 (학습 데이터가 너무 적어서 train과 val을 합쳐서 사용 후, 테스트 데이터를 검증 데이터셋으로 사용) 테스트데이터 test: 4952장 |
VOC 데이터셋의 설치
!wget http://pjreddie.com/media/files/VOCtrainval_06-Nov-2007.tar
!wget http://pjreddie.com/media/files/VOCtest_06-Nov-2007.tar
나눠야 할 경로
```
pascal_datasets
pascal_datasets/trainval
pascal_datasets/test
pascal_datasets/VOC
pascal_datasets/VOC/images
pascal_datasets/VOC/labels
pascal_datasets/VOC/images/train2007
pascal_datasets/VOC/images/val2007
pascal_datasets/VOC/images/test2007
pascal_datasets/VOC/labels/train2007
pascal_datasets/VOC/labels/val2007
pascal_datasets/VOC/labels/test2007
```
from pathlib import Path
추가적인 디렉토리의 생성
images와 label의 폴더를 생성하여 내부에 각각 train2007, val2007, test2007의 폴더를 다시 생성
root = Path('./pascal_datasets')
Path('./pascal_datasets/trainval').mkdir(parents=True, exist_ok=True)
Path('./pascal_datasets/test').mkdir(parents=True, exist_ok=True)
for path1 in ('images', 'labels'):
for path2 in ('train2007', 'val2007', 'test2007'):
new_path = root / 'VOC' / path1 / path2
new_path.mkdir(parents=True, exist_ok=True)
!tar -xvf VOCtrainval_06-Nov-2007.tar -C ./pascal_datasets/trainval/
!tar -xvf VOCtest_06-Nov-2007.tar -C ./pascal_datasets/test/
7-2. YOLO 포멧으로 변경
XML 형식은 YOLO V5 모델에서 사용하기 위해 YOLO 형식으로의 포멧 변경 필요
YOLO 형식
클래스번호 | x의 center 좌표 | y의 center 좌표 | 너비 | 높이
YOLO 포멧으로의 변경에 필요한 파일 설치
!git clone https://github.com/ssaru/convert2Yolo.git
%cd convert2Yolo
%pip install -qr requirements.txt
7-3. names 파일
머신러닝, 딥러닝 모델이 데이터셋 내 클래스를 인식/구분할 수 있도록 클래스 이름을 정의하는데 사용되는 파일 형식.
- Darknet 프레임워크와 일부 머신러닝 라이브러리와 함께 사용
- YOLO와 같은 유명한 객체 감지 알고리즘을 구현하는데 사용
# trainval 데이터 yolo 포멧 변환
!python3 example.py --datasets VOC --img_path ./pascal_datasets/trainval/VOCdevkit/VOC2007/JPEGImages/ --label /content/pascal_datasets/trainval/VOCdevkit/VOC2007/Annotations/ --convert_output_path /content/pascal_datasets/VOC/labels/train2007 --img_type ".jpg" --manifest_path /content/ --cls_list_file ./voc.names
# test 데이터 yolo 포멧 변환
!python3 example.py --datasets VOC --img_path ./pascal_datasets/test/VOCdevkit/VOC2007/JPEGImages/ --label /content/pascal_datasets/test/VOCdevkit/VOC2007/Annotations/ --convert_output_path /content/pascal_datasets/VOC/labels/test2007 --img_type ".jpg" --manifest_path /content/ --cls_list_file ./voc.names
# Pascal VOC 제공 파일로 train val 라벨 분할
# /content/pascal_datasets/trainval/VOCdevkit/VOC2007/ImageSets/Main/val.txt 를 읽어서
# /content/pascal_datasets/VOC/labels/train2007 파일을
# /content/pascal_datasets/VOC/labels/val2007 로 옮기기
import shutil
path = '/content/pascal_datasets/trainval/VOCdevkit/VOC2007/ImageSets/Main/val.txt'
with open(path) as f:
image_ids = f.read().strip().split()
for id in image_ids:
print(id)
ori_path = '/content/pascal_datasets/VOC/labels/train2007'
mv_path = '/content/pascal_datasets/VOC/labels/val2007'
shutil.move(f'{ori_path}/{id}.txt', f'{mv_path}/{id}.txt')
# Train / val / test 이미지 파일 복사
import os
path = '/content/pascal_datasets'
for folder, subset in ('trainval', 'train2007'), ('trainval', 'val2007'), ('test', 'test2007'):
ex_imgs_path = f'{path}/{folder}/VOCdevkit/VOC2007/JPEGImages'
label_path = f'{path}/VOC/labels/{subset}'
img_path = f'{path}/VOC/images/{subset}'
print(subset, ": ", len(os.listdir(label_path)))
for lbs_list in os.listdir(label_path):
shutil.move(os.path.join(ex_imgs_path, lbs_list.split('.')[0]+'.jpg'),
os.path.join(img_path, lbs_list.split('.')[0]+'.jpg'))
7-4. 커스텀 데이터 준비
CVAT을 이용
CVAT(Computer Vision Annotation Tool) 컴퓨터 비전 작업에 사용되는 주요한 오픈 소스 도구 중 하나로, 객체 검출, 분할, 추적 및 분류를 목적으로 이미지와 비디오 데이터에 주석(Labeling)을 달 수 있게 해줌. |
CVAT
Powerfull and efficient open source data annotation platform for computer vision datasets
www.cvat.ai
# 라벨링한 커스텀 데이터셋 다운로드(보류)
%cd /content/
!gdown 'https://drive.google.com/file/d/1E5ZmffycGj9HHirPDHH8svGteEDja3Km/custom_yolo_datasets.zip'
!unzip /content/custom_yolo_datasets.zip -d ./pascal_datasets/VOC/
%cd /content/
!git clone -b v6.2 https://github.com/ultralytics/yolov5.git
%cd yolov5
%pip install -qr requirements.txt
!pip install numpy==1.23.0
import torch
import utils
display = utils.notebook_init()
7-5. 학습 및 평가 과정 logging
WanDB를 이용
wanDB(Weights & Biases) 딥 러닝 모델의 학습 및 실험을 추적하고 시각화하기 위한 온라인 플랫폼으로, 실험 과정을 손쉽게 트랙킹 및 시각화해주는 툴. 기능: 학습 시 사용된 파라미터들을 저장 학습했던 각 실험들을 탐색하고, 비교하고, 시각화 학습 환경의 시스템을 어떻게 사용하고 있는지 분석 다른 사람들과의 협업 과거 실험 결과들을 복제 하이퍼 파라미터 튜닝이 가능 실험했던 모든 기록들을 영구적으로 저장 |
Weights & Biases – Developer tools for ML
WandB is a central dashboard to keep track of your hyperparameters, system metrics, and predictions so you can compare models live, and share your findings.
wandb.ai
%pip install -q wandb
import wandb
wandb.login()
'''
cuDNN(CUDA depp Neural Network library): NVIDIA에서 개발한 딥러닝 작업을
GPU에서 빠르게 처리하기 위한 GPU 가속 라이브러리
torch.backends.cudnn.deterministic: 학습 및 추론 과정에서 재현성을 보장하기 위해 사용
torch.backendscudnn.benchmark: 모델의 학습 및 추론 성능을 최적화하기 위해 사용
True: 최적화된 알고리즘을 동적으로 선택. 더 나은 성능을 내도록 노력하지만, 오버헤드가
발생할 수 있음
False: 오버헤드가 발생할지 않으나 성능이 저하될 수 있음
'''
import random
import numpy as np
seed = 2023
deterministic = True
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
if deterministic:
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = True
7-6. data.yaml 파일 생성
- custom_voc: Pascal voc 2007 데이터 명시 파일
- custom_dataset: 직접 라벨링한 테스트 데이터 명시 파일
- 파일 경로: /content/yolov5/data/
7-7. yolo v5의 가중치 파일
- yolov5s.pt
- yolov5에 가장 작은 버전으로 경량화된 모델
- 작은 크기의 객체를 감지하거나 시스템 리소스가 제한된 환경에서 사용
- yolov5m.pt
- 중간 크기의 모델로, 기본적인 객체 탐지와 분류에 적합
- yolov5l.pt
- 큰 모델로 더 높은 정확도를 제공
- 크기가 큰 객체나 복잡한 시나리오에 유용
- yolov5x.pt
- 가장 큰 모델로, 가장 높은 정확도를 목표로 함
%cd /content/yolov5
# Pascal VOC 데이터로 YOLO v5 학습
!python train.py --img 640 --batch 32 --epochs 30 --data custom_voc.yaml --weights yolov5s.pt --seed 2023
# Pascal VOC 테스트 데이터로 테스트
!python val.py --weights /content/yolov5/runs/train/exp/weights/best.pt --data custom_voc.yaml --img 640 --iou 0.65 --task test --half
# 직접 라벨링한 테스트 데이터로 테스트
!python val.py --weights /content/yolov5/runs/train/exp/weights/best.pt --data custom_dataset.yaml --img 640 --iou 0.65 --task test --half
# 이미지들에 대한 경계상자 이미지 생성
!python detect.py --weights /content/yolov5/runs/train/exp/weights/best.pt --img 640 --conf 0.25 --source /content/pascal_datasets/VOC/images/test2007