본문 바로가기

8. OpenCV | CV

8/11(금) IT K-DT(110일차) / 7.Object Detection(YoloV5)

 

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)을 달 수 있게 해줌.


 

https://www.cvat.ai/

 

 

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)
딥 러닝 모델의 학습 및 실험을 추적하고 시각화하기 위한 온라인 플랫폼으로, 실험 과정을 손쉽게 트랙킹 및 시각화해주는 툴. 
 
기능:
학습 시 사용된 파라미터들을 저장
학습했던 각 실험들을 탐색하고, 비교하고, 시각화
학습 환경의 시스템을 어떻게 사용하고 있는지 분석
다른 사람들과의 협업
과거 실험 결과들을 복제
하이퍼 파라미터 튜닝이 가능
실험했던 모든 기록들을 영구적으로 저장


 

https://wandb.ai/site

 

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