Руководство по предобработке КТ перед сегментацией

На раннем этапе работы с КТ-томограммами я постоянно упирался в одну и ту же проблему: хорошая архитектура сегментационной сети начинала глючить на данных из другого сканера или при переходе от обучающей выборки к реальным клиническим сериям. Причина почти всегда была не в модели, а в том, как были подготовлены входные объёмы. С тех пор я отношусь к предобработке не как к скучной технической формальности, а как к этапу, который напрямую определяет стабильность разметки, воспроизводимость результатов и клиническую полезность всего пайплайна. Если данные пропущены через неаккуратный конвейер, даже сильные нейросети начинают ошибаться на краях лёгких, путать сосуды с очагами и терять мелкие узелки в шуме и артефактах.

Зачем вообще нужна предобработка КТ

КТ-данные поступают в лабораторию или клинику в очень разнородном виде: разная толщина среза, поле обзора, реконструкционные ядра, уровень контраста и шума, неодинаковая ориентация. Для алгоритма сегментации это шум, который маскирует реальную анатомию. Нейросеть должна видеть сопоставимые входные сигнатуры, а не случайные вариации протоколов сканирования. Именно поэтому предобработка включает проверку DICOM-тегов, приведение к общему воксельному пространству, нормализацию интенсивностей и преобразование объёмов в формат, пригодный для обучения и инференса.

С практической точки зрения задача простая: выбросить всё, что не относится к анатомии и патологии, и оставить ту информацию, которая действительно нужна модели. Для лёгких это критично: границы паренхимы, сосудистые структуры и очаговые изменения невероятно чувствительны к шуму, параметрам реконструкции и дыхательным артефактам. Правильно подготовленный томографический объём даёт нейросети возможность сфокусироваться именно на клинически значимых элементах, а не на свойствах томографа.

Что входит в предобработку КТ

Ниже — тот костяк шагов, который я в том или ином виде использую практически при каждой подготовке данных для сегментации КТ. Он может варьироваться в деталях, но общая логика неизменна.

  • Проверка целостности DICOM и метаданных — фундаментальный шаг, без которого всё дальнейшее теряет смысл: если в серии не хватает срезов или перепутан их порядок, модель получит искажённую геометрию.
  • Приведение изображений к единому пространству и ориентации — обеспечиваем, чтобы право-лево, верх-низ и передне-заднее направления совпадали во всех исследованиях; иначе маски могут незаметно отзеркалиться.
  • Ресэмплинг до общей воксельной сетки — задаём целевое разрешение, единое для всех пациентов, чтобы кубический миллиметр ткани имел одинаковый физический размер и модель не училась на толщине среза.
  • Нормализация интенсивностей — приводим значения единиц Хаунсфилда к фиксированному диапазону, отсекаем выбросы и масштабируем, чтобы сети работали стабильно.
  • Обрезка лишней области и выделение зоны интереса — убираем воздух вокруг пациента, стол, элементы плечевого пояса и всё, что не имеет отношения к целевой анатомии.
  • Подготовка масок, если есть ручная разметка — согласовываем координаты, интерполируем корректным методом и контролируем, чтобы маска не сместилась относительно изображения.
  • Аугментация и балансировка данных для обучения — искусственно обогащаем тренировочную выборку, добавляя реалистичные вариации позы, шума и контраста.
  • Контроль качества после всех преобразований — визуальная и численная проверка, без которой нельзя гарантировать корректность конвейера.

Этот каркас покрывает 90% реальных рабочих ситуаций, но на каждом проекте я обязательно адаптирую его под конкретную клиническую задачу — будь то сегментация легочных полей, поиск узлов или анализ сосудистого русла.

DICOM: с чего начинается любая подготовка

КТ почти всегда хранится в DICOM, и именно здесь зарыто больше всего ловушек. Мне не раз попадались серии, в которых метаданные не совпадали с реальностью: указан шаг 1 мм, а на деле срезы идут с пропусками, или серия склеена из двух реконструкций с разным Spacing Between Slices. Если не проверить базовые теги до начала обработки, последующая сегментация будет плавать непредсказуемо, независимо от качества модели.

