В прошлом месяце RSNA (Радиологическое общество Северной Америки) запустило на Kaggle проект с метко названным RSNA Pneumonia Detection Challenge. Как следует из названия, цель задачи заключалась в разработке алгоритмов, которые помогли бы обнаруживать случаи пневмонии на рентгенографических изображениях (также известных как рентгеновские снимки) грудной клетки пациента. Определенно достойный вызов для любого специалиста по данным или инженера по машинному обучению!

Я и команда ОЧЕНЬ квалифицированных специалистов (привет Мэтью Т., Джейку Х., Себастьяну Н., Кэссиди Д. и нашему советнику Райану Х.) отправились в благородное путешествие, чтобы изменить мир медицины… или по крайней мере, понять, что, черт возьми, мы вообще делали. Эта статья будет разбита на разделы, описывающие соответствующие концепции и проблемы, связанные с конкуренцией и нашими усилиями:

  1. Пневомния: к чему все такое раздражение?
  2. Конкурс Kaggle
  3. Исследования и эксперименты
  4. Прорыв
  5. Заключение

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

1. Пневмония: к чему все такое раздражение?

Помимо плохих слов, пневмония - серьезная проблема со здоровьем. Симптомы воспалительного заболевания могут быть довольно серьезными, наиболее частым из них является утечка жидкости в воздушные мешочки в легких, что не очень хорошо, если вы, знаете, любите дышать. Если вы рыба, то это не проблема. К сожалению, ни один из ананасов не живет под водой, так что это довольно важный медицинский вопрос. Только в 2015 году, по данным RSNA, от болезни умерло 920 тысяч детей. Для контекста, CDC сообщил о примерно 640 000 и 600 000 смертей от сердечных заболеваний и рака соответственно.

Как в это вписывается RSNA? Пневмония обычно диагностируется с помощью рентгенограммы грудной клетки (также известной как рентген грудной клетки или CXR, как их называет RSNA). Заболевание проявляется на этих снимках в виде помутнений. Для медицинских работников это сложная задача, поскольку на рентгеновских снимках появляется ряд затемненных участков: кровеносные сосуды, кости, внутреннее кровотечение, не связанное с пневмонией, имплантаты и т. Д. RSNA, будучи сообществом медиков и радиологов, очень заинтересованы в возможности более точного определения пневмонии. В рамках конкурса Kaggle они предоставили участникам более 54 000 изображений, которые уже были просмотрены. Есть надежда, что ML сможет обнаруживать паттерны, символизирующие помутнения, характерные для пневмонии. Поскольку на момент публикации этой статьи конкурс еще продолжается, я умоляю всех, кто интересуется медицинской визуализацией, принять участие в конкурсе!

2. Конкурс Kaggle

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

‘Это соревнование оценивается по средней средней точности на различных пересечениях по порогам объединения (IoU). IoU набора прогнозируемых ограничивающих прямоугольников и ограничивающих прямоугольников наземной истины рассчитывается как:

Сначала это звучит немного сбивающе с толку, но это не так уж и важно. Пересечение над объединением описывает перекрытие двух ограничивающих рамок (вы уже догадались, что эта проблема требует использования компьютерного зрения и, следовательно, некоторой версии сверточной нейронной сети). Если вы посмотрите на формулу выше, пересечение по объединению, IoU (A, B), равно площади перекрытия обоих ограничивающих прямоугольников (исходная истинность и прогноз), деленная на площадь объединенных блоков (в случае, если рисунок ниже не поясняет это, мы вычисляем не площадь обоих блоков, а, скорее, многоугольник, который является периметром соединенных блоков. Другой способ думать из этого площадь объединения равна: (область прогноза) + (область достоверности - область перекрытия)).

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

3. Исследования и эксперименты

Данные. Строитель империй и что-то такое, что, если вы работаете в Facebook, слишком часто доставляет вам неприятности. В контексте нашей задачи было предоставлено 54 000 изображений для обучения и проверки наших решений. Будучи изображениями, мы создали CNN для выявления случаев пневмонии. На канале CrashCourse на Youtube есть отличное введение в Computer Vision, поэтому, если вы не знакомы с его работой, я рекомендую вам посмотреть это видео, чтобы быстрее освоиться.

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

from keras import models
from keras import layers
model = models.Sequential()
model.add(layers.Dense(32, input_shape=(784,)))
model.add(layers.Dense(32))

Все, на чем нам действительно нужно сосредоточиться, это на двух нижних строчках: они составляют основу сети. Это примеры Denselayers. Грубо говоря, Denselayers полностью подключены к каждому нейрону в слое перед ним, если таковой имеется. Это также означает, что ИНС, состоящая только из плотных слоев, имеет больший вес. По причинам, объяснение которых я передам на аутсорсинг, сверточные слои обычно имеют меньший вес. В общем, CNN состоят в основном из сверточных и объединяющих слоев и ограничены меньшим количеством плотных слоев:

