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

395 lines
12 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Lihtne pildiklassifikaator\n",
"\n",
"See märkmik näitab, kuidas klassifitseerida pilte eelnevalt treenitud närvivõrgu abil.\n",
"\n",
"**Mida õpid:**\n",
"- Kuidas laadida ja kasutada eelnevalt treenitud mudelit\n",
"- Piltide eeltöötlus\n",
"- Ennustuste tegemine piltide põhjal\n",
"- Usaldusväärsuse skooride mõistmine\n",
"\n",
"**Kasutusjuht:** Objektide tuvastamine piltidel (näiteks \"kass\", \"koer\", \"auto\" jne)\n",
"\n",
"---\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Samm 1: Vajalike teekide importimine\n",
"\n",
"Importime vajalikud tööriistad. Ära muretse, kui sa veel kõigest aru ei saa!\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": [
"## Samm 2: Eeltreenitud mudeli laadimine\n",
"\n",
"Kasutame **MobileNetV2**, närvivõrku, mis on juba treenitud miljonite piltide peal.\n",
"\n",
"Seda nimetatakse **ülekandeõppeks** - kasutame mudelit, mille keegi teine on juba treeninud!\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": [
"## Samm 3: Abifunktsioonid\n",
"\n",
"Loome funktsioonid piltide laadimiseks ja ettevalmistamiseks meie mudeli jaoks.\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": [
"## Samm 4: Testimine näidispiltidega\n",
"\n",
"Proovime klassifitseerida mõned internetist leitud pildid!\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": [
"### Klassifitseeri iga pilt\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": [
"## Samm 5: Proovi oma pilte!\n",
"\n",
"Asenda allolev URL mis tahes pildi URL-iga, mida soovid klassifitseerida.\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": [
"## 💡 Mis Just Juhtus?\n",
"\n",
"1. **Laadisime eelnevalt treenitud mudeli** - MobileNetV2 on treenitud miljonite piltidega\n",
"2. **Eeltöötlesime pilte** - Muutsime nende suurust ja vormindasime mudeli jaoks\n",
"3. **Mudel tegi ennustusi** - Väljundiks olid tõenäosused 1000 objekti klassi kohta\n",
"4. **Dekodeerisime tulemused** - Muutsime numbrid inimloetavateks siltideks\n",
"\n",
"### Usaldusväärsuse skooride mõistmine\n",
"\n",
"- **90-100%**: Väga kindel (peaaegu kindlasti õige)\n",
"- **70-90%**: Kindel (tõenäoliselt õige)\n",
"- **50-70%**: Mõnevõrra kindel (võib olla õige)\n",
"- **Alla 50%**: Vähe kindel (ebakindel)\n",
"\n",
"### Miks ennustused võivad olla valed?\n",
"\n",
"- **Ebatavaline nurk või valgustus** - Mudel on treenitud tüüpiliste fotode põhjal\n",
"- **Mitu objekti** - Mudel eeldab ühte peamist objekti\n",
"- **Haruldased objektid** - Mudel tunneb ainult 1000 kategooriat\n",
"- **Madala kvaliteediga pilt** - Udused või pikslilised pildid on raskemad\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 🚀 Järgmised sammud\n",
"\n",
"1. **Proovi erinevaid pilte:**\n",
" - Leia pilte [Unsplashist](https://unsplash.com)\n",
" - Paremklõps → \"Kopeeri pildi aadress\", et saada URL\n",
"\n",
"2. **Katseta:**\n",
" - Mis juhtub abstraktse kunstiga?\n",
" - Kas see suudab objekte ära tunda erinevatest nurkadest?\n",
" - Kuidas see käsitleb mitut objekti korraga?\n",
"\n",
"3. **Õpi rohkem:**\n",
" - Uuri [Arvutinägemise õppetunde](../lessons/4-ComputerVision/README.md)\n",
" - Õpi, kuidas treenida oma pildiklassifikaatorit\n",
" - Saa aru, kuidas CNN-id (konvolutsioonilised närvivõrgud) töötavad\n",
"\n",
"---\n",
"\n",
"## 🎉 Palju õnne!\n",
"\n",
"Sa just ehitasid pildiklassifikaatori, kasutades tipptasemel närvivõrku!\n",
"\n",
"Sama tehnika on aluseks:\n",
"- Google Photos (sinu fotode organiseerimine)\n",
"- Isejuhtivad autod (objektide tuvastamine)\n",
"- Meditsiiniline diagnoos (röntgenpiltide analüüs)\n",
"- Kvaliteedikontroll (vigade tuvastamine)\n",
"\n",
"Jätka avastamist ja õppimist! 🚀\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**Lahtiütlus**: \nSee dokument on tõlgitud, kasutades AI tõlketeenust [Co-op Translator](https://github.com/Azure/co-op-translator). Kuigi püüame tagada täpsust, palun arvestage, et automaatsed tõlked võivad sisaldada vigu või ebatäpsusi. Algne dokument selle algkeeles tuleks lugeda autoriteetseks allikaks. Olulise teabe puhul on soovitatav kasutada professionaalset inimtõlget. Me ei vastuta selle tõlke kasutamisest tulenevate arusaamatuste või valede tõlgenduste eest.\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-11T11:53:33+00:00",
"source_file": "examples/03-image-classifier.ipynb",
"language_code": "et"
}
},
"nbformat": 4,
"nbformat_minor": 4
}