{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.6.6","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[],"dockerImageVersionId":28755,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"\nimport pandas as pd\nimport torch\nimport torchvision.models as models\nimport torchvision.transforms as T\nfrom transformers import AutoTokenizer, AutoModel\nfrom PIL import Image\nimport numpy as np\n\n# 1. إعداد الجهاز والتحميل المسبق للموديلات والـ Tokenizer\ndevice = \"cuda\" if torch.cuda.is_available() else \"cpu\"\n\ntokenizer = AutoTokenizer.from_pretrained(\"xlm-roberta-base\")\ntext_model = AutoModel.from_pretrained(\"xlm-roberta-base\").to(device)\n\nimage_model = models.resnet50(pretrained=True)\nimage_model.fc = torch.nn.Identity()\nimage_model = image_model.to(device)\n\n# طبقة التصنيف النهائي للـ 12 إصابة\nclassifier = torch.nn.Linear(in_features=2816, out_features=12).to(device)\n\n# تحويلات الصور الثابتة\nimage_transforms = T.Compose([\n    T.Resize((224, 224)),\n    T.ToTensor(),\n    T.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n])\n\n# 2. قراءة ملف جدول البيانات (قم بتغيير المسار لمسار ملف كاجل الحقيقي)\n# سنقوم بقراءة أول 10 أسطر فقط كمثال لتوفير الوقت والذاكرة\ndf = pd.read_csv(\"train.csv\").head(10) \n\n# 3. بدء الحلقة التكرارية (Loop) للمرور على البيانات صفاً بصف\nprint(\"بدء معالجة الحالات الطبية...\")\nfor index, row in df.iterrows():\n    \n    # أ) جلب بيانات الصف الحالي\n    study_id = row['StudyInstanceUID']\n    report_text = str(row['Report']) # التقرير النصي للحالة\n    \n    print(f\"\\n--- جاري معالجة الحالة رقم {index+1}: {study_id} ---\")\n    \n    # ب) معالجة النص الحالي عبر الـ Tokenizer والموديل\n    text_inputs = tokenizer(\n        report_text,\n        padding=\"max_length\",\n        truncation=True,\n        max_length=128,\n        return_tensors=\"pt\"\n    ).to(device)\n    \n    with torch.no_grad():\n        text_outputs = text_model(input_ids=text_inputs['input_ids'], attention_mask=text_inputs['attention_mask'])\n        text_features = text_outputs.last_hidden_state[:, 0, :]\n        \n    # ج) معالجة الصورة المقابلة للحالة الحالية\n    # (هنا نقوم بمحاكاة قراءة ملف الصورة بناءً على الـ study_id الحالي)\n    # في الكود الحقيقي ستكتب: pil_image = Image.open(f\"images_dir/{study_id}.png\")\n    mock_image_np = np.random.randint(0, 255, (256, 256, 3), dtype=np.uint8)\n    pil_image = Image.fromarray(mock_image_np)\n    \n    image_tensor = image_transforms(pil_image).unsqueeze(0).to(device)\n    \n    with torch.no_grad():\n        image_features = image_model(image_tensor)\n        \n    # د) دمج الميزات المستخلصة منفصلة والتنبؤ النهائي\n    combined_features = torch.cat((image_features, text_features), dim=1)\n    \n    with torch.no_grad():\n        predictions = classifier(combined_features)\n        \n    # هـ) عرض النتيجة الحالية\n    # قمنا بتحويل المخرج إلى احتمالات بين 0 و 1 باستخدام Sigmoid لتبسيط رؤيتها\n    probabilities = torch.sigmoid(predictions).cpu().numpy()[0]\n    print(f\"احتمال الإصابات الـ 12 لهذه الحالة:\\n\", probabilities)\n\nprint(\"\\nتمت معالجة جميع الحالات بنجاح!\")\n\n\n","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}