model = Sequential() 
model.add(Conv2D(32, activation ='relu',input_shape=input_shape)) model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2))) model.add(Conv2D(64, activation='relu')) model.add(MaxPooling2D(pool_size=(2, 2))) 
model.add(Flatten()) 
model.add(Dense(1000, activation='relu')) model.add(Dense(num_classes, activation='softmax'))

Мы используем CNN в качестве инструмента компьютерного зрения, потому что они хорошо умеют находить локальные шаблоны (те, которые состоят из некоторого подмножества пикселей в обучающем изображении) в изображениях, и могут обобщать, чтобы искать их в других образцах. Если бы наша сеть была исключительно плотной (на данном этапе я отказался от встроенных), они бы изучали глобальные шаблоны (те, которые затрагивают каждый пиксель изображения) и должны были бы изучать новые глобальные шаблоны для каждого изображения, с которым они сталкиваются, по сути, устраняя его способность обобщать уникальные закономерности. Вот отличная визуализация, предоставленная Франсуа Шоле, автором библиотеки Кераса:

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

  1. Помогите быстрее начать лечение до того, как проявятся более серьезные симптомы
  2. Узнайте все помутнения, которые не являются пневмонией

Последняя часть - непредвиденная выгода от разработки такой сети. По сути, если вы не диагностируете пневмонию из-за помутнения, вы получаете диагноз «что-то еще» бесплатно. Что это за что-то, мы точно не знаем, но если у вас есть, например, два врача, обсуждающие, является ли помутнение в грудной полости внутренним кровотечением или пневмонией (при условии, что они знают, что это должно быть одно из двух), уверенность в том, что это не пневмония, дает вам немедленный диагноз и ясный путь к выздоровлению пациента.

Просмотр самих данных имеет решающее значение для понимания проблемы. Вот ссылка на записную книжку EDA, которую создал товарищ по команде Мэтью Томас. Он информативен и имеет очень красивую графику. И да, Нет-Моня !!! это название нашей команды, да, мы зарегистрировали его как товарный знак. Некоторые интересные выводы из данных:

Глядя на данные, мы можем сделать ряд наблюдений. Примерно 23% наших тренировочных данных положительны для пневмонии. Если вы женщина, у вас больше шансов заболеть пневмонией. Кроме того, пневмония не ограничивается только телом легких. Внутренняя жидкость может попасть в соседние пространства, от кровеносных сосудов до кишечника и полостей между органами. Вот несколько примеров ограничивающих прямоугольников, нарисованных сетью:

Если вы хотите начать самостоятельно, другой товарищ по команде Себастьян Норена сделал отличный средний пост, подробно объясняя, как вы можете это сделать, а также объясняя шаги, предпринятые для перехода к нашей текущей сборке.

Что касается реализации конкретного решения CNN, у нас было несколько вариантов:

  1. Стандартный CNN
  2. R-CNN
  3. Быстрый R-CNN и более быстрый R-CNN
  4. YOLO (Вы смотрите только один раз, это девиз nnn… .euron YOLO, и мы тренируем его каждый день, каждый день, каждый день)

R-CNN отличается от Standard тем, что решает одну из проблем, представленных моим традиционным CNN. Стандартные CNN заинтересованы в заданном количестве вхождений членов соответствующих классов. Он определяет, является ли объект, на котором он фокусируется, членом определенного класса. Он не ищет все вхождения каких-либо классов. Региональные CNN, или R-CNN, как мы их называем, разбивают изображения на 2000 регионов и ищут в каждой вхождения членов класса. Если мы предоставим стандартную CNN ее собственным устройствам, вычислительная нагрузка, которую она вызовет, может сильно варьироваться, и на ее выполнение могут потребоваться дни, часы или дни. Затем R-CNN объединяют эти регионы вместе, чтобы предсказать появление членов класса. Fast и Faster R-CNN - это варианты R-CNN. Поскольку нас они не интересуют, я предоставлю вам возможность прочитать эту статью, если хотите. Это объясняет все варианты CNN, которые я изложил выше. После тщательного тестирования этих методов членами команды Джейк Ханикатт оказался нашим относительным спасителем благодаря реализации сети YOLO. Здесь я должен сказать, что не совсем понимаю, как реализовать YOLO, и не понимаю полностью его архитектуру. По этой причине я даю ссылку на средний пост Джейка, в котором гораздо более подробно рассказывается, как он это реализовал. Но, поскольку это очень важная концепция для данной статьи, я перефразирую объяснение, данное Манишем Чаблани.

YOLO работает, беря изображение и разбивая его на сетку SxS, внутри каждой сетки мы берем M ограничивающих прямоугольников. Для каждого ограничивающего прямоугольника сеть выводит вероятность класса и значения смещения для ограничивающего прямоугольника. Выбираются ограничивающие прямоугольники, имеющие вероятность класса выше порогового значения, и используются для определения местоположения объекта на изображении.

YOLO намного быстрее (45 кадров в секунду), чем другие алгоритмы обнаружения объектов. Ограничение алгоритма YOLO заключается в том, что он борется с небольшими объектами на изображении, например, у него могут быть трудности с обнаружением стаи птиц. Это связано с пространственными ограничениями алгоритма.

Выводы

Выходит 30 октября!