AI-For-Beginners/translations/uk/examples/03-image-classifier.ipynb

397 lines
16 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": [
"# Простий класифікатор зображень\n",
"\n",
"Цей ноутбук демонструє, як класифікувати зображення за допомогою попередньо навченої нейронної мережі.\n",
"\n",
"**Що ви дізнаєтесь:**\n",
"- Як завантажити та використовувати попередньо навчену модель\n",
"- Попередня обробка зображень\n",
"- Виконання прогнозів на зображеннях\n",
"- Розуміння рівнів впевненості\n",
"\n",
"**Випадок використання:** Визначення об'єктів на зображеннях (наприклад, \"кіт\", \"собака\", \"автомобіль\" тощо)\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Крок 1: Імпорт необхідних бібліотек\n",
"\n",
"Давайте імпортуємо інструменти, які нам знадобляться. Не хвилюйтеся, якщо ви поки що не розумієте всі з них!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Core libraries\n",
"import numpy as np\n",
"from PIL import Image\n",
"import requests\n",
"from io import BytesIO\n",
"\n",
"# TensorFlow for deep learning\n",
"try:\n",
" import tensorflow as tf\n",
" from tensorflow.keras.applications import MobileNetV2\n",
" from tensorflow.keras.applications.mobilenet_v2 import preprocess_input, decode_predictions\n",
" print(\"✅ TensorFlow loaded successfully!\")\n",
" print(f\" Version: {tf.__version__}\")\n",
"except ImportError:\n",
" print(\"❌ Please install TensorFlow: pip install tensorflow\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Крок 2: Завантаження попередньо навченої моделі\n",
"\n",
"Ми використаємо **MobileNetV2**, нейронну мережу, яка вже навчена на мільйонах зображень.\n",
"\n",
"Це називається **Трансферне навчання** - використання моделі, яку хтось інший вже навчив!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"print(\"📦 Loading pre-trained MobileNetV2 model...\")\n",
"print(\" This may take a minute on first run (downloading weights)...\")\n",
"\n",
"# Load the model\n",
"# include_top=True means we use the classification layer\n",
"# weights='imagenet' means it was trained on ImageNet dataset\n",
"model = MobileNetV2(weights='imagenet', include_top=True)\n",
"\n",
"print(\"✅ Model loaded!\")\n",
"print(f\" The model can recognize 1000 different object categories\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Крок 3: Допоміжні функції\n",
"\n",
"Давайте створимо функції для завантаження та підготовки зображень для нашої моделі.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"def load_image_from_url(url):\n",
" \"\"\"\n",
" Load an image from a URL.\n",
" \n",
" Args:\n",
" url: Web address of the image\n",
" \n",
" Returns:\n",
" PIL Image object\n",
" \"\"\"\n",
" response = requests.get(url)\n",
" img = Image.open(BytesIO(response.content))\n",
" return img\n",
"\n",
"\n",
"def prepare_image(img):\n",
" \"\"\"\n",
" Prepare an image for the model.\n",
" \n",
" Steps:\n",
" 1. Resize to 224x224 (model's expected size)\n",
" 2. Convert to array\n",
" 3. Add batch dimension\n",
" 4. Preprocess for MobileNetV2\n",
" \n",
" Args:\n",
" img: PIL Image\n",
" \n",
" Returns:\n",
" Preprocessed image array\n",
" \"\"\"\n",
" # Resize to 224x224 pixels\n",
" img = img.resize((224, 224))\n",
" \n",
" # Convert to numpy array\n",
" img_array = np.array(img)\n",
" \n",
" # Add batch dimension (model expects multiple images)\n",
" img_array = np.expand_dims(img_array, axis=0)\n",
" \n",
" # Preprocess for MobileNetV2\n",
" img_array = preprocess_input(img_array)\n",
" \n",
" return img_array\n",
"\n",
"\n",
"def classify_image(img):\n",
" \"\"\"\n",
" Classify an image and return top predictions.\n",
" \n",
" Args:\n",
" img: PIL Image\n",
" \n",
" Returns:\n",
" List of (class_name, confidence) tuples\n",
" \"\"\"\n",
" # Prepare the image\n",
" img_array = prepare_image(img)\n",
" \n",
" # Make prediction\n",
" predictions = model.predict(img_array, verbose=0)\n",
" \n",
" # Decode predictions to human-readable labels\n",
" # top=5 means we get the top 5 most likely classes\n",
" decoded = decode_predictions(predictions, top=5)[0]\n",
" \n",
" # Convert to simpler format\n",
" results = [(label, float(confidence)) for (_, label, confidence) in decoded]\n",
" \n",
" return results\n",
"\n",
"\n",
"print(\"✅ Helper functions ready!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Крок 4: Тестування на зразкових зображеннях\n",
"\n",
"Спробуймо класифікувати кілька зображень з інтернету!\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Sample images to classify\n",
"# These are from Unsplash (free stock photos)\n",
"test_images = [\n",
" {\n",
" \"url\": \"https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba?w=400\",\n",
" \"description\": \"A cat\"\n",
" },\n",
" {\n",
" \"url\": \"https://images.unsplash.com/photo-1552053831-71594a27632d?w=400\",\n",
" \"description\": \"A dog\"\n",
" },\n",
" {\n",
" \"url\": \"https://images.unsplash.com/photo-1511919884226-fd3cad34687c?w=400\",\n",
" \"description\": \"A car\"\n",
" },\n",
"]\n",
"\n",
"print(f\"🧪 Testing on {len(test_images)} images...\")\n",
"print(\"=\" * 70)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Класифікуйте кожне зображення\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"for i, img_data in enumerate(test_images, 1):\n",
" print(f\"\\n📸 Image {i}: {img_data['description']}\")\n",
" print(\"-\" * 70)\n",
" \n",
" try:\n",
" # Load image\n",
" img = load_image_from_url(img_data['url'])\n",
" \n",
" # Display image\n",
" display(img.resize((200, 200))) # Show smaller version\n",
" \n",
" # Classify\n",
" results = classify_image(img)\n",
" \n",
" # Show predictions\n",
" print(\"\\n🎯 Top 5 Predictions:\")\n",
" for rank, (label, confidence) in enumerate(results, 1):\n",
" # Create a visual bar\n",
" bar_length = int(confidence * 50)\n",
" bar = \"█\" * bar_length\n",
" \n",
" print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n",
" \n",
" except Exception as e:\n",
" print(f\"❌ Error: {e}\")\n",
"\n",
"print(\"\\n\" + \"=\" * 70)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Крок 5: Спробуйте власні зображення!\n",
"\n",
"Замініть URL нижче на будь-який URL зображення, яке ви хочете класифікувати.\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Try your own image!\n",
"# Replace this URL with any image URL\n",
"custom_image_url = \"https://images.unsplash.com/photo-1472491235688-bdc81a63246e?w=400\" # A flower\n",
"\n",
"print(\"🖼️ Classifying your custom image...\")\n",
"print(\"=\" * 70)\n",
"\n",
"try:\n",
" # Load and show image\n",
" img = load_image_from_url(custom_image_url)\n",
" display(img.resize((300, 300)))\n",
" \n",
" # Classify\n",
" results = classify_image(img)\n",
" \n",
" # Show results\n",
" print(\"\\n🎯 Top 5 Predictions:\")\n",
" print(\"-\" * 70)\n",
" for rank, (label, confidence) in enumerate(results, 1):\n",
" bar_length = int(confidence * 50)\n",
" bar = \"█\" * bar_length\n",
" print(f\" {rank}. {label:20s} {confidence*100:5.2f}% {bar}\")\n",
" \n",
" # Highlight top prediction\n",
" top_label, top_confidence = results[0]\n",
" print(\"\\n\" + \"=\" * 70)\n",
" print(f\"\\n🏆 Best guess: {top_label} ({top_confidence*100:.2f}% confident)\")\n",
" \n",
"except Exception as e:\n",
" print(f\"❌ Error: {e}\")\n",
" print(\" Make sure the URL points to a valid image!\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 💡 Що щойно сталося?\n",
"\n",
"1. **Ми завантажили попередньо навчену модель** - MobileNetV2 була навчена на мільйонах зображень \n",
"2. **Ми попередньо обробили зображення** - Змінили розмір і форматували їх для моделі \n",
"3. **Модель зробила прогнози** - Вона видала ймовірності для 1000 класів об'єктів \n",
"4. **Ми декодували результати** - Перетворили числа на зрозумілі для людини назви \n",
"\n",
"### Розуміння рівнів впевненості\n",
"\n",
"- **90-100%**: Дуже впевнено (майже напевно правильно) \n",
"- **70-90%**: Впевнено (ймовірно правильно) \n",
"- **50-70%**: Помірно впевнено (можливо правильно) \n",
"- **Менше 50%**: Невпевнено (сумнівно) \n",
"\n",
"### Чому прогнози можуть бути неправильними?\n",
"\n",
"- **Незвичайний кут або освітлення** - Модель була навчена на типових фотографіях \n",
"- **Кілька об'єктів** - Модель очікує один основний об'єкт \n",
"- **Рідкісні об'єкти** - Модель знає лише 1000 категорій \n",
"- **Низька якість зображення** - Розмиті або пікселізовані зображення складніші для аналізу \n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🚀 Наступні кроки\n",
"\n",
"1. **Спробуйте різні зображення:**\n",
" - Знайдіть зображення на [Unsplash](https://unsplash.com)\n",
" - Клацніть правою кнопкою миші → \"Копіювати адресу зображення\", щоб отримати URL\n",
"\n",
"2. **Експериментуйте:**\n",
" - Що відбувається із абстрактним мистецтвом?\n",
" - Чи може розпізнавати об'єкти з різних ракурсів?\n",
" - Як система справляється з кількома об'єктами?\n",
"\n",
"3. **Дізнайтеся більше:**\n",
" - Досліджуйте [уроки з комп'ютерного зору](../lessons/4-ComputerVision/README.md)\n",
" - Навчіться тренувати власний класифікатор зображень\n",
" - Зрозумійте, як працюють CNN (Convolutional Neural Networks)\n",
"\n",
"---\n",
"\n",
"## 🎉 Вітаємо!\n",
"\n",
"Ви щойно створили класифікатор зображень, використовуючи сучасну нейронну мережу!\n",
"\n",
"Ця ж техніка використовується для:\n",
"- Google Photos (організація ваших фотографій)\n",
"- Автономних автомобілів (розпізнавання об'єктів)\n",
"- Медичної діагностики (аналіз рентгенівських знімків)\n",
"- Контролю якості (виявлення дефектів)\n",
"\n",
"Продовжуйте досліджувати та навчатися! 🚀\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Відмова від відповідальності**: \nЦей документ був перекладений за допомогою сервісу автоматичного перекладу [Co-op Translator](https://github.com/Azure/co-op-translator). Хоча ми прагнемо до точності, будь ласка, зверніть увагу, що автоматичні переклади можуть містити помилки або неточності. Оригінальний документ на його рідній мові слід вважати авторитетним джерелом. Для критично важливої інформації рекомендується професійний людський переклад. Ми не несемо відповідальності за будь-які непорозуміння або неправильні тлумачення, що виникають внаслідок використання цього перекладу.\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.8.0"
},
"coopTranslator": {
"original_hash": "1d472141d9df46b751542b3c29f88677",
"translation_date": "2025-10-03T11:55:29+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "uk"
}
},
"nbformat": 4,
"nbformat_minor": 4
}