1. YOLO
이미지 분류, 객체 탐지, 인스턴스 분할 작업에 사용할 수 있는 모델
|
1. YOLO의 장점 |
* Sliding Window 방식이 아닌 CNN을 사용하여 이미지 전역의 Contextual Informaion을 얻어 학습 성능을 높임 * 일반적인 Object의 표현을 학습하기에 Domain이 달라도 높은 성능을 보임 |
2. YOLOv8 |
* Backbone, Nect, Head 로 구성 * Backbone : 전체 네트워크의 본체 파트 * Neck : Backbone과 Head를 연결 * Head: 최종 출력 생성 파트 * 이전 버전에 비해서 더 복잡한 구조를 가지고 있어 높은 정확도를 보여줄 뿐만 아니라, 빠른 속소를 보임 |
2. PascalVOC 데이터
1. PascalVOC 2007 |
* 분류와 객체 검출을 위해 만들어진 데이터셋 * 총 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 |
2. 실습준비 |
* 학습 데이터 * train: 2501장 * val: 2510장 * 학습 데이터가 너무 적어서 train과 val를 합쳐서 학습시킨 후, 테스트 데이터를 검증 데이터셋으로 사용 예정 * 테스트 데이터 * test: 4952장 |
◼ train , val, test 데이터 다운받기
!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
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 아카이브 파일을 지정된 디렉토리에 압축 해제
!tar -xvf VOCtrainval_06-Nov-2007.tar -C ./pascal_datasets/trainval/ !tar -xvf VOCtest_06-Nov-2007.tar -C ./pascal_datasets/test/
|
3. YOLO 포맷으로 변경 |
* xml에서 (xmin, ymin, xmax, ymax)을 YOLO 모델에서 사용하기 위해 포멧 변경이 필요 * YOLO 형식: (클래스번호, x의 center 좌표, y의 center 좌표, 너비, 높이) Yolo 형식으로 바꿀 필요성! |
◼ git에서 변경사항 가져오기
!git clone https://github.com/ssaru/convert2Yolo.git
|
|
◼ 포맷 변경
%cd convert2Yolo
%pip install -qr requirements.txt
|
* 000005.txt 파일 확인 * yolo 형식으로 좌표가 바뀐 것을 볼 수 있음 |
4. names 파일 |
* 머딥러닝 모델이 데이터셋 내의 클래스를 인식하고 구분할 수 있도록 클래스 이름을 정의하는데 사용되는 파일 형식 * YOLO와 같은 유명한 객체 탐지 알고리즘을 구현하는데 사용 |
◼ voc.names 파일 다운로드 / convert2Yolo폴더에 넣기
|
◼ trainval 데이터 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 포멧 변환
# 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
|
|
- 경로복사
5. PascalVOC 제공 파일로 train, val 라벨분할 |
* /content/pascal_datasets/trainval/VOCdevkit/VOC2007/ImageSets/Main/val.txt * /content/pascal_datasets/VOC/labels/train2007 파일 중 위 txt 문서에 있는 파일을 /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')
|
000005 000007 000009 000016 ...... 009950 009954 009955 009958 |
6. VOC/labels 에 맞게 images 분할 |
* /content/pascal_datasets/trainval/VOCdevkit/VOC2007/JPEGImages 와 /content/pascal_datasets/test/VOCdevkit/VOC2007/JPEGImages 에서 이미지를 가져와 디렉토리에 맞게 저장 |
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'))
|
train2007 : 2501 val2007 : 2510 test2007 : 4952 |
3. 커스텀 데이터 준비
- 커스텀 데이터 다운로드
- CVAT 사이트: https://www.cvat.ai/
더보기
1. 새로운 프로젝트 생성
2. 라벨 정보 입력(이름과 색상 설정) -> 저장
3. 새로운 task 생성
4. 이미지 업로드
* 설정
5. 이미지 데이터 경계상자 라벨링
6. 라벨링 결과물 저장
7. 결과물 YOLO 포멧으로 Export
8. Requests에서 다운로드
4. YOLO 모델 불러오기
◼ git 에서 yolov5 불러오기
%cd /content/
!git clone https://github.com/ultralytics/yolov5.git
|
◼ requirments.txt에서 설치할 pip 설치하기
%cd yolov5
%pip install -qr requirements.txt
|
◼ import 와 환경 초기화
import torch
import utils
display = utils.notebook_init()
|
5. WanDB를 이용한 학습 및 평가 과정 로깅
- wandb는 머신러닝/딥러닝 개발자를 위한 종합적인 보조 도구
- 딥러닝 모델 학습할 때 학습 과정에 대해 로깅을 진행
- 손실값의 감소하는 형태를 쉽게 파악할 수 있음
- 팀 단위로 실험 결과를 추적할 수 있도록 해주기 때문에 웹에서 편리하게 분석이 가능
- 사이트 : https://wandb.ai/site
- 사용방법
◼ WanDB 설치
%pip install wandb
|
◼ 설치 확인
import wandb
|
◼ 로그인 하기
wandb.login()
|
wandb: Appending key for api.wandb.ai to your netrc file: /root/.netrc True |
6. 실험의 재현성 보장
◼ 랜덤 시드 설정
import random
import numpy as np
import torch
seed = 2024
deterministic = True
random.seed(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
if deterministic:
# CuDNN을 사용하는 GPU 연산에서 설정
# True(동일한 입력에 대해 항상 동일한 결과를 보장)
torch.backends.cudnn.deterministic = True
# CuDNN 벤치마크 모드를 활성화
# 입력 크기가 변경되지 않을 경우 최적의 알고리즘을 선택하여 성능을 향상
torch.backends.cudnn.benchmark = False
|
7. data.yaml 파일
custom_voc.yaml: Pascal voc 2007 데이터 명시 파일
custom_dataset.yaml: 직접 라벨링한 테스트 데이터 명시 파일
파일 경로: /content/yolov5/data
1. Custom_dataset.yaml |
|
2. Custom_voc.yaml |
|
8. YOLOv5 가중치 파일
- yolov5s.pt: 가장 작은 버전으로 경량화된 모델이며 작은 크기의 객체를 감지하거나 시스템 리소스가 제한된 환경에서 사용
- yolov5m.pt: 중간 크기의 모델로, 기본적인 객체 탐지와 분류에 적합
- yolov5l.pt: 큰 모델로 더 높은 정확도를 제공, 크기가 큰 객체나 복잡한 시나리오에 유용
- yolov5x.pt: 가장 큰 모델로, 가장 높은 정확도를 목표로 함
◼ YOLOv5 모델을 훈련시키기
%cd /content/yolov5
!python3 train.py --img 640 --batch 32 --epochs 10 --data custom_voc.yaml --weights yolov5s.pt --seed 2024
|
train.py 스크립트를 실행하여 YOLOv5 모델을 지정된 파라미터로 훈련시키는 명령입니다. 훈련 과정은 입력 이미지 크기, 배치 크기, 에포크 수, 데이터셋 구성 파일, ㅠ사전 훈련된 가중치, 랜덤 시드를 사용하여 설정됩니다. |
|
9. mAP(mean Average Precision)
|
◼ Pascal VOC 테스트 데이터로 테스트하기
# 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
|
◼ 파일확인
|
◼ VOC 폴더 안에 custom_dataset > obj_train_data 폴더 만들기
|
◼ 바운딩 박스 치기
# 이미지들에 대한 경계상자 이미지 생성
!python detect.py --weights /content/yolov5/runs/train/exp/weights/best.pt --img 640 --conf 0.25 --source /content/pascal_datasets/VOC/custom_datasets/obj_train_data
|
◼ 생성된 detect 폴더에서 바운딩 박스 확인
|
◼ 커스텀 이미지에서도 잘 찾아내는 것을 확인
|
- 최종실행파일
'AI > 컴퓨터 비전' 카테고리의 다른 글
16. YOLO v8를 활용한 안전모 탐지 (0) | 2024.08.08 |
---|---|
15. YOLO v8을 이용한 폐질환 분류 (0) | 2024.08.07 |
@. 과제 (0) | 2024.08.05 |
13. Faster R-CNN | 객체 탐지 (0) | 2024.07.25 |
12. VGG19 | 분류 (1) | 2024.07.24 |