Сверточные нейронные сети (CNN) за последние два года быстро продвинулись вперед, помогая в классификации медицинских изображений. Как мы можем, даже будучи любителями, использовать эти последние достижения и применить их к новым наборам данных? Мы собираемся пройти через этот процесс, и он на удивление более доступен, чем вы думаете.

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

О, я был так готов.

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

Начать с начала

Весь мой путь к глубокому обучению проходил через процесс Fast.ai. Это началось 2 года назад, когда я пытался подтвердить, что все ИИ и Машинное обучение, которые мы использовали в сфере безопасности, не были чрезмерно раздутыми или предвзятыми. Это было так, и мы избегали этих технологий. Самым отрезвляющим фактом было то, что для того, чтобы стать экспертом в этой области, нужно немного поэкспериментировать.

Настройка

Я использовал Fast.ai на всех этапах, и последняя версия делает это проще, чем когда-либо. Способы создания вашей учебной среды быстро распространяются. Теперь есть образы докеров, Amazon amis и сервисы (такие как Crestle), которые упрощают настройку, чем когда-либо.

Независимо от того, являетесь ли вы самым зеленым из новичков в программировании или опытным ниндзя, начните здесь на веб-сайте Fast.ai.

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

Изменения Fast.ai в версии 3

Я использовал другие версии Fast.ai и, просмотрев новейший курс, заметил, насколько проще все было в записной книжке. Документация и примеры есть везде.

Давайте погрузимся в урок1-домашние животные, и если вы настроили Fast.ai, не стесняйтесь следить за ним в своем личном экземпляре jupyter.

