Spaces:
Running
Running
Add files via upload
Browse files- tumor_analysis.ipynb +0 -0
- tumor_detection_app.py +302 -0
tumor_analysis.ipynb
ADDED
The diff for this file is too large to render.
See raw diff
|
|
tumor_detection_app.py
ADDED
@@ -0,0 +1,302 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from PIL import Image
|
3 |
+
import numpy as np
|
4 |
+
import pandas as pd
|
5 |
+
import base64
|
6 |
+
import os
|
7 |
+
import h5py
|
8 |
+
import matplotlib.pyplot as plt
|
9 |
+
|
10 |
+
# Streamlit ile HTML ve CSS ekleme
|
11 |
+
st.markdown(f"""
|
12 |
+
<style>
|
13 |
+
.body {{
|
14 |
+
background-color: #f0f0f0; /* Açık gri arka plan */
|
15 |
+
/* veya */
|
16 |
+
background-image: url('/static/images/background.jpg');
|
17 |
+
background-size: cover;
|
18 |
+
}}
|
19 |
+
.main {{
|
20 |
+
background-color: rgba(255, 255, 255, 0.8); /* Beyaz renk, %80 şeffaflık */
|
21 |
+
padding: 20px;
|
22 |
+
border-radius: 10px;
|
23 |
+
background-image: url("/Users/eceguney/Desktop/background.PNG"); /* Arka plan resminin yolu */
|
24 |
+
background-position: center;
|
25 |
+
background-repeat: no-repeat;
|
26 |
+
background-size: cover;
|
27 |
+
height: 100vh; /* Sayfa yüksekliği */
|
28 |
+
}}
|
29 |
+
.header {{
|
30 |
+
color: white;
|
31 |
+
background-color: #4CAF50;
|
32 |
+
padding: 10px;
|
33 |
+
text-align: center;
|
34 |
+
border-radius: 5px;
|
35 |
+
}}
|
36 |
+
|
37 |
+
.section-title {{
|
38 |
+
color: #4CAF50;
|
39 |
+
font-size: 30px;
|
40 |
+
text-align: center;
|
41 |
+
margin: 20px 0;
|
42 |
+
border-bottom: 2px solid #4CAF50;
|
43 |
+
padding-bottom: 5px;
|
44 |
+
}}
|
45 |
+
|
46 |
+
.sidebar .sidebar-content {{
|
47 |
+
background-color: #f4f4f9;
|
48 |
+
}}
|
49 |
+
.section-title {{
|
50 |
+
color: #4CAF50;
|
51 |
+
font-size: 30px;
|
52 |
+
text-align: center;
|
53 |
+
margin: 20px 0;
|
54 |
+
border-bottom: 2px solid #4CAF50;
|
55 |
+
padding-bottom: 5px;
|
56 |
+
}}
|
57 |
+
|
58 |
+
.content-box {{
|
59 |
+
border: 2px solid #4CAF50;
|
60 |
+
padding: 20px;
|
61 |
+
border-radius: 5px;
|
62 |
+
margin-bottom: 20px;
|
63 |
+
}}
|
64 |
+
|
65 |
+
.form-container {{
|
66 |
+
border: 2px solid #4CAF50;
|
67 |
+
padding: 15px;
|
68 |
+
border-radius: 5px;
|
69 |
+
background-color: #f9f9f9;
|
70 |
+
}}
|
71 |
+
|
72 |
+
.table-container {{
|
73 |
+
border: 2px solid #4CAF50;
|
74 |
+
padding: 15px;
|
75 |
+
border-radius: 5px;
|
76 |
+
background-color: #f9f9f9;
|
77 |
+
}}
|
78 |
+
|
79 |
+
.footer {{
|
80 |
+
text-align: center;
|
81 |
+
font-size: 12px;
|
82 |
+
color: gray;
|
83 |
+
margin-top: 20px;
|
84 |
+
}}
|
85 |
+
</style>
|
86 |
+
""", unsafe_allow_html=True)
|
87 |
+
|
88 |
+
# Ana başlık
|
89 |
+
st.title("Tümör Tespit Sistemi")
|
90 |
+
|
91 |
+
# Menü çubuğu oluştur, her seçenek için benzersiz key parametresi ekle
|
92 |
+
# Sidebar menu
|
93 |
+
menu = st.sidebar.selectbox("Menü", ["Anasayfa", "Hakkımızda", "Tümör Tespiti","Örnek Hasta Analizlerimiz", "Hasta Yorumları", "Bize Ulaşın"], key="menu_selectbox")
|
94 |
+
|
95 |
+
# Menüye göre sayfaların içeriğini değiştir
|
96 |
+
if menu == "Anasayfa":
|
97 |
+
st.markdown('<div class="header"><h2>Hoş Geldiniz!</h2></div>', unsafe_allow_html=True)
|
98 |
+
st.write("Bu uygulama, MR görüntüleri üzerinden tümör tespiti ve analiz yapmaktadır.")
|
99 |
+
# Resmi yükleyin
|
100 |
+
image = Image.open("/Users/eceguney/Desktop/veri bilimi/kod calismalarim/mri/index.jpeg")
|
101 |
+
st.image(image, caption="Beyin Tümörü Tespiti", use_container_width=True)
|
102 |
+
|
103 |
+
elif menu == "Hakkımızda":
|
104 |
+
st.markdown('<div class="header"><h2>Hakkımızda</h2></div>', unsafe_allow_html=True)
|
105 |
+
st.write("""
|
106 |
+
Tümör Tespit Sistemi olarak, sağlık alanında teknolojiyi kullanarak insanların hayatlarını daha sağlıklı ve güvenli hale getirmeyi amaçlıyoruz. Ekibimiz, yapay zeka ve derin öğrenme teknikleriyle gelişmiş sağlık çözümleri üretmeye odaklanmış bir grup uzman profesyonelden oluşmaktadır. Yenilikçi yaklaşımlar ve sağlam bilimsel temellerle, kanser ve diğer hastalıkların erken teşhisini mümkün kılacak teknolojiler geliştirmekteyiz.
|
107 |
+
|
108 |
+
Misyonumuz, tıbbi görüntüleme verilerini kullanarak tümörleri erken aşamalarda tespit etmek ve doğru teşhis konulmasına yardımcı olmaktır. Bu, hastaların tedaviye daha erken başlamasını ve sonuçların daha başarılı olmasını sağlar. Tümör Tespit Sistemi, doktorların tanı koyma sürecini hızlandırarak, zamanında ve doğru müdahaleler yapılmasına olanak tanır.
|
109 |
+
|
110 |
+
Yapay zeka destekli sistemimiz, sürekli olarak öğrenen ve gelişen bir yapıya sahiptir. Sistemimiz, MR, röntgen ve diğer tıbbi görüntüleri analiz ederek, tümör varlığını yüksek doğrulukla tespit eder ve görsel işaretlemeler yaparak doktorlara kolaylık sağlar. Bu sayede, sağlık profesyonelleri daha verimli çalışabilir, hastalar ise doğru ve hızlı bir şekilde tedavi süreçlerine dahil olabilirler.
|
111 |
+
|
112 |
+
Her adımda güvenlik ve gizliliğe büyük önem veriyor, hasta verilerini korumak için en yüksek güvenlik standartlarını uyguluyoruz. Kullanıcı dostu arayüzümüz sayesinde, sistemimiz her türlü sağlık kuruluşunda kolayca kullanılabilir. Sürekli olarak güncellenen ve geliştirilen bu sistem, sağlık sektöründe önemli bir devrim yaratmayı hedeflemektedir.
|
113 |
+
|
114 |
+
Vizyonumuz ise, yapay zeka teknolojileriyle sağlık hizmetlerini dönüştürerek, daha hızlı, daha doğru ve daha erişilebilir bir sağlık altyapısı oluşturmaktır. Bu sayede, her bireyin sağlık durumunun daha yakından takip edilebilmesi ve sağlık hizmetlerine erişimin daha kolay hale gelmesi için çalışıyoruz.
|
115 |
+
|
116 |
+
Sağlıklı günler dileriz.
|
117 |
+
""")
|
118 |
+
|
119 |
+
# "Örnek Analizlerimiz" sekmesi
|
120 |
+
elif menu == "Örnek Hasta Analizlerimiz":
|
121 |
+
st.markdown('<div class="header"><h2>Örnek Analizlerimiz</h2></div>', unsafe_allow_html=True)
|
122 |
+
folder_path = "/Users/eceguney/Desktop/veri bilimi/kod calismalarim/mri/dataset/data/"
|
123 |
+
|
124 |
+
# Dizin içindeki .mat dosyalarını listeleme
|
125 |
+
mat_files = [f for f in os.listdir(folder_path) if f.endswith('.mat')]
|
126 |
+
|
127 |
+
# İlk 20 görüntü ile sınırlama
|
128 |
+
mat_files = mat_files[:20]
|
129 |
+
|
130 |
+
# Görüntülerde tümör olup olmadığını kontrol etmek için sayaç
|
131 |
+
tumor_found_count = 0
|
132 |
+
non_tumor_count = 0
|
133 |
+
|
134 |
+
# Her bir .mat dosyasını işlemek için döngü
|
135 |
+
for mat_file in mat_files:
|
136 |
+
file_path = os.path.join(folder_path, mat_file)
|
137 |
+
|
138 |
+
# Dosyayı açma
|
139 |
+
with h5py.File(file_path, 'r') as data:
|
140 |
+
cjdata = data['cjdata']
|
141 |
+
|
142 |
+
# Görüntü verisini alma
|
143 |
+
image = np.array(cjdata['image']) # Görüntü
|
144 |
+
|
145 |
+
# 'tumorBorder' verisini alma
|
146 |
+
tumor_border = None
|
147 |
+
if 'tumorBorder' in cjdata:
|
148 |
+
tumor_border = np.array(cjdata['tumorBorder'])
|
149 |
+
tumor_found_count += 1 # Tümör bulunan görüntü sayısını artır
|
150 |
+
|
151 |
+
# 'tumorMask' verisini alma (Tümör maskesi var mı?)
|
152 |
+
tumor_mask = None
|
153 |
+
if 'tumorMask' in cjdata:
|
154 |
+
tumor_mask = np.array(cjdata['tumorMask'])
|
155 |
+
|
156 |
+
# Görüntüyü matplotlib ile hazırlama
|
157 |
+
fig, ax = plt.subplots()
|
158 |
+
ax.imshow(image, cmap='gray') # Siyah-beyaz görüntü
|
159 |
+
|
160 |
+
# Eğer tümör sınırı varsa, bunu kırmızı renkte çizme
|
161 |
+
if tumor_border is not None:
|
162 |
+
ax.plot(tumor_border[:, 0], tumor_border[:, 1], color='red', label="Tümör Sınırları", linewidth=2)
|
163 |
+
else:
|
164 |
+
non_tumor_count += 1 # Tümör olmayan görüntü sayısını artır
|
165 |
+
|
166 |
+
# Maskeyi kırmızı olarak ekleme (şeffaflık ile)
|
167 |
+
if tumor_mask is not None:
|
168 |
+
ax.imshow(tumor_mask, cmap='Reds', alpha=0.5) # Kırmızı tonlarında ve şeffaf olarak eklenmiş
|
169 |
+
|
170 |
+
# Tümörün boyutunu hesaplama (maskedeki piksel sayısı)
|
171 |
+
tumor_area = np.sum(tumor_mask) # Tümör maskesindeki beyaz piksel sayısı (tümör alanı)
|
172 |
+
|
173 |
+
# Risk analizi
|
174 |
+
if tumor_area < 500:
|
175 |
+
risk_message = "Düşük risk: Küçük tümör. Düzenli takip gereklidir."
|
176 |
+
elif tumor_area < 2000:
|
177 |
+
risk_message = "Orta risk: Orta büyüklükte tümör. Hekiminizle görüşün."
|
178 |
+
else:
|
179 |
+
risk_message = "Yüksek risk: Büyük tümör. Acil müdahale gerekebilir."
|
180 |
+
|
181 |
+
# Mesaj kutusunda tümör durumu ve risk bilgisini gösterme
|
182 |
+
message = f"Tümör Alanı: {tumor_area} piksel\n{risk_message}"
|
183 |
+
else:
|
184 |
+
# Tümör bulunmayan görüntüler için mesaj
|
185 |
+
message = "Tümör bulunmamaktadır.\nSağlıklı günler dileriz."
|
186 |
+
|
187 |
+
# Başlık ve etiket ekleme
|
188 |
+
ax.set_title(f"MR Görüntüsü ve Tümör Sınırları ({mat_file})")
|
189 |
+
ax.legend()
|
190 |
+
|
191 |
+
# Görüntüyü Streamlit'te gösterme
|
192 |
+
st.pyplot(fig)
|
193 |
+
st.markdown(f"**{message}**")
|
194 |
+
|
195 |
+
# Açıklama metnini ekleyelim
|
196 |
+
st.markdown(f"### Açıklama: {mat_file}")
|
197 |
+
st.write("""
|
198 |
+
Bu görüntü, beyin MR'ı üzerinde yapılan tümör tespiti analizinin bir örneğidir.
|
199 |
+
Görüntüdeki tümör sınırları (eğer varsa) kırmızı renkte gösterilmektedir.
|
200 |
+
Ayrıca, tümör alanı hesaplanarak risk analizi yapılmaktadır.
|
201 |
+
Eğer tümör alanı küçükse, düşük risk kategorisinde değerlendirilir;
|
202 |
+
orta büyüklükte ise orta risk, büyük bir tümör var ise yüksek risk kategorisinde yer alır.
|
203 |
+
Eğer görüntüde tümör yoksa, bu da açıkça belirtilir.
|
204 |
+
""")
|
205 |
+
|
206 |
+
# Sonuçları yazdırma
|
207 |
+
st.write(f"Tümör Bulunan Görüntüler: {tumor_found_count}")
|
208 |
+
st.write(f"Tümör Olmayan Görüntüler: {non_tumor_count}")
|
209 |
+
|
210 |
+
elif menu == "Tümör Tespiti":
|
211 |
+
st.markdown('<div class="header"><h2>Tümör Tespiti</h2></div>', unsafe_allow_html=True)
|
212 |
+
# Hasta Bilgilerini Almak İçin Form
|
213 |
+
with st.form(key='patient_form'):
|
214 |
+
st.markdown('<div class="section-title">Hasta Bilgileri</div>', unsafe_allow_html=True)
|
215 |
+
name = st.text_input("Ad Soyad")
|
216 |
+
age = st.number_input("Yaş", min_value=0, max_value=120)
|
217 |
+
gender = st.selectbox("Cinsiyet", ["Erkek", "Kadın"], key="gender_selectbox")
|
218 |
+
uploaded_file = st.file_uploader("MR Görüntüsünü Yükleyin", type=["jpg", "png", "jpeg"], key="file_uploader")
|
219 |
+
submit_button = st.form_submit_button("Tümör Analizini Başlat")
|
220 |
+
if submit_button:
|
221 |
+
if uploaded_file is not None:
|
222 |
+
image = Image.open(uploaded_file)
|
223 |
+
st.image(image, caption="Yüklenen MR Görüntüsü", use_container_width=True)
|
224 |
+
|
225 |
+
# Görüntü üzerinde basit bir analiz yapalım (örneğin, renk tonlarıyla basit bir tümör varlığı kontrolü)
|
226 |
+
image_array = np.array(image)
|
227 |
+
|
228 |
+
# Örnek basit analiz: Görüntünün ortalama parlaklık değerini alalım
|
229 |
+
average_brightness = np.mean(image_array)
|
230 |
+
|
231 |
+
# Tümör var mı yok mu tahmini (basit bir yaklaşım)
|
232 |
+
if average_brightness < 100: # Bu eşik değeri tamamen örnektir, daha gelişmiş bir analiz için değiştirilmelidir.
|
233 |
+
tumor_status = "Tümör Tespit Edildi"
|
234 |
+
explanation = "Görüntüde yüksek kontrastlı alanlar tespit edildi, bu da tümör olasılığını artırıyor."
|
235 |
+
else:
|
236 |
+
tumor_status = "Tümör Yok"
|
237 |
+
explanation = "Görüntüde belirgin bir kontrast farkı bulunmamaktadır, bu da tümör olmadığına işaret edebilir."
|
238 |
+
|
239 |
+
# Sonuçları göster
|
240 |
+
st.markdown(f"**Sonuç: {tumor_status}**")
|
241 |
+
st.write(explanation)
|
242 |
+
|
243 |
+
elif menu == "Hasta Yorumları":
|
244 |
+
st.markdown('<div class="header"><h2>Hasta Yorumları</h2></div>', unsafe_allow_html=True)
|
245 |
+
# Yorumları Listeleme
|
246 |
+
st.markdown('<div class="table-container">', unsafe_allow_html=True)
|
247 |
+
st.write("""
|
248 |
+
- Hasta 1: "Bu sistem hayatımı kurtardı, teşekkürler!"
|
249 |
+
- Hasta 2: "Çok kolay ve kullanışlı."
|
250 |
+
- Hasta 3: "Hızlı sonuç ve güvenilir analiz."
|
251 |
+
""")
|
252 |
+
st.markdown('</div>', unsafe_allow_html=True)
|
253 |
+
|
254 |
+
# Yorum eklemek için form
|
255 |
+
with st.form(key='comment_form'):
|
256 |
+
st.markdown('<div class="section-title">Yeni Yorum Ekleyin</div>', unsafe_allow_html=True)
|
257 |
+
|
258 |
+
new_comment = st.text_area("Yorumunuzu Buraya Yazın", key="new_comment_area")
|
259 |
+
submit_button = st.form_submit_button("Yorum Gönder")
|
260 |
+
|
261 |
+
if submit_button and new_comment:
|
262 |
+
st.write(f"Yeni Yorum: {new_comment}")
|
263 |
+
st.write("Yorum başarıyla eklendi.")
|
264 |
+
|
265 |
+
elif menu == "Bize Ulaşın":
|
266 |
+
# Bize Ulaşın sayfası içeriği
|
267 |
+
st.markdown('<div class="header"><h2>Bize Ulaşın</h2></div>', unsafe_allow_html=True)
|
268 |
+
|
269 |
+
# İletişim bilgilerini tablo şeklinde yazdırma
|
270 |
+
contact_info = {
|
271 |
+
"Bilgi": ["Email", "Telefon", "Adres"],
|
272 |
+
"Değer": ["info@tumordetection.com", "+90 555 555 55 55", "İstanbul, Türkiye"]
|
273 |
+
}
|
274 |
+
|
275 |
+
# DataFrame oluşturuluyor
|
276 |
+
contact_df = pd.DataFrame(contact_info)
|
277 |
+
|
278 |
+
# Tabloyu Streamlit üzerinde gösterme
|
279 |
+
st.markdown('<div class="table-container">', unsafe_allow_html=True)
|
280 |
+
st.table(contact_df) # Tabloyu göster
|
281 |
+
st.markdown('</div>', unsafe_allow_html=True)
|
282 |
+
|
283 |
+
# Doldurulabilir iletişim formu
|
284 |
+
with st.form(key="contact_form"):
|
285 |
+
st.subheader("İletişim Formu")
|
286 |
+
|
287 |
+
# Kullanıcıdan veri alınması
|
288 |
+
name = st.text_input("Adınız Soyadınız")
|
289 |
+
email = st.text_input("E-posta Adresiniz")
|
290 |
+
subject = st.text_input("Konu")
|
291 |
+
message = st.text_area("Mesajınız")
|
292 |
+
|
293 |
+
# Gönder butonu
|
294 |
+
submit_button = st.form_submit_button("Gönder")
|
295 |
+
|
296 |
+
if submit_button:
|
297 |
+
# Form gönderildiğinde kullanıcıya onay mesajı gösterme
|
298 |
+
st.success(f"Teşekkür ederiz {name}, mesajınız başarıyla gönderildi!")
|
299 |
+
# Burada form verilerini bir veritabanına veya e-posta sistemine yönlendirebilirsiniz
|
300 |
+
|
301 |
+
# Footer
|
302 |
+
st.markdown('<div class="footer">© 2024 Tümör Tespit Sistemi. Tüm haklar saklıdır. </div>', unsafe_allow_html=True)
|