Я помню тот день так ярко — и в то же время так смутно. Я не мог дышать. Даже незнакомцы, проходившие мимо, спрашивали, все ли со мной в порядке. Опираясь на рельсы на станции китайского метро, ​​я едва удерживал равновесие, пока в конце концов не потерял сознание.

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

В 2020 г. Всемирная организация здравоохранения сообщила, что пневмония является самой распространенной причиной смерти детей в возрасте до 5 лет, на нее приходится 18% всех детских смертей. Чтобы количественно оценить этот процент с точки зрения воздействия, это означает, что каждый год примерно 1,4 миллиона детей умирают от пневмонии. Что еще хуже, у многих врачей нет необходимых инструментов для диагностики пневмонии, а если и есть, то их диагноз просто недостаточно точен.

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

Это особенно несправедливо по отношению к развивающимся странам — для сравнения: в Бостоне с населением 680 000 человек работают 126 рентгенологов. В Кении с населением 43 миллиона человек всего 200 рентгенологов. Что-то в этом соотношении кажется немного неправильным…

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

Инструменты и технологии

  1. Google Colab.Colab – это бесплатная облачная записная книжка Jupyter, которая позволяет вводить код Python и обучать модели машинного и глубокого обучения прямо в браузере.
  2. TensorFlow.TensorFlow — это программная библиотека с открытым исходным кодом для машинного обучения. Он предустановлен в Google Colab.
  3. Keras —Keras — это библиотека нейронных сетей с открытым исходным кодом.
  4. Сверточные нейронные сети.CNN — это особый тип нейронной сети, специально предназначенный для обработки данных изображения, которые в конечном итоге представляют собой просто массивную матрицу чисел.

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

План атаки

Обычно лучше иметь какой-то план, вот наш —

  1. Сбор набора данных
  2. Импорт библиотек
  3. Разделение данных
  4. Создание нашей CNN
  5. Обучение и тестирование
  6. Предсказание

Шаг 1 — Соберите данные

Прежде чем мы начнем строить нашу сеть, нам нужно найти набор данных, на котором наша сеть сможет обучаться и тестироваться. Я нашел такой датасет на Kaggle. Он содержит 5863 рентгеновских изображения грудной клетки, которые разделены на 3 категории: обучение, тестирование и проверка. Вот пример рентгеновского сканирования грудной клетки:

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

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

Шаг 2 — Импорт библиотек

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

Шаг 3 — Разделение данных

Предварительная обработка изображений является неотъемлемой частью создания любой CNN, поэтому первым шагом является преобразование коэффициентов RGB изображений в то, с чем наш компьютер может справиться в вычислительном отношении. Разделив все коэффициенты на 255, мы существенно изменим шкалу с 0–255 на 0–1; это намного облегчает жизнь нашему компьютеру, поскольку он не только работает с данными, но и делает прогнозы в зависимости от определенного порога.

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

train.flow_from_directory делает вещи еще лучше, автоматически создавая метки на основе имени папки, в которой находится изображение. Как видите, наш компьютер нашел 4192 изображения в 2 классах в наборе поездов и 1040 изображений в 2 класса в тестовом наборе.

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

Шаг 4 — Создание нашей CNN

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

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

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

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

Так как же взвешенное ядро ​​на самом деле возвращает функцию? Он делает это, применяя веса к пикселям и, по сути, определяя их уровень важности.

Глядя на входную матрицу слева, человек может совершенно четко распознать, что все пиксели со значением 10 рядом с пикселями со значением 0 образуют вертикальную линию, но это потому, что мы можем наблюдать их все в однажды. Для нашего компьютера это было бы затратно в вычислительном отношении и неэффективно, поэтому мы применяем это взвешенное ядро ​​к нашей матрице.

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

2. Объединение основано на окончательной идее свертки и попытке сделать наши входные данные тупыми. По сути, объединение — это упрощение областей пикселей — это позволяет нам значительно уменьшить размер нашего ввода.

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

Один из способов сделать это — использовать Max-Pooling, когда выбранный пиксель имеет самое высокое значение среди всех остальных в том же регионе.

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

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

4. Последняя концепция — это Dropout, который просто случайным образом удаляет определенные выборки данных, чтобы наша сеть не стала слишком знакомой с нашим набором данных до такой степени, что она теряет точность по сравнению с общими данными. данные. Это предотвращает переоснащение.

Шаг 5 — Обучение и тестирование

Теперь, когда основная часть тяжелой работы выполнена, наша модель готова к обучению и тестированию. Как мы видим, он становится все более точным после каждой эпохи, снижаясь примерно до 96% точности как при обучении , так и при тестировании!

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

Шаг 6 — Прогнозирование

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

Светлое будущее машинного обучения

Однако подобные проекты не должны быть концептуальными. Их можно применять для спасения жизней.

В Соединенном Королевстве компания GE Healthcare недавно разработала и представила свой новый ИИ, который быстро анализирует рентгеновские снимки грудной клетки и способен определять и предупреждать рентгенологов о до 8 аномалиях, включая пневмонию, указывающую на Covid-19. 19, туберкулез, фиброз и др.

Более того, он продемонстрировал 34%-е сокращение времени считывания на случай при одновременном сохранении уровня точности на уровне 97–99%. Невероятно!

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

Спасибо, что прочитали! ❤️

Если эта статья показалась вам интересной, подпишитесь на меня в LinkedIn и Medium, чтобы узнать больше! Кроме того, не стесняйтесь писать мне и создавать чат об искусственном интеллекте, беспилотных автомобилях и обо всем, что вас интересует!