JUST WRITE

[Vision] 엔지니어의 Yolo 도전기(3) - Yolo 모델 Train 본문

AI

[Vision] 엔지니어의 Yolo 도전기(3) - Yolo 모델 Train

천재보단범재 2023. 4. 27. 16:04

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 환경 구성은 아래 포스팅에 참고해 주시길 바랍니다.

 

AWS EC2에서 GPU를 사용하려면?!

AWS EC2 GPU를 사용하려면?! 딥러닝 작업은 단순사칙연산을 수행합니다. 단순사칙연산 작업은 CPU보다는 GPU에 작업 시 효율적으로 동작합니다. GPU 서버에서 GPU를 활용해서 딥러닝 작업을 하려면 추

developnote-blog.tistory.com

그럼 준비한 DataSet으로 어떻게 Yolo 모델을 Train을 할까요???

다행히 Yolo 모델 관련한 오픈소스가 있습니다.

 

GitHub - ultralytics/yolov5: YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite

YOLOv5 🚀 in PyTorch > ONNX > CoreML > TFLite. Contribute to ultralytics/yolov5 development by creating an account on GitHub.

github.com

해당 오픈소스를 통해 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도 제공합니다(아래 링크 참조)

 

Dataset Portioning · Issue #5405 · ultralytics/yolov5

Search before asking I have searched the YOLOv5 issues and discussions and found no similar questions. Question Hello @glenn-jocher et all, what is the ideal portion ratio for the tain:validation s...

github.com

저는 대략적으로 계산해서 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에서 확인할 수 있습니다.

 

What's the difference between last.pt&best.pt, and which one should i use when i test my custom data? · Issue #582 · ultralyti

I have tried your work of yolov3 on my custom data, and when i train on yolov5 i find that yolov5 is more excellent! I just train for 100 epochs, the map50 have reached at 80! And i will train more...

github.com

정리

엔지니어로써 무작정 Vision에 도전해 보았습니다.

Auto Labeling Tool인 CVAT과 가장 많이 쓰고 있는 Vision 모델인 Yolo를 접하였습니다.

Vision 모델링 관련해서 전체적인 흐름을 파악할 수 있었습니다.

VIsion 모델링 관련 파이프라인에 대한 전체 그림을 생각해 볼 수 있었습니다.

역시 한 번 직접 부딪혀봐야 머리로 이해하는 게 빠른 거 같습니다.

앞으로도 간단한 모델링을 도전해서 포스팅해보도록 하겠습니다.

728x90
반응형
Comments