Первое, с чем я столкнулся, когда начинал собирать корпус для челленджа по разметке лёгких — никакая, даже самая тщательно настроенная U-Net не компенсирует небрежность на этапе данных. Можно хоть десять раз перебрать архитектуру: если на входе DICOM-серии с разным шагом по оси z, маски, где левое и правое перепутаны, и разметка, выполненная разными людьми без общего гайдлайна, модель будет учиться не анатомии, а хаосу. Уверен, именно поэтому проекты по сегментации тонут чаще не из-за алгоритмов, а из-за того, что датасет не подготовлен для реальной работы.
Здесь я разбираю практический путь — от формулировки задачи до контроля качества, с теми нюансами, которые наработал за годы экспериментов: от пороговой обработки и активных контуров до интеграции свёрточных сетей в рутинные процессы. Всё это нужно, чтобы подготовить данные для сегментации лёгких так, чтобы они давали стабильно воспроизводимый результат и в обучении, и в клинической валидации.
Почему подготовка данных решает больше, чем кажется
В медицинской визуализации модель редко «ломается» из-за архитектуры. Чаще проблема в том, что данные собраны с разных сканеров, имеют разный шаг по оси z, содержат артефакты дыхания, неполную разметку или несовместимые протоколы. Для сегментации лёгких это особенно критично: грудная клетка анатомически вариативна — от глубины диафрагмальных синусов до формы купола плевры. А границы лёгочной ткани на КТ могут быть размытыми при фиброзе, слипаться при ателектазе или вовсе исчезать в зоне консолидации. Я видел случай, когда модель, обученная только на чётких нормальных контурах, при встрече с небольшим плевральным выпотом начинала «захватывать» жидкость в маску, потому что никогда не видела ничего подобного.
Если говорить практично, хорошая подготовка данных для сегментации лёгких нужна для трёх вещей:
- чтобы модель видела одинаковую логику входных данных;
- чтобы разметка была достаточно чистой для обучения;
- чтобы метрики отражали реальное качество, а не случайный набор артефактов.
С чего начинается подготовка данных для сегментации лёгких
Определите задачу
Казалось бы, «сегментация лёгких» звучит однозначно, но на практике за этим может скрываться всё что угодно. Один клиницист хочет получить объём лёгочной паренхимы без трахеи для количественного анализа эмфиземы, другой — выделить доли для планирования резекции, третий — просто оба лёгких как маску для постпроцессинга. Несколько раз я сталкивался с проектом, где после полугодовой разметки вдруг выяснялось, что нужно было размечать и крупные бронхи, а не только паренхиму. Переделки стоили потерянных человеко-часов.
Перед разметкой нужно понять, что именно вы сегментируете:
- только оба лёгких целиком;
- лёгкие плюс трахея и крупные бронхи;
- доли лёгких;
- патологические зоны внутри лёгких;
- объём лёгочной ткани для количественного анализа.
Чем точнее постановка задачи, тем меньше переделок потом. Это особенно важно, если данные собираются для клинического кейса, где модель должна интегрироваться в рабочий процесс без лишних сюрпризов.
Зафиксируйте тип исследования
Основной объём моего опыта — это КТ грудной клетки. Именно КТ даёт трёхмерную информацию с приемлемым контрастом между воздухом и мягкими тканями. Реже используется рентгенография, но там уже двухмерная проекционная картинка, где задача сегментации лёгких существенно иная и часто требует дополнительной регистрации или компенсации наложения рёбер. Отдельные подзадачи на МРТ — это другая анатомия, другие принципы контрастирования и пространственного разрешения, и пока МРТ для рутинной сегментации лёгких скорее исключение.
Для КТ важно сразу зафиксировать параметры, влияющие на границы и текстуру:
- толщину среза;
- наличие контрастирования;
- реконструктивный алгоритм (bone, soft, lung kernel);
- положение пациента (supine, prone, decubitus);
- фазу дыхания, если она известна (inspiration, expiration).
К примеру, смена кернеля реконструкции с легочного на мягкотканный может сделать границы лёгкого более «размытыми», и модель, обученная на одном типе, начнёт терять уверенность на другом. Я всегда стараюсь унифицировать протоколы уже на уровне сбора.
Какие данные собирать
Минимальный набор для рабочей выборки
Датасет для сегментации — это не только файлы картинок, но и понимание того, откуда они взялись. На практике в рабочем проекте я обязательно фиксирую:
- DICOM-серии целиком (без выборочного извлечения слайсов);
- маски разметки в едином формате (чаще NIfTI, иногда DICOM RT);
- описание источника исследования (клиника, отделение);
- возрастной и клинический контекст (минимум возраст, пол, причина сканирования, ключевые находки);
- параметры сканирования (модель томографа, протокол, kVp, mAs, ядро реконструкции);
- статус качества серии (полная, частичная, с артефактами, приемлемая).
Если задача образовательная или исследовательская, всегда записываю и причину исключения серии: сильные артефакты от металлоконструкций, неполный объём захвата лёгких, низкое качество из-за движения пациента, ошибка экспорта из PACS. Эта информация спасает через полгода, когда пытаешься понять, почему в выборке образовался перекос.
Какие случаи нужны обязательно
Чтобы модель была устойчивой, в датасете должны быть не только «чистые» исследования студентов-медиков без патологии. По опыту, если подготовка данных для сегментации лёгких ограничивается нормой, модель уверенно покажет Dice выше 0,95 на тесте таких же здоровых, но в реальной клинике провалится. Обязательные классы клинических сценариев:
- нормальные случаи (как базовый референс);
- эмфизема (буллёзная и центрилобулярная);
- фиброз (различные паттерны — NSIP, UIP, honeycombing);
- пневмония (вирусная, бактериальная, с консолидацией и матовым стеклом);
- плевральный выпот (гидроторакс, гемоторакс);
- ателектазы (компрессионные, обтурационные);
- послеоперационные изменения (лобэктомия, резекция сегментов);
- выраженные артефакты, если они встречаются в реальной практике.
Если собрать только чистые исследования, модель хорошо покажет себя в тесте на похожих данных, но быстро проседает в клинике — особенно на базальных отделах с выпотом или на коллабированной доле после резекции.
Как организовать разметку
Единые правила — важнее, чем «хороший глаз» разметчика
Самая частая ошибка, которую я наблюдал и сам совершал — когда разные рентгенологи размечают по-своему, а потом это называют одним датасетом. Для сегментации лёгких нужны подробные инструкции, которые снимают неоднозначность. Чем детальнее guideline, тем меньше разброс.
Прописываю в гайде:
- где проходит внешний контур лёгкого (по плевре, исключая средостение и грудную стенку);
- включаются ли в маску сосуды и бронхи (обычно исключаются, но для долей — иначе);
- что делать с участками коллапса (ателектазированное лёгкое включать, но с осторожностью);
- как размечать зоны консолидации (сохранять как лёгкое, если пневмония, но исключать, если задача — только воздушная паренхима);
- исключаются ли плевральные жидкости (да, почти всегда);
- как поступать с частично обрезанными сериями (когда не видно купола диафрагмы или верхушек).
Различие в интерпретации одного такого пункта способно сгенерировать систематическую ошибку на всём датасете. Однажды в проекте по долям лёгкого два эксперта по-разному проводили междолевую границу у пациентов с фиброзом — Dice между их разметками падал до 0.85, и модель выучивалась на несогласованной смеси. После унификации правил согласие поднималось выше 0.93.
Ручная, полуавтоматическая и автоматическая разметка
За годы я перепробовал все три подхода. У каждого свои сценарии, и важно понимать, когда что применять.
| Подход | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Ручная разметка | Максимальный контроль | Долго и дорого | Небольшие наборы, сложные кейсы |
| Полуавтоматическая | Быстрее, меньше рутины | Нужна проверка человеком | Средние датасеты, пилотные проекты |
| Автоматическая с последующей правкой | Хорошо масштабируется | Риск систематических ошибок | Большие корпуса, постоянное пополнение базы |
На старте я чаще всего задействую полуавтоматический сценарий: алгоритм пороговой обработки с морфологическими операциями быстро строит грубую маску, а эксперт корректирует её на спорных участках — у корней, вблизи выпота и в зонах плевральных спаек. Затем постепенно, по мере накопления проверенных масок, можно обучать лёгкую предварительную сегментацию и переходить к автоматической с верификацией. Полностью доверять автомату без контроля человека я бы не решился до тех пор, пока не протестировал на всех клинически значимых паттернах.
Форматы и техническая подготовка
Приведение данных к единому виду
Перед обучением данные нужно нормализовать не только математически, но и организационно. Мой стандартный процесс включает:
- приведение всех серий к одному формату хранения (DICOM или NIfTI);
- проверка целостности DICOM-тегов (SliceLocation, ImageOrientationPatient);
- удаление дубликатов и локальных копий с разными именами;
- унификация размера вокселя, как минимум — документирование разброса;
- решение о ресэмплинге (да/нет);
- фиксация одинаковой ориентации объёма (например, LPS с аксиальным первым срезом).
Для лёгких особенно важен шаг по оси z. Если часть серий имеет толщину среза 0.625 мм, а другая — 3 мм, то на толстых срезах из-за эффекта частичного объёма граница плевры размывается. Модель начинает то «раздувать», то «сужать» контур в апикально-каудальном направлении, и стабильность падает. В одном проекте пришлось исключить все серии с шагом больше 2 мм, потому что ресэмплинг создавал артефакты кольца Гиббса, и модель реагировала на них как на патологию.
Что важно проверить перед загрузкой в обучение
Даже после конвертации я всегда запускаю быструю верификацию:
- совпадает ли маска с изображением по размеру;
- нет ли сдвига по координатам (проверяю наложение в нескольких срезах);
- не перепутаны ли левое и правое лёгкое (часто из-за разных конвенций тега PatientPosition);
- не пустая ли маска (бывает, экспорт маски NIfTI случайно содержит только фон);
- не содержатся ли в маске посторонние структуры (рёбра, трахея);
- не обрезан ли верхний или нижний край лёгких (при обрезке по HU или ручном кадрировании).
Один из самых коварных багов — зеркальная перестановка лёгких, когда маска левого ложится на правое и наоборот. Обычно это выявляется только визуальным сравнением на корональной проекции. Пропустишь этот момент — модель уверенно научится инвертировать анатомию.
Предобработка: что делать до обучения
Нормализация интенсивности
Для КТ стандартная практика — работать в шкале Hounsfield Units и ограничивать диапазон, полезный для лёгочной ткани. Это уменьшает влияние экстремальных значений (металл, контраст) и делает данные более сопоставимыми между разными томографами.
Обычно я применяю:
- клиппинг по диапазону, например от ‑1000 HU до 600 HU;
- нормализацию в выбранный интервал [–1, 1] или [0,1];
- иногда — стандартную z-нормализацию после клиппинга, если модель чувствительна к масштабу.
Важный нюанс: для эмфиземы низкие значения в районе ‑1000 HU несут диагностический смысл, так что чрезмерный клиппинг снизу стирает воздушные ловушки. Я оставляю небольшой запас и не обрезаю весь отрицательный хвост.
Ресэмплинг
Если данные разнородные, объём приводят к единому пространственному разрешению — модель видит одинаковую геометрию объектов. Но здесь есть подвох: слишком агрессивный ресэмплинг может «съесть» мелкие детали. Когда задача не только на сегментацию лёгких, но и на поиск мелких узелков или булл, я стараюсь сохранить максимальное исходное разрешение, а вместо ресэмплинга использую рандомизированный кроп с адаптацией.
Если ресэмплинг неизбежен, ориентируюсь на медианный спейсинг в выборке. Интерполяция третьего порядка иногда создаёт артефакты на границах — тогда перехожу на линейную. Также не ресэмплю маски, а перестраиваю их через ближайшего соседа, чтобы сохранить бинарность и не размыть края.
Обрезка области интереса
Иногда полезно убрать лишнее пространство вокруг грудной клетки и оставить только region of interest. Это ускоряет обучение, снижает нагрузку на память и уменьшает долю пустых пикселей, которые не несут информации.
Я автоматически нахожу bounding box по грубой пороговой маске лёгких и добавляю по 10–15 мм запаса, чтобы гарантированно сохранить верхушки и диафрагмальные углы. Главное — не обрезать зону средостения там, где плевра уходит глубже, и верхушечные сегменты, которые при вдохе могут немного смещаться вверх.
Контроль качества: без него датасет быстро деградирует
Что проверять вручную
Даже при хорошо отлаженном пайплайне часть данных нужно просматривать глазами. Я обязательно проверяю несколько срезов в разных плоскостях (аксиальной, корональной, сагиттальной) для каждого n-го пациента. Это позволяет заметить разрывы контура на границе средостения или диафрагмы.
Контрольный список для ручной проверки:
- наложение маски на изображение (полупрозрачное перекрытие);
- соответствие анатомии (нет ли участков сердца или печени в маске);
- случаи с патологией (особенно выпот и фиброз);
- пограничные исследования (артефакты, неполный захват).
Также полезно анимированно пролистать маску поверх нативных срезов: так выявляются «обрывы» на паре слайсов, которые глаз на статике может не заметить.
Типичные ошибки
Из того, что я регулярно встречаю:
- маска съехала на несколько пикселей из-за нестыковки систем координат DICOM и NIfTI;
- часть лёгкого не размечена (часто верхушечные или базальные участки);
- в контур попала стенка грудной клетки (из-за пороговой сегментации без морфологической постобработки);
- верхушки обрезаны (при автоматической обрезке bounding box’а);
- двусторонняя разметка перепутана;
- серия была пересохранена с потерей ориентации (тег ImageOrientationPatient становится 1,0,0,0,0,-1 вместо корректного).
Если подобные ошибки попадают в обучение, модель начинает воспроизводить их как норму — например, «заезжать» на пару пикселей в мягкие ткани средостения.
Как делить данные на train, validation и test
Деление должно быть по пациентам, а не по срезам
Это принципиальный момент, который я объясняю каждому новому участнику команды. Если разделять по срезам, а не по пациентам, модель увидит одного и того же пациента в разных выборках, и метрики будут искусственно завышены. Для сегментации лёгких это критично, потому что соседние срезы одного объёма практически идентичны.
В одном из ранних проектов мы случайно разбили по срезам и получили Dice на validation около 0.98, а при тестировании на независимой когорте — лишь 0.91. Причина проста: модель переобучилась на межсрезовую корреляцию и не умела экстраполировать на новые анатомии.
Правильный подход: train — основная обучающая выборка, validation — для подбора гиперпараметров, test — для финальной оценки. И критически важно, чтобы пациент присутствовал только в одной из этих частей.
Что ещё учитывать при сплите
Кроме правила «один пациент — одна выборка», я стремлюсь к сбалансированному сплиту по патологиям, типам сканеров, возрастным группам. Если тестовая выборка не отражает ту популяцию, с которой модель столкнётся в клинике, оценка будет обманчивой. Редкие случаи (например, объёмная резекция доли) лучше выделять отдельно и обязательно включать в test, иначе останется неизвестным, как модель поведёт себя в такой ситуации.
Аугментация: где помогает, а где мешает
Полезные виды аугментации
Для подготовки данных для сегментации лёгких хорошо зарекомендовали себя умеренные геометрические и яркостные преобразования:
- повороты в небольшом диапазоне (±10°);
- сдвиги (до 10% размера);
- масштабирование (имитация разного телосложения);
- изменение яркости и контраста (симуляция вариаций окон HU и протоколов);
- добавление шума (имитация низкодозовой КТ);
- elastic deformation, если она не ломает анатомию.
Эластичная деформация с малым sigma хорошо моделирует естественные дыхательные девиации, но её нужно настраивать так, чтобы граница плевры не становилась бугристой и неестественной.
Осторожность с агрессивной аугментацией
Нельзя превращать медицинское изображение в абстракцию. Слишком сильные трансформации создают неестественные формы, и модель обучается на искажениях, а не на анатомии. Для лёгких это особенно заметно: паренхима должна сохранять свою текстурную структуру, а контур плевры оставаться гладким.
Однажды я использовал аугментацию с сильными random elastic deformation, и модель начала «сглаживать» эмфизематозные буллы, принимая их за шум. Пришлось снизить интенсивность деформации и добавить ограничение на гладкость поля.
Как понять, что данные готовы
Практический чек-лист
Перед тем как запустить обучение, я проверяю по пунктам:
- задача сформулирована однозначно;
- есть единый guideline по разметке;
- все серии проверены на целостность;
- изображения и маски совпадают геометрически;
- данные разделены по пациентам;
- есть контроль качества разметки (хотя бы выборочно);
- зафиксированы параметры предобработки (клиппинг, нормализация, ресэмплинг);
- известны ограничения датасета (каких случаев в нём нет или мало).
Что чаще всего упускают
Неполная документация
Без описания протокола сканирования и логики разметки через полгода трудно понять, почему модель ведёт себя именно так. Хороший датасет — это не только файлы, но и документация: какой тег DICOM использовался для сортировки слайсов, какие серии исключены и почему. Я веду отдельный мета-файл, где фиксирую каждое решение. Поверьте, это окупается, когда проект возобновляют спустя несколько месяцев.
Слабая проверка межэкспертного согласия
Если разметку делали несколько специалистов, нужно хотя бы выборочно оценивать согласие — иначе вы не отличите реальную сложность задачи от хаоса в правилах. Я обычно рассчитываю попарный Dice на пересекающемся наборе из 10–20 случаев. Если межэкспертное согласие ниже 0.9, значит, гайдлайн нуждается в уточнении. Модель не сможет превзойти своих учителей, если те противоречат друг другу.
Игнорирование клинической вариативности
Модель должна видеть не только «учебные» КТ из открытых банков, но и то, что реально приходит в отделение: артефакты от металлических скобок, нестандартные протоколы, сопутствующие находки. Без этого обученная модель покажет идеальные метрики на чистых данных и тут же провалится при первом же клиническом тестировании с неидеальным вдохом или пневмотораксом.
Практический рабочий процесс
Если вы начинаете проект с нуля
Из своего опыта итеративной разработки я вывел следующий путь, который экономит больше времени, чем попытка сразу собрать гигантский датасет без правил:
- Зафиксируйте конечную задачу (что именно должно быть сегментировано и зачем).
- Опишите критерии включения и исключения.
- Соберите 50–100 серий для пилота — достаточно, чтобы увидеть разброс анатомии и протоколов.
- Подготовьте guideline для разметки с примерами спорных ситуаций.
- Разметьте небольшой корпус вручную или полуавтоматически и проверьте качество (сам просмотр + метрика Dice между экспертами).
- Настройте предобработку и контроль совпадения масок.
- Только потом масштабируйте сбор данных, подключая больше экспертов или переходя к автоматизированной предразметке с проверкой.
Если датасет уже есть, но модель работает плохо
Когда готовая модель сегментации даёт неудовлетворительные результаты, я методично прохожу по списку:
- нет ли ошибок в разметке (визуально выборочная проверка);
- не перепутаны ли train и test;
- одинаков ли формат у всех серий (спейсинг, ориентация);
- нормализованы ли интенсивности (HU);
- достаточно ли в датасете сложных случаев (выпот, ателектаз, послеоперационные изменения);
- не слишком ли агрессивна аугментация (потеря текстур).
Также полезно визуализировать карты ошибок модели на тестовых случаях: часто видно, что проблемы сосредоточены, например, в задне-базальных отделах, где у нас просто не было примеров с выпотом. Это сразу указывает на нехватку клинической вариативности.
FAQ
Сколько данных нужно для сегментации лёгких?
Минимальный объём зависит от сложности задачи, но для старта полезнее не «много», а чисто и единообразно собранный набор. Для простой сегментации целых лёгких 30–50 хорошо размеченных 3D-томограмм с вариативностью патологий могут дать вполне рабочий baseline. Небольшой качественный датасет часто даёт лучший результат, чем большой, но хаотичный, потому что модель не тратит ресурсы на компенсацию ошибок разметки.
Можно ли учить модель только на нормальных КТ?
Можно, но такая модель плохо переносится на патологию и нестандартные исследования. При встрече с консолидацией она может интерпретировать уплотнённую ткань как средостение и исключить её из маски, либо, наоборот, включить плевральный выпот в лёгкое. Для практического применения нужны разные клинические сценарии, иначе модель останется академической демонстрацией.
Что важнее: качество разметки или количество данных?
Для сегментации лёгких качество разметки обычно важнее. Плохая разметка масштабируется в плохую модель, и добавление новых плохо размеченных томограмм не исправит ситуацию, а только укрепит систематические ошибки. Лучше потратить время на дотошную верификацию сотни масок, чем накопить тысячу сомнительных.
Нужен ли ресэмплинг всегда?
Нет. Он полезен при разнородных данных, но может ухудшать мелкие структуры. Если все серии укладываются в узкий диапазон толщин среза и внутриплоскостного разрешения, можно обойтись без ресэмплинга. Решение зависит от исходного шага по осям и требований к задаче. При сильном разбросе ресэмплинг к общему знаменателю почти неизбежен.
Какой формат разметки удобнее всего?
На практике удобен тот формат, который легко проверять, версионировать и конвертировать в обучающий пайплайн. Я чаще всего храню маски в NIfTI с явно заданной affine-матрицей и ориентацией, потому что это упрощает визуализацию в 3D Slicer и совместимо с большинством библиотек (MONAI, nnU-Net). DICOM SEG тоже хорош, но требует дополнительного трактования. Важно не название формата, а воспроизводимость всего процесса подготовки данных для сегментации лёгких — от исходного DICOM до финальной маски.