Про распознавание флюорограмм

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

Пожалуй единственный жанр, который мне остался интересен – статьи про то как на базе ML разрабатывается и внедряется технология. Процессы каждый раз могут быть кардинально отличающимися.

Решил обернуть некоторый из своего опыта последнего времени в статьи. До хабра они, пожалуй, пока не доросли. А в качестве небольшой заметки как надо/как не надо – сгодяться.

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

Основная проблема большинства медицинских данных – их нечёткость. Одно дело – распознавать автономера / маркировки. И совсем другое – распознавать каждый раз разные данные. Человек может быть большой, может быть маленький, может страдать ожирением – а может быть атлетом. Может курить каждый день, а может нырять с аквалангом. И всё это – разные границы нормы.

Второй момент. Большая часть данных в задачах распознавания – очень плохая. Возьмём, например, конкурс на kaggle. Цель конкурса – распознать нерв. Вот так он выглядит:

Догадаетесь где он?

Причём выглядеть он может по разному. Чтобы вы его стабильно находили – вам нужно знать анатомию + иметь опыт разглядывания УЗИ.
И третий момент, самый важный. Врачи  – не супер люди. И они видят по разному. В большинстве случаев нельзя взять КТ/рентген/УЗИ и однозначно что-то сказать. Я думаю, что вы сами слышали пару историй о том как два врача говорили что-то принципиально разное по одному и тому же снимку.

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

Введение

В какой-то момент к нам пришли знакомые и попросили поконсультировать. У них была огромная база флюорограмм, а так же желание сделать систему автоматического распознавания туберкулёза. Казалось бы, всё просто. Отмечаем на картинках туберкулёз – обучаем-распознаём.
Но, как вы догадались, сложность возникла сразу же. Ведь туберкулёз отметить на картинке нельзя. Можно только отметить изменения ткани лёгких, которые бы косвенно говорили о наличии туберкулёза.
Как отметить? А вот тут то и возникает основная проблема: трактовка. Как трактовать?

Часть 1

Чтобы ответить на этот вопрос – нам потребовалось потратить пару дней на чтение медицинских текстов + работ по данной тематике а потом 4-5 консультаций с двумя группами врачей на тему того что трактовать.
Каждая школа врачей трактует свои повреждения. А если сравнивать это с американскими работами – там полный разнобой.
Спустя два месяца был подготовлен список на ~20 характеристик, из которых ~6 было критических ~10 второстепенных, а остальные побочные и вспомогательные.
И только сформировав этот список можно было преступать к дальнейшей работе.
На мой субъективный взгляд – именно этот список, правила его формирования, корреляция списка с тем как получается обучить, именно это является научной новизной работы.
Переписать список из книжки по фтизиатрии – это как расписаться в собственной некомпетентности. Часто там идёт путаница с визуально видимыми отклонениями, с симптомами, с заболеваниями, и.т.д.
Ключевой момент, чтобы врачи могли понять особенность того как происходит обучение и что сможет увидеть алгоритм.

Часть 2

Разметка. Во всех наших проектах разметка была самой технической частью. Набираешь студентов, говоришь какие точки/области отмечать. Поехали. Через пару недель можно работать.
А тут всё сложнее. Врачи могут иметь разный взгляд на то что изображено. При этом два врача которые отметили что-то по-разному могут до хрипоты спорить что правильно.
Моя жена – хирург. Она регулярно рассказывает как 2-3 специалиста по КТ не могут понять что видят. В результате зовут хирурга который объясняет им что и как было во время операции.
Тут всё так же. Только хирурга нет.
В нашем случае механизм разметки был такой:

  • 2-3 ординатора размечают базу
  • Один специалист проверяет разметку на предмет ошибок, правит её местами.
  • Все поправленные картинки, картинки где возникли затруднения – проверяются консилиумом из 2-3 специалистов.
  • Независимый человек из другой больницы оценивает результат.

