0

Берёшь и делаешь: нейронные сети в ЦВТ

Артур Ахметгалин
28 марта 2017 года

Мы в ЦВТ всегда следим за актуальными трендами в развитии технологий. Смотрим, анализируем происходящее и запрыгиваем на поезд прогресса, если считаем нужным.

Так в 2010 году мы начали делать мобильные приложения. В 2011 — приложения для SMART TV. Недавно занялись VR и AR, а вот буквально только что решили подключиться к нейронным сетям.

Neural Networks

Сама по себе технология, конечно, не нова. А уж теория и вовсе уходит корнями в 60-е годы прошлого века.

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

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

А такое нам не очень интересно. Но обо всём по порядку.

Neural Networks 101

Как мы начали работать с нейросетями?

С одной стороны — очень легко. В последние годы появилось огромное количество инструментов для создания нейросетей. Огромное количество информации по ним. От препринтов на arXiv.org до статей на habrhabr.ru. Конечно, разрыв между уровнем материалов соответствующий.

rest-of-the-owl

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

Поэтому задача перед нами стояла непростая. Как быть, если нужно решать задачу, к которой непонятно как подступиться? Всё как мы любим: просто брать и делать.

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

Telegram+2017-03-22+15-51-40

«Что может быть лучше, чтобы влиться в тему, чем хакатон?» — подумали мы. И полетели в Санкт-Петербург.

AI Hackaton в Санкт-Петебруге

AI Hackaton — это одно из крупнейших мероприятий для коммьюнити нейросетевиков в России. В этом году участвовали более 50 команд (до финиша дошли 37) и более 250 человек. Среди спонсоров — крупные российские инвест-фонды: Embria Ventures, Haxus, Flint Capital. В общем, всё серьёзно.

Сам хакатон не имеет конкретной направленности. Главное — это нейронные сети. Поэтому команды и проекты были самые разные. Вот лишь несколько примеров:

  • Сервис для прогнозирования рейтингов и кассовых сборов фильмов до начала проката.
  • ИИ, который умеет определять рейтинг ещё неопубликованного поста в соцсетях. (Кстати, это победители.)
  • Приложение, подбирающее рецепты блюд по фотографии открытого холодильника.
  • Телеграм-бот, ищущий порнозвёзд, похожих на ваших знакомых. No shit! (Приз зрительских симпатий.)

и многие-многие другие.

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

Проект LungDiagnostics

Каждые 30 секунд в мире умирает один ребенок от поздней диагностики пневмонии.

Основная проблема — быстрое и плохо предсказуемое развитие вирусных инфекций, несвоевременная диагностика, недостаток ресурсов в сфере медицины.

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

Вызов — отсутствие качественного Data Set и низкая распространенность гаджетов (качественных цифровых стетоскопов), таким образом проект должен решить вопрос сбора данных (как для обучения, так и для работы пользователей).

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

Всё это ведёт к по-настоящему ужасной статистике детской смертности.

На самом деле этот проект уже стартовал как НИОКР в СТМ в Ижевске. Но к началу хакатона у нас не было ничего, кроме прототипа электронного стетоскопа, собранного буквально за два дня. Так что никакого читерства.

Сделать за два дня и один вечер предстояло очень много:

  1. Проанализировать данные. Как и написано выше, здесь заключалась главная проблема. Исходных данных для анализа было мало.
  2. Выбрать модель, собрать и обучить нейронную сеть.
  3. Подготовить демонстрационную часть. В нашем случае — простейший веб-сервис.
  4. Подготовиться к собственно презентации.

К счастью, команда у нас была большая, и мы быстро принялись за дело.

hackaton-pipeline

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

0. Задача на хакатон и команда

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

Состав команды был такой:

  • Команда «Сетевого завода» из СТМ
  • Мы, ЦВТ
  • Студенческий коллектив Санкт-Петербургскго университета информационных технологий, механики и оптики (ИТМО)

1. Анализ данных

На момент старта у нас был довольно скромный дата-сет: 470 записей больных людей (около 10 патологий) и 110 здоровых. Тот, кто в теме, понимает, что этого крайне мало. Для действительно хороших результатов нужны десятки тысяч.

Но получить больше в короткий срок было невозможно. Да и не нужно, ведь мы на хакатоне, и важен proof of concept.

Поэтому мы занялись аугментацией:

  1. Увеличили и замедлили скорость записей.
  2. Сдвинули шумы лёгких ближе к началу аудиофайла, ближе к концу аудиофайла.
  3. Комбинировали пункты 1 и 2.

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

Параллельно часть команды собирала данные прямо среди участников хакатона.

trip-collecting-dataset

После аугментации произвели препроцессинг данных с помощью фреймворков SMOTE и Bootstrap, чтобы сбалансировать данные. И очистили данные, используя Быстрое преобразование Фурье (Fast Fourier transform, FFT).

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

2. Выбор модели и обучение сети

Для проверки наших гипотез был выбран один из самых простых типов сетей — нейронная сеть прямого распространения (Feedforward neural network, FNN).

FFN

Он отлично подходит для извлечения фич при помощи Мел-кепстральных коэффициентов (Mel-frequency cepstrum coefficients, MFCC).

Использовались 3 обучающих слоя. А сама структура сети была такой:

  • Вход: 2400 нейронов
  • Первый скрытый слой: 1000 нейронов
  • Второй скрытый слой: 500 нейронов
  • Третий скрытый слой: 150 нейронов
  • Выход: 1 нейрон

За время хакатона были проверены следующие модели:

  1. Логистическая регрессия (Logistic Regression)
  2. Случайный лес (Random Forest)
  3. Многослойный перцептрон (Multilayer perceptron, MLP)
  4. Свёрточная нейронная сеть (Convolutional neural network, CNN)

Наилучшие результаты показали Логистическая регрессия и многослойный перцептрон. Именно на них и решили остановиться.

3. Демо-часть

В качестве демо мы реализовали простейший сервис на Python и Tornado. Настроили сервер, привязали домен и выложили на всеобщее обозрение.

Фреймворк Tornado мы видели на хакатоне в первый раз, так как компания большей частью специализируется в веб-разработке на PHP. Но разобрались очень быстро.

Вообще подавляющее большинство инструментов для создания нейросетей, например, самые популярные связки вроде Theano + Keras, Tensorflow + Keras, реализованы именно на Python. Поэтому сеть на Python идеально дружится с бэкендом на Python же.

Lungdiagnostics.ru

Посмотреть получившийся результат можно здесь: Lungdiagnostics.ru. Сервис позволяет загрузить запись своих лёгких в формате WAV. Нейронная сеть произведёт анализ данных и выдаст результат.

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

4. Презентация и результаты

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

trip-after-work-done

В результате наша сеть показала результат в 85% — 90% точности. Это очень хороший показатель для того объёма работы, который можно выполнить на хакатоне.

Именно это позволило нам занять на хакатоне 3 место.

trip-3rd-place-fuck-yeah

В заключение

Вывод № 1

Нейронные сети — это легко и сложно одновременно.

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

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

Вывод № 2

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

Метки: , , ,

Оставить комментарий