Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| from transformers import BlipProcessor, BlipForQuestionAnswering, MarianMTModel, MarianTokenizer | |
| from PIL import Image | |
| import torch | |
| # تحميل نموذج BLIP المدرب مسبقًا | |
| blip_model = BlipForQuestionAnswering.from_pretrained("mshsahmed/blip-vqa-finetuned-kvasir-v58849") | |
| processor = BlipProcessor.from_pretrained("mshsahmed/blip-vqa-finetuned-kvasir-v58849") | |
| # تحميل نماذج الترجمة | |
| ar_en_tokenizer = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-ar-en") | |
| ar_en_model = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-ar-en") | |
| en_ar_tokenizer = MarianTokenizer.from_pretrained("Helsinki-NLP/opus-mt-en-ar") | |
| en_ar_model = MarianMTModel.from_pretrained("Helsinki-NLP/opus-mt-en-ar") | |
| # دوال الترجمة | |
| def translate_ar_to_en(text): | |
| inputs = ar_en_tokenizer(text, return_tensors="pt", padding=True, truncation=True) | |
| outputs = ar_en_model.generate(**inputs) | |
| return ar_en_tokenizer.decode(outputs[0], skip_special_tokens=True).strip() | |
| def translate_en_to_ar(text): | |
| inputs = en_ar_tokenizer(text, return_tensors="pt", padding=True, truncation=True) | |
| outputs = en_ar_model.generate(**inputs) | |
| return en_ar_tokenizer.decode(outputs[0], skip_special_tokens=True).strip() | |
| # قاموس ترجمة طبي يدوي | |
| medical_terms = { | |
| "chest x-ray": "أشعة سينية للصدر", | |
| "x-ray": "أشعة سينية", | |
| "ct scan": "تصوير مقطعي محوسب", | |
| "mri": "تصوير بالرنين المغناطيسي", | |
| "ultrasound": "تصوير بالموجات فوق الصوتية", | |
| "normal": "طبيعي", | |
| "abnormal": "غير طبيعي", | |
| "brain": "الدماغ", | |
| "fracture": "كسر", | |
| "no abnormality detected": "لا توجد شذوذات", | |
| "left lung": "الرئة اليسرى", | |
| "right lung": "الرئة اليمنى" | |
| } | |
| # دالة الترجمة الذكية للإجابات | |
| def translate_answer_medical(answer_en): | |
| key = answer_en.lower().strip() | |
| if key in medical_terms: | |
| return medical_terms[key] | |
| else: | |
| return translate_en_to_ar(answer_en) | |
| # الدالة الرئيسية | |
| def vqa_multilingual(image, question): | |
| if not image or not question.strip(): | |
| return "يرجى رفع صورة وكتابة سؤال.", "", "", "" | |
| # هل السؤال بالعربية؟ | |
| is_arabic = any('' <= c <= 'ۿ' for c in question) | |
| if is_arabic: | |
| question_ar = question.strip() | |
| question_en = translate_ar_to_en(question_ar) | |
| else: | |
| question_en = question.strip() | |
| question_ar = translate_en_to_ar(question_en) | |
| # تمرير السؤال الإنجليزي للنموذج | |
| inputs = processor(image, question_en, return_tensors="pt") | |
| with torch.no_grad(): | |
| output = blip_model.generate(**inputs) | |
| answer_en = processor.decode(output[0], skip_special_tokens=True).strip() | |
| # ترجمة الإجابة باستخدام القاموس أو آليًا | |
| answer_ar = translate_answer_medical(answer_en) | |
| return ( | |
| f"السؤال بالعربية: | |
| {question_ar}", | |
| f"السؤال بالإنجليزية: | |
| {question_en}", | |
| f"الإجابة بالعربية: | |
| {answer_ar}", | |
| f"الإجابة بالإنجليزية: | |
| {answer_en}" | |
| ) | |
| # واجهة Gradio | |
| gr.Interface( | |
| fn=vqa_multilingual, | |
| inputs=[ | |
| gr.Image(type="pil", label="🔍 ارفع صورة الأشعة"), | |
| gr.Textbox(label="💬 أدخل سؤالك (بالعربية أو الإنجليزية)") | |
| ], | |
| outputs=[ | |
| gr.Textbox(label="🟠 السؤال بالعربية"), | |
| gr.Textbox(label="🟢 السؤال بالإنجليزية"), | |
| gr.Textbox(label="🟠 الإجابة بالعربية"), | |
| gr.Textbox(label="🟢 الإجابة بالإنجليزية") | |
| ], | |
| title="نموذج ثنائي اللغة (عربي - إنجليزي)", | |
| description="ارفع صورة طبية واسأل بالعربية أو الإنجليزية، وستحصل على الإجابة باللغتين." | |
| ).launch(share=True) | |