На что смотреть в DICOM в первую очередь

  • Slice Thickness и Spacing Between Slices — обязательно сопоставляю с фактическим расстоянием между позициями срезов. Иногда в теге одно, а реальный шаг другое; для сегментации лёгких ошибка даже в 0,3 мм при накоплении по оси z может сжать или растянуть анатомию.
  • Pixel Spacing — важен для корректного масштабирования в плоскости; у старых томографов он может быть неизотропным, и тогда после ресэмплинга появляются неожиданные артефакты.
  • Ориентация серии — смотрю на ImageOrientationPatient и сопоставляю с реальными анатомическими ориентирами: сердцем, печенью, дугой аорты. Однажды я столкнулся с серией, где право и лево были перепутаны, и маски оказались зеркальными — модель училась на неверной латерализации.
  • Наличие артефактов склейки серии из разных реконструкций — когда технолог объединил тонкие срезы верхней части и толстые нижней, в результате на стыке ломались все границы.
  • Корректность метки модальности — убедиться, что это действительно CT, а не какая-то производная серия.
  • Соответствие серии одной пациентской сессии — проверяю Study и Series Instance UID, чтобы не смешать данные разных моментов сканирования.

Особого внимания заслуживает смешивание тонких (0,5–1 мм) и толстых (5 мм) срезов в одном наборе. Для сегментации лёгких это практически разные модальности по уровню детализации, и если они попадут в обучение вперемешку, сеть начнёт воспринимать толщину среза как признак патологии.

Ресэмплинг: зачем приводить все к одному шагу

Без ресэмплинга кубический воксель одного исследования может представлять совсем другой физический объём, чем воксель другого. Модель будет видеть один объект «плотным» по оси z, а другой — растянутым, и начнёт выучивать не анатомию, а особенности протокола. Для сегментации это критично: при переходе от обучения к клиническому инференсу разница в разрешении почти всегда приводит к падению точности.

Обычно я стремлюсь к изотропному или близкому к изотропному шагу: для большинства задач лёгких хорошо работает 1 × 1 × 1 мм. Этого достаточно для визуализации долевых границ, сосудистых структур и большинства очагов. Если задача — поиск субсолидных микроузелков, приходится рассматривать шаг 0,5 мм, но это резко увеличивает объём вычислений и требовательность к памяти.

Практический совет

Определите целевое разрешение до того, как начнёте разметку и обучение. Для каждого режима — обучения, валидации и будущего развёртывания в клинике — пространственное разрешение должно быть согласовано. Я не раз обжигался, когда модель тренировалась на шаге 1,0 мм, а в PACS поступали данные с нативным 0,7 мм и автоматическим ресэмплингом на другой шаг. В итоге мелкие сосуды рвались, а сегментация очагов давала артефактные разрывы. Если режимы инференса отличаются от обучения, обязательно проверяйте качество на промежуточных тестовых наборах, иначе рискуете получить неприятные сюрпризы.

Нормализация интенсивностей

Шкала Хаунсфилда (HU) — огромное преимущество КТ: воздух около –1000 HU, мягкие ткани около 0–50 HU, костные структуры от +400 и выше. Но «сырые» значения почти всегда требуют обработки: металлические протезы могут давать выбросы за +3000 HU, а шум в воздухе — провалы ниже –1024. Если подать сети такой разброс без нормализации, градиенты становятся нестабильными, а тонкие паренхиматозные структуры тонут в шуме.

Самый частый подход

На практике для сегментации лёгких я чаще всего применяю отсечение экстремальных значений (например, всё ниже –1024 и выше +3071 HU — это очевидные артефакты) и затем линейное отображение полезного диапазона в [0, 1] или стандартизацию. Оптимальное окно зависит от задачи: если цель — только легочная паренхима, я обычно ограничиваюсь интервалом от –1000 до +400 HU, после чего масштабирую; это сохраняет воздух и мягкие ткани, подавляя лишний вклад костей и случайных выбросов. Для поиска очагов я беру более узкое мягкотканное окно, иногда комбинируя несколько диапазонов как отдельные каналы.

Дополнительно можно применить клиппинг по процентилям, чтобы автоматически обрезать выбросы под каждый конкретный объём, но в клиническом конвейере это рискованно: можно «срезать» значимую костную информацию или кальцификаты. Поэтому я предпочитаю фиксированные пороги, проверенные на репрезентативной выборке.

Окна КТ: почему они важны

Оконное представление — это не просто эстетика для визуализации, а способ выделить нужный плотностной контраст. Для нейросети это тоже имеет значение, особенно если на вход подаётся многоканальный объём, где каждый канал соответствует своему окну. Я не раз замечал, как переход с широкого легочного окна на мягкотканное кардинально менял видимость солидных узлов на фоне сосудов — и наоборот, лёгочная граница на мягкотканном окне становилась смазанной.

Типичные сценарии

Задача Что важно Что обычно делают
Сегментация легких Воздух и граница паренхимы Широкое легочное окно, например, ширина 1500 HU, центр –600 HU, или адаптивно под конкретный сканер
Выявление очагов Мягкие ткани, узлы, инфильтраты Несколько окон: легочное + мягкотканное (W350, C40) + возможно промежуточное, объединённые в каналы
Костные структуры Высокая плотность Отдельное костное окно (W1500, C300) или его нормализованный аналог
Комплексный анализ грудной клетки Разные ткани Мультиканальная подготовка: несколько нормализованных окон как вход 3D-сети

Если задача достаточно сложная и требует одновременного учёта нескольких тканевых классов, я не пытаюсь подобрать одно «идеальное» окно. Гораздо надёжнее работает многоканальный подход: модель получает один и тот же объём в двух-трёх оконных представлениях, и сама учится комбинировать информацию.

Обрезка области интереса

Полный КТ-объём грудной клетки содержит много «балласта»: стол, воздух вне тела, части плечевого пояса, иногда куски шеи и живота. Всё это не только занимает память GPU и замедляет обучение, но и порождает ложные срабатывания — сеть может начать сегментировать край стола или одежду как ткань. Грубая предварительная локализация тела пациента и ограничение объёма границами грудной клетки решают эти проблемы.

Но здесь нужен баланс. Слишком агрессивная автоматическая обрезка способна отрезать верхушки лёгких, плевральные утолщения или субплевральные очаги размером в несколько миллиметров. Я не раз ловил такие ошибки при визуальном контроле: алгоритм, ориентируясь на порог плотности, принимал плечевые кости за границу тела и обрезал апикальные отделы. Поэтому любую обрезку ROI я сопровождаю ручной выборочной проверкой, особенно на периферии лёгких.

Почему это полезно

  • Меньше памяти на GPU — освобождает гигабайты видеопамяти, что особенно важно для полных 3D-моделей.
  • Быстрее обучение — сеть обрабатывает меньше пустого пространства, эпохи проходят ощутимо быстрее.
  • Меньше ложных срабатываний — исчезают зоны, не имеющие отношения к целевой анатомии, и модель перестаёт выдавать артефактные контуры на столе или воздухе.
  • Проще балансировать классы — доля фона в объёме снижается, что упрощает функцию потерь.
  • Выше устойчивость к мусорным зонам — нет скачков предсказаний на границе поля томографа.

Пороговая обработка, морфология и базовая очистка

До сих пор классические методы — пороговая бинаризация, морфологические операции — остаются полезным инструментом подготовки данных, особенно для полуавтоматической разметки. Я часто начинал с порога –500 HU, чтобы быстро набросать грубую маску лёгких, а затем заполнял отверстия и убирал мелкий шум с помощью серии эрозий и дилатаций. Это даёт отличную стартовую точку для ручной коррекции и сокращает время разметки в разы.

Что обычно применяют

  • Бинаризацию по плотности — первичная маска «воздух/не воздух», из которой потом вырастает сегментация.
  • Удаление малых компонент — убираем артефакты сканирования, элементы стола, случайные шумовые пиксели.
  • Заполнение отверстий — помогает включить в маску сосуды и бронхи, которые иначе остаются «дырками» внутри легочного поля.
  • Эрозию и дилатацию — разрываем тонкие перемычки между лёгким и грудной стенкой, сглаживаем контуры.
  • Выбор крупнейших связных компонент — оставляем только легочные поля, отбрасывая изолированные воздушные карманы вне лёгких.

