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 の検出に成功しています。