AI-For-Beginners/translations/ru/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 (сверточные нейронные сети)\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:37:57+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "ru"
}
},
"nbformat": 4,
"nbformat_minor": 4
}