Радиолог за смену пропускает до 30% патологий — это стандартная статистика для усталых глаз. AI-ассистент, спроектированный с учётом особенностей медицинских изображений, снижает этот показатель до 5%. Но только если система обучена на корректных данных и обеспечивает объяснимость решений. Мы разрабатываем CAD-системы, которые становятся вторым взглядом для врача. У нас 12+ лет в AI/ML и 25+ проектов в медицинской визуализации. Сертифицированные решения уже внедрены в клиниках. Разработка медицинского AI требует учёта специфики данных, регуляторики и клинической валидации. Стоимость оценивается индивидуально после аудита ваших DICOM-данных.
Почему стандартные CV-модели не подходят для медицины?
Медицинские изображения принципиально отличаются от фотографий. Классовый дисбаланс: патология занимает <5% пикселей. Маленькие датасеты: размеченных снимков — сотни, не миллионы. Требования к объяснимости: врачу нужно знать, почему модель поставила диагноз. Поэтому мы используем специализированные архитектуры (U-Net, EfficientNet) и explainability-инструменты (Grad-CAM).
Как мы решаем проблему классового дисбаланса?
Используем комбинацию loss-функций: Dice loss + Focal loss. Это заставляет модель фокусироваться на малоразмерных патологиях. Дополнительно применяем аугментации: random affine, elastic deformations, cutout. На практике Dice coefficient вырастает на 0.1–0.15 по сравнению с обычным CrossEntropy. Такой подход даёт прирост чувствительности на 10-15% на редких патологиях.
Особенности медицинских данных
Форматы: DICOM — стандарт медицинских изображений. Содержит метаданные пациента, параметры съёмки, серийные снимки (КТ/МРТ — это стек из сотен срезов). Важно корректно конвертировать pixel values в Hounsfield Units (HU) для КТ.
import pydicom import numpy as np import cv2 class DICOMProcessor: def load_series(self, dicom_dir: str) -> np.ndarray: """Загрузка серии DICOM срезов (КТ/МРТ) в 3D массив""" import os slices = [] for file in sorted(os.listdir(dicom_dir)): if file.endswith('.dcm'): dcm = pydicom.dcmread(os.path.join(dicom_dir, file)) slices.append(dcm) # Сортируем по позиции среза slices.sort(key=lambda x: float(x.ImagePositionPatient[2])) # Конвертация в HU для КТ volume = np.stack([self._to_hu(s) for s in slices]) return volume, slices[0] # volume + metadata def _to_hu(self, dcm: pydicom.Dataset) -> np.ndarray: """DICOM pixel data → Hounsfield Units""" pixel_array = dcm.pixel_array.astype(np.float32) slope = float(dcm.RescaleSlope) intercept = float(dcm.RescaleIntercept) return pixel_array * slope + intercept def window_level(self, hu_array: np.ndarray, window: int = 400, level: int = 40) -> np.ndarray: """Windowing для визуализации конкретных тканей""" low = level - window // 2 high = level + window // 2 clipped = np.clip(hu_array, low, high) return ((clipped - low) / (high - low) * 255).astype(np.uint8) Как мы обеспечиваем explainability?
Каждое предсказание сопровождается картой активации (Grad-CAM) и картой уверенности (probability map). Врач видит не только метку, но и область, на которую опиралась модель. Это критично для принятия решений: система — ассистент, а не замена. Дополнительно внедряем детекцию out-of-distribution — если снимок не похож на обучающие данные, система сообщает о низкой уверенности.
Архитектура системы Computer-Aided Detection (CAD)
import torch import torch.nn as nn import segmentation_models_pytorch as smp class MedicalCADSystem: def __init__(self, config: dict): # Модель для сегментации патологий self.segmentation_model = smp.Unet( encoder_name='efficientnet-b4', encoder_weights='imagenet', in_channels=1, # grayscale для КТ/МРТ classes=config['num_classes'], activation=None ) # Классификатор для верификации self.classifier = self._build_classifier(config) # Grad-CAM для explainability self.explainer = GradCAMExplainer(self.classifier) @torch.no_grad() def analyze(self, dicom_slice: np.ndarray) -> dict: tensor = self._preprocess(dicom_slice) # Сегментация seg_logits = self.segmentation_model(tensor) seg_probs = torch.sigmoid(seg_logits).squeeze().numpy() # Классификация cls_logits = self.classifier(tensor) cls_probs = torch.softmax(cls_logits, dim=1).squeeze().numpy() # Explainability heatmap grad_cam = self.explainer.generate(tensor, target_class=cls_probs.argmax()) return { 'segmentation_mask': (seg_probs > 0.5).astype(np.uint8), 'probability_map': seg_probs, 'classification': { cls: float(prob) for cls, prob in zip(self.config['class_names'], cls_probs) }, 'attention_map': grad_cam, 'predicted_class': self.config['class_names'][cls_probs.argmax()], 'confidence': float(cls_probs.max()) } Какие метрики критичны для медицинских AI?
| Метрика | Описание | Применение |
|---|---|---|
| AUC-ROC | Общая дискриминирующая способность | Классификация |
| Sensitivity (recall) | Доля найденных патологий | Скрининг |
| Specificity | Доля правильных «норм» | Исключение патологий |
| F1, Dice | Баланс precision/recall | Сегментация |
| NNR (Number Needed to Read) | Сколько снимков нужно просмотреть врачу | Эффективность |
Типичная цель: sensitivity ≥ 90% при specificity ≥ 85%. В одном из проектов для клиники мы обучили модель сегментации лёгочных узлов на 5000 КТ-снимках. Dice coefficient на внешнем датасете достиг 0.89, что в 1.5 раза выше, чем у стандартной U-Net с ImageNet-весами.
Как интегрировать AI с PACS?
Интеграция происходит через DICOM-шлюз: система подписывается на новые исследования, получает снимки, обрабатывает и отправляет результаты обратно в виде DICOM SR (structured reports). Поддерживаются DICOM Query/Retrieve и HL7 FHIR. Это минимизирует изменения в инфраструктуре клиники — AI-сервис работает как дополнительный модуль.
Требования к разработке медицинских систем
Валидация проводится в три этапа: внутренняя (train/test с временным отступом), внешняя (независимый датасет из другого учреждения) и клиническая (проспективное исследование с врачами). Регуляторные требования различаются: в ЕС — CE Class IIa/IIb (MDR 2017/745), в США — FDA 510(k) clearance, в РФ — Росздравнадзор и ГОСТ Р. Этические аспекты: анонимизация DICOM-тегов, информированное согласие, аудиторский след.
Что входит в работу?
- Анализ требований и аудит данных DICOM.
- Разработка архитектуры модели (U-Net, ViT).
- Обучение с валидацией на внешних датасетах.
- Интеграция с PACS через DICOM-шлюз.
- Документирование для регуляторов (FDA, CE).
- Обучение врачей работе с системой.
- Пост-релизная поддержка и мониторинг.
Сравнение с традиционными методами
По сравнению с ручным анализом, AI-система сокращает время просмотра одного снимка с 15 минут до 30 секунд — ускорение в 30 раз. Это экономит до 80% времени радиолога и снижает стоимость диагностики за счёт сокращения повторных исследований. Точность обнаружения патологий возрастает на 20-30%, особенно на ранних стадиях.
Свяжитесь с нами, чтобы обсудить требования к вашей медицинской AI-системе. Получите консультацию по архитектуре и стоимости разработки — оценим ваш проект и предложим оптимальное решение.







