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 |