Разработка 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 недель |