Я подготовился к первому уроку (обычно определяя между двумя классами - кошки и собаки - как и много раз раньше. Однако на этот раз я увидел, что мы делаем что-то гораздо более сложное, касающееся 33 пород кошек и собак, используя меньше строк кода. .

CNN заработал и изучил 7 строк кода !!

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

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

Матрица путаницы была мне даже полезнее. Это позволило мне просмотреть весь набор на предмет неправильной классификации 33 пород.

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

Не будучи владельцем домашнего животного или энтузиастом, я не смог бы выяснить эти тонкие детали тонких особенностей породы. Модель работает намного лучше, чем я мог бы сделать! Хотя я, безусловно, получаю ответы, мне также любопытно найти эту недостающую функцию или фрагмент данных для улучшения модели.

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

Поэтому мы сидим немного мудрее и увереннее в 4 фазе. Учитывая эти данные, с помощью каких решений мне следует повысить точность?

  • Больше тренировок
  • Больше изображений
  • Более мощная архитектура

Хитрый вопрос! Я собираюсь взглянуть на другой набор данных. Давайте займемся эндоскопическими изображениями человеческих внутренностей.

Получите набор данных, посмотрите много всякой ерунды

Всем, кто интересуется гастроэнтерологией, рекомендую заглянуть в The Kvasir Dataset. Хорошее описание с их сайта:

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

Существует также исследовательская статья экспертов (Погорелов и др.), Описывающая, как они решали проблему, включая их выводы.

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

Когда мы загружаем данные, первое, что мы замечаем, это то, что в этом наборе данных есть 8 классов, которые мы должны классифицировать, а не 33, как было раньше. Однако это не должно повлиять на другие наши операции.

Боковое примечание: Первоначально я потратил несколько часов на написание сценария того, как перемещать папки в папки проверки, и потратил некоторое время на настройку всего. Написание сценариев оказалось пустой тратой времени, потому что уже существует простая функция для создания набора проверки.

Урок таков: «Если что-то неприятно, скорее всего, кто-то из сообщества Fast.ai уже написал это за вас».

Погружение в записную книжку

Вы можете получить мою записную книжку Jupyter на GitHub здесь.

Создание для скорости и экспериментов

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

Это означает:

  • Используйте меньшие партии
  • Используйте меньшее количество эпох
  • Предельные преобразования

Если пробежка длится более 2 минут, придумайте, как сделать это быстрее. Как только все будет на месте, можно сойти с ума.

Обработка данных

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

Следовательно, нам нужно проделать то же самое с данными эндоскопа, и это одна строка кода.

Объяснение переменных:

  • Путь указывает на наши данные (# 1)
  • Проверка установлена ​​на 20% для правильного создания загрузчиков данных.
  • преобразования по умолчанию
  • размер изображения установлен на 224

Вот и все! Блок данных настроен и готов к следующему этапу.

Реснет

У нас есть данные, и нам нужно определиться с архитектурой. В настоящее время Resnet широко используется для классификации изображений. После него стоит номер, который соответствует количеству слоев. О Resnet существует множество лучших статей, поэтому для упрощения этой статьи:

Больше слоев = более точная (Ура!)

Больше слоев = больше вычислений и времени (Бу ..)

Таким образом, Resnet34 имеет 34 слоя качества поиска изображений.

Готовый? Я готов!

Благодаря структурированным данным, архитектуре и метрике ошибок по умолчанию у нас есть все необходимое, чтобы учащийся начал адаптироваться.

Давайте посмотрим на код:

Мы видим, что после циклов и 7 минут мы достигаем точности 87%. Неплохо. Совсем неплохо.

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

Из 8 классов 2 подхода по 2 часто путают друг с другом. В качестве исходного уровня я мог только видеть, окрашены ли они, полипы или что-то еще. Таким образом, по сравнению с моим личным базовым уровнем точности 30%, машина показывает удивительные 87%.

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

  1. Окрашенные участки путают друг с другом. Ошибки такого типа можно ожидать. Они оба голубого цвета и очень похожи друг на друга.
  2. Эзофагит трудно отличить от нормальной Z-линии. Может быть, эзофагит краснее, чем Z-линия? Я не уверен.

Тем не менее, все кажется отличным, и нам нужно активизировать нашу игру.

Больше слоев, больше изображений, больше возможностей!

Теперь, когда мы видим, как работает наша сверхбыстрая модель, давайте перейдем к электростанции.

  • Я увеличил размер набора данных с v1 до v2. В большем наборе количество доступных изображений удваивается с 4000 до 8000. (Примечание: во всех примерах в этой статье показана версия 2.)
  • Преобразуйте все, что имеет смысл. Есть много вещей, которые вы можете настроить. Вскоре мы поговорим об этом подробнее.
  • Поскольку изображения из набора данных относительно большие, я решил попробовать увеличить их. Хотя это будет медленнее, мне было любопытно, сможет ли он лучше выделить мелкие детали. Эта гипотеза все еще требует некоторого экспериментирования.
  • Все больше и больше эпох.
  • Если вы помните, Resnet50 будет иметь больше слоев (точнее), но потребует больше времени вычислений и, следовательно, будет медленнее. Поэтому мы изменим модель с Resnet34 на Resnet50.

Преобразование: максимальное использование изображения

Преобразование изображений - отличный способ повысить точность. Если мы вносим случайные изменения в изображение (вращаем, меняем цвет, переворачиваем и т. Д.), Мы можем создать впечатление, будто у нас есть больше изображений для обучения, и у нас меньше шансов переобучиться. Так же хорошо, как получить больше изображений? Нет, но это быстро и дешево.

Выбирая, какие преобразования использовать, мы хотим чего-то осмысленного. Вот несколько примеров нормального преобразования одного и того же изображения, если бы мы смотрели на породы собак. Если бы какой-либо из них по отдельности попал в набор данных, мы бы подумали, что это имеет смысл. Введя преобразования, теперь у нас есть 8 изображений вместо каждого 1.

Что, если в безумии трансформации мы зайдем слишком далеко? Мы могли бы получить изображения ниже, которые слишком резкие. Мы не хотели бы использовать многие из них, потому что они нечеткие и неправильно ориентируются в том направлении, в котором мы ожидаем поступления данных. Хотя собаку можно наклонить, она никогда не будет перевернутой.

Что касается изображений с эндоскопа, нас не особо беспокоит, что они перевернуты или перевернуты. Эндоскоп повсюду и может вращаться здесь на 360 градусов, поэтому я стал безумным с вращательными преобразованиями. Даже немного с цветом, так как освещение внутри корпуса было бы другим. Все это кажется вполне возможным.

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

Реконструкция данных и запуск

Теперь мы можем увидеть, как добавлять преобразования и как сдвигать другие переменные для данных:

Затем меняем учащегося:

Тогда мы готовы к стрельбе!

Спустя много эпох…

93% точность! Не так уж и плохо, давайте еще раз посмотрим на матрицу путаницы.

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

Может ли это работать в производстве?

Да, есть инструкции по быстрому размещению этой информации в виде веб-службы. Пока лицензия не активна, и вы не против подождать… вы можете попробовать ее в Render right here!

Заключение и дальнейшие действия:

Как видите, перенести новый курс из Fast.ai в другой набор данных несложно. Намного доступнее, чем когда-либо прежде.

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

Некоторые наблюдения по этому набору данных.

  • Я пытаюсь решить эту проблему неправильно. Я использую один классификатор, когда эти слайды имеют несколько классификаций. Я обнаружил это позже, когда читал исследовательскую работу. Не дожидайтесь конца, чтобы прочитать статьи!
  • В качестве проблемы множественной классификации я должен включить ограничивающие рамки для основных функций.
  • Для классификации может быть полезна функция, описывающая, насколько далеко эндоскоп находится в теле. Значительные ориентиры на теле помогут классифицировать изображения. Небольшая зеленая рамка в нижнем левом углу изображений представляет собой карту, описывающую, где находится эндоскоп, и может быть полезной функцией для изучения.
  • Если вы еще не видели новый курс fast.ai, взгляните, мне потребовалось больше времени, чтобы написать этот пост, чем написать код программы, это было так просто.

Ресурсы