ml_med

Практика машинного обучения: как искать пневмонию с помощью iPhone?

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

Курс по Machine Learning
Идет набор в группу 3 800₽ в месяц

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

Эту истину доказал на практике ML-специалист Озгур Захин (Özgür Şahin), который собственными руками создал приложение для определения пневмонии по рентгеновским снимкам. Его программа работает на самом обычном iPhone, а все рабочие инструменты он скачал бесплатно. Хотите знать, как ему это удалось? Читайте дальше.

Использованный инструментарий

В своей работе Захин использовал Core ML, фреймворк от Apple, который был представлен на конференции для разработчиков WWDC 2017. Этот пакет позволяет интегрировать сторонние модели машинного обучения в iOS-приложения. Python-программисты могут использовать фреймворк coremltools, чтобы переносить в Core ML модели из Keras, Caffe, Scikit-learn. Если вы пока не овладели Python, к вашим услугам программа Create ML — ее также создали специалисты Apple, чтобы помочь разработчикам создавать системы машинного обучения в экосистеме Apple.

Create ML предназначена для тренировки моделей для распознания изображений, Программа использует модели, которые уже встроены в iOS 12 (так называемый метод transfer learning). Фактически это позволяет создавать новые модели, меняя лишь последний слой нейросети. В результате тренировка ML-систем проходит гораздо быстрее, а сами программы занимают гораздо меньше места. По окончании тренировки готовую модель можно простым drag-n-drop перенести в проект Xcode — программную среду для разработки приложений для Apple.

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

Курс по нейронным сетям
Идет набор в группу 4 200₽ в месяц

Руководство с картинками

Первым делом Захин озаботился наборами данных для своей модели. Он нашел на Kaggle готовую подборку рентгеновских снимков груди весом в 1 ГБ, которые поступили из медицинского центра в Гуанчжоу (Китай). Внутри изображения уже были разделены на три сета, хотя о сбалансированных исходных материалах приходилось только мечтать — на 1341 здоровых пациентов оказалось 3857 больных. 

Захин начал работу. Он создал новый проект MacOs Playground и развернул в нем билдер MLImageClassifier, импортировав фреймворк CreateMLUI. Последний штрих — вызвать метод showInLiveView, чтобы работать с билдером во встроенном редакторе.

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

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

Пора начинать обучение — жмем кнопку Train. Сначала модель добывает ключевые характеристики образцов. Захин отчитался, что тренировочный набор из 5215 изображений модель обработала за 20 минут, а оценочный сет с 15 образцами проглотила менее чем за четыре секунды. Весь процесс можно отслеживать по показателям в нижней панели.

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

В результатах теста разработчик может увидеть матрицу ошибок (confusion) и показатели точности/полноты (precision/recall). Точность в данном случае отображает, насколько успешно модель выставляет правильную оценку той или иной категории (чем меньше ложных положительных срабатываний, тем лучше). В свою очередь, показатель полноты говорит нам, хорошо ли система находит все релевантные образцы в категории (чем меньше ложно негативных срабатываний, тем лучше).

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

После первого теста модель правильно классифицировала 380 из 390 пациентов с пневмонией. Еще у 142 человек диагноз был поставлен ошибочно. Как указал Захин, это прямое следствие дисбаланса с сетах данных — поскольку «больные» снимки сильно перевешивают там «чистые», нейросеть чаще видит болезнь, в том числе и у здоровых людей.

Результаты первого теста

Лучший способ повысить точность модели — это устранить дисбаланс. Другой метод заключается в том, чтобы повысить количество прогонов. Захин воспользовался этим способом и добился точности в 97% (+5 п.п. по сравнению с первыми результатами). Количество пропущенных больных упало до трех человек, но с определением здоровых пациентов по-прежнему есть проблемы.

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

Финальные показатели натренированной модели

Код для своего проекта Захин решил взять прямо у Apple — скачал с GitHub образец, на котором разработчики показывали возможности Core ML. Он просто удалил оттуда использованную модель и вставил свою.

Как подсказал Xcode, натренированная модель весила всего 17 килобайт. Программа автоматически присвоила ей класс PneumoniaClassifier, после чего осталось вписать это название в ImageClassificationViewController.

Запускаем проект, делаем фото рентгеновского снимка на iPhone — и, как сейчас говорят, раунд.

По Интернету ходит злая шутка про современных любителей гаджетов: «В твоем смартфоне больше вычислительных мощностей,чем у всего НАСА в 1969 году. НАСА запустило человека на Луну. А ты запускаешь птиц в свиней.»

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

Текст: Помогаев Дмитрий

Поделиться:
Опубликовано в рубрике Machine LearningTagged ,

SkillFactory.Рассылка