Руководство и введение в глубокое обучение в медицине.

Представьте себе это.

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

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

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

Что делает нейрон?

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

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

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

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

Так как же применить это к фотографиям поражений кожи? Мы используем специальный тип нейронной сети, называемый сверточной нейронной сетью.

Сверточные нейронные сети

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

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

Помимо сверточных слоев, CNN содержат еще пару слоев, а именно уровни объединения и классификации.

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

В конце все эти слои объединяются в функцию softmax (слой классификации), которая производит окончательную классификацию.

Построение классификатора

Давайте перейдем к построению модели, которую я использовал для классификации поражений кожи. Я использовал собственный Keras для создания CNN, и не волнуйтесь, если у вас нет опыта работы с машинным обучением, с помощью этого руководства вы сможете получить довольно хорошее представление о том, как это работает! Я использовал переносное обучение для создания этой модели, что означает, что я взял предварительно обученную сеть под названием MobileNet, которая обучена с помощью ImageNet, набора данных. более 14 миллионов изображений и добавил к нему еще несколько слоев, чтобы можно было классифицировать поражения кожи. Идея состоит в том, что мы берем модель, обученную на огромном количестве данных, и используем ее для новой задачи, для которой у нас не так много данных. Обычно это очень помогает повысить точность окончательной модели, а также сокращает время обучения!

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

Что делает MobileNet быстрее?

Ранее я объяснил, как сверточные слои пропускают фильтр поверх изображения. Это действительно сложно вычислить, когда изображение имеет более одного цветового канала (RGB имеет 3 канала). Здесь в игру вступает разделимая по глубине свертка. Это то, что делает MobileNet особенной, а также делает ее намного быстрее, чем некоторые другие сети.

Глубинная свертка разделяет процесс свертки на два этапа. Он передает фильтр на каждый из отдельных слоев изображения, придавая фильтру глубину 1. Если есть три слоя, красный, зеленый и синий, он будет пропускать разные фильтры через каждый из слоев. После этого он объединяет слои, применяя свертку 1x1 ко всем слоям с помощью процесса, называемого точечной сверткой. Общее количество вычислений с разделимой по глубине сверткой в 8–9 раз меньше, чем при стандартной свертке, и в результате ее можно выполнять на мобильных устройствах! Я вкратце рассмотрел это, если вы хотите лучше понять глубинные свертки, посмотрите эту статью.

HAM10000

Набор данных HAM10000 - это то место, где мы будем получать изображения, необходимые для обучения нашей модели. Это коллекция из около 10 000 изображений с пометками 7 различных типов кожных поражений.

Вот типы поражений, которые обнаруживаются в наборе данных:

  • Актинический кератоз
  • Базально-клеточная карцинома
  • Доброкачественный кератоз
  • Дерматофиброма
  • Злокачественная меланома
  • Меланоцитарные невусы
  • Сосудистые поражения

Подробнее об этом можно узнать здесь.

Теперь перейдем к коду.

Начнем с импорта всех необходимых нам библиотек. Целая куча импорта Keras необходима для создания различных частей нашей CNN. Мы также импортируем Numpy, itertools и Scikit-Learn. Мы будем изучать, для чего они нужны, по мере продвижения вперед!

Теперь давайте объявим несколько переменных, которые нам пригодятся в дальнейшем. Мы устанавливаем некоторые переменные, которые имеют расположение данных обучения и данных оценки, чтобы нам было легче работать. Количество образцов - это количество изображений в используемом наборе данных. Размер пакета - это количество изображений, которые вы обрабатываете до обновления весов сети. Размер изображения, которое мы вводим в нейронную сеть, составляет 224x224, я расскажу об этом чуть позже. Наконец, нам нужно объявить, сколько раз сети нужно выполнить прямой / обратный проход, пока она не проанализирует каждое отдельное изображение, что мы можем сделать, разделив общее количество изображений в наших данных на размер пакета, а затем округлим в большую сторону.

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

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

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

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

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

Чтобы запустить это в сети, я преобразовал модель Keras в модель TensorflowJS и смог довольно легко реализовать ее в сети, следуя этому руководству.

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

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

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

Последствия использования таких технологий огромны. Мы потенциально могли бы искоренить ошибочный диагноз в клиниках, используя технологию искусственного интеллекта, подобную этой. Чем больше данных и поддержки у нас будет для этого, тем больше он будет расти и становиться более точным. Имея всего 10 000 изображений, мы достигли точности около 85%, но представьте, насколько лучше было бы, если бы у нас были миллионы изображений. Эти модели будут обладать навыками врача, который буквально видел и извлекал уроки из миллионов изображений. Вы можете себе это представить?

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

Если вам понравилась моя статья или вы узнали что-то новое, обязательно: