Google Colab で BIRDS 525 データセットに物体検出のラベルを付けて YOLOv8 の training を実行

1. 概要

こちらのページに記載した BIRDS 525 データセットに物体検出のラベルを付けて YOLOv8 を training する操作を Google Colab の無料版を使って試しました。

Google Drive 無料版は 15 GB までですが、BIRDS 525 データセットは zip 圧縮された状態で 1.96 GB ですので無料版のままで実行できます。

ネットワーク規模が比較的小さい yolov8n を使用した 100 epoch の training を約 8 分 30 秒で完了させることができました。

2. Google Drive 上に BIRDS 525 データセットの圧縮ファイルをアップロード
2.1. BIRDS 525 SPECIES – IMAGE CLASSIFICATION データセットのダウンロード

こちらのページから BIRDS 525 SPECIES – IMAGE CLASSIFICATION データセットをダウンロードします。

2.2. Google Drive に archive.zip をアップロード

Google Drive に上記 2.1. でダウンロードした archive.zip をアップロードします。

3. Google Colab 上でのコマンドの実行
3.1. Google Drive のマウント

コードセルに下記の Python スクリプトを記述し、スクリプトを実行します。Google Drive が /content/drive にマウントされます。

from google.colab import drive
drive.mount('/content/drive')
3.2. BIRDS 525 圧縮ファイルの展開

コードセルに下記のように記述し、スクリプトを実行します。データ archive.zip を Google Drive から Google Colab にコピーし、展開しています。1 分 30 秒ほどで zip ファイルを展開することができました。

%%bash
mkdir -p kaggle/birds525
cd kaggle/birds525
cp /content/drive/MyDrive/kaggle/birds525/archive.zip .
unzip archive.zip
cd /content
補足:
コードセルに下記のように記述し、Google Drive 上でファイルを展開することも試してみました。Google Colab の接続が切れた場合にも展開したファイルが残るようにするためです。ですが、この場合には、zip ファイルの展開に 20 分ほどの時間を要しました。

データを Google Drive に置いて Google Colab から参照した場合、ニューラルネットワークの training にも時間を要するようです。再接続した際に展開し直す必要がありますが、データを Google Colab にコピーしてから展開するようにしたほうが良さそうです。

%%bash
cd /content/drive/MyDrive/kaggle/birds525/
unzip archive.zip
3.3. Ultralytics YOLO のインストール

コードセルに下記のように記述し、スクリプトを実行します。

%pip install ultralytics
import ultralytics
ultralytics.checks()
3.4. Ultralytics YOLO format のデータセットの作成

こちらのGitHubのページに BIRDS 525 データセットから Ultralytics YOLO format のデータセットを作成する Python スクリプトを用意しました。コードセルに下記のように記述し、スクリプトを実行します。

!git clone https://github.com/fukagai-takuya/birds525yolo.git

コードセルに下記のように記述し、スクリプトを実行します。下記のスクリプトは BIRDS 525 データセットから Ultralytics YOLO format のデータセットを作成します。
下記のスクリプトの /content/kaggle/birds525/ は展開された BIRDS 525 データセットの置かれたディレクトリです。/content/birds525-yolo-data は生成された Ultralytics YOLO format データセットの出力先ディレクトリです。

%%bash
mkdir birds525-yolo-data
cd birds525yolo
python3 ./create_yolo_dataset_from_birds525_limit_bird_species.py /content/kaggle/birds525/ /content/birds525-yolo-data
cd /content

下記のようなログが出力されます。こちらのページに記載しましたように、一羽しか鳥が写っていないはずなのに複数の鳥が検出された場合等、YOLO format の training データを生成する際 training データから除外した画像があります。除外した画像を処理したときは Failed で始まるメッセージを出力するようにしています。そのため、Failed で始まるメッセージが多く出力されますが、特に問題ありません。

/content/kaggle/birds525/ satisfy the requirement of birds525/archive/
Downloading https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov9c.pt to 'yolov9c.pt'...
YOLOv9c summary: 618 layers, 25,590,912 parameters, 0 gradients, 104.0 GFLOPs
valid
Failed: len(boxes.cls):2, label_name:BLUE HERON, image_file:2.jpg
success_counter: 19
...
failure_counter_single_bird_multiple_objects: 1
train
Failed: number_of_birds:0, label_name:BLUE HERON, image_file:088.jpg
...
Failed: number_of_birds:2, label_name:ROCK DOVE, image_file:115.jpg
success_counter: 471
failure_counter_results_not_one: 0
failure_counter_no_birds: 11
failure_counter_multiple_birds: 65
failure_counter_single_bird_multiple_objects: 25
100%|██████████| 49.4M/49.4M [00:00<00:00, 362MB/s]
3.5. training コマンドの実行

コードセルに下記のように記述し、スクリプトを実行します。

model パラメータにセットしている yolov8n.pt は学習済みネットワークのデータです。短い training 時間となるよう、ネットワーク規模が比較的小さい yolov8n を学習済みネットワークとして指定しています。他のデータで学習したネットワークを初期値とし、今回用意したデータで training することになります。

data パラメータに渡しているのは生成した Ultralytics YOLO format データセットの data.yaml ファイルになります。

epochs はエポック数です。下記の例では 100 を指定していますので、用意した 1 セット分の training データを 100 回繰り返し使用してネットワークを training することになります。

BIRDS 525 データセットの画像サイズは 224 x 224 pixel で、それよりも大きなデフォルトの画像サイズ 640 で training したときは学習が進みませんでした。そのため、imgsz=224 のように画像サイズをパラメータとして渡しています。

!yolo train model=yolov8n.pt data=/content/birds525-yolo-data/data.yaml epochs=100 imgsz=224

約 8 分 30 秒で training を完了させることができ、ログには下記のようなメッセージが出力されました。

Downloading https://github.com/ultralytics/assets/releases/download/v8.2.0/yolov8n.pt to 'yolov8n.pt'...
100% 6.25M/6.25M [00:00<00:00, 280MB/s]
Ultralytics YOLOv8.2.98 🚀 Python-3.10.12 torch-2.4.1+cu121 CUDA:0 (Tesla T4, 15102MiB)
engine/trainer: task=detect, mode=train, model=yolov8n.pt, data=/content/birds525-yolo-data/data.yaml, epochs=100, time=None, patience=100, batch=16, imgsz=224, save=True, save_period=-1, cache=False, device=None, workers=8, project=None, name=train, exist_ok=False, pretrained=True, optimizer=auto, verbose=True, seed=0, deterministic=True, single_cls=False, rect=False, cos_lr=False, close_mosaic=10, resume=False, amp=True, fraction=1.0, profile=False, freeze=None, multi_scale=False, overlap_mask=True, mask_ratio=4, dropout=0.0, val=True, split=val, save_json=False, save_hybrid=False, conf=None, iou=0.7, max_det=300, half=False, dnn=False, plots=True, source=None, vid_stride=1, stream_buffer=False, visualize=False, augment=False, agnostic_nms=False, classes=None, retina_masks=False, embed=None, show=False, save_frames=False, save_txt=False, save_conf=False, save_crop=False, show_labels=True, show_conf=True, show_boxes=True, line_width=None, format=torchscript, keras=False, optimize=False, int8=False, dynamic=False, simplify=False, opset=None, workspace=4, nms=False, 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=7.5, cls=0.5, dfl=1.5, pose=12.0, kobj=1.0, label_smoothing=0.0, nbs=64, 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, bgr=0.0, mosaic=1.0, mixup=0.0, copy_paste=0.0, auto_augment=randaugment, erasing=0.4, crop_fraction=1.0, cfg=None, tracker=botsort.yaml, save_dir=runs/detect/train
Downloading https://ultralytics.com/assets/Arial.ttf to '/root/.config/Ultralytics/Arial.ttf'...
100% 755k/755k [00:00<00:00, 130MB/s]
Overriding model.yaml nc=80 with nc=4

                   from  n    params  module                                       arguments                     
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]     

 ...
 ...
 ...

 22        [15, 18, 21]  1    752092  ultralytics.nn.modules.head.Detect           [4, [64, 128, 256]]           
Model summary: 225 layers, 3,011,628 parameters, 3,011,612 gradients, 8.2 GFLOPs

Transferred 319/355 items from pretrained weights
TensorBoard: Start with 'tensorboard --logdir runs/detect/train', view at http://localhost:6006/
Freezing layer 'model.22.dfl.conv.weight'
AMP: running Automatic Mixed Precision (AMP) checks with YOLOv8n...
AMP: checks passed ✅
train: Scanning /content/birds525-yolo-data/labels/train... 496 images, 0 backgrounds, 0 corrupt: 100% 496/496 [00:00<00:00, 1829.14it/s]
train: New cache created: /content/birds525-yolo-data/labels/train.cache
albumentations: Blur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01, num_output_channels=3, method='weighted_average'), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8))
/usr/lib/python3.10/multiprocessing/popen_fork.py:66: RuntimeWarning: os.fork() was called. os.fork() is incompatible with multithreaded code, and JAX is multithreaded, so this will likely lead to a deadlock.
  self.pid = os.fork()
val: Scanning /content/birds525-yolo-data/labels/val... 20 images, 0 backgrounds, 0 corrupt: 100% 20/20 [00:00<00:00, 1490.62it/s]
val: New cache created: /content/birds525-yolo-data/labels/val.cache
Plotting labels to runs/detect/train/labels.jpg... 
optimizer: 'optimizer=auto' found, ignoring 'lr0=0.01' and 'momentum=0.937' and determining best 'optimizer', 'lr0' and 'momentum' automatically... 
optimizer: AdamW(lr=0.00125, momentum=0.9) with parameter groups 57 weight(decay=0.0), 64 weight(decay=0.0005), 63 bias(decay=0.0)
TensorBoard: model graph visualization added ✅
Image sizes 224 train, 224 val
Using 2 dataloader workers
Logging results to runs/detect/train
Starting training for 100 epochs...

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
      1/100     0.386G     0.9005      3.037      1.234         41        224: 100% 31/31 [00:07<00:00,  4.10it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% 1/1 [00:01<00:00,  1.65s/it]
                   all         20         20     0.0162          1      0.489       0.44

      ...
      ...
      ...

      Epoch    GPU_mem   box_loss   cls_loss   dfl_loss  Instances       Size
    100/100     0.348G     0.1748      0.178     0.8938         16        224: 100% 31/31 [00:03<00:00,  9.97it/s]
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% 1/1 [00:00<00:00, 10.73it/s]
                   all         20         20      0.988          1      0.995      0.945

100 epochs completed in 0.132 hours.
Optimizer stripped from runs/detect/train/weights/last.pt, 6.2MB
Optimizer stripped from runs/detect/train/weights/best.pt, 6.2MB

Validating runs/detect/train/weights/best.pt...
Ultralytics YOLOv8.2.98 🚀 Python-3.10.12 torch-2.4.1+cu121 CUDA:0 (Tesla T4, 15102MiB)
Model summary (fused): 168 layers, 3,006,428 parameters, 0 gradients, 8.1 GFLOPs
                 Class     Images  Instances      Box(P          R      mAP50  mAP50-95): 100% 1/1 [00:00<00:00,  9.44it/s]
                   all         20         20      0.984          1      0.995      0.954
            BLUE HERON          5          5      0.984          1      0.995        0.9
  EUROPEAN TURTLE DOVE          5          5      0.976          1      0.995      0.995
          MALLARD DUCK          5          5      0.991          1      0.995      0.926
             ROCK DOVE          5          5      0.984          1      0.995      0.995
Speed: 0.0ms preprocess, 0.6ms inference, 0.0ms loss, 1.1ms postprocess per image
Results saved to runs/detect/train
💡 Learn more at https://docs.ultralytics.com/modes/train
3.6. training したネットワークで物体検出を実行

コードセルに下記のように記述し、スクリプトを実行します。

上記 3.5. で training したネットワークを使用した物体検出処理になります。
model パラメータで training 後に得られた重みデータ best.pt を指定しています。
source パラメータで指定した入力画像は BIRDS 525 データセットの test ディレクトリの画像で training には使用していません。

!yolo predict model=/content/runs/detect/train/weights/best.pt source="/content/kaggle/birds525/test/EUROPEAN TURTLE DOVE/1.jpg"

約 7 秒で実行され、ログには下記のようなメッセージが出力されました。

Ultralytics YOLOv8.2.98 🚀 Python-3.10.12 torch-2.4.1+cu121 CUDA:0 (Tesla T4, 15102MiB)
Model summary (fused): 168 layers, 3,006,428 parameters, 0 gradients, 8.1 GFLOPs

image 1/1 /content/kaggle/birds525/test/EUROPEAN TURTLE DOVE/1.jpg: 224x224 1 EUROPEAN TURTLE DOVE, 20.2ms
Speed: 1.3ms preprocess, 20.2ms inference, 858.0ms postprocess per image at shape (1, 3, 224, 224)
Results saved to runs/detect/predict
💡 Learn more at https://docs.ultralytics.com/modes/predict

左側のフォルダ内に表示された検出結果の画像 /content/runs/detect/predict/1.jpg をダブルクリックすると下の画像のような検出結果が表示されます。キジバト EUROPEAN TURTLE DOVE の検出に成功しています。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA