AI for MRI Scan Analysis

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
AI for MRI Scan Analysis
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

Разработка AI для анализа МРТ-снимков

МРТ (магнитно-резонансная томография) — лучшая модальность для мягких тканей, мозга, суставов, спинного мозга. В отличие от КТ, МРТ имеет несколько режимов (последовательностей): T1, T2, FLAIR, DWI, DCE, каждый подчёркивает разные тканевые характеристики. AI-задачи: сегментация мозга, детекция опухолей, анализ белого вещества, планирование нейрохирургических операций.

Специфика предобработки МРТ

МРТ не имеет единой шкалы интенсивности (в отличие от HU для КТ). Сигнал зависит от конкретного сканера и протокола. Нормализация обязательна:

import nibabel as nib
import numpy as np
from scipy import ndimage

class MRIPreprocessor:
    def load_and_preprocess(self, nifti_path: str,
                             target_shape: tuple = (128, 128, 128)) -> np.ndarray:
        img = nib.load(nifti_path)
        volume = img.get_fdata()

        # 1. Нормализация интенсивности (Z-score по мозговой ткани)
        brain_mask = volume > 0
        mean_val = volume[brain_mask].mean()
        std_val = volume[brain_mask].std()
        normalized = (volume - mean_val) / (std_val + 1e-8)

        # 2. Ресемплинг до изотропного разрешения
        current_spacing = img.header.get_zooms()[:3]
        target_spacing = (1.0, 1.0, 1.0)  # 1мм³ изотропный
        scale_factors = tuple(
            c / t for c, t in zip(current_spacing, target_spacing)
        )
        resampled = ndimage.zoom(normalized, scale_factors, order=1)

        # 3. Центральный crop до target_shape
        cropped = self._center_crop(resampled, target_shape)

        return cropped

    def _center_crop(self, volume: np.ndarray,
                      shape: tuple) -> np.ndarray:
        D, H, W = volume.shape
        dD, dH, dW = shape
        sD = max(0, (D - dD) // 2)
        sH = max(0, (H - dH) // 2)
        sW = max(0, (W - dW) // 2)

        cropped = volume[sD:sD+dD, sH:sH+dH, sW:sW+dW]

        # Padding если нужно
        pad = [(0, max(0, d - s)) for d, s in zip(shape, cropped.shape)]
        return np.pad(cropped, pad)

Сегментация опухоли мозга (BraTS)

BraTS (Brain Tumor Segmentation Challenge) — ключевой бенчмарк. Задача: сегментировать три региона опухоли глиобластомы: Enhancing Tumor (ET), Tumor Core (TC), Whole Tumor (WT) на мультимодальном МРТ (T1, T1CE, T2, FLAIR).

import torch
from monai.networks.nets import SwinUNETR

class BrainTumorSegmenter:
    def __init__(self, model_path: str):
        # SwinUNETR — state-of-the-art на BraTS 2021
        self.model = SwinUNETR(
            img_size=(128, 128, 128),
            in_channels=4,     # T1, T1CE, T2, FLAIR
            out_channels=3,    # ET, TC, WT
            feature_size=48,
            use_checkpoint=True
        )
        self.model.load_state_dict(torch.load(model_path))
        self.model.eval()

    @torch.no_grad()
    def segment(self, modalities: dict) -> np.ndarray:
        """
        modalities: {'t1': arr, 't1ce': arr, 't2': arr, 'flair': arr}
        Каждый массив: [128, 128, 128] нормализованный
        """
        # Конкатенация модальностей по каналам
        volume = np.stack([
            modalities['t1'],
            modalities['t1ce'],
            modalities['t2'],
            modalities['flair']
        ])  # [4, 128, 128, 128]

        tensor = torch.from_numpy(volume).float().unsqueeze(0)
        logits = self.model(tensor)
        predictions = torch.sigmoid(logits).squeeze().numpy()

        return {
            'et_mask': (predictions[0] > 0.5).astype(np.uint8),  # Enhancing Tumor
            'tc_mask': (predictions[1] > 0.5).astype(np.uint8),  # Tumor Core
            'wt_mask': (predictions[2] > 0.5).astype(np.uint8),  # Whole Tumor
            'probability_maps': predictions
        }

Сегментация структур мозга

FreeSurfer — классический инструмент, но медленный (6–8 часов). DeepMedic, FastSurfer (FastSurferCNN) — 1–5 минут:

# FastSurfer: глубокое обучение для сегментации мозга
import subprocess

def segment_brain_structures(mri_path: str, output_dir: str):
    subprocess.run([
        'python', '/path/to/FastSurfer/run_fastsurfer.py',
        '--t1', mri_path,
        '--sid', 'patient_001',
        '--sd', output_dir,
        '--seg_only',    # только сегментация, без cortical thickness
        '--device', 'cuda'
    ], check=True)

Диффузионная МРТ (DWI/DTI)

Для анализа белого вещества и трактографии:

import dipy

from dipy.io.image import load_nifti
from dipy.reconst.dti import TensorModel

def analyze_white_matter(dwi_path: str, bvec_path: str, bval_path: str):
    """DTI анализ белого вещества"""
    dwi_data, affine = load_nifti(dwi_path)
    bvals, bvecs = dipy.io.gradients.read_bvals_bvecs(bval_path, bvec_path)

    from dipy.core.gradients import gradient_table
    gtab = gradient_table(bvals, bvecs)

    tenmodel = TensorModel(gtab)
    tenfit = tenmodel.fit(dwi_data)

    # FA (Fractional Anisotropy) — мера целостности трактов
    fa = tenfit.fa
    md = tenfit.md  # Mean Diffusivity

    return {'fa': fa, 'md': md}
Задача Датасет Dice SOTA
Сегментация опухоли мозга BraTS 2021 ET 0.85, TC 0.87, WT 0.90
Сегментация структур мозга MRBrainS DSC 0.90+
Артикулярные хрящи (колено) OAI DSC 0.88
Сердечная функция ACDC DSC 0.94
Задача Срок
Сегментация одного органа/структуры 10–14 недель
BraTS-совместимая система 14–22 недели
Multi-modal, multi-task анализ 24–36 недель