Обнаружение пневмонии с помощью глубокого обучения: мягкое введение в сверточные нейронные сети

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

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

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

Итак ... с чего начать?

Компьютерное зрение и сверточные нейронные сети

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

К счастью для нас, глубокое обучение не является (полностью) черным ящиком магии вуду. Мы можем использовать то, что стало основой моделей нейронных сетей в компьютерном зрении; сверточные нейронные сети или сокращенно CNN (не путать с Cable News Network). CNN очень похожи на традиционные сети с прямой связью, которые стали определять глубокое обучение, за исключением того, что они реализуют математическую операцию, известную как свертка:

Так что это значит на простом английском? Для менее технически подкованных, самое важное, что нужно помнить о CNN, это следующее:

По сравнению с традиционными нейронными сетями они намного эффективнее обрабатывают данные изображений.

Это связано с тем, что, когда мы строим нашу сеть AI, она принимает в качестве входных данных все значения пикселей для данного изображения, каждое в виде трех разных значений RGB (красный, зеленый, синий), а затем приступает к линейным операциям и активациям для каждого из них. Возьмите все эти операции, умножьте их на количество узлов и слоев в вашей сети, и да! Внезапно у вас есть сотни миллионов операций! Чтобы обработать всего одно изображение, потребуется много вычислительной мощности и времени.

Применяя свертки, мы можем быть намного эффективнее с этими операциями. Вместо того, чтобы переходить по пикселям, мы используем «фильтры» для анализа частей изображения. Это настолько мощная модель, что она может сократить количество операций с простой сети с сотен миллионов до менее чем десяти миллионов. Это производительность инженеров!

Теперь, когда мы знаем, что мы будем использовать для компьютерного зрения, приступим к делу!

Организация наших рентгеновских снимков

Благодаря Kaggle я смог получить этот набор данных для рентгеновских снимков пневмонии, которые уже были помечены! Была одна папка с названием Нормальное сканирование, а другая - Сканирование пневмонии. Так что для действительно умных людей это имеет смысл, но как мы можем заставить глупый компьютер различать эти два?

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

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

Мне очень повезло с этим конкретным набором данных. В большинстве реальных сценариев данные, которые вы собираете, никогда не идеально подходят и не организованы для ваших нужд. Этот тоже не был идеальным; изображений «пневмония» было примерно в 3 раза больше, чем «нормальных», что вызывало дисбаланс данных. Кроме того, не все изображения были отформатированы одинаково, поэтому мне пришлось равномерно сделать их все изображения RGB 224x224 пикселей.

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

Построение нашей модели

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

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

Отличная библиотека / инструмент для создания прототипов - Keras. Keras - это высокоуровневый API, который позволяет быстро создавать нейронные сети, не беспокоясь об их тонкостях. Keras использует более сложную структуру на сервере, которую вы можете определить. Для этого примера обнаружения пневмонии я использовал Keras с серверной частью Tensorflow. Вот большая часть моей модели, написанная для того, чтобы вы имели представление:

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

Обучение и тестирование сети

А теперь самое интересное, давайте обучим сеть!

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

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

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

К концу обучения у нас (надеюсь) должна быть достаточно приличная модель для тестирования. Так как же работает тестирование?

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

Точность 80%! Неплохо для нашего первого запуска!

Некоторые заключительные мысли

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

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