microsoft/AI-For-Beginners
Publicmirrored fromhttps://github.com/microsoft/AI-For-BeginnersAvailable
translations/cs/examples/03-image-classifier.ipynb
395lines · modecode
| 1 | { |
| 2 | "cells": [ |
| 3 | { |
| 4 | "cell_type": "markdown", |
| 5 | "metadata": {}, |
| 6 | "source": [ |
| 7 | "# Jednoduchý klasifikátor obrázků\n", |
| 8 | "\n", |
| 9 | "Tento notebook vám ukáže, jak klasifikovat obrázky pomocí předem natrénované neuronové sítě.\n", |
| 10 | "\n", |
| 11 | "**Co se naučíte:**\n", |
| 12 | "- Jak načíst a použít předem natrénovaný model\n", |
| 13 | "- Předzpracování obrázků\n", |
| 14 | "- Provádění predikcí na obrázcích\n", |
| 15 | "- Porozumění skóre důvěryhodnosti\n", |
| 16 | "\n", |
| 17 | "**Použití:** Identifikace objektů na obrázcích (například \"kočka\", \"pes\", \"auto\" atd.)\n", |
| 18 | "\n", |
| 19 | "---\n" |
| 20 | ] |
| 21 | }, |
| 22 | { |
| 23 | "cell_type": "markdown", |
| 24 | "metadata": {}, |
| 25 | "source": [ |
| 26 | "## Krok 1: Importujte potřebné knihovny\n", |
| 27 | "\n", |
| 28 | "Importujeme nástroje, které budeme potřebovat. Nemějte obavy, pokud zatím všemu nerozumíte!\n" |
| 29 | ] |
| 30 | }, |
| 31 | { |
| 32 | "cell_type": "code", |
| 33 | "execution_count": null, |
| 34 | "metadata": {}, |
| 35 | "outputs": [], |
| 36 | "source": [ |
| 37 | "# Core libraries\n", |
| 38 | "import numpy as np\n", |
| 39 | "from PIL import Image\n", |
| 40 | "import requests\n", |
| 41 | "from io import BytesIO\n", |
| 42 | "\n", |
| 43 | "# TensorFlow for deep learning\n", |
| 44 | "try:\n", |
| 45 | " import tensorflow as tf\n", |
| 46 | " from tensorflow.keras.applications import MobileNetV2\n", |
| 47 | " from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions\n", |
| 48 | " print(\"✅ TensorFlow loaded successfully!\")\n", |
| 49 | " print(f\" Version: {tf.__version__}\")\n", |
| 50 | "except ImportError:\n", |
| 51 | " print(\"❌ Please install TensorFlow: pip install tensorflow\")" |
| 52 | ] |
| 53 | }, |
| 54 | { |
| 55 | "cell_type": "markdown", |
| 56 | "metadata": {}, |
| 57 | "source": [ |
| 58 | "## Krok 2: Načtení předem natrénovaného modelu\n", |
| 59 | "\n", |
| 60 | "Použijeme **MobileNetV2**, neuronovou síť, která byla již natrénována na milionech obrázků.\n", |
| 61 | "\n", |
| 62 | "Tomu se říká **Transfer Learning** - využití modelu, který natrénoval někdo jiný!\n" |
| 63 | ] |
| 64 | }, |
| 65 | { |
| 66 | "cell_type": "code", |
| 67 | "execution_count": null, |
| 68 | "metadata": {}, |
| 69 | "outputs": [], |
| 70 | "source": [ |
| 71 | "print(\"📦 Loading pre-trained MobileNetV2 model...\")\n", |
| 72 | "print(\" This may take a minute on first run (downloading weights)...\")\n", |
| 73 | "\n", |
| 74 | "# Load the model\n", |
| 75 | "# include_top=True means we use the classification layer\n", |
| 76 | "# weights='imagenet' means it was trained on ImageNet dataset\n", |
| 77 | "model = MobileNetV2(weights='imagenet', include_top=True)\n", |
| 78 | "\n", |
| 79 | "print(\"✅ Model loaded!\")\n", |
| 80 | "print(f\" The model can recognize 1000 different object categories\")" |
| 81 | ] |
| 82 | }, |
| 83 | { |
| 84 | "cell_type": "markdown", |
| 85 | "metadata": {}, |
| 86 | "source": [ |
| 87 | "## Krok 3: Pomocné funkce\n", |
| 88 | "\n", |
| 89 | "Vytvořme funkce pro načítání a přípravu obrázků pro náš model.\n" |
| 90 | ] |
| 91 | }, |
| 92 | { |
| 93 | "cell_type": "code", |
| 94 | "execution_count": null, |
| 95 | "metadata": {}, |
| 96 | "outputs": [], |
| 97 | "source": [ |
| 98 | "def load_image_from_url(url):\n", |
| 99 | " \"\"\"\n", |
| 100 | " Load an image from a URL.\n", |
| 101 | " \n", |
| 102 | " Args:\n", |
| 103 | " url: Web address of the image\n", |
| 104 | " \n", |
| 105 | " Returns:\n", |
| 106 | " PIL Image object\n", |
| 107 | " \"\"\"\n", |
| 108 | " response = requests.get(url)\n", |
| 109 | " img = Image.open(BytesIO(response.content))\n", |
| 110 | " return img\n", |
| 111 | "\n", |
| 112 | "\n", |
| 113 | "def prepare_image(img):\n", |
| 114 | " \"\"\"\n", |
| 115 | " Prepare an image for the model.\n", |
| 116 | " \n", |
| 117 | " Steps:\n", |
| 118 | " 1. Resize to 224x224 (model's expected size)\n", |
| 119 | " 2. Convert to array\n", |
| 120 | " 3. Add batch dimension\n", |
| 121 | " 4. Preprocess for MobileNetV2\n", |
| 122 | " \n", |
| 123 | " Args:\n", |
| 124 | " img: PIL Image\n", |
| 125 | " \n", |
| 126 | " Returns:\n", |
| 127 | " Preprocessed image array\n", |
| 128 | " \"\"\"\n", |
| 129 | " # Resize to 224x224 pixels\n", |
| 130 | " img = img.resize((224, 224))\n", |
| 131 | " \n", |
| 132 | " # Convert to numpy array\n", |
| 133 | " img_array = np.array(img)\n", |
| 134 | " \n", |
| 135 | " # Add batch dimension (model expects multiple images)\n", |
| 136 | " img_array = np.expand_dims(img_array, axis=0)\n", |
| 137 | " \n", |
| 138 | " # Preprocess for MobileNetV2\n", |
| 139 | " img_array = preprocess_input(img_array)\n", |
| 140 | " \n", |
| 141 | " return img_array\n", |
| 142 | "\n", |
| 143 | "\n", |
| 144 | "def classify_image(img):\n", |
| 145 | " \"\"\"\n", |
| 146 | " Classify an image and return top predictions.\n", |
| 147 | " \n", |
| 148 | " Args:\n", |
| 149 | " img: PIL Image\n", |
| 150 | " \n", |
| 151 | " Returns:\n", |
| 152 | " List of (class_name, confidence) tuples\n", |
| 153 | " \"\"\"\n", |
| 154 | " # Prepare the image\n", |
| 155 | " img_array = prepare_image(img)\n", |
| 156 | " \n", |
| 157 | " # Make prediction\n", |
| 158 | " predictions = model.predict(img_array, verbose=0)\n", |
| 159 | " \n", |
| 160 | " # Decode predictions to human-readable labels\n", |
| 161 | " # top=5 means we get the top 5 most likely classes\n", |
| 162 | " decoded = decode_predictions(predictions, top=5)[0]\n", |
| 163 | " \n", |
| 164 | " # Convert to simpler format\n", |
| 165 | " results = [(label, float(confidence)) for (_, label, confidence) in decoded]\n", |
| 166 | " \n", |
| 167 | " return results\n", |
| 168 | "\n", |
| 169 | "\n", |
| 170 | "print(\"✅ Helper functions ready!\")" |
| 171 | ] |
| 172 | }, |
| 173 | { |
| 174 | "cell_type": "markdown", |
| 175 | "metadata": {}, |
| 176 | "source": [ |
| 177 | "## Krok 4: Testování na vzorových obrázcích\n", |
| 178 | "\n", |
| 179 | "Zkusme klasifikovat některé obrázky z internetu!\n" |
| 180 | ] |
| 181 | }, |
| 182 | { |
| 183 | "cell_type": "code", |
| 184 | "execution_count": null, |
| 185 | "metadata": {}, |
| 186 | "outputs": [], |
| 187 | "source": [ |
| 188 | "# Sample images to classify\n", |
| 189 | "# These are from Unsplash (free stock photos)\n", |
| 190 | "test_images = [\n", |
| 191 | " {\n", |
| 192 | " \"url\": \"https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba?w=400\",\n", |
| 193 | " \"description\": \"A cat\"\n", |
| 194 | " },\n", |
| 195 | " {\n", |
| 196 | " \"url\": \"https://images.unsplash.com/photo-1552053831-71594a27632d?w=400\",\n", |
| 197 | " \"description\": \"A dog\"\n", |
| 198 | " },\n", |
| 199 | " {\n", |
| 200 | " \"url\": \"https://images.unsplash.com/photo-1511919884226-fd3cad34687c?w=400\",\n", |
| 201 | " \"description\": \"A car\"\n", |
| 202 | " },\n", |
| 203 | "]\n", |
| 204 | "\n", |
| 205 | "print(f\"🧪 Testing on {len(test_images)} images...\")\n", |
| 206 | "print(\"=\" * 70)" |
| 207 | ] |
| 208 | }, |
| 209 | { |
| 210 | "cell_type": "markdown", |
| 211 | "metadata": {}, |
| 212 | "source": [ |
| 213 | "### Klasifikujte každý obrázek\n" |
| 214 | ] |
| 215 | }, |
| 216 | { |
| 217 | "cell_type": "code", |
| 218 | "execution_count": null, |
| 219 | "metadata": {}, |
| 220 | "outputs": [], |
| 221 | "source": [ |
| 222 | "for i, img_data in enumerate(test_images, 1):\n", |
| 223 | " print(f\"\\n📸 Image {i}: {img_data['description']}\")\n", |
| 224 | " print(\"-\" * 70)\n", |
| 225 | " \n", |
| 226 | " try:\n", |
| 227 | " # Load image\n", |
| 228 | " img = load_image_from_url(img_data['url'])\n", |
| 229 | " \n", |
| 230 | " # Display image\n", |
| 231 | " display(img.resize((200, 200))) # Show smaller version\n", |
| 232 | " \n", |
| 233 | " # Classify\n", |
| 234 | " results = classify_image(img)\n", |
| 235 | " \n", |
| 236 | " # Show predictions\n", |
| 237 | " print(\"\\n🎯 Top 5 Predictions:\")\n", |
| 238 | " for rank, (label, confidence) in enumerate(results, 1):\n", |
| 239 | " # Create a visual bar\n", |
| 240 | " bar_length = int(confidence * 50)\n", |
| 241 | " bar = \"█\" * bar_length\n", |
| 242 | " \n", |
| 243 | " print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n", |
| 244 | " \n", |
| 245 | " except Exception as e:\n", |
| 246 | " print(f\"❌ Error: {e}\")\n", |
| 247 | "\n", |
| 248 | "print(\"\\n\" + \"=\" * 70)" |
| 249 | ] |
| 250 | }, |
| 251 | { |
| 252 | "cell_type": "markdown", |
| 253 | "metadata": {}, |
| 254 | "source": [ |
| 255 | "## Krok 5: Vyzkoušejte své vlastní obrázky!\n", |
| 256 | "\n", |
| 257 | "Nahraďte níže uvedenou URL libovolnou URL obrázku, který chcete klasifikovat.\n" |
| 258 | ] |
| 259 | }, |
| 260 | { |
| 261 | "cell_type": "code", |
| 262 | "execution_count": null, |
| 263 | "metadata": {}, |
| 264 | "outputs": [], |
| 265 | "source": [ |
| 266 | "# Try your own image!\n", |
| 267 | "# Replace this URL with any image URL\n", |
| 268 | "custom_image_url = \"https://images.unsplash.com/photo-1472491235688-bdc81a63246e?w=400\" # A flower\n", |
| 269 | "\n", |
| 270 | "print(\"🖼️ Classifying your custom image...\")\n", |
| 271 | "print(\"=\" * 70)\n", |
| 272 | "\n", |
| 273 | "try:\n", |
| 274 | " # Load and show image\n", |
| 275 | " img = load_image_from_url(custom_image_url)\n", |
| 276 | " display(img.resize((300, 300)))\n", |
| 277 | " \n", |
| 278 | " # Classify\n", |
| 279 | " results = classify_image(img)\n", |
| 280 | " \n", |
| 281 | " # Show results\n", |
| 282 | " print(\"\\n🎯 Top 5 Predictions:\")\n", |
| 283 | " print(\"-\" * 70)\n", |
| 284 | " for rank, (label, confidence) in enumerate(results, 1):\n", |
| 285 | " bar_length = int(confidence * 50)\n", |
| 286 | " bar = \"█\" * bar_length\n", |
| 287 | " print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n", |
| 288 | " \n", |
| 289 | " # Highlight top prediction\n", |
| 290 | " top_label, top_confidence = results[0]\n", |
| 291 | " print(\"\\n\" + \"=\" * 70)\n", |
| 292 | " print(f\"\\n🏆 Best guess: {top_label} ({top_confidence*100:.2f}% confident)\")\n", |
| 293 | " \n", |
| 294 | "except Exception as e:\n", |
| 295 | " print(f\"❌ Error: {e}\")\n", |
| 296 | " print(\" Make sure the URL points to a valid image!\")" |
| 297 | ] |
| 298 | }, |
| 299 | { |
| 300 | "cell_type": "markdown", |
| 301 | "metadata": {}, |
| 302 | "source": [ |
| 303 | "## 💡 Co se právě stalo?\n", |
| 304 | "\n", |
| 305 | "1. **Načetli jsme předtrénovaný model** - MobileNetV2 byl natrénován na milionech obrázků \n", |
| 306 | "2. **Předzpracovali jsme obrázky** - Změnili jsme jejich velikost a formát pro model \n", |
| 307 | "3. **Model provedl predikce** - Vygeneroval pravděpodobnosti pro 1000 kategorií objektů \n", |
| 308 | "4. **Dekódovali jsme výsledky** - Převedli čísla na čitelné popisky \n", |
| 309 | "\n", |
| 310 | "### Porozumění skóre jistoty\n", |
| 311 | "\n", |
| 312 | "- **90-100 %**: Velmi jisté (téměř určitě správné) \n", |
| 313 | "- **70-90 %**: Jisté (pravděpodobně správné) \n", |
| 314 | "- **50-70 %**: Částečně jisté (může být správné) \n", |
| 315 | "- **Pod 50 %**: Málo jisté (nejisté) \n", |
| 316 | "\n", |
| 317 | "### Proč mohou být predikce chybné?\n", |
| 318 | "\n", |
| 319 | "- **Neobvyklý úhel nebo osvětlení** - Model byl trénován na běžných fotografiích \n", |
| 320 | "- **Více objektů** - Model očekává jeden hlavní objekt \n", |
| 321 | "- **Vzácné objekty** - Model zná pouze 1000 kategorií \n", |
| 322 | "- **Nízká kvalita obrázku** - Rozmazané nebo pixelované obrázky jsou obtížnější \n" |
| 323 | ] |
| 324 | }, |
| 325 | { |
| 326 | "cell_type": "markdown", |
| 327 | "metadata": {}, |
| 328 | "source": [ |
| 329 | "## 🚀 Další kroky\n", |
| 330 | "\n", |
| 331 | "1. **Vyzkoušejte různé obrázky:**\n", |
| 332 | " - Najděte obrázky na [Unsplash](https://unsplash.com)\n", |
| 333 | " - Klikněte pravým tlačítkem → „Kopírovat adresu obrázku“ pro získání URL\n", |
| 334 | "\n", |
| 335 | "2. **Experimentujte:**\n", |
| 336 | " - Co se stane s abstraktním uměním?\n", |
| 337 | " - Dokáže rozpoznat objekty z různých úhlů?\n", |
| 338 | " - Jak si poradí s více objekty?\n", |
| 339 | "\n", |
| 340 | "3. **Zjistěte více:**\n", |
| 341 | " - Prozkoumejte [lekce o počítačovém vidění](../lessons/4-ComputerVision/README.md)\n", |
| 342 | " - Naučte se trénovat vlastní klasifikátor obrázků\n", |
| 343 | " - Pochopte, jak fungují CNNs (Konvoluční neuronové sítě)\n", |
| 344 | "\n", |
| 345 | "---\n", |
| 346 | "\n", |
| 347 | "## 🎉 Gratulujeme!\n", |
| 348 | "\n", |
| 349 | "Právě jste vytvořili klasifikátor obrázků pomocí špičkové neuronové sítě!\n", |
| 350 | "\n", |
| 351 | "Tato stejná technika pohání:\n", |
| 352 | "- Google Photos (organizace vašich fotografií)\n", |
| 353 | "- Autonomní auta (rozpoznávání objektů)\n", |
| 354 | "- Lékařskou diagnostiku (analýza rentgenových snímků)\n", |
| 355 | "- Kontrolu kvality (detekce vad)\n", |
| 356 | "\n", |
| 357 | "Pokračujte v objevování a učení! 🚀\n" |
| 358 | ] |
| 359 | }, |
| 360 | { |
| 361 | "cell_type": "markdown", |
| 362 | "metadata": {}, |
| 363 | "source": [ |
| 364 | "\n---\n\n**Prohlášení**: \nTento dokument byl přeložen pomocí služby AI pro překlady [Co-op Translator](https://github.com/Azure/co-op-translator). I když se snažíme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Původní dokument v jeho původním jazyce by měl být považován za autoritativní zdroj. Pro důležité informace doporučujeme profesionální lidský překlad. Neodpovídáme za žádná nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.\n" |
| 365 | ] |
| 366 | } |
| 367 | ], |
| 368 | "metadata": { |
| 369 | "kernelspec": { |
| 370 | "display_name": "Python 3", |
| 371 | "language": "python", |
| 372 | "name": "python3" |
| 373 | }, |
| 374 | "language_info": { |
| 375 | "codemirror_mode": { |
| 376 | "name": "ipython", |
| 377 | "version": 3 |
| 378 | }, |
| 379 | "file_extension": ".py", |
| 380 | "mimetype": "text/x-python", |
| 381 | "name": "python", |
| 382 | "nbconvert_exporter": "python", |
| 383 | "pygments_lexer": "ipython3", |
| 384 | "version": "3.8.0" |
| 385 | }, |
| 386 | "coopTranslator": { |
| 387 | "original_hash": "1d472141d9df46b751542b3c29f88677", |
| 388 | "translation_date": "2025-10-03T11:52:07+00:00", |
| 389 | "source_file": "examples/03-image-classifier.ipynb", |
| 390 | "language_code": "cs" |
| 391 | } |
| 392 | }, |
| 393 | "nbformat": 4, |
| 394 | "nbformat_minor": 4 |
| 395 | } |