{
 "nbformat": 4,
 "nbformat_minor": 0,
 "metadata": {
  "colab": {"provenance": [], "gpuType": "T4"},
  "accelerator": "GPU",
  "kernelspec": {"name": "python3", "display_name": "Python 3"},
  "language_info": {"name": "python"}
 },
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 🎯 اليوم 9 — تدريب YOLO11 على خلايا الدم (BCCD)\n",
    "**دورة بايثون والذكاء الاصطناعي للتشخيص الطبي — وزارة الصحة، مديرية التشخيص**\n",
    "\n",
    "د. حسام صلاح مهدي — رئيس قسم الذكاء الاصطناعي، جامعة المصطفى\n",
    "\n",
    "---\n",
    "المجموعة: **364 صورة مجهرية** (205 تدريب / 87 تحقق / 72 اختبار) — الأصناف: `Platelets`, `RBC`, `WBC` — الترخيص MIT.\n",
    "\n",
    "> ⚠️ **قبل أي شيء:** من القائمة `Runtime` ← `Change runtime type` ← اختر **T4 GPU** ← `Save`."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "# هل الـ GPU مفعّل؟ يجب أن يظهر جدول فيه Tesla T4\n",
    "!nvidia-smi"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "# تثبيت الأداة\n",
    "!pip install ultralytics -q\n",
    "!yolo checks"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1) البيانات — اختر أحد طريقين\n",
    "**الطريق أ (نسخة الصف — المعتمد):** المدرب وزّع `blood_cells.zip`؛ ارفعه إلى Drive الخاص بك ثم نفّذ الخلية الآتية.\n",
    "\n",
    "**الطريق ب (Roboflow مباشرة):** من صفحة المجموعة اختر **Show download code** والصق مقتطفك في الخلية المخصصة (يمتلئ بمفتاحك تلقائياً). 🔴 تذكير: مفتاح API سرّي — ولا ترفع أي بيانات مرضى إلى الحسابات المجانية (تُنشر علناً)."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "# ===== الطريق أ: من Drive =====\n",
    "from google.colab import drive\n",
    "drive.mount('/content/drive')\n",
    "!unzip -q /content/drive/MyDrive/blood_cells.zip -d /content/\n",
    "!ls /content/blood_cells"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "# ===== الطريق ب: مقتطف Roboflow (أزل التعليق والصق قيمك) =====\n",
    "# !pip install roboflow -q\n",
    "# from roboflow import Roboflow\n",
    "# rf = Roboflow(api_key=\"YOUR_API_KEY\")\n",
    "# project = rf.workspace(\"WORKSPACE_ID\").project(\"PROJECT_ID\")\n",
    "# dataset = project.version(1).download(\"yolov11\")\n",
    "# print(dataset.location)   # عندئذٍ استعمل هذا المسار بدل /content/blood_cells"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "# بطاقة تعريف البيانات — تأكد من الأصناف الثلاثة\n",
    "!cat /content/blood_cells/data.yaml"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2) فحص الدخان (دقيقتان) — قبل البيانات الحقيقية\n",
    "`coco8`: ثماني صور تنزل تلقائياً؛ هدفها إثبات أن سلسلة التدريب كلها تعمل."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "!yolo detect train model=yolo11n.pt data=coco8.yaml epochs=3 imgsz=640"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3) التدريب الحقيقي — سطر واحد (نحو 10–20 دقيقة على T4)\n",
    "راقب أثناء التدريب: الخسارة `loss` تهبط و `mAP50` يصعد حقبة بعد حقبة."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "!yolo detect train model=yolo11n.pt data=/content/blood_cells/data.yaml epochs=50 imgsz=640 device=0"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "# 🔴 أهم خلية في اليوم: أنقذ الأوزان إلى Drive قبل موت الجلسة\n",
    "!cp /content/runs/detect/train/weights/best.pt /content/drive/MyDrive/blood_cells_best.pt\n",
    "!ls -lh /content/drive/MyDrive/blood_cells_best.pt"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4) التقييم — هل النموذج جيد؟\n",
    "`mAP50` فوق **0.85** بداية ممتازة تعليمياً. ثم اقرأ المنحنيات ومصفوفة الالتباس قراءة مختبري."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "!yolo detect val model=/content/runs/detect/train/weights/best.pt data=/content/blood_cells/data.yaml"
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "from IPython.display import Image as IPyImage, display\n",
    "display(IPyImage('/content/runs/detect/train/results.png', width=900))\n",
    "display(IPyImage('/content/runs/detect/train/confusion_matrix.png', width=650))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5) الاستخدام — التنبؤ على صور الاختبار (لم يرها النموذج)\n",
    "جرّب تغيير عتبة الثقة: `conf=0.25` ثم `conf=0.6` — وناقش أثرها على الإنذارات الكاذبة والخلايا الفائتة."
   ]
  },
  {
   "cell_type": "code",
   "metadata": {},
   "execution_count": null,
   "outputs": [],
   "source": [
    "!yolo detect predict model=/content/runs/detect/train/weights/best.pt source=/content/blood_cells/test/images conf=0.4 save=True\n",
    "\n",
    "import glob\n",
    "preds = sorted(glob.glob('/content/runs/detect/predict/*.jpg'))\n",
    "print(len(preds), 'annotated images')\n",
    "for p in preds[:3]:\n",
    "    display(IPyImage(p, width=750))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ✅ الخطوة التالية — على حاسوبك في الوزارة\n",
    "نزّل `blood_cells_best.pt` من Drive ثم محلياً (ويندوز 11):\n",
    "```\n",
    "conda activate yolo\n",
    "yolo detect predict model=blood_cells_best.pt source=smear_test.jpg conf=0.4 save=True\n",
    "```\n",
    "الاستدلال لا يحتاج GPU — نموذجك يعمل على أي جهاز في المديرية.\n",
    "\n",
    "**التوثيق:** ملف `runs/detect/train/args.yaml` يحفظ إعدادات تجربتك كاملة — أرفقه بتقريرك."
   ]
  }
 ]
}
