Burakaltintasx commited on
Commit
35ded33
·
verified ·
1 Parent(s): ab0ef57

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +147 -0
app.py ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import gradio as gr
3
+ import torch
4
+ from torch import nn
5
+ import torchvision.models as models
6
+ import torchvision.transforms as transforms
7
+ from PIL import Image
8
+ from datasets import load_dataset
9
+ import numpy as np
10
+ from transformers import AutoModelForSequenceClassification, AutoTokenizer, pipeline
11
+
12
+ # Veri setini yükleme
13
+ dataset = load_dataset("wanglab/chest-agent-bench")
14
+
15
+ # Model tanımı - önceden eğitilmiş bir DenseNet modeli kullanacağız
16
+ class ChestXRayModel(nn.Module):
17
+ def __init__(self, num_classes=14):
18
+ super(ChestXRayModel, self).__init__()
19
+ self.densenet = models.densenet121(pretrained=True)
20
+ num_features = self.densenet.classifier.in_features
21
+ self.densenet.classifier = nn.Sequential(
22
+ nn.Linear(num_features, num_classes),
23
+ nn.Sigmoid()
24
+ )
25
+
26
+ def forward(self, x):
27
+ return self.densenet(x)
28
+
29
+ # Model yükleme fonksiyonu (gerçek bir uygulamada önceden eğitilmiş model kullanılacaktır)
30
+ def load_model():
31
+ model = ChestXRayModel()
32
+ # Gerçek uygulamada: model.load_state_dict(torch.load('path/to/model.pth'))
33
+ model.eval()
34
+ return model
35
+
36
+ # Görüntü dönüştürme
37
+ transform = transforms.Compose([
38
+ transforms.Resize((224, 224)),
39
+ transforms.ToTensor(),
40
+ transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
41
+ ])
42
+
43
+ # Sınıf etiketleri (CheXpert'ten alındı)
44
+ class_names = [
45
+ 'Atelektazi', 'Kardiyomegali', 'Effüzyon', 'İnfiltrasyon', 'Kitle',
46
+ 'Nodül', 'Pnömoni', 'Pnömotoraks', 'Konsolidasyon', 'Ödem',
47
+ 'Amfizem', 'Fibrozis', 'Plevral Kalınlaşma', 'Hernia'
48
+ ]
49
+
50
+ # Rapor oluşturma için doğal dil işleme modeli
51
+ def load_nlp_model():
52
+ tokenizer = AutoTokenizer.from_pretrained("facebook/bart-large-cnn")
53
+ summarizer = pipeline("summarization", model="facebook/bart-large-cnn", tokenizer=tokenizer)
54
+ return summarizer
55
+
56
+ # Röntgen analiz fonksiyonu
57
+ def analyze_xray(image):
58
+ # Görüntü ön işleme
59
+ if image is None:
60
+ return None, "Lütfen bir görüntü yükleyin."
61
+
62
+ img = Image.fromarray(image).convert('RGB')
63
+ img_tensor = transform(img).unsqueeze(0)
64
+
65
+ # Model tahminleri
66
+ model = load_model()
67
+ with torch.no_grad():
68
+ outputs = model(img_tensor)
69
+
70
+ # Tahminleri işleme
71
+ probabilities = outputs[0].numpy()
72
+
73
+ # Pozitif bulguların tespiti (0.5 eşik değeri ile)
74
+ findings = []
75
+ for i, prob in enumerate(probabilities):
76
+ if prob > 0.5:
77
+ findings.append(f"{class_names[i]} (%.2f%%)" % (prob * 100))
78
+
79
+ if not findings:
80
+ findings.append("Belirgin patoloji tespit edilmedi.")
81
+
82
+ # Görselle ilgili özet rapor oluşturma (gerçek uygulama için geliştirilebilir)
83
+ summary = f"**Röntgen Analiz Raporu**\n\n"
84
+ summary += "**Tespit Edilen Bulgular:**\n"
85
+ for finding in findings:
86
+ summary += f"- {finding}\n"
87
+
88
+ # Gerçek bir uygulamada NLP tabanlı açıklama eklenir
89
+ summary += "\n**Yorum:**\n"
90
+ if "Belirgin patoloji tespit edilmedi." in findings:
91
+ summary += "Radyografide belirgin patolojik bulgu izlenmedi. Klinik bulgular ışığında değerlendirilmesi önerilir."
92
+ else:
93
+ summary += "Yukarıda belirtilen bulgular saptandı. Klinik bulgularla korele değerlendirilmesi önerilir."
94
+
95
+ # Doktora öneriler
96
+ summary += "\n\n**Öneriler:**\n"
97
+ if any(x in ' '.join(findings) for x in ['Pnömoni', 'Atelektazi', 'İnfiltrasyon']):
98
+ summary += "- Enfeksiyon belirtileri dikkate alınmalı\n"
99
+ summary += "- Antibiyotik tedavisi değerlendirilmeli\n"
100
+ if 'Nodül' in ' '.join(findings) or 'Kitle' in ' '.join(findings):
101
+ summary += "- İleri görüntüleme (BT) önerilir\n"
102
+ summary += "- Takip görüntüleme planlanmalı\n"
103
+ if 'Effüzyon' in ' '.join(findings) or 'Pnömotoraks' in ' '.join(findings):
104
+ summary += "- Torasentez düşünülebilir\n"
105
+
106
+ return img, summary
107
+
108
+ # Veri setinden örnek yükleme fonksiyonu
109
+ def load_sample():
110
+ # Rastgele bir örnek seçelim
111
+ random_idx = np.random.randint(0, len(dataset["train"]))
112
+ sample = dataset["train"][random_idx]
113
+ image = sample["image"].convert('RGB')
114
+ image_array = np.array(image)
115
+ return image_array
116
+
117
+ # Gradio arayüzü
118
+ with gr.Blocks(title="Göğüs Röntgeni Analiz Asistanı", theme=gr.themes.Soft()) as demo:
119
+ gr.Markdown("# 🏥 Göğüs Röntgeni Analiz Asistanı")
120
+ gr.Markdown("Bu araç, göğüs röntgenlerini analiz ederek olası bulguları tespit etmeye yardımcı olur.")
121
+
122
+ with gr.Row():
123
+ with gr.Column(scale=1):
124
+ image_input = gr.Image(type="numpy", label="Röntgen Görüntüsü")
125
+ with gr.Row():
126
+ analyze_btn = gr.Button("Analiz Et", variant="primary")
127
+ sample_btn = gr.Button("Örnek Yükle")
128
+
129
+ with gr.Column(scale=1):
130
+ image_output = gr.Image(label="İşaretlenmiş Görüntü")
131
+ text_output = gr.Markdown(label="Rapor")
132
+
133
+ analyze_btn.click(analyze_xray, inputs=image_input, outputs=[image_output, text_output])
134
+ sample_btn.click(load_sample, inputs=None, outputs=image_input)
135
+
136
+ gr.Markdown("## Nasıl Kullanılır")
137
+ gr.Markdown("""
138
+ 1. Göğüs röntgeni yükleyin veya 'Örnek Yükle' butonuna tıklayın
139
+ 2. 'Analiz Et' butonuna tıklayın
140
+ 3. Sistem röntgeni analiz edecek ve olası bulguları listeleyecektir
141
+
142
+ **Not:** Bu uygulama sadece yardımcı bir araçtır ve kesin teşhis için uzman radyolog görüşü gereklidir.
143
+ """)
144
+
145
+ # Uygulamayı başlat
146
+ if __name__ == "__main__":
147
+ demo.launch(share=True)