Статьи

Диагностика диабетической ретинопатии с глубоким обучением

В чем разница между этими двумя изображениями?

Один сверху не имеет признаков диабетической ретинопатии, в то время как другой имеет серьезные признаки этого.

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

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

Конкурс начался в феврале, и более 650 команд приняли участие в борьбе за призовой фонд в размере 100 000 долларов.
Участникам было предоставлено более 35 000 изображений сетчатки, каждая из которых имела степень тяжести. Было 5 классов серьезности, и распределение классов было довольно несбалансированным. Большинство изображений не показали никаких признаков заболевания. Только несколько процентов имели два самых суровых рейтинга.

Метрика, с которой были оценены предсказания, была квадратично-взвешенной каппой, которую мы опишем позже.

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

Также вы можете прочитать больше о конкурсе здесь .

Обзор решения

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

Наше решение состояло из нескольких этапов:

  • предварительная обработка изображений
  • обучение нескольких глубоких CNN
  • смешивание глаз
  • оптимизация счета каппа

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

предварительная обработка

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

  • Обрезать изображение до прямоугольной ограничительной рамки, содержащей все пиксели выше определенного порога
  • Масштабируйте его до 256 × 256, сохраняя соотношение сторон и отступы на черном фоне (необработанные изображения также имеют черный фон, более или менее)
  • Для каждого компонента RGB по отдельности переназначьте интенсивности цвета, чтобы CDF (накопительная функция распределения) выглядела как можно ближе к линейной (это называется «нормализацией гистограммы»)

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

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

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

В результате получился практически идеальный урожай для всех изображений, который мы использовали для наших окончательных решений. Мы также изменили целевое разрешение на 512 × 512, так как оно значительно улучшило производительность наших нейронных сетей по сравнению с меньшим разрешением 256 × 256.

Вот как выглядит предварительно обработанное изображение.


Непосредственно перед передачей изображений на следующий этап мы преобразовали изображения таким образом, чтобы среднее значение каждого канала (R, G, B) по всем изображениям составляло приблизительно 0, а стандартное отклонение — приблизительно 1.

Архитектура Convnet
Ядром нашего решения была глубокая сверточная нейронная сеть. Хотя мы начали с довольно мелких моделей — четырех сверточных слоев — мы быстро обнаружили, что добавление большего количества слоев и фильтров внутри слоев помогло. Наша лучшая модель состояла из девяти сверточных слоев.

Подробная архитектура:

| Type    | nof filters | nof units |
|---------|-------------|-----------|
| Conv    | 16          |           |
| Conv    | 16          |           |
| Pool    |             |           |
| Conv    | 32          |           |
| Conv    | 32          |           |
| Pool    |             |           |
| Conv    | 64          |           |
| Conv    | 64          |           |
| Pool    |             |           |
| Conv    | 96          |           |
| Pool    |             |           |
| Conv    | 96          |           |
| Pool    |             |           |
| Conv    | 128         |           |
| Pool    |             |           |
| Dropout |             |           |
| FC1     |             | 96        |
| FC2     |             | 5         |
| Sofmax  |             |           |

Все слои Conv имеют ядро ​​3 × 3, шаг 1 и отступ 1. Таким образом, размер (высота, ширина) вывода свертки совпадает с размером ввода. Во всех наших сверточных слоях мы следуем за сверточным слоем по уровню пакетной нормализации и активациям ReLu . Пакетная нормализация — это простой, но мощный метод для нормализации значений до активации в нейронной сети, чтобы их распределение не сильно менялось во время обучения. Часто данные стандартизируют, чтобы получить нулевое среднее и единичную дисперсию. Пакетная нормализация делает шаг вперед. Проверьте эту статью Google, чтобы узнать больше.

