This commit is contained in:
Lukáš Trkan
2026-05-01 21:42:32 +02:00
parent 8df624f568
commit 2bd731620c
5 changed files with 435 additions and 185 deletions

View File

@@ -6,15 +6,25 @@
"source": [
"# 01 — Příprava datasetu VisDrone\n",
"\n",
"**VisDrone2019-DET** je veřejně dostupný dataset leteckých snímků s anotacemi vozidel.\n",
"**VisDrone2019-DET** je veřejně dostupný dataset dronových snímků s anotacemi vozidel.\n",
"Obsahuje třídy: `pedestrian, people, bicycle, car, van, truck, tricycle, awning-tricycle, bus, motor`.\n",
"\n",
"My použijeme pouze vozidlové třídy a převedeme anotace do formátu YOLO.\n",
"Použijeme pouze vozidlové třídy a převedeme anotace do formátu YOLO.\n",
"\n",
"**Citace:**\n",
"> Zhu, P., Wen, L., Du, D., et al. (2021). Detection and Tracking Meet Drones Challenge. *IEEE TPAMI*."
]
},
{
"cell_type": "markdown",
"id": "md-1d291f",
"metadata": {},
"source": [
"## Instalace závislostí\n",
"\n",
"Nainstalujeme potřebné knihovny: `ultralytics` (YOLOv8), `Pillow`, `tqdm`, `pandas` a `matplotlib` pro analýzu a vizualizaci."
]
},
{
"cell_type": "code",
"execution_count": 1,
@@ -36,9 +46,19 @@
"%pip install ultralytics Pillow tqdm requests pyyaml pandas matplotlib --quiet"
]
},
{
"cell_type": "markdown",
"id": "md-75919d",
"metadata": {},
"source": [
"## Stažení VisDrone datasetu\n",
"\n",
"VisDrone2019-DET je rozdělený na tři části (train/val/test). Každá část obsahuje letecké snímky a textové anotace."
]
},
{
"cell_type": "code",
"execution_count": 2,
"execution_count": 1,
"metadata": {},
"outputs": [
{
@@ -47,13 +67,13 @@
"text": [
"Stahuji train.zip ...\n",
"Rozbaluji train.zip ...\n",
" OK data/visdrone/VisDrone2019-DET-train\n",
" OK data/visdrone/VisDrone2019-DET-train\n",
"Stahuji val.zip ...\n",
"Rozbaluji val.zip ...\n",
" OK data/visdrone/VisDrone2019-DET-val\n",
" OK data/visdrone/VisDrone2019-DET-val\n",
"Stahuji test.zip ...\n",
"Rozbaluji test.zip ...\n",
" OK data/visdrone/VisDrone2019-DET-test-dev\n",
" OK data/visdrone/VisDrone2019-DET-test-dev\n",
"Dataset připraven.\n"
]
}
@@ -66,7 +86,6 @@
"DATA_DIR = Path(\"data/visdrone\")\n",
"DATA_DIR.mkdir(parents=True, exist_ok=True)\n",
"\n",
"# Mapování split → název složky (VisDrone používá plné názvy)\n",
"SPLIT_DIRS = {\n",
" \"train\": DATA_DIR / \"VisDrone2019-DET-train\",\n",
" \"val\": DATA_DIR / \"VisDrone2019-DET-val\",\n",
@@ -91,11 +110,19 @@
" print(f\"Rozbaluji {zip_path.name} ...\")\n",
" with zipfile.ZipFile(zip_path) as zf:\n",
" zf.extractall(DATA_DIR)\n",
" print(f\" OK {split_dir}\")\n",
" print(f\" OK {split_dir}\")\n",
"\n",
"print(\"Dataset připraven.\")"
]
},
{
"cell_type": "markdown",
"id": "md-c4fe96",
"metadata": {},
"source": [
"## Ověření struktury datasetu"
]
},
{
"cell_type": "code",
"execution_count": 3,
@@ -122,9 +149,19 @@
" print(f\"{split}: CHYBÍ ({split_dir})\")"
]
},
{
"cell_type": "markdown",
"id": "md-f2ffb4",
"metadata": {},
"source": [
"## Formát anotací VisDrone\n",
"\n",
"Každá řádka anotačního souboru obsahuje: `bbox_left, bbox_top, bbox_width, bbox_height, score, category, truncation, occlusion`."
]
},
{
"cell_type": "code",
"execution_count": 4,
"execution_count": null,
"metadata": {},
"outputs": [
{
@@ -149,8 +186,6 @@
}
],
"source": [
"# Ukázkový anotační soubor\n",
"# Formát: <bbox_left>,<bbox_top>,<bbox_width>,<bbox_height>,<score>,<category>,<truncation>,<occlusion>\n",
"import pandas as pd\n",
"\n",
"ann_dir = SPLIT_DIRS[\"train\"] / \"annotations\"\n",
@@ -162,9 +197,19 @@
"print(\"\\nRozdělení tříd:\", df[\"cat\"].value_counts().to_dict())"
]
},
{
"cell_type": "markdown",
"id": "md-3f6c92",
"metadata": {},
"source": [
"## Konverze anotací do formátu YOLO\n",
"\n",
"YOLO používá normalizované souřadnice středu ohraničovacího rámečku (cx, cy, w, h) v rozsahu 01. VisDrone má 10 tříd — my vybereme pouze 4 vozidlové: car, van, truck, bus. Pěší a cyklisté jsou pro tuto úlohu irelevantní."
]
},
{
"cell_type": "code",
"execution_count": 5,
"execution_count": null,
"metadata": {},
"outputs": [
{
@@ -219,12 +264,11 @@
"# 0=ignored, 1=pedestrian, 2=people, 3=bicycle, 4=car,\n",
"# 5=van, 6=truck, 7=tricycle, 8=awning-tricycle, 9=bus, 10=motor, 11=others\n",
"\n",
"# Přemapování na 4 vozidlové třídy\n",
"VISDRONE_TO_YOLO = {\n",
" 4: 0, # car car\n",
" 5: 1, # van van\n",
" 6: 2, # truck truck\n",
" 9: 3, # bus bus\n",
" 4: 0, # car -> car\n",
" 5: 1, # van -> van\n",
" 6: 2, # truck -> truck\n",
" 9: 3, # bus -> bus\n",
"}\n",
"CLASS_NAMES = [\"car\", \"van\", \"truck\", \"bus\"]\n",
"\n",
@@ -278,9 +322,19 @@
"print(\"Konverze hotova!\")"
]
},
{
"cell_type": "markdown",
"id": "md-4b68ce",
"metadata": {},
"source": [
"## Konfigurace datasetu (YAML)\n",
"\n",
"YOLOv8 potřebuje YAML soubor popisující cestu k datům a názvy tříd. "
]
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": null,
"metadata": {},
"outputs": [
{
@@ -302,7 +356,6 @@
}
],
"source": [
"# Vytvoření YAML konfigurace pro YOLOv8\n",
"import yaml\n",
"\n",
"cfg = {\n",
@@ -321,9 +374,19 @@
"print(yaml.dump(cfg, allow_unicode=True))"
]
},
{
"cell_type": "markdown",
"id": "md-a00834",
"metadata": {},
"source": [
"## Vizualizace anotací\n",
"\n",
"Vybereme několik trénovacích snímků a zobrazíme jejich anotace — každá třída je vyznačena jinou barvou rámečku."
]
},
{
"cell_type": "code",
"execution_count": 7,
"execution_count": null,
"metadata": {},
"outputs": [
{
@@ -345,7 +408,6 @@
}
],
"source": [
"# Vizualizace ukázkových anotací\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib.patches as patches\n",
"import random\n",
@@ -397,9 +459,17 @@
"show_sample()"
]
},
{
"cell_type": "markdown",
"id": "md-663f41",
"metadata": {},
"source": [
"## Statistiky datasetu"
]
},
{
"cell_type": "code",
"execution_count": 8,
"execution_count": null,
"metadata": {},
"outputs": [
{
@@ -424,7 +494,6 @@
}
],
"source": [
"# Statistiky datasetu\n",
"from collections import Counter\n",
"\n",
"for split in [\"train\", \"val\"]:\n",