Files
su2-img/02_training.ipynb
Lukáš Trkan d7620979ee update
2026-04-21 01:14:25 +02:00

569 lines
43 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 02 — Trénování YOLOv8 na VisDrone\n",
"\n",
"Trénujeme YOLOv8s (small) fine-tuned z ImageNet vah na VisDrone dataset.\n",
"Model detekuje 4 třídy vozidel z leteckých snímků.\n",
"\n",
"**GPU doporučeno** (trénink na CPU trvá ~10× déle)."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\u001b[33mWARNING: Running pip as the 'root' user can result in broken permissions and conflicting behaviour with the system package manager, possibly rendering your system unusable.It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv. Use the --root-user-action option if you know what you are doing and want to suppress this warning.\u001b[0m\u001b[33m\n",
"\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m A new release of pip is available: \u001b[0m\u001b[31;49m24.2\u001b[0m\u001b[39;49m -> \u001b[0m\u001b[32;49m26.0.1\u001b[0m\n",
"\u001b[1m[\u001b[0m\u001b[34;49mnotice\u001b[0m\u001b[1;39;49m]\u001b[0m\u001b[39;49m To update, run: \u001b[0m\u001b[32;49mpython -m pip install --upgrade pip\u001b[0m\n",
"PyTorch: 2.4.1+cu124\n",
"CUDA dostupná: True\n",
"GPU: NVIDIA GeForce RTX 4090\n"
]
}
],
"source": [
"!pip install ultralytics --quiet\n",
"\n",
"import torch\n",
"print(f\"PyTorch: {torch.__version__}\")\n",
"print(f\"CUDA dostupná: {torch.cuda.is_available()}\")\n",
"if torch.cuda.is_available():\n",
" print(f\"GPU: {torch.cuda.get_device_name(0)}\")\n",
"elif torch.backends.mps.is_available():\n",
" print(\"MPS (Apple Silicon) dostupné\")"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Creating new Ultralytics Settings v0.0.6 file ✅ \n",
"View Ultralytics Settings with 'yolo settings' or at '/root/.config/Ultralytics/settings.json'\n",
"Update Settings with 'yolo settings key=value', i.e. 'yolo settings runs_dir=path/to/dir'. For help see https://docs.ultralytics.com/quickstart/#ultralytics-settings.\n",
"Downloading https://github.com/ultralytics/assets/releases/download/v8.4.0/yolov8s.pt to 'yolov8s.pt': 100% ━━━━━━━━━━━━ 21.5MB 119.1MB/s 0.2s\n",
"YOLOv8s summary: 129 layers, 11,166,560 parameters, 0 gradients, 28.8 GFLOPs\n",
"Model načten: (129, 11166560, 0, 28.816844800000002)\n"
]
}
],
"source": [
"from ultralytics import YOLO\n",
"from pathlib import Path\n",
"\n",
"YAML = Path(\"data/yolo_visdrone/dataset.yaml\")\n",
"assert YAML.exists(), f\"Nejprve spusť 01_dataset_prep.ipynb! Chybí: {YAML}\"\n",
"\n",
"# Zvolíme YOLOv8s — dobrý poměr přesnosti a rychlosti\n",
"# Alternativy: yolov8n (nejrychlejší), yolov8m (přesnější)\n",
"model = YOLO(\"yolov8s.pt\") # stáhne předtrénované ImageNet váhy\n",
"print(\"Model načten:\", model.info())"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Trénink na: cuda\n",
"Ultralytics 8.4.40 🚀 Python-3.11.10 torch-2.4.1+cu124 CUDA:0 (NVIDIA GeForce RTX 4090, 24210MiB)\n",
"\u001b[34m\u001b[1mengine/trainer: \u001b[0magnostic_nms=False, amp=True, angle=1.0, augment=False, auto_augment=randaugment, batch=16, bgr=0.0, box=7.5, cache=False, cfg=None, classes=None, close_mosaic=10, cls=0.5, cls_pw=0.0, compile=False, conf=None, copy_paste=0.0, copy_paste_mode=flip, cos_lr=False, cutmix=0.0, data=data/yolo_visdrone/dataset.yaml, degrees=15.0, deterministic=True, device=0, dfl=1.5, dnn=False, dropout=0.0, dynamic=False, embed=None, end2end=None, epochs=50, erasing=0.4, exist_ok=False, fliplr=0.5, flipud=0.5, format=torchscript, fraction=1.0, freeze=None, half=False, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, imgsz=640, int8=False, iou=0.7, keras=False, kobj=1.0, line_width=None, lr0=0.01, lrf=0.01, mask_ratio=4, max_det=300, mixup=0.0, mode=train, model=yolov8s.pt, momentum=0.937, mosaic=1.0, multi_scale=0.0, name=visdrone_vehicles, nbs=64, nms=False, opset=None, optimize=False, optimizer=auto, overlap_mask=True, patience=10, perspective=0.0, plots=True, pose=12.0, pretrained=True, profile=False, project=runs/train, rect=False, resume=False, retina_masks=False, rle=1.0, save=True, save_conf=False, save_crop=False, save_dir=/workspace/projekt/runs/detect/runs/train/visdrone_vehicles, save_frames=False, save_json=False, save_period=10, save_txt=False, scale=0.5, seed=0, shear=0.0, show=False, show_boxes=True, show_conf=True, show_labels=True, simplify=True, single_cls=False, source=None, split=val, stream_buffer=False, task=detect, time=None, tracker=botsort.yaml, translate=0.1, val=True, verbose=True, vid_stride=1, visualize=False, warmup_bias_lr=0.1, warmup_epochs=3.0, warmup_momentum=0.8, weight_decay=0.0005, workers=8, workspace=None\n",
"Downloading https://ultralytics.com/assets/Arial.ttf to '/root/.config/Ultralytics/Arial.ttf': 100% ━━━━━━━━━━━━ 755.1KB 19.0MB/s 0.0s\n",
"Overriding model.yaml nc=80 with nc=4\n",
"\n",
" from n params module arguments \n",
" 0 -1 1 928 ultralytics.nn.modules.conv.Conv [3, 32, 3, 2] \n",
" 1 -1 1 18560 ultralytics.nn.modules.conv.Conv [32, 64, 3, 2] \n",
" 2 -1 1 29056 ultralytics.nn.modules.block.C2f [64, 64, 1, True] \n",
" 3 -1 1 73984 ultralytics.nn.modules.conv.Conv [64, 128, 3, 2] \n",
" 4 -1 2 197632 ultralytics.nn.modules.block.C2f [128, 128, 2, True] \n",
" 5 -1 1 295424 ultralytics.nn.modules.conv.Conv [128, 256, 3, 2] \n",
" 6 -1 2 788480 ultralytics.nn.modules.block.C2f [256, 256, 2, True] \n",
" 7 -1 1 1180672 ultralytics.nn.modules.conv.Conv [256, 512, 3, 2] \n",
" 8 -1 1 1838080 ultralytics.nn.modules.block.C2f [512, 512, 1, True] \n",
" 9 -1 1 656896 ultralytics.nn.modules.block.SPPF [512, 512, 5] \n",
" 10 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] \n",
" 11 [-1, 6] 1 0 ultralytics.nn.modules.conv.Concat [1] \n",
" 12 -1 1 591360 ultralytics.nn.modules.block.C2f [768, 256, 1] \n",
" 13 -1 1 0 torch.nn.modules.upsampling.Upsample [None, 2, 'nearest'] \n",
" 14 [-1, 4] 1 0 ultralytics.nn.modules.conv.Concat [1] \n",
" 15 -1 1 148224 ultralytics.nn.modules.block.C2f [384, 128, 1] \n",
" 16 -1 1 147712 ultralytics.nn.modules.conv.Conv [128, 128, 3, 2] \n",
" 17 [-1, 12] 1 0 ultralytics.nn.modules.conv.Concat [1] \n",
" 18 -1 1 493056 ultralytics.nn.modules.block.C2f [384, 256, 1] \n",
" 19 -1 1 590336 ultralytics.nn.modules.conv.Conv [256, 256, 3, 2] \n",
" 20 [-1, 9] 1 0 ultralytics.nn.modules.conv.Concat [1] \n",
" 21 -1 1 1969152 ultralytics.nn.modules.block.C2f [768, 512, 1] \n",
" 22 [15, 18, 21] 1 2117596 ultralytics.nn.modules.head.Detect [4, 16, None, [128, 256, 512]]\n",
"Model summary: 130 layers, 11,137,148 parameters, 11,137,132 gradients, 28.7 GFLOPs\n",
"\n",
"Transferred 349/355 items from pretrained weights\n",
"Freezing layer 'model.22.dfl.conv.weight'\n",
"\u001b[34m\u001b[1mAMP: \u001b[0mrunning Automatic Mixed Precision (AMP) checks...\n",
"Downloading https://github.com/ultralytics/assets/releases/download/v8.4.0/yolo26n.pt to 'yolo26n.pt': 100% ━━━━━━━━━━━━ 5.3MB 66.2MB/s 0.1s\n",
"\u001b[34m\u001b[1mAMP: \u001b[0mchecks passed ✅\n",
"\u001b[34m\u001b[1mtrain: \u001b[0mFast image access ✅ (ping: 0.2±0.1 ms, read: 78.2±41.0 MB/s, size: 260.7 KB)\n",
"\u001b[34m\u001b[1mtrain: \u001b[0mScanning /workspace/projekt/data/yolo_visdrone/train/labels... 6471 images, 279 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 6471/6471 635.9it/s 10.2s\n",
"\u001b[34m\u001b[1mtrain: \u001b[0m/workspace/projekt/data/yolo_visdrone/train/images/0000140_00118_d_0000002.jpg: 1 duplicate labels removed\n",
"\u001b[34m\u001b[1mtrain: \u001b[0mNew cache created: /workspace/projekt/data/yolo_visdrone/train/labels.cache\n",
"\u001b[34m\u001b[1mval: \u001b[0mFast image access ✅ (ping: 0.2±0.0 ms, read: 56.8±15.7 MB/s, size: 142.1 KB)\n",
"\u001b[34m\u001b[1mval: \u001b[0mScanning /workspace/projekt/data/yolo_visdrone/val/labels... 548 images, 29 backgrounds, 0 corrupt: 100% ━━━━━━━━━━━━ 548/548 777.4it/s 0.7s\n",
"\u001b[34m\u001b[1mval: \u001b[0mNew cache created: /workspace/projekt/data/yolo_visdrone/val/labels.cache\n",
"\u001b[34m\u001b[1moptimizer:\u001b[0m 'optimizer=auto' found, ignoring 'lr0=0.01' and 'momentum=0.937' and determining best 'optimizer', 'lr0' and 'momentum' automatically... \n",
"\u001b[34m\u001b[1moptimizer:\u001b[0m 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)\n",
"Plotting labels to /workspace/projekt/runs/detect/runs/train/visdrone_vehicles/labels.jpg... \n",
"Image sizes 640 train, 640 val\n",
"Using 8 dataloader workers\n",
"Logging results to \u001b[1m/workspace/projekt/runs/detect/runs/train/visdrone_vehicles\u001b[0m\n",
"Starting training for 50 epochs...\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 1/50 6.74G 1.681 1.528 1.078 120 640: 100% ━━━━━━━━━━━━ 405/405 13.4it/s 30.3s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 5.7it/s 3.2s\n",
" all 548 17040 0.364 0.302 0.271 0.148\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 2/50 7.48G 1.561 1.225 1.018 411 640: 100% ━━━━━━━━━━━━ 405/405 14.8it/s 27.4s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.0it/s 2.6s\n",
" all 548 17040 0.479 0.293 0.301 0.178\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 3/50 7.5G 1.538 1.186 1.007 316 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.7s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 5.5it/s 3.2s\n",
" all 548 17040 0.384 0.342 0.304 0.167\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 4/50 7.5G 1.503 1.155 0.998 229 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.8s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 5.6it/s 3.2s\n",
" all 548 17040 0.487 0.33 0.329 0.206\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 5/50 7.5G 1.465 1.105 0.9862 296 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.8s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 6.6it/s 2.7s\n",
" all 548 17040 0.489 0.348 0.345 0.198\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 6/50 7.5G 1.453 1.075 0.9789 307 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.2s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 5.9it/s 3.0s\n",
" all 548 17040 0.55 0.362 0.385 0.21\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 7/50 7.5G 1.433 1.058 0.9745 352 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.1s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 6.7it/s 2.7s\n",
" all 548 17040 0.526 0.367 0.385 0.238\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 8/50 7.5G 1.411 1.033 0.9689 130 640: 100% ━━━━━━━━━━━━ 405/405 15.8it/s 25.7s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.9it/s 2.3s\n",
" all 548 17040 0.544 0.38 0.396 0.251\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 9/50 7.5G 1.391 1.016 0.9621 362 640: 100% ━━━━━━━━━━━━ 405/405 15.4it/s 26.4s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.7it/s 2.1s\n",
" all 548 17040 0.533 0.391 0.408 0.257\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 10/50 7.5G 1.37 1 0.9538 251 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.0s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.4it/s 2.2s\n",
" all 548 17040 0.56 0.366 0.383 0.239\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 11/50 7.5G 1.359 0.9788 0.9528 315 640: 100% ━━━━━━━━━━━━ 405/405 15.4it/s 26.3s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.2it/s 2.5s\n",
" all 548 17040 0.528 0.393 0.408 0.248\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 12/50 8.27G 1.349 0.9773 0.9515 194 640: 100% ━━━━━━━━━━━━ 405/405 16.2it/s 25.0s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.3it/s 1.9s\n",
" all 548 17040 0.569 0.408 0.424 0.266\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 13/50 8.27G 1.338 0.9568 0.9487 302 640: 100% ━━━━━━━━━━━━ 405/405 16.1it/s 25.2s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.8it/s 2.3s\n",
" all 548 17040 0.586 0.403 0.43 0.272\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 14/50 8.27G 1.329 0.9541 0.9422 212 640: 100% ━━━━━━━━━━━━ 405/405 15.6it/s 25.9s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.9it/s 2.3s\n",
" all 548 17040 0.583 0.421 0.452 0.282\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 15/50 8.27G 1.327 0.9459 0.9386 312 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.2s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.6it/s 2.1s\n",
" all 548 17040 0.592 0.424 0.453 0.289\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 16/50 8.27G 1.316 0.9352 0.9406 391 640: 100% ━━━━━━━━━━━━ 405/405 15.3it/s 26.4s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.6it/s 2.1s\n",
" all 548 17040 0.577 0.417 0.442 0.276\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 17/50 8.27G 1.302 0.9241 0.9354 289 640: 100% ━━━━━━━━━━━━ 405/405 15.9it/s 25.5s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.8it/s 2.0s\n",
" all 548 17040 0.615 0.41 0.455 0.286\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 18/50 8.27G 1.296 0.9194 0.9328 343 640: 100% ━━━━━━━━━━━━ 405/405 15.4it/s 26.3s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.9it/s 2.0s\n",
" all 548 17040 0.613 0.395 0.436 0.28\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 19/50 8.27G 1.285 0.9064 0.9314 176 640: 100% ━━━━━━━━━━━━ 405/405 15.4it/s 26.3s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.7it/s 2.3s\n",
" all 548 17040 0.596 0.427 0.454 0.287\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 20/50 8.27G 1.272 0.8993 0.9273 419 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.8s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.5it/s 2.1s\n",
" all 548 17040 0.603 0.414 0.452 0.294\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 21/50 8.27G 1.266 0.8915 0.9256 368 640: 100% ━━━━━━━━━━━━ 405/405 15.8it/s 25.7s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.4it/s 2.4s\n",
" all 548 17040 0.635 0.433 0.479 0.303\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 22/50 8.27G 1.252 0.8861 0.9235 399 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.1s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.6it/s 2.1s\n",
" all 548 17040 0.639 0.433 0.472 0.299\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 23/50 8.27G 1.249 0.8802 0.9229 323 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.8s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.6it/s 2.1s\n",
" all 548 17040 0.616 0.427 0.467 0.305\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 24/50 8.27G 1.232 0.8676 0.9185 515 640: 100% ━━━━━━━━━━━━ 405/405 15.4it/s 26.3s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.9it/s 2.3s\n",
" all 548 17040 0.64 0.42 0.471 0.308\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 25/50 8.27G 1.23 0.8628 0.917 293 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.8s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.4it/s 2.1s\n",
" all 548 17040 0.592 0.45 0.478 0.31\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 26/50 9.3G 1.231 0.8637 0.9194 339 640: 100% ━━━━━━━━━━━━ 405/405 15.6it/s 25.9s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.2it/s 2.2s\n",
" all 548 17040 0.635 0.418 0.467 0.305\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 27/50 9.3G 1.217 0.8563 0.9122 342 640: 100% ━━━━━━━━━━━━ 405/405 15.2it/s 26.7s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.0it/s 2.2s\n",
" all 548 17040 0.643 0.436 0.484 0.314\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 28/50 9.3G 1.213 0.8475 0.9091 387 640: 100% ━━━━━━━━━━━━ 405/405 15.6it/s 25.9s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.8it/s 2.3s\n",
" all 548 17040 0.622 0.449 0.486 0.31\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 29/50 9.3G 1.21 0.8415 0.9099 393 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.1s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.3it/s 2.2s\n",
" all 548 17040 0.604 0.452 0.488 0.32\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 30/50 9.3G 1.203 0.8385 0.9082 296 640: 100% ━━━━━━━━━━━━ 405/405 15.6it/s 26.0s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.8it/s 2.0s\n",
" all 548 17040 0.604 0.452 0.487 0.311\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 31/50 9.3G 1.186 0.8276 0.9057 187 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.1s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.7it/s 1.9s\n",
" all 548 17040 0.607 0.46 0.495 0.322\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 32/50 9.3G 1.194 0.8245 0.9052 312 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.2s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 7.9it/s 2.3s\n",
" all 548 17040 0.652 0.451 0.502 0.327\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 33/50 9.3G 1.185 0.8258 0.9068 385 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.9s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.6it/s 2.1s\n",
" all 548 17040 0.603 0.474 0.499 0.322\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 34/50 9.3G 1.181 0.8198 0.9028 300 640: 100% ━━━━━━━━━━━━ 405/405 15.4it/s 26.2s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.9it/s 2.0s\n",
" all 548 17040 0.651 0.451 0.5 0.326\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 35/50 9.3G 1.175 0.8094 0.9012 312 640: 100% ━━━━━━━━━━━━ 405/405 15.3it/s 26.5s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 10.6it/s 1.7s\n",
" all 548 17040 0.622 0.455 0.494 0.326\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 36/50 9.3G 1.167 0.8011 0.9009 399 640: 100% ━━━━━━━━━━━━ 405/405 15.8it/s 25.6s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.7it/s 1.8s\n",
" all 548 17040 0.634 0.452 0.499 0.33\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 37/50 9.3G 1.161 0.7976 0.9003 318 640: 100% ━━━━━━━━━━━━ 405/405 15.6it/s 26.0s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.9it/s 2.0s\n",
" all 548 17040 0.625 0.475 0.509 0.335\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 38/50 9.3G 1.164 0.7973 0.8987 280 640: 100% ━━━━━━━━━━━━ 405/405 15.4it/s 26.4s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.5it/s 1.9s\n",
" all 548 17040 0.625 0.482 0.517 0.34\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 39/50 9.3G 1.155 0.7871 0.8957 475 640: 100% ━━━━━━━━━━━━ 405/405 15.6it/s 25.9s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.2it/s 2.0s\n",
" all 548 17040 0.64 0.466 0.512 0.334\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 40/50 9.3G 1.151 0.7872 0.8961 274 640: 100% ━━━━━━━━━━━━ 405/405 15.7it/s 25.8s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.5it/s 1.9s\n",
" all 548 17040 0.644 0.471 0.51 0.334\n",
"Closing dataloader mosaic\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 41/50 9.3G 1.115 0.7576 0.8965 134 640: 100% ━━━━━━━━━━━━ 405/405 15.6it/s 26.0s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.3it/s 1.9s\n",
" all 548 17040 0.645 0.466 0.505 0.33\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 42/50 9.3G 1.105 0.7458 0.895 193 640: 100% ━━━━━━━━━━━━ 405/405 15.8it/s 25.7s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 8.9it/s 2.0s\n",
" all 548 17040 0.659 0.451 0.51 0.334\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 43/50 9.3G 1.099 0.7388 0.8945 119 640: 100% ━━━━━━━━━━━━ 405/405 16.1it/s 25.2s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.0it/s 2.0s\n",
" all 548 17040 0.589 0.486 0.505 0.335\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 44/50 9.3G 1.091 0.7312 0.8914 272 640: 100% ━━━━━━━━━━━━ 405/405 15.5it/s 26.1s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.3it/s 1.9s\n",
" all 548 17040 0.619 0.476 0.504 0.335\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 45/50 9.3G 1.086 0.7252 0.8911 180 640: 100% ━━━━━━━━━━━━ 405/405 16.1it/s 25.1s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.7it/s 1.9s\n",
" all 548 17040 0.638 0.468 0.506 0.338\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 46/50 9.3G 1.084 0.7237 0.8881 140 640: 100% ━━━━━━━━━━━━ 405/405 16.1it/s 25.1s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.6it/s 1.9s\n",
" all 548 17040 0.669 0.453 0.51 0.336\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 47/50 9.3G 1.078 0.7178 0.8877 187 640: 100% ━━━━━━━━━━━━ 405/405 16.2it/s 25.0s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.7it/s 1.8s\n",
" all 548 17040 0.663 0.458 0.512 0.339\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 48/50 9.3G 1.072 0.7115 0.8862 265 640: 100% ━━━━━━━━━━━━ 405/405 15.9it/s 25.4s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.6it/s 1.9s\n",
" all 548 17040 0.646 0.465 0.512 0.341\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 49/50 9.3G 1.073 0.7076 0.8848 238 640: 100% ━━━━━━━━━━━━ 405/405 16.0it/s 25.3s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.6it/s 1.9s\n",
" all 548 17040 0.632 0.468 0.515 0.343\n",
"\n",
" Epoch GPU_mem box_loss cls_loss dfl_loss Instances Size\n",
" 50/50 9.3G 1.062 0.7007 0.8852 221 640: 100% ━━━━━━━━━━━━ 405/405 16.3it/s 24.9s\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 9.7it/s 1.8s\n",
" all 548 17040 0.649 0.463 0.514 0.343\n",
"\n",
"50 epochs completed in 0.402 hours.\n",
"Optimizer stripped from /workspace/projekt/runs/detect/runs/train/visdrone_vehicles/weights/last.pt, 22.5MB\n",
"Optimizer stripped from /workspace/projekt/runs/detect/runs/train/visdrone_vehicles/weights/best.pt, 22.5MB\n",
"\n",
"Validating /workspace/projekt/runs/detect/runs/train/visdrone_vehicles/weights/best.pt...\n",
"Ultralytics 8.4.40 🚀 Python-3.11.10 torch-2.4.1+cu124 CUDA:0 (NVIDIA GeForce RTX 4090, 24210MiB)\n",
"Model summary (fused): 73 layers, 11,127,132 parameters, 0 gradients, 28.4 GFLOPs\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 18/18 6.4it/s 2.8s\n",
" all 548 17040 0.648 0.463 0.514 0.343\n",
" car 515 14064 0.752 0.751 0.772 0.51\n",
" van 421 1975 0.6 0.368 0.425 0.285\n",
" truck 266 750 0.579 0.3 0.342 0.223\n",
" bus 131 251 0.661 0.435 0.515 0.353\n",
"Speed: 0.0ms preprocess, 0.3ms inference, 0.0ms loss, 1.0ms postprocess per image\n",
"Results saved to \u001b[1m/workspace/projekt/runs/detect/runs/train/visdrone_vehicles\u001b[0m\n"
]
}
],
"source": [
"import torch\n",
"\n",
"# Detekce dostupného zařízení\n",
"if torch.cuda.is_available():\n",
" DEVICE = \"cuda\"\n",
"elif torch.backends.mps.is_available():\n",
" DEVICE = \"mps\"\n",
"else:\n",
" DEVICE = \"cpu\"\n",
"\n",
"print(f\"Trénink na: {DEVICE}\")\n",
"\n",
"results = model.train(\n",
" data=str(YAML),\n",
" epochs=50,\n",
" imgsz=640,\n",
" batch=16,\n",
" device=DEVICE,\n",
" name=\"visdrone_vehicles\",\n",
" project=\"runs/train\",\n",
" patience=10, # early stopping\n",
" save=True,\n",
" save_period=10,\n",
" val=True,\n",
" plots=True,\n",
" # Augmentace pro letecké snímky\n",
" degrees=15.0, # rotace\n",
" flipud=0.5, # vertikální flip\n",
" fliplr=0.5,\n",
" mosaic=1.0,\n",
" scale=0.5,\n",
")"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"# Zobrazení tréninkových grafů\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.image as mpimg\n",
"from pathlib import Path\n",
"import glob\n",
"\n",
"run_dir = Path(\"runs/train/visdrone_vehicles\")\n",
"\n",
"for plot_name in [\"results.png\", \"confusion_matrix.png\", \"PR_curve.png\", \"val_batch0_pred.jpg\"]:\n",
" p = run_dir / plot_name\n",
" if p.exists():\n",
" fig, ax = plt.subplots(figsize=(12, 6))\n",
" ax.imshow(mpimg.imread(p))\n",
" ax.axis(\"off\")\n",
" ax.set_title(plot_name)\n",
" plt.tight_layout()\n",
" plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Ultralytics 8.4.40 🚀 Python-3.11.10 torch-2.4.1+cu124 CUDA:0 (NVIDIA GeForce RTX 4090, 24210MiB)\n",
"Model summary (fused): 73 layers, 11,127,132 parameters, 0 gradients, 28.4 GFLOPs\n",
"\u001b[34m\u001b[1mval: \u001b[0mFast image access ✅ (ping: 0.2±0.0 ms, read: 137.7±69.7 MB/s, size: 126.7 KB)\n",
"\n",
" Class Images Instances Box(P R mAP50 mAP50-95): 100% ━━━━━━━━━━━━ 35/35 10.5it/s 3.3s\n",
" all 548 17040 0.651 0.465 0.515 0.344\n",
" car 515 14064 0.753 0.751 0.774 0.511\n",
" van 421 1975 0.604 0.369 0.426 0.286\n",
" truck 266 750 0.578 0.3 0.342 0.224\n",
" bus 131 251 0.667 0.44 0.518 0.354\n",
"Speed: 0.6ms preprocess, 1.3ms inference, 0.0ms loss, 0.9ms postprocess per image\n",
"Results saved to \u001b[1m/workspace/projekt/runs/detect/val\u001b[0m\n",
"\n",
"mAP50: 0.5151\n",
"mAP50-95: 0.3438\n",
" AP50[car]: 0.7742\n",
" AP50[van]: 0.4262\n",
" AP50[truck]: 0.3418\n",
" AP50[bus]: 0.5181\n"
]
}
],
"source": [
"# Validace nejlepšího modelu\n",
"best_weights = Path(\"runs/detect/runs/train/visdrone_vehicles/weights/best.pt\")\n",
"assert best_weights.exists(), \"Trénink ještě neproběhl nebo selhal\"\n",
"\n",
"model_best = YOLO(str(best_weights))\n",
"val_results = model_best.val(data=str(YAML), imgsz=640, split=\"val\")\n",
"\n",
"print(f\"\\nmAP50: {val_results.box.map50:.4f}\")\n",
"print(f\"mAP50-95: {val_results.box.map:.4f}\")\n",
"for i, cls in enumerate([\"car\", \"van\", \"truck\", \"bus\"]):\n",
" ap = val_results.box.ap50[i] if i < len(val_results.box.ap50) else float('nan')\n",
" print(f\" AP50[{cls}]: {ap:.4f}\")"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Nejlepší model uložen v: runs/detect/runs/train/visdrone_vehicles/weights/best.pt\n",
"Konfigurace zapsána do: model_config.json\n"
]
}
],
"source": [
"# Uložení cesty k nejlepšímu modelu pro další notebooky\n",
"import json\n",
"\n",
"config = {\"best_model\": str(best_weights.resolve())}\n",
"with open(\"model_config.json\", \"w\") as f:\n",
" json.dump(config, f)\n",
"\n",
"print(f\"Nejlepší model uložen v: {best_weights}\")\n",
"print(f\"Konfigurace zapsána do: model_config.json\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.11.10"
}
},
"nbformat": 4,
"nbformat_minor": 4
}