Эти шаги особенно ценны, когда нужно быстро подготовить десяток-другой объёмов для доразметки или обучить первую итерацию модели, которая затем будет использована в режиме активного предобучения.

Аугментация: когда и зачем она нужна

Аугментация не делается для красоты. Её задача — дать модели увидеть больше вариаций анатомии и протоколов, чем присутствует в исходной коллекции. Особенно это актуально для грудной клетки: укладка пациента, фаза дыхания, шумовые характеристики томографа — всё это варьируется от случая к случаю. Без аугментации сеть может запомнить позу, в которой чаще всего располагались пациенты в обучающем наборе, и терять точность при малейших отклонениях.

При этом с КТ нельзя переусердствовать: слишком сильные цветовые искажения делают значения Хаунсфилда нереалистичными, и сеть учится на патологических артефактах. Я обычно подбираю параметры эластических деформаций так, чтобы они имитировали дыхательное движение, но не разрывали очаговые структуры. Однажды, экспериментируя с сегментацией узлов, я поставил слишком агрессивные деформации, и часть узелков визуально разрывалась на части — модель стала пропускать мелкие очаги. После уменьшения амплитуды всё встало на свои места.

Полезные виды аугментации

  • Небольшие повороты (до ±10–15°) — имитируют разную укладку пациента в гентри.
  • Смещения — сдвиг всей грудной клетки в пределах 5–10% размера изображения.
  • Масштабирование — вариация антропометрических особенностей (отдельно контролирую, чтобы не вылезти за границы реальных размеров).
  • Эластические деформации — с контролируемой амплитудой, имитируют дыхательные смещения, незаменимы при обучении на однотипных данных.
  • Изменение яркости и контраста — в рамках шкалы Хаунсфилда, например, добавление небольшого равномерного смещения и изменение крутизны.
  • Добавление шума — моделируют реальный шум томографа, улучшают устойчивость к низкодозовым протоколам.
  • Случайное отражение — для грудной клетки лево-правая симметрия допустима, это удваивает объём выборки; но если есть явные асимметричные патологии, отражение нужно применять осторожно.

Как готовить маски для сегментации

Когда имеется ручная разметка, важно убедиться, что после всех преобразований маска попиксельно совпадает с обработанным изображением. Даже мелкое расхождение в координатах приводит к тому, что модель будет учиться на неверной паре — и впоследствии систематически недооценивать или переоценивать границы органов. Мне памятен случай, когда после ресэмплинга маска лёгких сместилась на полвокселя, и сеть упорно не добирала около миллиметра по периферии — пришлось переделывать весь пайплайн.

Что важно проверить

  • Одинаковую размерность image и mask — именно array shape, а не только метаданные; если массив маски отличается хотя бы на один воксель, начнутся ошибки выравнивания.
  • Совпадение координат — после ресэмплинга аффинные матрицы изображения и маски должны быть строго согласованы, иначе физическое соответствие потеряется.
  • Корректный пересчет при ресэмплинге — маски обязательно интерполировать методом ближайшего соседа (Nearest-Neighbor), иначе появятся промежуточные значения и размытые границы.
  • Отсутствие «ступенек» на границах — визуально накладываю контур маски на изображение и проверяю, не появилось ли артефактов лестничного эффекта.
  • Сохранение тонких структур после интерполяции — особое внимание уделяю мелким узелкам менее 3 мм, сосудистым стенкам; они могут исчезнуть при некорректной обработке.

Предобработка для обучения и для клиники — не одно и то же

Один из самых недооценённых моментов: требования к обучающему и клиническому пайплайну принципиально разные. На этапе обучения я могу позволить себе аугментации, эксперименты с окнами и даже несколько вариантов обрезки ROI. В клинике же нужен детерминированный, воспроизводимый процесс, который даст одинаковый результат при повторном запуске и не зависит от случайных флагов. Я всегда сохраняю фиксированный конфиг нормализации и ресэмплинга, а также версионирую пайплайн, чтобы при обновлении модели не получить рассинхрон с обучающими данными.

Сравнение режимов

Этап Основная цель Что допустимо
Обучение Увеличить вариативность Аугментация, эксперименты с окнами, динамическая обрезка ROI, несколько вариантов нормализации
Валидация Честно оценить качество Только детерминированные преобразования без аугментации, строго фиксированные параметры
Инференс Стабильность и повторяемость Жёстко фиксированный пайплайн, все параметры ресэмплинга и нормализации вынесены в конфигурацию, никакой случайности
Клиника Воспроизводимость и контроль Версионирование пайплайна, автоматическая проверка входных DICOM-тегов, логирование предобработанных объёмов и параметров нормализации

Частые ошибки в предобработке КТ

  • Приведение всех данных к одному шаблону без учета клинической задачи — например, использование легочного окна для поиска костных метастазов; каждая задача требует индивидуальной настройки.
  • Смешивание серий с разной толщиной среза — модель может выучить толщину как признак патологии, и в клинике начнёт различать «тонкую» и «толстую» анатомию вместо реальных изменений.
  • Неправильная ориентация объемов — встречал разворот на 180° или перепутанные оси, сегментация становилась зеркальной или перевёрнутой.
  • Слишком агрессивный ресэмплинг — излишнее сглаживание может стереть границы очагов, слить тонкие сосудистые стенки и имитировать отсутствие патологии.
  • Неверная интерполяция масок — использование билинейного или бикубического ресэмплинга на масках приводит к серым зонам, которые ломают функцию потерь.
  • Отсутствие контроля качества после преобразований — один пропущенный случай с обрезанной верхушкой или смещённой маской порождает систематическую ошибку во всей модели.
  • Использование одинакового окна для разных задач — на мягкотканном окне граница лёгкого становится менее контрастной, и сегментация паренхимы страдает.
  • Автоматическое удаление «лишнего» без проверки верхушек и периферии легких — однажды мы потеряли субплевральный очаг из-за слишком жёсткого порога обрезки; с тех пор всегда проверяю проблемные зоны.

Как проверить, что предобработка работает правильно

Контроль качества не может быть формальным. Я обязательно смотрю изображения, а не только числовые метрики, потому что искажения часто видны именно глазу опытного рентгенолога.

Минимальный набор контроля

  • Открыть случайные 10–20 случаев после всех преобразований — я обычно беру по 5 примеров из каждого источника, чтобы убедиться в отсутствии дефектов на всём разнообразии.
  • Сравнить исходный и обработанный объем — убедиться, что ресэмплинг не смазал мелкие узлы и не исказил общую форму.
  • Наложить маску на изображение — проверить совпадение границ; любое смещение сразу бросается в глаза.
  • Проверить сохранение анатомических ориентиров — бифуркация трахеи, дуга аорты, кардиофренический угол должны быть на месте, без смещений.
  • Оценить, не потерялись ли тонкие структуры — стенки сосудов, небольшие очаги, плевральные спайки.
  • Посмотреть на гистограмму интенсивностей — в результирующем диапазоне не должно быть аномальных пиков, свидетельствующих о выбросах или недоклиппинге.
  • Протестировать пайплайн на данных из другого сканера — иначе можно не заметить, что нормализация «завязана» на характеристики конкретного аппарата, и в клинике модель провалится.

Практический рабочий пайплайн

Ниже — последовательность, которую я выработал как разумную отправную точку для большинства проектов по сегментации КТ. В зависимости от задачи и доступных ресурсов отдельные пункты могут детализироваться или автоматизироваться.

  1. Загрузка DICOM и проверка серии — убедиться, что все срезы на месте, нет дубликатов и серия относится к одному исследованию.
  2. Сортировка срезов и контроль ориентации — при необходимости вручную корректирую оси, если ImageOrientationPatient содержит ошибки; восстанавливаю право-лево по анатомическим маркерам.
  3. Приведение к единому воксельному шагу — задаю целевой spacing, для изображения использую BSpline-интерполяцию, для масок — Nearest Neighbor.
  4. Отсечение выбросов по интенсивности — удаляю явные артефактные значения ниже –1024 и выше +3071 HU, чтобы они не мешали нормализации.
  5. Нормализация значений — клиппирую по заданному диапазону, например [‑1000, +400] HU, и масштабирую в [0, 1] или стандартизирую под среднее/стандартное отклонение.
  6. Выделение ROI или тела пациента — нахожу границы тела, убираю лишний воздух и стол, устанавливаю фиксированные поля с отступом 10–20 мм от легочных верхушек и диафрагмы.
  7. Подготовка масок и согласование координат — применяю тот же ресэмплинг к маскам с Nearest‑Neighbor, проверяю соответствие аффинных матриц.
  8. Аугментация для обучающей выборки — применяю повороты, сдвиги, эластичные деформации и шум только на лету во время тренировки, без сохранения аугментированных копий на диск.
  9. Визуальный контроль нескольких примеров — обязательно просматриваю 10–15 итоговых объёмов, накладываю маску и сравниваю с исходным аксиальным рядом.
  10. Сохранение версий пайплайна для повторяемости — коммичу параметры предобработки в конфигурационный файл, чтобы через полгода точно знать, что именно было сделано с данными.

