본문 바로가기
Code Example

Yolov5를 이용한 Object Detection

by Oceanlighth AI 2023. 3. 28.

안녕하세요 오션라이트에이아이 백승기연구원입니다.

 

오늘은 Yolov5를 이용하여 Image Segmentation을 진행해보도록 하겠습니다.

 

머리글

Yolo는 You Only Look Once의 약자이며 객체탐지(Object Detection)분야에서 많이 활용되고 있는 모델입니다.

 

Yolo는 One-stage-detection이라는 방법을 이용하여 실시간 객체탐지를 가능하게 만들었습니다.

 

Yolov5의 특징
1. 이미지 전체를 한번만 봅니다.

Yolo모델 이전의 R-CNN모델들은 이미지를 여러장으로 분할한 뒤, CNN모델을 통해서 이미지를 분석하였습니다.

 

즉, 하나의 이미지를 이용해 객체탐지를 하더라도 실제 모델에서는 여러장의 이미지를 분석하는것과 같았습니다.


하지만 Yolo모델은 이러한 과정없이 하나의 이미지를 한번만 보는 특징을 가지고 있습니다.

 

2. 통합된 모델을 사용합니다.

우리가 기존에 알고있던 객체탐지 모델은 다양한 전처리 모델과 인공신경망을 결합하여 사용하였습니다. 

 

그에 반해, Yolo모델은 다양한 모델을 결합하는 것이 아닌 하나의 통합된 모델을 사용한다는 특징을 가지고 있습니다.

 

3. 실시간 객체탐지가 가능합니다.

Yolo모델은 아주 뛰어난 성능은 아니지만 준수한 성능과 실시간 객체탐지가 가능한 점을 활용하였습니다.

 

이러한 특징을 가지고 Yolo모델은 기존의 R-CNN보다 빠른 성능을 보여줍니다.

 

Yolov5 시작하기

그럼 Yolov5모델을 사용해 보도록 하겠습니다.

 

