{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# អ្នកចាត់ថ្នាក់រូបភាពសាមញ្ញ\n", "\n", "សៀវភៅកំណត់ត្រានេះបង្ហាញអ្នកពីរបៀបចាត់ថ្នាក់រូបភាពដោយប្រើបណ្តាញសរសៃប្រសammatមុនដែលបានបណ្តុះបណ្តាលរួច។\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. **ម៉ូដែលបានទស្សន៍ទាយ** - វាបានផ្តល់ព្រាប្បុលភាពសម្រាប់ ១០០០ ចំណាត់ថ្នាក់វត្ថុ\n", "4. **យើងបានបកស្រាយលទ្ធផល** - បម្លែងលេខទៅជាអត្ថបទដែលមនុស្សអាចអានបាន\n", "\n", "### ការយល់ដឹងអំពីពិន្ទុទំនុកចិត្ត\n", "\n", "- **៩០-១០០%**: មានទំនុកចិត្តខ្លាំង (ភាគច្រើនត្រឹមត្រូវ)\n", "- **៧០-៩០%**: មានទំនុកចិត្ត (ប្រហែលត្រឹមត្រូវ)\n", "- **៥០-៧០%**: មានទំនុកចិត្តខ្លះៗ (ប្រហែលជាត្រឹមត្រូវ)\n", "- **ក្រោម ៥០%**: មិនមានទំនុកចិត្តខ្លាំង (មិនប្រាកដ)\n", "\n", "### ហេតុអ្វីបានជា ការទស្សន៍ទាយអាចខុស?\n", "\n", "- **មុំឬពន្លឺមិនធម្មតា** - ម៉ូដែលបានបណ្តុះដោយរូបថតទំរង់ទូទៅ\n", "- **វត្ថុច្រើនកន្លែង** - ម៉ូដែលនឹកស្រមៃមានវត្ថុមួយដើម\n", "- **វត្ថុសម្បូរទ្រង់ទ្រាយកោសិកា** - ម៉ូដែលស្គាល់តែ ១០០០ ប្រភេទ\n", "- **រូបភាពគុណភាពទាប** - រូបភាពមិនច្បាស់ឬម៉ូសេតារីមានការលំបាក\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 🚀 ជំហានបន្ទាប់\n", "\n", "1. **សាកល្បងរូបភាពផ្សេងៗ:**\n", " - ស្វែងរករូបភាពនៅលើ [Unsplash](https://unsplash.com)\n", " - ចុចមែកខាងស្តាំ → \"ចម្លងអាសយដ្ឋានរូបភាព\" ដើម្បីទទួលបាន URL\n", "\n", "2. **សាកល្បង:**\n", " - តើមានអ្វីកើតឡើងជាមួយសិល្បៈ abstract?\n", " - តើវាអាចរកឃើញវត្ថុពីមุมផ្សេងៗទេ?\n", " - តើវាដំណើរការយ៉ាងដូចម្តេចជាមួយវត្ថុច្រើន?\n", "\n", "3. **រៀនបន្ថែម:**\n", " - ស្វែងយល់អំពី [មេរៀនទស្សនវិទ្យាកុំព្យូទ័រ](../lessons/4-ComputerVision/README.md)\n", " - រៀនបណ្ដុះបណ្ដាលម៉ាស៊ីនចាត់ថ្នាក់រូបភាពឯង\n", " - យល់ដឹងពីរបៀប CNNs (បណ្តាញប្រសាទបូកបញ្ចូល) ធ្វើការ\n", "\n", "---\n", "\n", "## 🎉 សូមអបអរសាទរ!\n", "\n", "អ្នកទើបបង្កើតម៉ាស៊ីនចាត់ថ្នាក់រូបភាពដោយប្រើបណ្តាញប្រសាទទំនើប!\n", "\n", "បច្ចេកវិទ្យានេះត្រូវបានប្រើសម្រាប់:\n", "- Google Photos (ចាត់តាំងរូបថតរបស់អ្នក)\n", "- ឡានបើកដោយខ្លួនឯង (ស្គាល់វត្ថុ)\n", "- ការធ្វើវិភាគវេជ្ជសាស្រ្ត (វិភាគរូបថត X-ray)\n", "- ការត្រួតពិនិត្យគុណភាព (រកកោសិលិ្អ)\n", "\n", "បន្តស្វែងយល់ និងរៀនបន្ថែម! 🚀\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "---\n\n\n**កំណត់សម្គាល់**៖ \nឯកសារនេះត្រូវបានបកប្រែដោយប្រើសេវាកម្មបកប្រែ AI [Co-op Translator](https://github.com/Azure/co-op-translator)។ ខណៈពេលដែលយើងខំប្រឹងប្រែងរកភាពត្រឹមត្រូវ សូមកត់សម្គាល់ថាការបកប្រែដោយស្វ័យប្រវត្តិសមត្ថភាពអាចមានកំហុស ឬភាពមិនត្រឹមត្រូវ។ ឯកសារដើមជាភាសាតំណើរការរបស់វាគួរត្រូវបានគេចាត់ទុកថាជា ប្រភពផ្លូវការ។ សម្រាប់ព័ត៌មានសំខាន់ៗ គេបนะนำឲ្យប្រើការបកប្រែដោយមនុស្សឯកទេសជំនាញ។ យើងមិនទទួលខុសត្រូវចំពោះការយល់ច្រឡំ ឬការបកស្រាយខុសផ្សេង ដែលកើតឡើងពីការប្រើប្រាស់ការបកប្រែនេះឡើយ។\n\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" } }, "nbformat": 4, "nbformat_minor": 4 }