Наша схема во многом была обусловлена маленьким бюджетом. Когда бюджет большой и надо сделать хорошо, используется другая схема (слышал так делают в ДИТе):

  • Формируется 2-3 группы: ординаторы + специалисты. Внутри каждой группы все изображения проверяются старшим.
  • Автоматически сравнивается разметка которую провели обе группы. Если разметка отличается более какого-то порога – проводится сверка результатов.
  • Сверка результатов, как я понимаю, делается группами разметки + дополнительный специалист со стороны с решающим голосом.

Как вы понимаете – это очень длинный и сложный процесс. Нам, например, для разметки 1300 изображений пришлось потратить полтора месяца.
Сколько тратят люди для разметки КТ по методу ДИТа – мне сложно представить.

Часть 3

И лишь когда части 1-2 закончены – начинается обучение. При этом прогресс обучения начинает сказываться зачастую на том как был сформулировано правило разметки в ч.1.
Мне пришлось объединять многие классы. Какие-то классы выкидывать из-за малой достоверности или из-за малого объёма базы.
По каким-то классам обучать отдельный детектор, и.т.д.
Всё упирается в маленький объём базы и в то что она очень нечёткая.
И тут начинается самое безумное…

Часть 4

Какие замечательные фотографии получились!

Но… Вы думаете они хоть что-то значат? В целом нет. Врачам нужна трактовка. Врачам нужно представить найденное в понятной форме.
Нет, конечно, есть несколько подходов:

  • Выдавать тревогу, когда врач говорит что всё ок, но программа считает что что-то не так (второе чтение). Но для этого программу надо лицензировать на огромном объёме медицинских данных. Что задача на несколько лет.
  • Помогать врачу обратить внимание на подозрительные участки (можно встраивать в аппаратуру). Но многие врачи будут принципиально против таким пользоваться (примерно как профессиональные водители не любили навигаторы на заре их появления).
  • Заполнять шаблон протокола. Это очень интересный подход. В реальности, может самый правильный. При интеграции с программами заполнения бланка исследования – система имеет право ошибаться. Но это значительно упрощает врачу набор данных, значительно ускоряет исследование. При этом у врача нет ощущение что система пытается его превзойти. В любом случае она экономит его время.
    При этом такие подходы зачастую не требуют сертификации, так как не дают сами заключения, а лишь уменьшают работу врача.
    Но создание такой программы, её сопряжение с математикой обработки – требуют наибольшей работы. Целевого обучения по правилам заполнения протоколов => привязки обучения к несколько невидимым показателям. Это решается, но этот подход занимает 90% времени задачи.
Итого

Как вы видите, обучение, даже если оно сложное – может занимать лишь 5-15% от работы по проекту. Всё остальное – организация труда специалистов, организация визуальных интерфейсов, сбор данных, и.т.д.
По нашему опыту, даже если математически задача разрешима, то чаще всего именно в оставшихся 85-95% кроется проблема. Где-то нельзя внедрить. Где-то продукт получается сильно не такой как планировалось изначально.
Проектов, где концепт выходного устройства поменялся 3 раза в ходе работы – было порядочно. Главное правильно интерпретировать – что можно обучить, что нельзя, а что обучать полезно. Это три главных столпа продукта.
Но DS инженеры часто считают что самый важный столп – это как обучать..:)
В реальности в 90% ситуаций можно воспользоваться самой простой моделькой, которая даст 95% результата. Очень советую для этого послушать рассказы Антона Слесарёва про то как в яндексе пилят беспилотные авто – https://events.yandex.ru/lib/people/613850/
Многое про что он рассказывает – знакомо до боли:)

P.S.
Компания ФтизисБиоМед, которая всю эту движуху делает – выложила в открытый доступ веб-морду алгоритма. Если у вас есть свежая флюрка – можете загрузить и посмотреть на результат. Только учтите, что алгоритм излишне насторожен. Процентов 15 здоровых может отправить на консультацию к врачу. Но я бы на вашем месте сходил:)

1 thought on “Про распознавание флюорограмм”

Leave a Reply

Your email address will not be published. Required fields are marked *