Cоревнование по определению костного возраста. Заметки участника
6-го октября на радары Володи Игловикова попал очень интересный конкурс, организованный американскими рентгенологами из The Radiological Society of North America (RSNA) и Radiology Informatics Committee (RIC), и он бросил клич в сообществе ODS.ai
Целью конкурса было создание автоматической системы для определения костного возраста по рентгеновским снимкам руки. Костный возраст используется в педиатрии для комплексной оценки физического развития детей, и его отклонение от хронологического помогает выявить нарушения в работе различных систем организма. Когда дело касается медицинских проектов, меня уговаривать не надо, но это соревнование стартовало в августе и вступать в него за 8 дней до окончания выглядело авантюрой. Чтобы хотя бы начать препроцессинг снимков, требовались маски рук, и Володя сделал их за несколько дней, отличного качества, и поделился с остальными. Как он так быстро справился с этой тяжёлой задачей, включавшей ручную разметку – загадка, и об этом он, возможно, напишет сам. С масками затея уже не выглядела безнадёжной, я решился участвовать и в конечном счёте успел реализовать почти все планы.
Задача
Костный возраст (bone age) — это условный возраст, которому соответствует уровень развития костей детей и подростков. Формирование скелета происходит в несколько стадий. Это используется в педиатрии для сравнения костного возраста с хронологическим, что позволяет вовремя заметить нарушения в работе эндокринной системы и системы обмена веществ.
Для определения костного возраста в основном используются две методики — GP Грейлиха и Пайла (Greulich and Pyle) и TW2 Таннера, Уайтхауза и Хили (Tanner, Whitehouse, Healy), разработанные во второй половине XX века. Обе методики основаны на рентгенограмме кисти и лучезапястного сустава. Благодаря большому количеству участков растущей ткани в костях и ядер окостенения, по этим рентгенограммам можно проследить появление эпифизов (концевых отделов трубчатых костей), этапы их развития, процессы слияния эпифизов с метафизами с образованием костных соединений.
Метод GP основан на сопоставлении рентгенограммы со специальным атласом. Здесь можно посмотреть, как определяется костный возраст по методу TW2. Метод заключается в оценке 20 определённых костей, большая часть которых относится к запястью или к зоне сочленения пястных костей и проксимальных фаланг. Классические методики определения костного возраста требуют значительного времени специалистов и сильно зависят от субъективных оценок, что отрицательно сказывается на диагностике и последующей терапии.
Первой и лучшей на сегодня системой автоматического определения костного возраста является коммерческая система BoneXpert, одобренная для применения в Европе. BoneXpert использует алгоритм компьютерного зрения AAM, при помощи которого реконструирует контуры 13 костей ладони, затем по их форме, текстуре и интенсивности определяет костный возраст в соответствии с методикой GP или TW. Точность этой системы составляет 0.65 года, но кроме рентгенограммы ей требуется хронологический возраст, что значительно упрощает задачу. К другим серьёзным ограничениям BoneXpert относится чувствительность к качеству снимков и то, что она не использует кости запястья, которые особенно важны при определении костного возраста маленьких детей. В недавней публикации “Fully Automated Deep Learning System for Bone Age Assessment” описана система машинного обучения, показавшая точность 0.82-0.93 года с использованием только рентгенограммы.
Задачей нашего соревнования было создание автоматической системы для определения костного возраста только по рентгенограмме.
Данные
Организаторы предоставили 12,611 тренировочных, 1,425 валидационных и 200 тестовых снимков, собранных из трёх лабораторий — Stanford University, the University of Colorado, the University of California. В тренировочном сете 5,778 девочек, 6,833 мальчиков. Возраст от 1 до 228 месяцев. В тестовом сете мальчиков и девочек поровну.
Снимки сделаны на разном оборудовании, в разное время и разнообразного вида: масштаб, размер руки, ориентация, контраст, сопутствующие надписи, рамки и другой мусор. Монохромные в формате png, типичный размер 2044x1514 пикселей. Для всех снимков был указан пол, а для тренировочных – костный возраст в месяцах, полученный экспертной оценкой.
Препроцессинг
Для нормализации контраста и удаления мусора нужно было обнулить фон, что было сделано при помощи масок В.Игловикова. Дальше рассматривались 2 варианта: autocontrast и equalize из PIL.ImageOps. Эквализация гистограммы не устроила тем, что пересвечивала светлые участки, и в итоге был использован autocontrast.
На этом с препроцессингом можно было бы закончить и тренировать модель на снимках разных масштабов и ориентаций. Вполне возможно, что это сработало бы. Но в оригинальных методиках основное внимание уделяется нескольким компактным зонам – пястным костям (Metacarpal), проксимальным фалангам (Proximal Phalanx) и запястью (Carpal). Было очень заманчиво натренировать несколько разных моделей на небольших зонах с высоким разрешением, но для правильной локализации этих зон нужно было сначала привести все ладони к одному размеру и положению, т.е. зарегистрировать. Таким образом, дальнейшая задача сводилась к двум моделям:
- для регистрации изображений
- для определения возраста по заданным зонам
Регистрация изображений. Модель №1
В качестве ключевых точек были выбраны кончик среднего пальца, центр головчатой кости в запястье (Capitate), кончик большого пальца. Вручную были размечены 800 снимков. Почему-то оказалось сложно найти рабочий софт для такой простой задачи как разметка точек, но в итоге нашёлся и отлично подошёл VGG Image Annotator (VIA). Снимки были приведены к размеру 2080x1600 и в процессе тренировки отмасштабированы с 16-кратным уменьшением.
Для определения координат ключевых точек (x, y) я воспользовался регрессионной VGG-подобной моделью с блоками 64-128-256, двумя полносвязными слоями по 512 нейронов, 6-ю выходами (3 x 2) и функцией потерь MSE. VGG блок представляет собой два конволюционных слоя с фильтрами 3x3 и 1x1, батч-нормализацией, активацией ELU и MaxPooling 3-2. Обычно я пользуюсь SGD оптимизатором, но здесь Adam показал себя хорошо, а времени было в обрез. Почему VGG, а не Resnet или Inception? Не знаю, с чем это связано, но в моих задачах VGG часто работает немного лучше, а времени на выбор архитектуры опять же не было. Тренировал с аугментацией: вращение, сдвиг, зум. Точность локализации получилась около 3%, что явно не предел, и после конкурса возникло желание попробовать другие способы регистрации медицинских изображений.
Когда ключевые точки найдены, остаётся посчитать аффинное преобразование (масштабирование, поворот, сдвиг и кое-где зеркальное отражение), чтобы кончик среднего пальца и головчатая кость оказались на одной вертикали, 100 пикселей сверху и 480 снизу соответственно, а большой палец справа:
Главная модель
Как можно догадаться, это тоже регрессионная VGG модель, но работающая на крупных картинках и более глубокая: блоки 32-64-128-128-256-384, два полносвязных слоя по 2048 нейронов и один выход. Метрикой соревнования была Mean Absolute Distance, соответственно и модель использовала Mean Absolute Error (MAE) в качестве функции потерь. На входе — картинки 2080x1600, но для этой модели был написан генератор, делающий кроп заданного размера из заданной зоны с аугментацией и масштабированием. Были выбраны 3 зоны:
A) вся рука, кроп 2000x1500, масштаб 1:4
B) запястье, кроп 750x750, масштаб 1:2
C) пястные кости и проксимальные фаланги, 600x1400, масштаб 1:3
Так были натренированы 3 модели из разных зон. До конца соревнования оставалось 2 дня, и делать полноценную кроссвалидацию я не стал; модели тренировались на 11,600 картинках и валидировались на 1,000. Благодаря аугментации и дропауту сходимость была очень равномерной, без признаков переобучения.
Выяснилось, что модель, натренированная на запястье (зона B), почти не уступает модели для всей руки (A) с площадью в 5.3 раза больше. Неожиданный результат показала модель на пястных костях (С), на которую не возлагалось особых надежд. Она оказалась лучше (B) и в ряде случаев немного лучше (A), хотя в методике TW2 зоне пястных костей придаётся не самое большое значение, а её площадь меньше (A) в 3.6 раза.
Под конец соревнования я вспомнил, что в стандартных методиках костный возраст определяется с учётом пола. Тюниг моделей отдельно для мальчиков и девочек дал значительное улучшение, порядка 1.4 месяца, и моделей вместо трёх стало шесть.
И уже после официального завершения одно недоразумение помогло реализовать идею, до которой вовремя не дошли руки – классификацию вместо регрессии. Организаторы назначили окончание соревнования на “полночь 15 октября”. Мы в ODS.ai думали, что это полночь между 15 и 16, но 14 октября узнали, что до завершения остаётся несколько часов и едва успели подать свои решения. Как и полагается при таком прекрасном дедлайне, повезло не всем. Несколько конкурсантов попались, стали жаловаться, соревнование продлили на сутки, и у меня появился дополнительный день.
Классификация была сделана не совсем традиционно. Роль классов играл возраст в месяцах, но на выходе сети были не вероятности, а матожидание возраста по всем классам. Я рассматривал разные варианты квантования, и лучше всего себя показал самый простой, 1 месяц — 1 класс, всего 240 классов. В предпоследнем слое я поставил софтмакс на 240 выходов, который скалярно умножал на вектор возрастов (0, …, 239 нормированный к [-1, 1]). Тренировал модель с теми же метками и той же функцией потерь (MAE), что и в случае регрессии.
Классификационные модели по отдельности лишь немного превзошли регрессионные, но вошли в линейный ансамбль с более значительными весами и заметно улучшили общий результат.
Заключение
Соревнование получилось прекрасным и самым стремительным из всех, в которых мне приходилось участвовать. Благодарен организаторам за очень интересную тему, В.Игловикову — за то, что втянул меня в это и помог с масками, А.Стромнову, А.Швецу, Ю.Кашницкому, П.Нестерову – за комментарии и поправки к тексту.
Надеюсь, что и наши результаты принесут медицине пользу. Точность определения костного возраста, показанная участниками ODS.ai на тестовой выборке (А.Рахлин — 4.97 месяца, В.Игловиков — 5.41, А.Швец — 5.50), значительно превзошла BoneXpert и “Fully Automated Deep Learning System for Bone Age Assessment” с их 0.65 и 0.82-0.93 года соответственно. Удалось почти всё запланированное, за исключением бустинга фич из последних слоёв. Но это вряд ли существенно улучшит результат: судя по всему, достигнут предел, связанный с неоднозначностью аннотации снимков, как это часто бывает в медицинском ML.
Автор: rakhlin