YOLOv7를 활용한 Object Detection

category AI 인공지능/AI Vision 2022. 11. 21. 16:57
728x90
반응형

환경구성

1. conda 환경 생성

[root@ai-server ~] conda create -n yolov7 python=3.7
[root@ai-server ~] conda activate yolov7
(yolov7) [root@ai-server ~] conda install pytorch==1.7.1 torchvision==0.8.2 torchaudio==0.7.2 cudatoolkit=11.0 -c pytorch

2. yolov7 프로젝트 clone

(yolov7) [root@ai-server ~] git clone https://github.com/WongKinYiu/yolov7.git
(yolov7) [root@ai-server yolov7] cd yolov7
(yolov7) [root@ai-server yolov7] pip install -r requirements.txt

 

데이터셋

1. 데이터셋 다운로드

(yolov7) [root@ai-server yolov7] mkdir -p dataset/vehicles_open_image
(yolov7) [root@ai-server yolov7] cd dataset/vehicles_open_image
(yolov7) [root@ai-server vehicles_open_image] curl -L "https://public.roboflow.com/ds/2Tb6yXY8l8?key=Eg82WpxUEr" > vehicles.zip
(yolov7) [root@ai-server vehicles_open_image] unzip vehicles.zip
(yolov7) [root@ai-server vehicles_open_image] rm -rf vehicles.zip

 

데이터 시각화

데이터 라벨을 시각화해보면 아래와 같은 형태로 되어 있다. 우리가 아는 일반적인 x1, y1, x2, y2 형태가 아닌 yolo style 형태의 bbox 형태이다. 하지만 걱정 할 필요 없다. 아래에 bbox를 변환해주는 함수를 활용할 수 있다.

class_id center_x center_y width height

예) 2 0.038461538461538464 0.8245192307692307 0.07692307692307693 0.34615384615384615

bbox 변환 함수

Converting Coco to Pascal_voc

# Convert Coco bb to Pascal_Voc bb
def coco_to_pascal_voc(x1, y1, w, h):
    return [x1,y1, x1 + w, y1 + h]

Converting Coco to Yolo

# Convert Coco bb to Yolo
def coco_to_yolo(x1, y1, w, h, image_w, image_h):
    return [((2*x1 + w)/(2*image_w)) , ((2*y1 + h)/(2*image_h)), w/image_w, h/image_h]

Converting Pascal_voc to Coco

# Convert Pascal_Voc bb to Coco bb
def pascal_voc_to_coco(x1, y1, x2, y2):
    return [x1,y1, x2 - x1, y2 - y1]

Converting Pascal_voc to Yolo

# Convert Pascal_Voc bb to Yolo
def pascal_voc_to_yolo(x1, y1, x2, y2, image_w, image_h):
    return [((x2 + x1)/(2*image_w)), ((y2 + y1)/(2*image_h)), (x2 - x1)/image_w, (y2 - y1)/image_h]

Converting Yolo to Coco

# Convert Yolo bb to Coco bb
def yolo_to_coco(x_center, y_center, w, h,  image_w, image_h):
    w = w * image_w
    h = h * image_h
    x1 = ((2 * x_center * image_w) - w)/2
    y1 = ((2 * y_center * image_h) - h)/2
    return [x1, y1, w, h]

Converting Yolo to Pascal_voc

# Convert Yolo bb to Pascal_voc bb
def yolo_to_pascal_voc(x_center, y_center, w, h,  image_w, image_h):
    w = w * image_w
    h = h * image_h
    x1 = ((2 * x_center * image_w) - w)/2
    y1 = ((2 * y_center * image_h) - h)/2
    x2 = x1 + w
    y2 = y1 + h
    return [x1, y1, x2, y2]

2. 데이터 메타정보 yaml 생성

(yolov7) [root@ai-server vehicles_open_image] cat > create_data.py
import os
import yaml

DATASET_DIR = os.getcwd()

config = {'path': DATASET_DIR,
         'train': '{}/train'.format(DATASET_DIR),
         'val': '{}/valid'.format(DATASET_DIR),
         'nc': 5,
         'names': ['Ambulance', 'Bus', 'Car', 'Motorcycle', 'Truck']}
 
with open("data.yaml", "w") as file:
    yaml.dump(config, file, default_flow_style=False)
