395 lines
13 KiB
Plaintext
395 lines
13 KiB
Plaintext
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"# Paprastas vaizdų klasifikatorius\n",
|
||
"\n",
|
||
"Šiame užrašų knygelėje parodoma, kaip klasifikuoti vaizdus naudojant iš anksto apmokytą neuroninį tinklą.\n",
|
||
"\n",
|
||
"**Ką išmoksite:**\n",
|
||
"- Kaip įkelti ir naudoti iš anksto apmokytą modelį\n",
|
||
"- Vaizdų išankstinis apdorojimas\n",
|
||
"- Prognozių atlikimas vaizdams\n",
|
||
"- Pasitikėjimo balų supratimas\n",
|
||
"\n",
|
||
"**Naudojimo atvejis:** Objektų atpažinimas vaizduose (pvz., „katė“, „šuo“, „automobilis“ ir kt.)\n",
|
||
"\n",
|
||
"---\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 1 žingsnis: Importuokite reikalingas bibliotekas\n",
|
||
"\n",
|
||
"Importuokime mums reikalingus įrankius. Nesijaudinkite, jei dar ne viską suprantate!\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 žingsnis: Įkelkite iš anksto apmokytą modelį\n",
|
||
"\n",
|
||
"Naudosime **MobileNetV2**, neuroninį tinklą, kuris jau apmokytas milijonais vaizdų.\n",
|
||
"\n",
|
||
"Tai vadinama **Perkėlimo mokymusi** – naudojame modelį, kurį apmokė kažkas kitas!\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 žingsnis: Pagalbinės funkcijos\n",
|
||
"\n",
|
||
"Sukurkime funkcijas, skirtas įkelti ir paruošti vaizdus mūsų modeliui.\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 žingsnis: Testavimas su pavyzdinėmis nuotraukomis\n",
|
||
"\n",
|
||
"Išbandykime klasifikavimą su keliomis nuotraukomis iš interneto!\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": [
|
||
"### Klasifikuokite Kiekvieną Vaizdą\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 žingsnis: Išbandykite savo vaizdus!\n",
|
||
"\n",
|
||
"Pakeiskite žemiau esantį URL bet kokiu vaizdo URL, kurį norite klasifikuoti.\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": [
|
||
"## 💡 Kas ką tik įvyko?\n",
|
||
"\n",
|
||
"1. **Įkėlėme iš anksto apmokytą modelį** – MobileNetV2 buvo apmokytas naudojant milijonus vaizdų\n",
|
||
"2. **Apdorojome vaizdus** – Pakeitėme jų dydį ir formatą, kad jie tiktų modeliui\n",
|
||
"3. **Modelis atliko prognozes** – Jis pateikė tikimybes 1000 objektų kategorijoms\n",
|
||
"4. **Dekodavome rezultatus** – Skaičius pavertėme į žmonėms suprantamas etiketes\n",
|
||
"\n",
|
||
"### Supratimas apie pasitikėjimo balus\n",
|
||
"\n",
|
||
"- **90–100%**: Labai užtikrintas (beveik tikrai teisinga)\n",
|
||
"- **70–90%**: Užtikrintas (tikriausiai teisinga)\n",
|
||
"- **50–70%**: Šiek tiek užtikrintas (gali būti teisinga)\n",
|
||
"- **Žemiau 50%**: Nelabai užtikrintas (neaišku)\n",
|
||
"\n",
|
||
"### Kodėl prognozės gali būti neteisingos?\n",
|
||
"\n",
|
||
"- **Neįprastas kampas ar apšvietimas** – Modelis buvo apmokytas naudojant įprastas nuotraukas\n",
|
||
"- **Daug objektų** – Modelis tikisi vieno pagrindinio objekto\n",
|
||
"- **Retai pasitaikantys objektai** – Modelis atpažįsta tik 1000 kategorijų\n",
|
||
"- **Prastos kokybės vaizdas** – Neryškūs ar pikseliuoti vaizdai yra sudėtingesni\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"## 🚀 Kiti žingsniai\n",
|
||
"\n",
|
||
"1. **Išbandykite skirtingus vaizdus:**\n",
|
||
" - Raskite vaizdų [Unsplash](https://unsplash.com)\n",
|
||
" - Dešiniuoju pelės mygtuku → „Kopijuoti vaizdo adresą“, kad gautumėte URL\n",
|
||
"\n",
|
||
"2. **Eksperimentuokite:**\n",
|
||
" - Kas nutinka su abstrakčiu menu?\n",
|
||
" - Ar gali atpažinti objektus iš skirtingų kampų?\n",
|
||
" - Kaip jis tvarkosi su keliais objektais?\n",
|
||
"\n",
|
||
"3. **Sužinokite daugiau:**\n",
|
||
" - Naršykite [Kompiuterinės regos pamokas](../lessons/4-ComputerVision/README.md)\n",
|
||
" - Išmokite treniruoti savo vaizdų klasifikatorių\n",
|
||
" - Supraskite, kaip veikia CNN (Konvoliuciniai neuroniniai tinklai)\n",
|
||
"\n",
|
||
"---\n",
|
||
"\n",
|
||
"## 🎉 Sveikiname!\n",
|
||
"\n",
|
||
"Jūs ką tik sukūrėte vaizdų klasifikatorių naudodami pažangų neuroninį tinklą!\n",
|
||
"\n",
|
||
"Ši technika naudojama:\n",
|
||
"- Google Photos (nuotraukų organizavimui)\n",
|
||
"- Savarankiškai važiuojančiuose automobiliuose (objektų atpažinimui)\n",
|
||
"- Medicininėje diagnostikoje (rentgeno nuotraukų analizėje)\n",
|
||
"- Kokybės kontrolėje (defektų aptikimui)\n",
|
||
"\n",
|
||
"Tęskite tyrinėjimus ir mokymąsi! 🚀\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {},
|
||
"source": [
|
||
"\n---\n\n**Atsakomybės apribojimas**: \nŠis dokumentas buvo išverstas naudojant dirbtinio intelekto vertimo paslaugą [Co-op Translator](https://github.com/Azure/co-op-translator). Nors siekiame tikslumo, atkreipiame dėmesį, kad automatiniai vertimai gali turėti klaidų ar netikslumų. Originalus dokumentas jo gimtąja kalba turėtų būti laikomas autoritetingu šaltiniu. Kritinei informacijai rekomenduojama naudotis profesionalių vertėjų paslaugomis. Mes neprisiimame atsakomybės už nesusipratimus ar klaidingus aiškinimus, kylančius dėl šio vertimo naudojimo.\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:58+00:00",
|
||
"source_file": "examples/03-image-classifier.ipynb",
|
||
"language_code": "lt"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 4
|
||
} |