먼저 GitHub에 있는 Yolov5를 설치하겠습니다.(https://github.com/ultralytics/yolov5)

 

그림 1. Yolov5 설치하기

위의 링크를 따라 들어가서 우측 상단의 Code를 클릭하면 밑에 Download ZIP이라는 글이 나옵니다. 해당 ZIP파일을 다운받아서 압축을 해제하겠습니다.

 

그림 2. Yolov5폴더 내부 파일

압축을 해제하면 그림 2.와 같이 파일들이 나오게 됩니다. 

 

Requirements 파일을 통해 필요한 Library 설치하기

저는 anaconda3를 통해 생성한 가상환경을 사용하기때문에 해당 가상환경에 Yolov5를 사용하기 위한 Library들을 설치하도록 하겠습니다.

 

그림 4. Yolov5를 사용하기 위해 필요한 Library들을 설치하기

그림 4.와 같이 pip install -r requirements.txt를 통해 해당 텍스트 파일 내에 있는 Library들을 가상환경에 설치할 수 있습니다.

 

Yolov5 예시 파일을 통해 Object Detection 진행하기

이 주소를 통해서 Image파일과 Label파일을 같이 다운받습니다.

 

다운받은 폴더를 

Desktop\yolov5-master\datasets\coco128\images\train2017
Desktop\yolov5-master\datasets\coco128\labels\train2017

다음과 같은 위치에 저장합니다.

그림 5. 데이터셋 폴더 위치 확인하기

그림 5.와 같이 예시 이미지와 라벨폴더를 위치시켰습니다.

 

혹은,

그림 6. 명령어를 통해 데이터셋 다운받기

그림 6.의 명령어를 실행시키면 그림 5.와 같이 데이터셋 폴더 안에 이미지와 라벨이 다운받아집니다.

 

예시데이터를 통해 학습시키기

데이터를 학습시키기 전에 Yolov5의 파일들이 어떻게 구성되어있는지 확인해보도록 하겠습니다.

 

그림 7. coco128.yaml파일 확인하기

그림 7.의 coco128.yaml파일을 한번확인해보겠습니다.

 

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# COCO128 dataset https://www.kaggle.com/ultralytics/coco128 (first 128 images from COCO train2017) by Ultralytics
# Example usage: python train.py --data coco128.yaml
# parent
# ├── yolov5
# └── datasets
#     └── coco128  ← downloads here (7 MB)


# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: ../datasets/coco128  # dataset root dir
train: images/train2017  # train images (relative to 'path') 128 images
val: images/train2017  # val images (relative to 'path') 128 images
test:  # test images (optional)

# Classes
names:
  0: person
  1: bicycle
  2: car
  3: motorcycle
  4: airplane
  5: bus
  6: train
  7: truck
  8: boat
  9: traffic light
  10: fire hydrant
  11: stop sign
  12: parking meter
  13: bench
  14: bird
  15: cat
  16: dog
  17: horse
  18: sheep
  19: cow
  20: elephant
  21: bear
  22: zebra
  23: giraffe
  24: backpack
  25: umbrella
  26: handbag
  27: tie
  28: suitcase
  29: frisbee
  30: skis
  31: snowboard
  32: sports ball
  33: kite
  34: baseball bat
  35: baseball glove
  36: skateboard
  37: surfboard
  38: tennis racket
  39: bottle
  40: wine glass
  41: cup
  42: fork
  43: knife
  44: spoon
  45: bowl
  46: banana
  47: apple
  48: sandwich
  49: orange
  50: broccoli
  51: carrot
  52: hot dog
  53: pizza
  54: donut
  55: cake
  56: chair
  57: couch
  58: potted plant
  59: bed
  60: dining table
  61: toilet
  62: tv
  63: laptop
  64: mouse
  65: remote
  66: keyboard
  67: cell phone
  68: microwave
  69: oven
  70: toaster
  71: sink
  72: refrigerator
  73: book
  74: clock
  75: vase
  76: scissors
  77: teddy bear
  78: hair drier
  79: toothbrush


# Download script/URL (optional)
download: https://ultralytics.com/assets/coco128.zip

다음과 같이 path의 경우에는 우리가 예시이미지를 다운받았던 폴더로 지정되어있고, 

train과 val 폴더경로는 path경로 내의 파일로 되어있습니다.

 

지금은 예시 이미지를 통해 학습을 진행시켜볼 것이기 때문에 따로 폴더경로를 수정하지 않겠습니다.

 

Class의 경우에는 pre-trained된 모델 class들이 있습니다.

 

만약 Custom Data를 사용하게 된다면 Class 또한 사용자에 맞게 설정해 주어야 합니다.

 

train.py의 코드 확인하기

다음은 우리가 학습시킬 학습 코드인 train.py에 대해서 잠깐 알아보겠습니다.

 

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
"""
Train a YOLOv5 model on a custom dataset.
Models and datasets download automatically from the latest YOLOv5 release.

Usage - Single-GPU training:
    $ python train.py --data coco128.yaml --weights yolov5s.pt --img 640  # from pretrained (recommended)
    $ python train.py --data coco128.yaml --weights '' --cfg yolov5s.yaml --img 640  # from scratch

Usage - Multi-GPU DDP training:
    $ python -m torch.distributed.run --nproc_per_node 4 --master_port 1 train.py --data coco128.yaml --weights yolov5s.pt --img 640 --device 0,1,2,3

Models:     https://github.com/ultralytics/yolov5/tree/master/models
Datasets:   https://github.com/ultralytics/yolov5/tree/master/data
Tutorial:   https://github.com/ultralytics/yolov5/wiki/Train-Custom-Data
"""

train.py의 서두에 보면 프롬프트를 통해 실행하는 명령어의 예시가 있습니다.

 

우리는 

python train.py --data coco128.yaml --weights yolov5s.pt --img 640 --epoch 10 --batch-size 4

해당 방법을 통해서 학습을 진행시킬 예정입니다.

 

coco128.yaml에서 설정된 파일과 미리 학습된 yolov5s의 가중치를 통해 학습을 진행하고 이미지 사이즈의 경우 640으로 맞추어 줍니다.

 

또한 epoch와 batch_size를 조정하여 학습을 진행시켜 보겠습니다.

 

그림 8. Yolov5 학습시키기

학습이 완료되었습니다.

 

Yolov5가 나타낸 결과지표 확인하기

학습이 완료되면 다음과 같은 폴더경로에 여러 파일들이 생깁니다.

 

\yolov5-master\runs\train\exp

해당 폴더에서는 학습 전 이미지데이터의 라벨링 class의 분포나 배치사이즈에 대한 Mosaic 이미지를 확인할 수 있습니다.

Mosaic이미지는 Batch_size를 기준으로 여러개의 이미지를 잘라서 하나의 이미지로 볼 수 있게 만들어줍니다.

 

그림 9. 라벨링 Class 분포와 이미지 크기 등의 정보를 미리 알아보기
그림 10. Mosaic 기법을 통해 여러개의 이미지를 잘라서 하나의 이미지처럼 만들기

그림 10.에 대해서 설명하자면 4의 배치사이즈를 가지기 때문에 이미지가 4개이고, 각각의 이미지는 다른 이미지들을 잘라와서 하나의 이미지로 만들었습니.

 

이제 학습결과에 대한 지표를 알아보겠습니다.

그림 11. Yolov5를 통해 학습결과지표 확인하기

train/box_loss Training 과정에서 원본사진의 라벨링데이터의 Bounding_Box와 예측한 Bounding_Box의 오차를 나타냅니다.
train/obj_loss Training 과정에서 원본데이터의 Bounding_Box가 나타내는 클래스와 예측한 Bounding_Box가 나타내는 클래스의 오차를 나타냅니다.
train/class_loss Training 과정에서 원본데이터의 라벨링 클래스와 예측한 클래스 각각에 대한 오차입니다.
metrics/precision 정답을 정답으로 예측한 수치를 정답을 정답으로 예측한 수치 + 정답이 아닌것을 정답으로 예측한 수치로 나눈 값입니다.
metrics/recall 정답을 정답으로 예측한 수치를 정답을 정답으로 예측한 수치 + 정답을 정답이 아닌것으로 예측한 수치로 나눈 값입니다.
val/box_loss Validate 과정에서 원본사진의 라벨링데이터의 Bounding_Box와 예측한 Bounding_Box의 오차를 나타냅니다.
val/obj_loss Validate 과정에서 원본데이터의 Bounding_Box가 나타내는 클래스와 예측한 Bounding_Box가 나타내는 클래스의 오차를 나타냅니다.
val/cls_loss Validate 과정에서 원본데이터의 라벨링 클래스와 예측한 클래스 각각에 대한 오차입니다.
metrics/mAP_0.5 mAP(Mean Average Precision)는 0.5의 Threshold(0.5이상의 수치를 가질 경우에만 객체를 판단)를 기준으로 IoU 평균수치를 나타낸 것입니다.
metrics/mAP_0.5:0.95 0.5~0.95사이의 다양한 Threshold를 기준으로 해서 mAP를 계산한 수치입니다.

 

왼쪽 그림은 원본데이터의 라벨링을 기준으로 만든 Bounding_Box이며 오른쪽 그림은 예측한 Bounding_Box입니다.

 

마치며

Yolov5에 대해서 기본적인 사용방법을 알아보았습니다.

 

epoch, batch_size, weights, image_size 말고도 hyperparameter를 수정하여 더 좋은 성능을 내는 모델을 만들 수 있습니다.

 

댓글