안녕하세요 오션라이트에이아이 백승기연구원입니다.
오늘은 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)
위의 링크를 따라 들어가서 우측 상단의 Code를 클릭하면 밑에 Download ZIP이라는 글이 나옵니다. 해당 ZIP파일을 다운받아서 압축을 해제하겠습니다.
압축을 해제하면 그림 2.와 같이 파일들이 나오게 됩니다.
Requirements 파일을 통해 필요한 Library 설치하기
저는 anaconda3를 통해 생성한 가상환경을 사용하기때문에 해당 가상환경에 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.와 같이 예시 이미지와 라벨폴더를 위치시켰습니다.
혹은,
그림 6.의 명령어를 실행시키면 그림 5.와 같이 데이터셋 폴더 안에 이미지와 라벨이 다운받아집니다.
예시데이터를 통해 학습시키기
데이터를 학습시키기 전에 Yolov5의 파일들이 어떻게 구성되어있는지 확인해보도록 하겠습니다.
그림 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를 조정하여 학습을 진행시켜 보겠습니다.
학습이 완료되었습니다.
Yolov5가 나타낸 결과지표 확인하기
학습이 완료되면 다음과 같은 폴더경로에 여러 파일들이 생깁니다.
\yolov5-master\runs\train\exp
해당 폴더에서는 학습 전 이미지데이터의 라벨링 class의 분포나 배치사이즈에 대한 Mosaic 이미지를 확인할 수 있습니다.
Mosaic이미지는 Batch_size를 기준으로 여러개의 이미지를 잘라서 하나의 이미지로 볼 수 있게 만들어줍니다.
그림 10.에 대해서 설명하자면 4의 배치사이즈를 가지기 때문에 이미지가 4개이고, 각각의 이미지는 다른 이미지들을 잘라와서 하나의 이미지로 만들었습니.
이제 학습결과에 대한 지표를 알아보겠습니다.
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를 수정하여 더 좋은 성능을 내는 모델을 만들 수 있습니다.
'Code Example' 카테고리의 다른 글
ChatGPT를 활용한 Text Classification모델 만들기 (0) | 2023.03.24 |
---|---|
Support Vector Machine(SVM)을 활용한 타이타닉 생존자 예측 (0) | 2023.03.16 |
Random Forest (Titanic 생존자 예측) (0) | 2023.02.09 |
Decision Tree Code Example(Titanic 생존자 예측) (0) | 2023.02.08 |
Multiple Linear Regression Code Example (0) | 2023.02.08 |
댓글