Разработка AI для анализа гистологических изображений

AI для гистологических изображений: от тайлинга до грейдирования

Направления AI-разработки

Часто задаваемые вопросы

Последние работы

  • image_website-b2b-advance_0.webp
    Разработка сайта компании B2B ADVANCE
    1441
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1301
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    998
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1267
  • image_logo-advance_0.webp
    Разработка логотипа компании B2B Advance
    713
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    1005

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 тайлов

Данные получены из открытых источников.

Процесс работы

  1. Аудит данных: оценка формата (SVS, TIFF), качества сканирования, наличия разметки.
  2. Предобработка: тайлинг (224×224 или 512×512), цветовая нормализация, фильтрация фона.
  3. Обучение: выбор архитектуры — MIL, YOLO, Attention сеть. Подбор гиперпараметров (learning rate, weight decay, batch size).
  4. Валидация: кросс-валидация на уровне пациентов (не слайдов). Метрики: AUC, F1, Kappa.
  5. Интеграция: упаковка модели в 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 для грейдирования простаты.