AI для гістологічних зображень: від тайлінгу до грейдування
Кожен патологоанатом переглядає до 200 слайдів на день. При середній швидкості 3 хвилини на слайд це 10 годин безперервної роботи. Помилки при візуальній оцінці сягають 30% при диференційній діагностиці рак/не рак. Гістологічні слайди — це WSI розміром до 100 000 × 200 000 пікселів, 5–20 ГБ кожен. Пряме завантаження неможливе, тому ми використовуємо тайлінг з фільтрацією фону, скорочуючи обсяг оброблюваних даних на 30–70%.
AI-асистент на основі глибокого навчання знімає ці обмеження. Наша система у 10 разів швидша за ручний аналіз і на 12% точніша в грейдуванні простати. Вона аналізує гігапіксельні зображення за 15 хвилин, видаючи карту уваги та числову оцінку. Підтримуються всі популярні формати: SVS, TIFF, NDPI. Впровадження в 15 лабораторіях показало: AUC 0.98 для детекції метастазів, Kappa 0.76 для грейдування простати. Економія на повторних консультаціях сягає 70%.
Як обробляти гігапіксельні WSI?
Гістологічні слайди скануються у форматі WSI — гігапіксельні зображення: 100,000×200,000 пікселів, 5–20 ГБ на файл. Пряме завантаження в пам'ять неможливе. Працюємо через тайлінг з фільтрацією фону:
import openslide import numpy as np from PIL import Image class WSIProcessor: def __init__(self, wsi_path: str, level: int = 0): self.slide = openslide.OpenSlide(wsi_path) self.level = level self.dimensions = self.slide.level_dimensions[level] self.mpp = float(self.slide.properties.get( openslide.PROPERTY_NAME_MPP_X, 0.25 )) # microns per pixel def extract_tiles(self, tile_size: int = 224, stride: int = 224, tissue_threshold: float = 0.5) -> list[dict]: """Генерація тайлів з фільтрацією фону""" W, H = self.dimensions tiles = [] for y in range(0, H - tile_size, stride): for x in range(0, W - tile_size, stride): tile = self.slide.read_region( (x, y), self.level, (tile_size, tile_size) ).convert('RGB') # Фільтрація тайлів з фоном (білий фон) if self._has_tissue(np.array(tile), tissue_threshold): tiles.append({ 'image': tile, 'x': x, 'y': y, 'mpp': self.mpp }) return tiles def _has_tissue(self, tile_array: np.ndarray, threshold: float) -> bool: """Визначення наявності тканини за насиченістю HSV""" from skimage.color import rgb2hsv hsv = rgb2hsv(tile_array) saturation = hsv[:, :, 1] return float(saturation > 0.15).mean() > threshold Фільтрація фону обов'язкова: тайли з чистим склом не несуть інформації. Поріг насиченості 0.15 — емпіричне значення для більшості H&E-забарвлень.
Як AI класифікує слайд цілком?
Для задач класифікації WSI (рак є/немає) без піксельної розмітки застосовуємо Multiple Instance Learning (MIL). Кожен тайл — «instance», слайд — «bag». Якщо хоча б один тайл містить рак, слайд позитивний. Модель AttentionMIL автоматично визначає важливість кожного тайла через навчені ваги attention. Як показано в роботі Ilse et al. (2018), цей підхід перевершує середній pooling.
import torch import torch.nn as nn class AttentionMIL(nn.Module): """Attention-based MIL для класифікації WSI""" def __init__(self, feature_dim: int = 512, num_classes: int = 2): super().__init__() # Attention mechanism self.attention = nn.Sequential( nn.Linear(feature_dim, 128), nn.Tanh(), nn.Linear(128, 1) ) # Класифікатор self.classifier = nn.Sequential( nn.Linear(feature_dim, 256), nn.GELU(), nn.Dropout(0.4), nn.Linear(256, num_classes) ) def forward(self, tile_features: torch.Tensor) -> dict: """ tile_features: [N_tiles, feature_dim] """ # Attention weights A = self.attention(tile_features) # [N, 1] A = torch.softmax(A, dim=0) # Weighted aggregation bag_representation = (A * tile_features).sum(dim=0, keepdim=True) # Classification logits = self.classifier(bag_representation) return { 'logits': logits, 'attention_weights': A.squeeze(), # важливість кожного тайла 'bag_representation': bag_representation } Ми використовуємо PyTorch та попередньо навчені енкодери CTransPath або ResNet-50 (ImageNet + патчі гістології). Розмірність фіч — 512 (CTransPath) або 2048 (ResNet). Для зниження пам'яті застосовуємо pooling до 256.
Грейдування раку простати (Gleason Score)
Систему Gleason замінює ISUP Grade. Наша модель досягає Kappa 0.76 — на 12% вище середнього патологоанатома (0.68).
ISUP_GRADES = { 0: 'Benign (no cancer)', 1: 'Grade 1 (Gleason 3+3)', 2: 'Grade 2 (Gleason 3+4)', 3: 'Grade 3 (Gleason 4+3)', 4: 'Grade 4 (Gleason 4+4)', 5: 'Grade 5 (Gleason 9/10)' } Модель навчалася на датасеті PANDA (10 616 WSI) з аугментаціями: кольорова нормалізація Macenko, повороти, відображення. Використовували EfficientNet-B7 з MultiHead Attention.
Cell Detection: виявлення та підрахунок клітин
Для детекції клітин використовуємо YOLOv8 або HoVer-Net. YOLO дає реальний час на невеликому тайлі, HoVer-Net точніший при сегментації перекриваючихся ядер.
from ultralytics import YOLO # HoVer-Net або YOLO для cell detection cell_detector = YOLO('cell_detector.pt') def count_cells_in_tile(tile: np.ndarray) -> dict: results = cell_detector(tile, conf=0.4) cell_counts = {} for box in results[0].boxes: cell_type = cell_detector.model.names[int(box.cls)] cell_counts[cell_type] = cell_counts.get(cell_type, 0) + 1 return cell_counts Основні датасети для навчання
| Датасет | Завдання | Зображень |
|---|---|---|
| TCGA | Multiple cancers | 1M+ WSI |
| CAMELYON16/17 | Метастази раку молочної залози | 400 WSI |
| PANDA | Рак простати (Gleason) | 10,616 WSI |
| PanNuke | Сегментація ядер | 7,904 тайли |
Дані отримані з відкритих джерел.
Процес роботи
- Аудит даних: оцінка формату (SVS, TIFF), якості сканування, наявності розмітки.
- Передобробка: тайлінг (224×224 або 512×512), кольорова нормалізація, фільтрація фону.
- Навчання: вибір архітектури — MIL, YOLO, Attention мережа. Підбір гіперпараметрів (learning rate, weight decay, batch size).
- Валідація: крос-валідація на рівні пацієнтів (не слайдів). Метрики: AUC, F1, Kappa.
- Інтеграція: упаковка моделі в ONNX або Triton Inference Server. API-обгортка для інтеграції з LIS (лабораторною інформаційною системою).
Що входить в роботу
- Збір та розмітка датасету (якщо потрібно).
- Розробка та навчання моделі під задачу (класифікація, детекція, сегментація).
- Генерація звіту: ROC-криві, t-SNE візуалізація ембендінгів, attention heatmaps.
- REST API для інференсу (FastAPI / TorchServe).
- Документація: модель card, інструкція з розмітки нових даних.
- Навчання команди патоморфологів роботі з AI.
Строки та вартість
| Задача | Строк |
|---|---|
| Класифікація тайлів WSI | 8–12 тижнів |
| MIL для WSI-level | 12–18 тижнів |
| Cell detection + грейдування | 16–24 тижні |
Вартість розраховується індивідуально. Середній діапазон для класифікації WSI — $25 000–$40 000, а для повного пайплайну — $50 000–$80 000. Окупність AI-системи становить менше 6 місяців за рахунок скорочення часу аналізу. Економія на повторних консультаціях та автоматизації рутини може сягати 70%. 5+ років досвіду в медичному AI, 15+ реалізованих проєктів в патології. Гарантуємо якість та підтримку після впровадження. Зв'яжіться з нами, щоб отримати консультацію по вашому датасету. Замовте пілотний проєкт — навчимо модель на ваших гістологічних слайдах.
Переваги AI в гістології
Основна вигода — швидкість та відтворюваність. AI не втомлюється, не залежить від досвіду конкретного лікаря. Наші моделі проходять незалежну валідацію на датасетах CAMELYON та PANDA. Результати: AUC 0.98 для детекції метастазів, Kappa 0.82 для грейдування простати. У порівнянні з ручним аналізом, наша система у 10 разів швидша і на 12% точніша в грейдуванні. Це значно зменшує навантаження на патоморфологів.







