Modern, dental fotoğraf analiz ve anamnez destekli mobil uygulama prototipi.
Amaç; hasta ve uzman rollerine göre:
- Dental fotoğraf yükleme/çekme
- “AI analiz” sonucu üretme
- Analize göre dinamik anamnez formu doldurma
- Raporları cihazda saklama ve görüntüleme
- Uzman tarafında paylaşılan raporları inceleme
akışlarını bir arada göstermek.
- Video Linki: https://youtube.com/shorts/J4lIFfjDGvQ?feature=share
Önemli: DentiScan tıbbi tanı koymaz. Sadece fotoğraf ve girilen bilgilere dayalı risk değerlendirmesi ve bilgilendirme sunar.
Gerçek hastalar için kullanılmamalıdır.
- Node.js (LTS)
- npm veya yarn
- Expo CLI (global şart değil,
npxile de çalışır)
cd "Mobil Uygulama Dersi/dentiscan"
npm install
npm start # veya:
npm run android
npm run webTelefonunuzda Expo Go ile QR kodu okutarak veya Android emülatöründe uygulamayı görebilirsiniz.
- Framework: Expo + React Native (TypeScript)
- Navigasyon:
@react-navigation- Root Stack (
RootNavigator) - Auth Stack (Welcome + Login)
- Patient Stack (Tab + Yeni Analiz / Sonuç / Anamnez / Rapor Detay / Feedback)
- Expert Stack (Tab + Rapor İnceleme)
- Root Stack (
- Durum Yönetimi:
zustandauthStore– kullanıcı ve rolanalysisStore– son AI analiz sonucu
- Formlar:
react-hook-form+zod - UI:
react-native-paper(Material 3) + custom light/dark renk paleti - Depolama:
@react-native-async-storage/async-storage- Raporlar
- Feedback
- Basit analytics (kaç analiz yapıldı, son analiz tarihi)
- Fotoğraf:
expo-image-picker(kamera + galeri) - Dosya:
expo-file-systempaketi projeye eklenmiştir (ileride PDF veya export için hazır) - Güvenlik: Mock senaryoda gerçek token yok; gerçek projede
expo-secure-storeile entegre edilebilir.
Klasör yapısı (özet):
dentiscan/
App.tsx
src/
navigation/
RootNavigator.tsx
auth/AuthNavigator.tsx
patient/PatientNavigator.tsx
expert/ExpertNavigator.tsx
tabs/PatientTabs.tsx
tabs/ExpertTabs.tsx
features/
auth/
reports/
profile/
expert/
feedback/
services/
aiService.ts
reportService.ts
feedbackService.ts
store/
authStore.ts
analysisStore.ts
ui/
theme.ts
components/
AppPrimitives.tsx
utils/
analyticsService.ts
types/
models.ts
src/types/models.ts içinde uygulamanın temel tipleri tanımlıdır:
- User
id,role(patient|expert),name,email
- AiResult
summary,riskLevel(low|medium|high)findings[]– başlık, güven skoru, notrecommendations[]anamnesis– AI’ın önerdiği anamnez alanları ve sorularıdisclaimer
- Report
id,patientId,createdAtimageUri– dental fotoğraf URIaiResult– yukarıdaki JSON şemasına uygunanamnesisAnswers– soru-id / cevap map’isharedWithExpert?: booleanexpertNote?: string– uzman notu (mock)
analyzeDentalPhoto(imageUri) : Promise<{ aiResult: AiResult; interpretation: string | null }>- Fotoğrafı base64’e çevirir (
expo-image-manipulator). POST { imageBase64 }ile Python/Colab backend’deki/analyzeendpoint’ine istek atar.- Backend:
prithivMLmods/tooth-agenesis-siglip2modeli ile dental sınıflandırma yapar.meta-llama/Llama-3.1-8B-Instruct(veya seçtiğiniz başka bir LLM) ile Türkçe açıklama üretir.- İkisini birlikte döner:
aiResult: UI’daki özet, bulgular, öneriler, anamnez vs.interpretation: LLM’den dönen serbest metin açıklama (yoksanull).
- Fotoğrafı base64’e çevirir (
- Backend’e ulaşılamazsa veya hata olursa:
- Uçtan uca akış bozulmasın diye lokal mock
AiResultüretilir,interpretation: nulldöner.
- Uçtan uca akış bozulmasın diye lokal mock
createReport(report)– yeni rapor kaydeder (AsyncStorage)listReportsByPatient(patientId)– “Analizlerim” ekranı için listegetReport(id)– rapor detayıupdateReport(id, patch)– rapor güncelleme (örneğinsharedWithExpert,expertNote)listSharedReports()– uzman tarafı için paylaşılan raporlar
submitFeedback(rating, comment)– yıldız + yorum kaydılistFeedback()– kayıtlı geri bildirimleri listeler (şu an sadece demo amaçlı)
incrementAnalysisCount()– her yeni rapor sonrası sayaç + tarih güncellenir.getAnalytics()– toplam analiz sayısı ve son analiz tarihi.
- Uygulamanın amacı, gizlilik ve “tıbbi tanı değildir” uyarısı.
- İki chip:
- “Hasta olarak devam et”
- “Uzman olarak devam et”
- Seçime göre
LoginScreen’e yönlendirir ve rol parametresi geçirir.
react-hook-form + zodile:- Ad Soyad
- E-posta
loginMockilezustandstore’a kullanıcıyı yazar:role: 'patient' | 'expert'
- Başarılı girişte:
- Hasta →
PatientNavigator - Uzman →
ExpertNavigator
- Hasta →
Tablar (PatientTabs):
-
Ana Sayfa (
PatientHomeScreen)- “Yeni Analiz Başlat” kartı ve butonu →
NewAnalysisPhotoScreen - Basit analytics kartı:
- Toplam analiz sayısı
- Son analiz tarihi
- Son 3 rapor alanı placeholder (AsyncStorage üzerinden genişletilebilir)
- “Yeni Analiz Başlat” kartı ve butonu →
-
Analizlerim (
ReportsListScreen)- Hasta id’ye göre raporlar AsyncStorage’dan çekilir.
- Arama kutusu (özet metni içinde arama)
- Risk seviyesine göre filtre chip’leri (low/medium/high/tümü)
- Liste elemanına tıklayınca →
ReportDetailScreen
-
Profil (
PatientProfileScreen)- Kullanıcı bilgileri (isim, e-posta, rol)
- Gizlilik metni (fotoğrafların cihazda mock olarak tutulduğu vurgulanır)
- “Çıkış Yap” butonu
- “Geri Bildirim Gönder” →
FeedbackScreen
-
Fotoğraf Yükle/Çek (
NewAnalysisPhotoScreen)expo-image-pickerile:- Galeriden seç
- Kamera ile çek (izin kontrolü)
- Seçilen fotoğraf için önizleme
- Segment buton:
- Mock Analiz
- API (varsa)
- “Analiz Et”:
analyzeDentalPhoto(imageUri)çağrılır (yalnızca doğrulama amaçlı)AnalysisResultScreen’e geçilir.
-
Analiz Sonucu (
AnalysisResultScreen)analyzeDentalPhotoile gelen JSON:aiResult– tooth-agenesis modelinden gelen ham sonuç (UI’da Türkçeleştirilmiş)interpretation– Llama 3.1 (veya seçtiğiniz LLM) ile üretilmiş Türkçe açıklama- Özet
- Risk seviyesi chip’i (renk kodlu)
- Bulgular listesi
- Öneriler listesi
- Uyarı/disclaimer metni
- “DentiScan Yorumu” kartı:
- Önce “Detaylı yorum hazırlanıyor, lütfen bekleyin...” yazar.
- LLM’den yanıt gelirse sadece LLM yorumu gösterilir.
- Zaman aşımı veya hata durumunda: “LLM tabanlı detaylı yorum şu anda alınamadı...” mesajı gösterilir.
- “Anamnez Doldur” butonu:
AnamnesisFormScreen’e geçiş
-
Anamnez Formu (
AnamnesisFormScreen)- AI’ın
anamnesisalanındaki sorulara göre dinamik alanlar:- pain, bleeding, duration, medical
react-hook-form + zodile text alanları- “Raporu Kaydet”:
Reportobjesi oluşturulurcreateReport(report)ile kaydedilirincrementAnalysisCount()ile analytics güncellenirReportDetailScreen’e yönlenir.
- AI’ın
-
Rapor Detay (
ReportDetailScreen)- Fotoğraf (URI)
- Analiz özeti ve risk seviyesi
- Anamnez cevapları listesi
- “Uzmanla paylaş” butonu:
sharedWithExpert: trueolarak raporu günceller- Uzman panelindeki hasta listesine düşmesini simüle eder.
-
Hasta Listesi (
ExpertPatientsScreen)listSharedReports()ilesharedWithExpert === trueraporlar çekilir.patientId’e göre gruplanır (mock hasta kimlikleri)- Arama kutusu: hasta ID içinde arama
- Her hasta altında rapor listesi:
- Tarih, risk seviyesi, özet
- Tıklandığında →
ExpertReportDetailScreen
-
Rapor İnceleme (
ExpertReportDetailScreen)- Rapor özeti ve anamnez cevapları
- “Uzman Notu / Öneri” alanı:
expertNotealanı AsyncStorage’da saklanır (mock)- “Notu Kaydet (Mock)” butonu
-
Uzman Profil (
ExpertProfileScreen)- Uzmanın mock bilgileri
- Panelin demo amaçlı olduğu bilgisi
- 1–5 arası yıldız seçimi
- Opsiyonel yorum alanı
- “Gönder”:
submitFeedback(rating, comment)ile AsyncStorage’a kaydedilir.- Buton “Teşekkürler!” durumuna geçer.
- Tema:
src/ui/theme.ts- Light & Dark tabanlı modern sağlık renk paleti
- Mavi/yeşil tonlar, yumuşak yüzeyler
- Reusable bileşenler (
AppPrimitives.tsx):Screen– her ekran için temel layoutAppButton– yuvarlatılmış butonAppCard– kart yapısıEmptyState– boş liste durumlarıErrorState– hata mesajlarıLoadingOverlay– tam ekran loading
Her liste ve veri çekme işlemi için:
- Loading: Analiz sonucu, rapor detayı vs. için yükleniyor gösterimi
- Empty state: Hiç rapor yoksa veya paylaşılan hasta yoksa
- Error state: Servis katmanındaki
try/catchile kullanıcı dostu hata mesajları
Bu proje, ders kapsamında MVP / demo amaçlı tasarlanmıştır:
- Gerçek hasta verisi ile kullanılmamalıdır.
- AI kısmı:
- Lokal fallback’te mock/heuristic bazlıdır.
- Python/Colab backend’i ile birlikte gerçek görüntü sınıflandırma + LLM yorumlama akışı sağlar.
İleri faz için fikirler:
- Gerçek AI servisi entegrasyonu (
ANALYSIS_API_URLüzerinden) - PDF rapor üretimi (
expo-file-system+ PDF kütüphesi) - Gerçek backend + JWT auth (
expo-secure-storeile token saklama) - Yetkilendirme, audit log, çoklu klinik desteği
- Daha detaylı dental bulgu şeması ve anotasyonlu görsel işaretleme
Bu README, projeyi hızlıca ayağa kaldırmanız ve temel akışları anlamanız için özet bir rehberdir.
Kodun tamamı TypeScript ile yazıldığı için, bileşen ve tip isimleri üzerinden kolayca keşfe devam edebilirsiniz.
Bu klasör Git’e yalnızca kaynak kod ile dahil edilmelidir.
venv/ve diğer derlenmiş dosyalar.gitignoreile dışarıda bırakılmıştır.
python-backend/requirements.txt:
fastapi==0.115.5
uvicorn[standard]==0.32.0
transformers==4.45.2
torch>=2.3.0
Pillow==10.4.0
python-multipart==0.0.12
accelerate==1.0.1cd python-backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
uvicorn app:app --host 0.0.0.0 --port 4001GET /health→{ ok: true, image_model, llm_model }POST /analyze:- Body:
{ "imageBase64": "<base64-görüntü>" } - Response:
{ aiResult: AiResult, interpretation: string | null }
- Body:
Uyarı: Llama 3.1 8B modeli CPU’da ağırdır. Gerçek kullanım için GPU’lu bir makine veya Colab GPU önerilir.
Lokal makineniz Llama 3.1 8B için yetersizse, aynı backend’i Google Colab üzerinde çalıştırabilirsiniz.
- Yeni bir Colab defteri açın.
- README’nin sonundaki “Colab backend örneği” hücrelerini sırasıyla çalıştırın:
- Hugging Face’e
login(...)ile giriş - FastAPI + modelleri kurup
app’i tanımlama pyngrokileuvicorn’u dışarı açma
- Hugging Face’e
- Colab çıktısında görünen:
PUBLIC URL: https://xxxx.ngrok-free.app
Health check: https://xxxx.ngrok-free.app/health
- Mobil uygulamada
BACKEND_URLsabitini bu URL ile güncelleyin:
// src/services/aiService.ts
const BACKEND_URL = 'https://xxxx.ngrok-free.app';Artık:
analyzeDentalPhoto→https://xxxx.ngrok-free.app/analyze- Backend:
- tooth-agenesis sınıflandırma
- Llama 3.1 ile Türkçe yorum
- Sonucu mobil UI’a döndürür.
- Node tarafı:
node_modules/,.expo/,.expo-shared/zaten.gitignoreiçinde.
- Python tarafı:
python-backend/venv/__pycache__/,*.pyc- Colab checkpoint/defterleri:
*.ipynb,.ipynb_checkpoints/
Bu sayede:
- Depoya yalnızca kaynak kod ve konfigürasyonlar girer.
- Büyük venv / model cache’leri remote’a push edilmez.