Medical Imaging AI System Development

We design and deploy artificial intelligence systems: from prototype to production-ready solutions. Our team combines expertise in machine learning, data engineering and MLOps to make AI work not in the lab, but in real business.
Showing 1 of 1 servicesAll 1566 services
Medical Imaging AI System Development
Complex
~2-4 weeks
FAQ
AI Development Areas
AI Solution Development Stages
Latest works
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1161
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1041
  • image_logo-advance_0.png
    B2B Advance company logo design
    561
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    823
  • image_logo-aider_0.jpg
    AIDER company logo development
    762
  • image_crm_chasseurs_493_0.webp
    CRM development for Chasseurs
    848

System Development медицинской визуализации (Medical Imaging AI)

Медицинская визуализация — одна из наиболее ответственных областей применения Computer Vision. Ошибочное предсказание может стоить жизни. Поэтому требования к системе принципиально отличаются от обычного CV: обязательная валидация на клинических данных, explainability (объяснимость), интеграция с процессом принятия решений врачом как «второй взгляд», а не замена.

Особенности медицинских данных

Форматы: DICOM — стандарт медицинских изображений. Содержит метаданные пациента, параметры съёмки, серийные снимки (КТ/МРТ — это стек из сотен срезов).

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 (Hounsfield Units) для КТ
        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)

Architecture системы 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())
        }

Требования к разработке медицинских систем

Валидация:

  • Внутренняя: разделение данных train/val/test с temporal split (train до 2022, test после)
  • Внешняя: валидация на независимом датасете из другого медучреждения
  • Клиническая: проспективное исследование с участием врачей

Регуляторные требования:

  • В ЕС: CE Class IIa/IIb (MDR 2017/745)
  • В США: FDA 510(k) clearance
  • В РФ: Росздравнадзор, ГОСТ Р

Этические требования:

  • Анонимизация данных: удаление DICOM тегов с ПДН через pydicom
  • Информированное согласие на использование данных
  • Аудиторский след всех предсказаний

Metrics медицинских AI-систем

Метрика Описание Применение
AUC-ROC Общая дискриминирующая способность Классификация
Sensitivity (recall) Доля найденных патологий Скрининг
Specificity Доля правильных «норм» Исключение патологий
F1, Dice Баланс precision/recall Сегментация
NNR (Number Needed to Read) Сколько снимков нужно просмотреть врачу Эффективность

Типичная цель: sensitivity ≥ 90% при specificity ≥ 85%.

Тип системы Срок разработки
CAD (второй взгляд) для одной патологии 12–18 недель
Полноценный радиологический ИИ 24–40 недель
Системы требующие клинической валидации 40–80 недель