일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- CSV
- docker
- OS
- kubectl
- kubeadm
- Python
- JavaScript
- tcp
- helm
- java
- Spring
- aws s3
- grafana
- MAC address
- airflow
- log
- AWS
- Vision
- Network
- zookeeper
- CVAT
- jvm
- PostgreSQL
- Packet
- EC2
- Kafka
- Operating System
- Trino
- kubernetes
- ip
- Today
- Total
JUST WRITE
[Vision] 엔지니어의 Yolo 도전기(3) - Yolo 모델 Train 본문
Yolo 모델 Trian
저번 포스팅에서 Yolo 모델을 Train 하기 위한 DataSet을 준비하였습니다.
CVAT을 통하여 샘플 Video에 있는 사람을 Labeling 하고 해당 Data를 COCO Data 포맷으로 변환하였습니다.
이번 포스팅에서는 준비한 DataSet으로 Yolo 모델을 Train 해보겠습니다.
Train 환경 준비
Train에 필요한 환경을 준비해야 합니다.
필수는 아니지만 빠른 Train을 위해서 GPU Server를 권장합니다.
저는 AWS EC2에서 Ubuntu p2.xlarge로 GPU Server를 준비하였습니다.
GPU Server 환경 구성은 아래 포스팅에 참고해 주시길 바랍니다.
그럼 준비한 DataSet으로 어떻게 Yolo 모델을 Train을 할까요???
다행히 Yolo 모델 관련한 오픈소스가 있습니다.
해당 오픈소스를 통해 python 코드 기반으로 Yolo 모델을 Train 할 수 있습니다.
해당 오픈소스를 이용하려면 python 3.7.0 이상의 버전이 필요합니다.
저는 pyenv를 통해 python 3.7.13 버전의 환경을 준비하였습니다.
pyenv 설치 관련해서 따로 포스팅해 정리하도록 하겠습니다.
python 환경이 준비되었으면 위 github 프로젝트(ultralytics)를 clone 합니다.
필요한 python 패키지도 설치합니다.
$ git clone https://github.com/ultralytics/yolov5 # clone
$ cd yolov5
$ pip install -r requirements.txt
모델 Train
이제 모델을 Train 할 환경이 준비되었습니다.
Train 하기 전 마지막으로 준비한 DataSet을 아래와 같이 3가지 나눕니다.
- Train
- Validation
- Test
보통 DataSet은 Train/Validation으로 나눌때는 70/30 비율로,
Train/Validation/Test으로 나눌 때는 70/20/10 비율로 나누게 됩니다.
ultralytics에서 Dataset을 나눠주는 function도 제공합니다(아래 링크 참조)
저는 대략적으로 계산해서 0~599는 Train, 600~699는 validation, 700~799는 Test으로 나눴습니다.
config yaml 파일을 생성하여 이미지 path와 label class를 설정해 줍니다.
$ vi custom.yaml
# path 설정
path: /home/ubuntu/workspace/yolov5/cvat
train: images/train
val: images/val
test: images/test
# label class 설정
nc: 1 # class 개수
names: ['person']
python 파일(train.py)을 실행해서 train을 진행합니다.
적절한 parameter를 넣어서 train을 진행합니다.
테스트이기 때문에 epoch는 5로 지정해서 train을 하였습니다.
python train.py
--data ./cvat/custom.yaml
--weights yolov5s.pt
--epochs 5
그리고 모델은 Yolo 모델 중에서 가장 작은 yolov5s로 진행하였습니다.
$ python train.py
--data ./cvat/custom.yaml
--weights yolov5s.pt
--epochs 5
train: weights=yolov5s.pt, cfg=, data=./cvat/custom.yaml, hyp=data/hyps/hyp.scratch-low.yaml, epochs=5, batch_size=16, imgsz=640, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, noplots=False, evolve=None, bucket=, cache=None, image_weights=False, device=, multi_scale=False, single_cls=False, optimizer=SGD, sync_bn=False, workers=8, project=runs/train, name=exp, exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, seed=0, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest
github: up to date with https://github.com/ultralytics/yolov5 ✅
requirements: /home/ubuntu/workspace/requirements.txt not found, check failed.
YOLOv5 🚀 v7.0-155-g8ecc727 Python-3.7.13 torch-1.13.1+cu117 CUDA:0 (Tesla K80, 11441MiB)
hyperparameters: lr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0
ClearML: run 'pip install clearml' to automatically track, visualize and remotely train YOLOv5 🚀 in ClearML
Comet: run 'pip install comet_ml' to automatically track and visualize YOLOv5 🚀 runs in Comet
TensorBoard: Start with 'tensorboard --logdir runs/train', view at http://localhost:6006/
Downloading https://ultralytics.com/assets/Arial.ttf to /home/ubuntu/.config/Ultralytics/Arial.ttf...
100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 755k/755k [00:00<00:00, 24.1MB/s]
Downloading https://github.com/ultralytics/yolov5/releases/download/v7.0/yolov5s.pt to yolov5s.pt...
100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 14.1M/14.1M [00:00<00:00, 156MB/s]
Overriding model.yaml nc=80 with nc=1
from n params module arguments
0 -1 1 3520 models.common.Conv [3, 32, 6, 2, 2]
1 -1 1 18560 models.common.Conv [32, 64, 3, 2]
2 -1 1 18816 models.common.C3 [64, 64, 1]
3 -1 1 73984 models.common.Conv [64, 128, 3, 2]
4 -1 2 115712 models.common.C3 [128, 128, 2]
5 -1 1 295424 models.common.Conv [128, 256, 3, 2]
6 -1 3 625152 models.common.C3 [256, 256, 3]
7 -1 1 1180672 models.common.Conv [256, 512, 3, 2]
8 -1 1 1182720 models.common.C3 [512, 512, 1]
9 -1 1 656896 models.common.SPPF [512, 512, 5]
10 -1 1 131584 models.common.Conv [512, 256, 1, 1]
11 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
12 [-1, 6] 1 0 models.common.Concat [1]
13 -1 1 361984 models.common.C3 [512, 256, 1, False]
14 -1 1 33024 models.common.Conv [256, 128, 1, 1]
15 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest']
16 [-1, 4] 1 0 models.common.Concat [1]
17 -1 1 90880 models.common.C3 [256, 128, 1, False]
18 -1 1 147712 models.common.Conv [128, 128, 3, 2]
19 [-1, 14] 1 0 models.common.Concat [1]
20 -1 1 296448 models.common.C3 [256, 256, 1, False]
21 -1 1 590336 models.common.Conv [256, 256, 3, 2]
22 [-1, 10] 1 0 models.common.Concat [1]
23 -1 1 1182720 models.common.C3 [512, 512, 1, False]
24 [17, 20, 23] 1 16182 models.yolo.Detect [1, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]
Model summary: 214 layers, 7022326 parameters, 7022326 gradients, 15.9 GFLOPs
Transferred 343/349 items from yolov5s.pt
AMP: checks passed ✅
optimizer: SGD(lr=0.01) with parameter groups 57 weight(decay=0.0), 60 weight(decay=0.0005), 60 bias
train: Scanning /home/ubuntu/workspace/yolov5/cvat/labels/train... 600 images, 0 backgrounds, 0 corrupt: 100%|██████████| 600/600 [00:00<00:00, 1054.19it/s]
train: WARNING ⚠️ /home/ubuntu/workspace/yolov5/cvat/images/train/frame_000000.PNG: 3 duplicate labels removed
train: WARNING ⚠️ /home/ubuntu/workspace/yolov5/cvat/images/train/frame_000055.PNG: 10 duplicate labels removed
train: WARNING ⚠️ /home/ubuntu/workspace/yolov5/cvat/images/train/frame_000068.PNG: 6 duplicate labels removed
train: WARNING ⚠️ /home/ubuntu/workspace/yolov5/cvat/images/train/frame_000184.PNG: 7 duplicate labels removed
train: New cache created: /home/ubuntu/workspace/yolov5/cvat/labels/train.cache
val: Scanning /home/ubuntu/workspace/yolov5/cvat/labels/val... 100 images, 0 backgrounds, 0 corrupt: 100%|██████████| 100/100 [00:00<00:00, 352.46it/s]
val: New cache created: /home/ubuntu/workspace/yolov5/cvat/labels/val.cache
AutoAnchor: 4.88 anchors/target, 1.000 Best Possible Recall (BPR). Current anchors are a good fit to dataset ✅
Plotting labels to runs/train/exp2/labels.jpg...
Image sizes 640 train, 640 val
Using 4 dataloader workers
Logging results to runs/train/exp2
Starting training for 5 epochs...
Epoch GPU_mem box_loss obj_loss cls_loss Instances Size
0/4 3.17G 0.1023 0.0584 0 79 640: 100%|██████████| 38/38 [00:40<00:00, 1.07s/it]
Class Images Instances P R mAP50 mAP50-95: 100%|██████████| 4/4 [00:03<00:00, 1.23it/s]
all 100 802 0.508 0.509 0.495 0.138
Epoch GPU_mem box_loss obj_loss cls_loss Instances Size
1/4 3.53G 0.07745 0.04294 0 82 640: 100%|██████████| 38/38 [00:37<00:00, 1.02it/s]
Class Images Instances P R mAP50 mAP50-95: 100%|██████████| 4/4 [00:02<00:00, 1.88it/s]
all 100 802 0.409 0.617 0.508 0.162
Epoch GPU_mem box_loss obj_loss cls_loss Instances Size
2/4 3.53G 0.07 0.0398 0 61 640: 100%|██████████| 38/38 [00:37<00:00, 1.02it/s]
Class Images Instances P R mAP50 mAP50-95: 100%|██████████| 4/4 [00:02<00:00, 1.98it/s]
all 100 802 0.401 0.631 0.488 0.178
Epoch GPU_mem box_loss obj_loss cls_loss Instances Size
3/4 3.53G 0.05852 0.03942 0 119 640: 100%|██████████| 38/38 [00:37<00:00, 1.02it/s]
Class Images Instances P R mAP50 mAP50-95: 100%|██████████| 4/4 [00:01<00:00, 2.03it/s]
all 100 802 0.768 0.754 0.813 0.37
Epoch GPU_mem box_loss obj_loss cls_loss Instances Size
4/4 3.53G 0.05506 0.04014 0 95 640: 100%|██████████| 38/38 [00:37<00:00, 1.01it/s]
Class Images Instances P R mAP50 mAP50-95: 100%|██████████| 4/4 [00:02<00:00, 2.00it/s]
all 100 802 0.686 0.739 0.712 0.228
5 epochs completed in 0.057 hours.
train이 완료되면 /runs/train/exp2/weights 폴더에 Train 한 모델이 생깁니다.
$ ll ./runs/train/exp2/weights/
total 28096
drwxrwxr-x 2 ubuntu ubuntu 4096 Apr 27 08:06 ./
drwxrwxr-x 3 ubuntu ubuntu 4096 Apr 27 08:09 ../
-rw-rw-r-- 1 ubuntu ubuntu 14378429 Apr 27 08:09 best.pt
-rw-rw-r-- 1 ubuntu ubuntu 14378429 Apr 27 08:09 last.pt
그럼 best.pt, last.pt 두 개의 모델이 나옵니다.
- best.pt -> training 중에 가장 좋은 epoch
- last.pt -> 마지막 epoch에 가중치
자세한 사항은 아래 github issue에서 확인할 수 있습니다.
정리
엔지니어로써 무작정 Vision에 도전해 보았습니다.
Auto Labeling Tool인 CVAT과 가장 많이 쓰고 있는 Vision 모델인 Yolo를 접하였습니다.
Vision 모델링 관련해서 전체적인 흐름을 파악할 수 있었습니다.
VIsion 모델링 관련 파이프라인에 대한 전체 그림을 생각해 볼 수 있었습니다.
역시 한 번 직접 부딪혀봐야 머리로 이해하는 게 빠른 거 같습니다.
앞으로도 간단한 모델링을 도전해서 포스팅해보도록 하겠습니다.
'AI' 카테고리의 다른 글
[Vision] GraphDB로 얼굴인식을?!?!(3) - GraphDB로 얼굴 인식하기 (0) | 2023.05.11 |
---|---|
[Vision] GraphDB로 얼굴인식을?!?!(2) - deepFace로 얼굴 이미지 Feature 추출 (0) | 2023.05.07 |
[Vision] GraphDB로 얼굴인식을?!?!(1) - neo4j 구축하기 (0) | 2023.04.29 |
[Vision] 엔지니어의 Yolo 도전기(2) - Train Dataset 준비 (2) | 2023.04.16 |
[Vision] 엔지니어의 Yolo 도전기(1) - CVAT을 통한 Auto Labeling (0) | 2023.04.09 |