STATE MACHINE · PROCESS LAYER · SAFETY/QA LAYER · v2.1
Aynı numune matriksi, disposable tip kullanıldı, splash yok
Farklı numune, aynı matriks tipi, düşük risk
Farklı matriks, şüpheli splash, yanlış dispense sonrası
Yüksek yük numune, biyofilm riski, alarm sonrası recovery
Günlük çevrim kapanışı — ertesi gün ready durumda bırakır
| Hata | Sınıf | Eylem | Kurtarılabilir? |
|---|---|---|---|
| Tip alınamadı (1. deneme) | WARNING | Yeniden dene (×3) | ✓ Evet |
| Tip alınamadı (3. deneme) | MINOR FAULT | Operatör çağır, iş durdur | ~ Koşullu |
| Tip + tool pozisyon hatası | MAJOR FAULT | Zone lockdown, tüm axisler durdur | ✗ Hayır |
| Dispense tolerans dışı (tekil) | WARNING | Log kaydı, işleme devam | ✓ Evet |
| Dispense tolerans dışı (3 ardışık) | PROCESS FAULT | Dilüsyon iptal, yeniden başlat | ~ Koşullu |
| Tıkanma algısı | MINOR FAULT | Geri çek, temizle, yeniden dene | ~ Koşullu |
| Barkod okunamadı | WARNING | Manuel giriş istek, 3× retry | ✓ Evet |
| LIMS reçetesi çekilemedi | MINOR FAULT | Lokal cache kontrol, operatör bildir | ~ Koşullu |
| UV-C doz doğrulaması başarısız | SAFETY FAULT | Chamber kilitle, servis çağır | ✗ Hayır |
| İnkübasyon sapması >0.5°C | WARNING | Log, sıcaklık toparlanmasını izle | ✓ Evet |
| İnkübasyon sapması >2°C | ALARM | Plate kurtarma prosedürü, operatör onayı | ~ Koşullu |
| Kamera blur / focus hatası | WARNING | Yeniden netleme, yeniden görüntü al | ✓ Evet |
| Görüntü kalitesi yetersiz (3×) | PROCESS FAULT | Manuel onay iste, sayım yapma | ~ Koşullu |
| Plate yanlış konumlandı | MINOR FAULT | Repositioning, konum doğrula | ~ Koşullu |
| Atık tank doldu | MAJOR FAULT | İşi durdur, boşaltma gerektir | ✗ İşlem durdurulur |
| Elektrik kesintisi / UPS devreye girdi | SAFETY FAULT | Güvenli durdurma, incubation koruma modu | ~ İnkübasyon korunur |
Mikrobiyolojik agar plakası görüntülerindeki bakteriyel kolonileri OpenCV ve derin öğrenme teknolojileriyle otomatik tespit eden, sayan ve raporlayan masaüstü yazılımı.
Proje amacı, kapsamı ve temel özellikler
MikroCFU, mikrobiyoloji laboratuvarlarında agar plakaları üzerinde büyüyen bakteriyel kolonilerin manuel sayımı yerine otomatik bilgisayarlı görü yöntemleriyle hızlı, doğru ve tekrarlanabilir sayım yapılmasını sağlar. CFU (Colony Forming Unit) hesaplamalarını destekler.
OpenCV motoru ortalama 1 s altında tam görüntü analizi
CLAHE, Watershed ve referans koloni filtreleme
Kendi verilerinizle model eğitin, ONNX'e aktarın
Spiral ve sektör plakalar için bölge bazlı dağılım analizi
Seçili bölgede yerel analiz ve hızlı odaklanma
Excel (.xlsx) ve CSV formatında detaylı rapor
ONNX, PyTorch ve YOLOv8 modellerini doğrudan kullan
Arayüz Türkçe ve İngilizce olarak çalışır
Uygulama arayüzü ve özellik görselleri
Ana pencere yatay bölünmüş iki panelden oluşur. Sol panel görüntü görüntüleyici (zoom + pan + ROI), sağ panel kontrol sekmelerini ve sonuçları gösterir. Üstteki araç çubuğu en sık kullanılan işlemlere hızlı erişim sağlar.
Ana Pencere — img_b64.json yüklenince görünecek
MikroCFU V2 — Ana Pencere: 37 koloni tespit edildi (0.82 s)
Analiz İşlemi: Görüntü İşleme Aşamaları — img_b64.json yüklenince görünecek
6 aşamalı görüntü işleme: Orijinal → CLAHE → Binary → Temizlenmiş → Watershed → Sonuç
Koloni Karoları Thumbnail Görünümü — img_b64.json yüklenince görünecek
16 koloni thumbnail kartı; sınıflandırma renk kodları ve koloni listesi
Sektör & Spiral Analizi — img_b64.json yüklenince görünecek
4 sektörlü analiz: S1:8, S2:11, S3:14, S4:10 koloni — Toplam: 43 koloni
Araçlar Paneli: Referans Koloni & ML/DL — img_b64.json yüklenince görünecek
Araçlar Paneli — ML sınıflandırma (30 özellik, ~%95 doğruluk) ve DL model tespiti (ONNX/YOLO)
img_b64.json dosyasını /home/ozkur/mikrobiyoloji-web/img_b64.json konumuna kopyalayın. Sayfa otomatik olarak görselleri yükleyecektir.
Modül yapısı, thread mimarisi ve sorumluluklar
| Modül | Görev |
|---|---|
main_window.py | GUI yönetimi, thread koordinasyonu |
colony_view.py | Zoom, pan, ROI, tıklama sinyalleri |
colony_counter.py | Tüm OpenCV analiz hattı |
dl_colony_detector.py | ONNX/YOLO/PT model inferans |
model_trainer.py | Özellik çıkarımı + eğitim + ONNX ihracı |
ml_data_exporter.py | Patch veri seti, metadata.csv |
fiji_bridge.py | PyImageJ API köprüsü |
Ağır hesaplamalar ayrı QThread nesnelerinde çalışır; UI tamamen tepkili kalır.
class AnalysisThread(QThread):
finished = pyqtSignal(dict) # Tamamlandığında sonuç dict'i
error = pyqtSignal(str) # Hata mesajı
progress = pyqtSignal(int) # 0-100 ilerleme yüzdesi
class ModelTrainingThread(QThread):
progress = pyqtSignal(str) # Epoch bilgisi
finished = pyqtSignal(dict, str) # (metrics, model_path)
error = pyqtSignal(str)
OpenCV tabanlı görüntü işleme algoritmaları
clipLimit=3.0, tileSize=16×16)7×7 kernel)colony_count.ijm ve preprocessing.ijm makro desteğiYerel kontrast iyileştirme — soluk koloniler global eşitlemeye dahil edilir. Agar maskesi dışı pikseller medyan değerle doldurulur.
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(16, 16))
agar_median = int(np.median(gray[agar_mask > 0]))
gray_for_clahe = gray.copy()
gray_for_clahe[agar_mask == 0] = agar_median
enhanced = clahe.apply(gray_for_clahe)
Birbirine yakın veya üst üste binen kolonileri ayrıştırmak için marker tabanlı yaklaşım — O(N log N) karmaşıklığı.
dist = cv2.distanceTransform(cleaned, cv2.DIST_L2, 5)
_, sure_fg = cv2.threshold(dist, 0.5*dist.max(), 255, 0)
# O(N log N) marker tabanlı özellik çıkarımı
flat_vals = markers.flatten()[flat_idx]
sort_order = np.argsort(flat_vals, kind='stable')
# YANLIŞ ❌ — orijinal görüntüyü maskeleme
full_img[mask == 0] = 0 # Otsu eşiğini bozar!
# DOĞRU ✅ — binary'e maskeleme
agar_pixels_vec = blurred[agar_mask > 0].reshape(-1, 1)
thresh_otsu, _ = cv2.threshold(agar_pixels_vec, 0, 255,
cv2.THRESH_BINARY + cv2.THRESH_OTSU)
binary = cv2.bitwise_and(binary, binary, mask=agar_mask)
Sekmeler, paneller ve tüm UI bileşenleri
| Eylem | İşlev | Koşul |
|---|---|---|
| Sol tık (koloni üzeri) | Koloniyi onayla (mavi daire) | Koloni Seçimi sekmesi |
| Sağ tık (koloni üzeri) | Koloniyi reddet (kırmızı) | Koloni Seçimi sekmesi |
| Sol tık + sürükle | Görüntüyü kaydır (pan) | Her zaman |
| Sağ tık + sürükle | ROI dikdörtgeni çiz | Normal mod |
| Çift tık | Seçili ROI'de analiz başlat | ROI çiziliyken |
| Fare tekerleği | Zoom in / out | Her zaman |
| Shift + sürükle | Serbest seçim ile toplu reddet | Normal mod |
| Ctrl + sürükle | Serbest seçim bölgesini yeniden tara | Normal mod |
📊 Analiz Sekmesi
🔧 Araçlar Sekmesi
📋 Rapor Sekmesi
🗂️ Eğitim Verisi
Model eğitimi, çıkarım ve veri seti yönetimi
Her koloni patch'inden 30 boyutlu özellik vektörü çıkarılır ve lojistik regresyon ile sınıflandırılır.
| Özellik Grubu | Boyut | Açıklama |
|---|---|---|
| HSV Histogramları | 16 | H:8 bin, S:4 bin, V:4 bin |
| HSV İstatistikleri | 6 | Her kanal ortalama + std |
| LAB İstatistikleri | 6 | Her kanal ortalama + std |
| Kenar Yoğunluğu | 1 | Canny normalize kenar yoğunluğu |
| Radyal Kontrast | 1 | Merkez − kenar parlaklık farkı |
| Toplam | 30 | 64×64 px patch giriş |
model_path, metrics = train_colony_classifier(
output_dir="ModelTraining/",
patch_size=64,
epochs=300
)
# → sample_colony_model.onnx (~%95 doğruluk)
Farklı formatlardaki DL modellerini otomatik algılar ve çalıştırır.
detector = DLColonyDetector()
detector.load_model(
"sample_colony_model.onnx",
model_type="auto",
conf_threshold=0.25
)
colonies = detector.detect(
image_path="plate.jpg",
agar_circle=(400, 300, 250)
)
[x_c, y_c, w, h, conf, class_id] (YOLO-uyumlu)
OpenCV veya DL motoru kolonileri tespit eder
Koloni Karoları sekmesinde her thumbnail için sınıf atanır
ml_data_exporter patch'leri sınıf klasörlerine kaydeder + metadata.csv üretir
model_trainer scikit-learn modeli ONNX formatında dışarı aktarır
Eğitilen model Araçlar → Derin Öğrenme panelinden yüklenir
ROI, sektör analizi, manuel ekleme ve referans koloni
Görüntünün belirli bir dikdörtgen bölgesini seçip yalnızca o alanda analiz yapılır.
Koloni Seçimi sekmesinde ROI dikdörtgeni çiz
Seçili alanda analiz başlatılır
Araç çubuğundan temizle; tam görüntü analizine dön
Analiz tamamlandıktan sonra Ctrl+S veya Rapor sekmesinden kaydedilen dosya paketi:
| Dosya | İçerik |
|---|---|
*_rapor.xlsx | Excel — koloni listesi, istatistik sayfası, sektör tablosu |
*_rapor.csv | Makine okunabilir koloni verisi |
*_annotated.png | İşaretlenmiş görüntü (mavi=onay, kırmızı=reddet) |
Hızlı erişim tuş kombinasyonları
| Kısayol | İşlev | Konum |
|---|---|---|
| Ctrl+O | Görüntü aç | Dosya menüsü |
| F5 | Analizi başlat | Analiz menüsü / Araç çubuğu |
| Ctrl+S | Raporu kaydet | Dosya menüsü |
| Ctrl+D | Rapor klasörü seç | Dosya menüsü |
| Ctrl+Q | Uygulamadan çık | Dosya menüsü |
| F1 | Kullanım kılavuzu | Yardım menüsü |
| Tekerlek | Zoom in / out | Görüntü üzerinde |
| Sol tık + sürükle | Görüntüyü kaydır (pan) | Koloni Seçimi |
| Sağ tık + sürükle | ROI dikdörtgeni çiz | Koloni Seçimi |
| Çift tık | ROI analizi başlat | ROI seçiliyken |
| Shift + sürükle | Serbest seçim ile toplu reddet | Koloni Seçimi |
| Ctrl + sürükle | Serbest seçim bölgesini yeniden tara | Koloni Seçimi |
Hızlı kurulum adımları
git clone https://github.com/ozkurkuran/MikroCFU.git
cd MikroCFU
pip install -r requirements.txt
pip install pyimagej scyjava # Java 11+ gerektirir
pip install ultralytics
python src/main.py
Zorunlu
| Paket | Versiyon |
|---|---|
| python | ≥ 3.9 |
| PyQt5 | ≥ 5.15 |
| opencv-python | ≥ 4.5 |
| numpy | ≥ 1.21 |
| scikit-learn | ≥ 1.0 |
| openpyxl | ≥ 3.0 |
| onnxruntime | ≥ 1.12 |
Opsiyonel
| Paket | Amaç |
|---|---|
| pyimagej | ImageJ/Fiji köprüsü |
| scyjava | Java-Python köprüsü |
| ultralytics | YOLOv8 model desteği |
| torch | PyTorch model desteği |
| skl2onnx | Sklearn→ONNX dönüşümü |
Tüm parametrelerin ayrıntılı açıklaması
| Parametre | Varsayılan | Aralık | Açıklama |
|---|---|---|---|
min_size | 50 | 1–50 000 px² | Minimum koloni blob alanı. Artefaktları elemek için artırın. |
max_size | 10 000 | 10–500 000 px² | Maksimum koloni alanı. Büyük konglomerat blobları dışlar. |
threshold | 0 (Otsu) | 0–255 | 0 = Otsu otomatik. Düşük değer daha fazla tespit. |
min_circularity | 0.20 | 0.0–1.0 | Min. dışbükeylik. Yüksek değer daha yuvarlak koloniler seçer. |
flatten_illumination | False | Açık/Kapalı | FFT periyodik arka plan düzeltme. Şerit artefaktları için. |
agar_circle | None | (cx, cy, r) | Petri kabı piksel koordinatları. Dışarıdaki pikseller dışlanır. |
ref_tolerance | 35 | 5–100 % | Renk toleransı yüzdesi. Düşük değer daha katı eşleştirme. |
min_size=50, max_size=5000, threshold=0, min_circularity=0.2min_size=10, max_size=500min_size=200, max_size=50000flatten_illumination=True + Agar alanı seç
# logs/app.log örnek
2026-03-19 14:23:01 INFO [main_window] Görüntü açıldı: sample_plate.jpg
2026-03-19 14:23:05 INFO [colony_counter] Analiz başladı: threshold=0 (Otsu)
2026-03-19 14:23:06 DEBUG [colony_counter] Otsu eşiği: 142, ön plan: 0.023
2026-03-19 14:23:06 INFO [colony_counter] 37 koloni tespit edildi (0.82 s)
2026-03-19 14:23:12 INFO [main_window] Rapor: KoloniRaporlari/plate_rapor.xlsx
🔬 MikroCFU — Koloni Sayım Sistemi V2
Geliştirici: Mikrofab Ltd. • www.mikrofab.com.tr • info@mikrofab.com.tr
Python 3.9+ · PyQt5 · OpenCV 4.x · 19 Mart 2026