(yolov7) [root@ai-server vehicles_open_image]$ python create_data.py
(yolov7) [root@ai-server vehicles_open_image]$ ll
total 36
drwxrwxr-x 5 yscho02 yscho02 4096 11월 21 16:07 ./
drwxrwxr-x 3 yscho02 yscho02 4096 11월 21 16:01 ../
-rw-r--r-- 1 yscho02 yscho02 1371  6월 15  2021 README.dataset.txt
-rw-r--r-- 1 yscho02 yscho02  419  6월 15  2021 README.roboflow.txt
-rw-rw-r-- 1 yscho02 yscho02  360 11월 21 16:07 create_data.py
-rw-rw-r-- 1 yscho02 yscho02  286 11월 21 16:07 data.yaml
drwxr-xr-x 4 yscho02 yscho02 4096  6월 15  2021 test/
drwxr-xr-x 4 yscho02 yscho02 4096  6월 15  2021 train/
drwxr-xr-x 4 yscho02 yscho02 4096  6월 15  2021 valid/

(yolov7) [root@ai-server vehicles_open_image]$ cat data.yaml
names:
- Ambulance
- Bus
- Car
- Motorcycle
- Truck
nc: 5
path: /home/yolov7/dataset/vehicles_open_image
train: /home/yolov7/dataset/vehicles_open_image/train
val: /home/yolov7/dataset/vehicles_open_image/valid

 

훈련하기

(yolov7) [root@ai-server yolov7] WANDB_MODE="disabled" python train.py \
--cfg cfg/training/yolov7.yaml \
--img 640 \
--batch-size 8 \
--epochs 20 \
--data "$PWD/dataset/vehicles_open_image/data.yaml" \
--hyp "$PWD/data/hyp.scratch.p5.yaml" \
--weights yolov7.pt \
--workers 1 \
--project vehicles_open_image_pyimagesearch \
--name yolov7

 

평가하기

import torch
from PIL import Image

model = torch.hub.load('WongKinYiu/yolov7', 'custom', path='yolov7.pt')

img = Image.open('sample.jpg')
draw = ImageDraw.Draw(img) 
res = model(img)

res.print()  
res.show()

res.xyxy[0]
tensor([[2.60347e+02, 1.97247e+02, 4.15732e+02, 4.15249e+02, 8.69950e-01, 2.00000e+00],
        [1.56850e+02, 1.06492e+02, 2.70030e+02, 4.16000e+02, 8.29194e-01, 0.00000e+00],
        [1.23749e+00, 1.47667e+02, 1.42186e+02, 2.52097e+02, 8.18335e-01, 2.00000e+00],
        [3.48707e+02, 1.36289e+02, 4.15982e+02, 1.98119e+02, 8.04200e-01, 2.00000e+00],
        [2.34788e+02, 1.29659e+02, 2.99248e+02, 2.28759e+02, 7.99016e-01, 2.00000e+00],
        [4.06910e-01, 2.70421e+02, 3.25550e+01, 4.15147e+02, 7.70532e-01, 2.00000e+00],
        [3.23113e+02, 1.17482e+02, 3.56575e+02, 1.67035e+02, 4.78211e-01, 0.00000e+00],
        [3.70406e+02, 1.20547e+02, 3.84670e+02, 1.35473e+02, 4.12928e-01, 0.00000e+00],
        [3.97325e+02, 1.63098e+02, 4.16000e+02, 1.96388e+02, 3.60122e-01, 2.00000e+00],
        [1.68800e+02, 1.28301e+02, 1.85821e+02, 1.76295e+02, 3.00761e-01, 0.00000e+00],
        [6.00648e+01, 1.24467e+02, 6.98916e+01, 1.49072e+02, 2.60879e-01, 0.00000e+00]], device='cuda:0')
res.pandas().xyxy[0]
xmin ymin xmax ymax confidence class name
260.347076 197.246552 415.731598 415.248657 0.869950 2 car
156.849731 106.492386 270.029907 416.000000 0.829194 0 person
1.237490 147.667328 142.186264 252.096542 0.818335 2 car
348.707214 136.289337 415.981659 198.118988 0.804200 2 car
234.787613 129.658722 299.248352 228.758774 0.799016 2 car
0.406910 270.421234 32.555023 415.147491 0.770532 2 car
323.113068 117.481972 356.574890 167.035034 0.478211 0 person
370.406006 120.546799 384.670441 135.472702 0.412928 0 person
397.324707 163.097504 416.000000 196.388428 0.360122 2 car
168.799561 128.301056 185.821091 176.295319 0.300761 0 person
60.064758 124.467171 69.891563 149.072449 0.260879 0 person
728x90
반응형

'AI 인공지능 > AI Vision' 카테고리의 다른 글

Craft Model 사용법  (0) 2022.12.01
YOLOv7에 대해 알아보자  (0) 2022.11.22
이미지 유사도 embedding  (1) 2021.12.29
패션 의류 분류 (Fashion Classification)  (0) 2021.09.15
Fashion MNIST  (0) 2021.09.12