Наши слои Pool всегда используют максимальное объединение. Размер окна объединения составляет 3 × 3, а шаг — 2. Таким образом, высота и ширина изображения уменьшаются пополам каждым слоем объединения. В слоях FC (полностью подключенных) мы снова используем ReLu в качестве функции активации. Первый полностью связанный слой, FC1, также использует периодическую нормализацию. Для регуляризации мы использовали Dropout layer перед первым полностью связанным слоем, и регуляризация L2 применялась к некоторым параметрам. В целом сеть имеет 925 013 параметров.

Мы обучили сеть, используя стохастический градиентный спуск с логикой импульса и мультикласса в качестве функции потерь. Кроме того, скорость обучения была скорректирована вручную несколько раз во время обучения. Мы использовали нашу собственную реализацию на основе Theano и Nvidia cuDNN.

Чтобы еще больше упорядочить сеть, мы дополнили данные во время обучения, взяв случайные 448 × 448 фрагментов изображений и перевернув их по горизонтали и вертикали, независимо с вероятностью 0,5. Во время теста мы взяли несколько таких случайных посевов, сальто для каждого глаза и усреднили наши прогнозы по ним. Прогнозы также усреднялись по нескольким эпохам.

На подготовку и вычисление тестовых прогнозов ушло довольно много времени даже для одной сети. На экземпляре AWS g2.2xlarge (с использованием Nvidia GRID K520) это заняло около 48 часов.

Смешивание глаз

В какой-то момент мы поняли, что корреляция между оценками двух глаз в паре была довольно высокой. Например, процент пар глаз, для которых оценка для левого глаза такая же, как для правого, составляет 87,2%. Для 95,7% пар оценки различаются не более чем на 1, а для 99,8% — не более 2. Существует две вероятные причины такого рода корреляции.

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

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

Один простой способ — взять предсказанные распределения D_L и D_R для левого и правого глаза соответственно и создать новые распределения с использованием линейного смешивания следующим образом. Для левого глаза мы предсказываем c⋅D L + (1-c) ⋅D R , аналогично мы предсказываем c⋅D R + (1-c) ⋅D Lдля правого глаза, для некоторого c в [0, 1]. Мы попробовали c = 0,7 и несколько других значений. Даже это простое смешивание привело к значительному увеличению нашей оценки каппа. Однако, гораздо большее улучшение было получено, когда вместо специальной линейной смеси мы обучили нейронную сеть. Эта сеть принимает два распределения (т.е. 10 чисел) в качестве входов и возвращает новые «смешанные» версии первых 5 входов. Его можно обучить, используя прогнозы на наборах проверки. Что касается архитектуры, то мы решили пойти с очень сильно регуляризованным (выпадающим) с двумя внутренними слоями по 500 выпрямленных линейных узлов каждый.

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

Каппа Оптимизация

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

Это довольно сложная функция потерь для прямой оптимизации. Поэтому вместо того, чтобы пытаться это сделать, мы используем двухэтапную процедуру. Сначала мы оптимизируем наши модели для мультиклассовых логов. Это дает распределение вероятностей для каждого изображения. Затем мы выбираем метку для каждого изображения с помощью оптимизатора на основе имитации отжига. Конечно, мы не можем по-настоящему оптимизировать QWK, не зная реальных ярлыков. Вместо этого мы определяем и оптимизируем прокси-сервер для QWK следующим образом. Напомним, что QWK = 1 — TSE / ESE. Мы оцениваем как TSE, так и ESE, предполагая, что истинные метки взяты из распределения, описанного нашим прогнозом, а затем включаем эти прогнозы в формулу QWK вместо истинных значений. Обратите внимание, что как TSE, так и ESE недооценены с помощью описанной выше процедуры. Эти два эффекта в некоторой степени компенсируют друг друга,Тем не менее, наши прогнозы QWK оказались довольно значительными по сравнению с результатами в таблице лидеров.

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

Мы хотели бы поблагодарить California Healthcare Foundation за спонсорство, EyePACS за предоставление изображений и Kaggle за организацию этого конкурса. Мы многому научились и были рады принять участие в разработке инструментов, которые могут помочь диагностировать диабетическую ретинопатию. Мы с нетерпением ждем решения следующей задачи.