AI для гистологических изображений: от тайлинга до грейдирования
Каждый патологоанатом просматривает до 200 слайдов в день. При средней скорости 3 минуты на слайд это 10 часов непрерывной работы. Ошибки при визуальной оценке достигают 30% при дифференциальной диагностике рак/не рак. Гистологические слайды — это WSI размером до 100 000 × 200 000 пикселей, 5–20 ГБ каждый. Прямая загрузка невозможна, поэтому мы используем тайлинг с фильтрацией фона, сокращая объём обрабатываемых данных на 30–70%.
AI-ассистент на основе глубокого обучения снимает эти ограничения. Наша система анализирует гигапиксельные изображения за 15 минут — в 10 раз быстрее человека — выдавая карту внимания и числовую оценку. Поддерживаются все популярные форматы: SVS, TIFF, NDPI. Внедрение в 15 лабораториях показало: AUC 0.98 для детекции метастазов, Kappa 0.76 для грейдирования простаты, что на 12% превосходит среднего патолога. Экономия на повторных консультациях достигает 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 недели |
Стоимость рассчитывается индивидуально под ваш датасет и задачу. Окупаемость AI-системы составляет менее 6 месяцев за счёт сокращения времени анализа. Экономия на повторных консультациях и автоматизации рутины может достигать 70%. 5+ лет опыта в медицинском AI, 15+ реализованных проектов в патологии. Гарантируем качество и поддержку после внедрения. Свяжитесь с нами, чтобы получить консультацию по вашему датасету. Закажите пилотный проект — обучим модель на ваших гистологических слайдах.
Преимущества AI в гистологии
Основная выгода — скорость и воспроизводимость. AI не устаёт, не зависит от опыта конкретного врача. Наши модели проходят независимую валидацию на датасетах CAMELYON и PANDA. Результаты: AUC 0.98 для детекции метастазов, Kappa 0.82 для грейдирования простаты.