FAQ по предобработке КТ перед сегментацией

Нужно ли всегда делать ресэмплинг?

Практически всегда. Если все данные собраны в одном центре на единственном томографе с одинаковой толщиной и пиксельным шагом, теоретически можно пропустить, но даже микроразличия накапливаются при прохождении через многослойную свёрточную сеть и могут ухудшить обобщение. Кроме того, клинические инференс-данные редко бывают идеально единообразными, так что ресэмплинг — это страховка.

Можно ли сразу подавать DICOM в нейросеть?

Технически да, но я настоятельно не рекомендую. Во-первых, различные DICOM-теги (например, Rescale Slope/Intercept) могут интерпретироваться разными библиотеками по-разному, и модель будет видеть непредсказуемые значения HU. Во-вторых, без приведения к общему разрешению и диапазону вы обрекаете сеть на нестабильность. Лучше один раз нормализовать, чем потом искать невидимые источники ошибок.

Что важнее: окно или ресэмплинг?

Оба этапа критичны, но если расставить приоритеты, то геометрическая согласованность (ресэмплинг) обычно важнее контрастной (окно). Неправильное пространственное разрешение ломает топологию органов и приводит к неконсистентным контурам; неправильное окно же ухудшает видимость, но пространственные отношения сохраняет. В идеале, конечно, не пренебрегать ни тем ни другим.

Можно ли использовать одну и ту же предобработку для легких, узлов и эмболии?

Категорически нет. У каждой задачи свой масштаб интереса, диапазон критических плотностей и требуемая детализация. Для сегментации паренхимы нужно широкое легочное окно и более грубая обрезка, для узлов — мягкотканное окно и сохранение мельчайших деталей, для ТЭЛА — фокус на контрастированных сосудах. Базовый скелет пайплайна может быть общим, но параметры нужно обязательно настраивать под конкретную клиническую цель.

Как понять, что аугментация слишком сильная?

Простой тест: показать несколько аугментированных срезов опытному рентгенологу. Если он скажет: «Это не похоже на настоящий КТ», или вы сами замечаете, что сосуды изгибаются неестественно, очаги разрываются, а легочный рисунок смазывается в бесформенные пятна — значит, пора снижать амплитуду. Количественный критерий: рост ошибки на валидационной выборке при усилении аугментаций.

Почему модель ошибается, хотя обучение шло хорошо?

Классическая ловушка — различие между обучающим и инференс-пайплайном. Даже если на тренировочной и валидационной выборках метрики высоки, малейший дисбаланс в нормализации или ресэмплинге на реальных клинических данных может обрушить качество. Я всегда проверяю идентичность конвейера, включая порядок преобразований, типы интерполяции и параметры окна, а на стадии инференса логирую входные теги, чтобы иметь возможность отследить расхождения.

Что запомнить на практике

Предобработка КТ перед сегментацией не должна быть самой сложной частью пайплайна — она должна быть самой согласованной. Как только вы зафиксировали формат входных данных, воксельный шаг, схему нормализации и правила проверки, всё становится предсказуемым: меньше ошибок в масках, чище градиенты при обучении и гораздо выше шанс, что модель уверенно заработает не только в лабораторных тестах, но и в живом клиническом потоке. Контролируйте каждый шаг, версионируйте конфигурацию и всегда выделяйте время на визуальный контроль — это окупается стабильностью и доверием врачей.