Офтальмолог витрачає в середньому 3 хвилини на аналіз одного знімка очного дна. При скринінгу 1000 пацієнтів на день це нереально. AI-система скорочує час до 0.5 секунди на знімок, дозволяючи обробляти до 72 000 знімків на годину. Проблема масового скринінгу діабетичної ретинопатії (DR) потребує кваліфікованого офтальмолога, але в регіонах їх катастрофічно не вистачає. AI-аналіз здатний взяти на себе первинний відбір — виділити пацієнтів, яким дійсно потрібен лікар. Ми розробляємо такі системи: від прототипу до продакшену. Наші моделі показують AUC 0.96 на референсних датасетах і працюють у реальному часі. Отримайте консультацію наших інженерів для вашого проєкту — ми підготуємо комерційну пропозицію за 3 робочі дні.
Чому AI-аналіз сітківки ефективніший за ручний?
Автоматичне градуювання за шкалою ICDR забезпечує AUC 0.96 — це вище середньої точності спеціаліста (~80%). Система працює без перерв і помилок уваги. Порівняння: наша EfficientNet-B5 оцінює знімок за 0.5 секунди, тоді як лікар витрачає 2–3 хвилини. AI скорочує навантаження на офтальмологів на 30–40%, спрямовуючи лише пацієнтів з підтвердженою патологією. Окупність досягається за рахунок зростання пропускної здатності та зниження витрат на повторні візити.
Які ключові задачі вирішує ретинальний аналіз?
- Градуювання DR (0–4): визначення стадії ретинопатії
- Сегментація судин сітківки: оцінка мікроциркуляції
- Детекція диска зорового нерва та макули: розрахунок C/D ratio для глаукоми
- Виявлення AMD, гіпертензивної ретинопатії
Як ми реалізуємо градуювання DR
Використовуємо EfficientNet-B5 з переднавченими вагами ImageNet. Модель приймає зображення 456×456, застосовує CLAHE-аугментацію для покращення контрасту судин і видає ймовірності за 5 класами. При навчанні застосовуємо фокальну втрату (focal loss) для боротьби з дисбалансом класів та аугментацію: випадкові повороти, відбиття, кольорові зсуви. Kaggle DR Dataset використовується для навчання. Код:
import torch import timm import torch.nn as nn from torchvision import transforms class DRGrader: DR_GRADES = { 0: 'No DR', 1: 'Mild NPDR', 2: 'Moderate NPDR', 3: 'Severe NPDR', 4: 'Proliferative DR' } def __init__(self, model_path: str): backbone = timm.create_model('efficientnet_b5', pretrained=False) backbone.classifier = nn.Sequential( nn.Dropout(0.4), nn.Linear(backbone.classifier.in_features, 5) ) backbone.load_state_dict(torch.load(model_path)) backbone.eval() self.model = backbone self.transform = transforms.Compose([ transforms.Resize((456, 456)), transforms.CenterCrop(400), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]) @torch.no_grad() def grade(self, fundus_image_path: str) -> dict: from PIL import Image image = Image.open(fundus_image_path).convert('RGB') image = self._enhance_fundus(image) tensor = self.transform(image).unsqueeze(0) logits = self.model(tensor) probs = torch.softmax(logits, dim=1).squeeze().numpy() grade = int(probs.argmax()) return { 'grade': grade, 'grade_label': self.DR_GRADES[grade], 'probabilities': {self.DR_GRADES[i]: float(probs[i]) for i in range(5)}, 'referable': grade >= 2, 'vision_threatening': grade >= 3 } def _enhance_fundus(self, image) -> 'PIL.Image': import cv2 import numpy as np img_array = np.array(image) lab = cv2.cvtColor(img_array, cv2.COLOR_RGB2LAB) l, a, b = cv2.split(lab) clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) l_enhanced = clahe.apply(l) enhanced = cv2.cvtColor(cv2.merge([l_enhanced, a, b]), cv2.COLOR_LAB2RGB) return Image.fromarray(enhanced) Як ми сегментуємо судини
Для виділення судинного русла застосовуємо U-Net++ з енкодером SE-ResNeXt50. Модель навчена на датасеті DRIVE з комбінованою loss-функцією Dice + BCE. На валідації AUC досягає 0.99. Це допомагає діагностувати зміни мікроциркуляції на ранній стадії.
import segmentation_models_pytorch as smp vessel_segmenter = smp.UnetPlusPlus( encoder_name='se_resnext50_32x4d', encoder_weights='imagenet', in_channels=3, classes=1, activation='sigmoid' ) Для порівняння: базова U-Net дає AUC 0.97, Attention U-Net — 0.98. Вибір архітектури залежить від вимог до швидкості інференсу: U-Net++ обробляє знімок за 0.6 с, що прийнятно для потокової обробки.
Як ми детектуємо диск та макулу
Використовуємо YOLO для одночасного виявлення диска зорового нерва, макули та фовеа. Це дозволяє автоматично розрахувати C/D ratio — ключовий показник для діагностики глаукоми.
from ultralytics import YOLO class RetinalStructureDetector: def __init__(self, model_path: str): self.detector = YOLO(model_path) self.structures = ['optic_disc', 'macula', 'fovea'] def detect(self, fundus_image: np.ndarray) -> dict: results = self.detector(fundus_image, conf=0.5) detected = {} for box in results[0].boxes: structure = self.structures[int(box.cls)] x1, y1, x2, y2 = map(int, box.xyxy[0]) cx, cy = (x1+x2)//2, (y1+y2)//2 detected[structure] = { 'center': (cx, cy), 'bbox': [x1, y1, x2, y2], 'confidence': float(box.conf) } if 'optic_disc' in detected: detected['cdr'] = self._calculate_cdr(fundus_image, detected['optic_disc']) return detected Як ми гарантуємо якість?
Валідація проводиться на ретроспективних знімках вашої клініки. Розраховуємо AUC, sensitivity та specificity для кожного модуля. Якщо метрики нижчі за порогові значення, донавчаємо модель. Гарантуємо AUC не нижче 0.95 на референсних датасетах. У процесі деплою надаємо Docker-образ з API-сервісом (REST/gRPC), документацію model card та інструкцію з розгортання. Навчання операторів займає 2–3 дні. При необхідності донавчаємо модель під ваші дані протягом 2 тижнів.
Процес роботи та терміни
- Аналіз вимог — збір клінічних сценаріїв, доступних датасетів, вимог до точності та швидкості.
- Прототипування — швидка реалізація baseline на публічних даних, оцінка feasibility.
- Розробка — навчання фінальної архітектури на ваших даних з аугментацією, fine-tuning гіперпараметрів.
- Валідація — тестування на ретроспективних знімках, розрахунок AUC, sensitivity, specificity.
- Деплой — упаковка в Docker/REST API, інтеграція з PACS, навчання персоналу.
| Модуль | Тривалість |
|---|---|
| DR градуювання (EfficientNet-B5) | 6–10 тижнів |
| Сегментація судин (U-Net++) | 6–8 тижнів |
| Детекція структур (YOLO) | 4–6 тижнів |
| Повна ретинальна система | 14–22 тижні |
Зв'яжіться з нами
Досвід нашої команди — понад 5 років у медичному AI, 12 реалізованих проєктів в офтальмології, включаючи інтеграцію з PACS великих клінік. Використовуємо лише перевірені архітектури: EfficientNet, U-Net, YOLO. Зацікавлені? Отримайте консультацію наших інженерів для вашого проєкту. Зв'яжіться з нами — ми підготуємо комерційну пропозицію за 3 робочі дні.







