Мы в ЦВТ всегда следим за актуальными трендами в развитии технологий. Смотрим, анализируем происходящее и запрыгиваем на поезд прогресса, если считаем нужным.
Так в 2010 году мы начали делать мобильные приложения. В 2011 — приложения для SMART TV. Недавно занялись VR и AR, а вот буквально только что решили подключиться к нейронным сетям.
Сама по себе технология, конечно, не нова. А уж теория и вовсе уходит корнями в 60-е годы прошлого века.
Однако, лишь недавно инструменты и вычислительные мощности достигли уровня, когда нейронные сети стало можно применять для решения самых прикладных задач.
Например, та самая пресловутая Prisma. Приложение действительно интересное и отлично демонстрирующее то, на что способны нейронные сети. Но приложение развлекательное, не решающее конкретных задач на благо общества.
А такое нам не очень интересно. Но обо всём по порядку.
Neural Networks 101
Как мы начали работать с нейросетями?
С одной стороны — очень легко. В последние годы появилось огромное количество инструментов для создания нейросетей. Огромное количество информации по ним. От препринтов на arXiv.org до статей на habrhabr.ru. Конечно, разрыв между уровнем материалов соответствующий.
С другой стороны — очень непросто. Потому что создание сетей, действительно, не требует длительной разработки или написания большого количества кода. Зато требует значительной экспертизы в математике и такой отдельной компетенции, как Data Science. То есть нужно уметь работать с большим количеством данных и вообще понимать что в этих данных искать.
Поэтому задача перед нами стояла непростая. Как быть, если нужно решать задачу, к которой непонятно как подступиться? Всё как мы любим: просто брать и делать.
Потому что, если просто берёшь и делаешь, то всё обязательно сложится. Так получилось и в этот раз. Не успели мы в феврале-марте углубиться в теорию, как в самую обычную среду я получил в Телеграме вот такое сообщение от наших друзей и коллег из компании Современные Технологии Машиностроения:
«Что может быть лучше, чтобы влиться в тему, чем хакатон?» — подумали мы. И полетели в Санкт-Петербург.
AI Hackaton в Санкт-Петебруге
AI Hackaton — это одно из крупнейших мероприятий для коммьюнити нейросетевиков в России. В этом году участвовали более 50 команд (до финиша дошли 37) и более 250 человек. Среди спонсоров — крупные российские инвест-фонды: Embria Ventures, Haxus, Flint Capital. В общем, всё серьёзно.
Сам хакатон не имеет конкретной направленности. Главное — это нейронные сети. Поэтому команды и проекты были самые разные. Вот лишь несколько примеров:
- Сервис для прогнозирования рейтингов и кассовых сборов фильмов до начала проката.
- ИИ, который умеет определять рейтинг ещё неопубликованного поста в соцсетях. (Кстати, это победители.)
- Приложение, подбирающее рецепты блюд по фотографии открытого холодильника.
- Телеграм-бот, ищущий порнозвёзд, похожих на ваших знакомых. No shit! (Приз зрительских симпатий.)
и многие-многие другие.
Но как я и говорил — нам развлечения не интересны. Поэтому мы сразу решили спасать мир, и занялись диагностикой человеческого дыхания и определением заболеваний.
Проект LungDiagnostics
Каждые 30 секунд в мире умирает один ребенок от поздней диагностики пневмонии.
Основная проблема — быстрое и плохо предсказуемое развитие вирусных инфекций, несвоевременная диагностика, недостаток ресурсов в сфере медицины.
Цель команды — создать простой и экономичный домедицинский сервис, позволяющий каждому пользователю проанализировать фонограмму дыхания и получить вероятностный ответ о наличии аномалии.
Вызов — отсутствие качественного Data Set и низкая распространенность гаджетов (качественных цифровых стетоскопов), таким образом проект должен решить вопрос сбора данных (как для обучения, так и для работы пользователей).
Вот так наша идея была оформлена перед заключительной презентацией. И проблема существует действительно серьёзная. В мире, даже в самых развитых странах, категорически не хватает врачей. Почти везде люди живут в удалённых районах, где нет возможности получить медицинскую помощь быстро, и нельзя заехать в поликлинику по дороге с работы домой.
Всё это ведёт к по-настоящему ужасной статистике детской смертности.
На самом деле этот проект уже стартовал как НИОКР в СТМ в Ижевске. Но к началу хакатона у нас не было ничего, кроме прототипа электронного стетоскопа, собранного буквально за два дня. Так что никакого читерства.
Сделать за два дня и один вечер предстояло очень много:
- Проанализировать данные. Как и написано выше, здесь заключалась главная проблема. Исходных данных для анализа было мало.
- Выбрать модель, собрать и обучить нейронную сеть.
- Подготовить демонстрационную часть. В нашем случае — простейший веб-сервис.
- Подготовиться к собственно презентации.
К счастью, команда у нас была большая, и мы быстро принялись за дело.
Disclaimer: детальное описание разработанного решения и теоретический ликбез не входит в задачу этой статьи. Поэтому я привожу только краткий отчёт о проделанной работе.
0. Задача на хакатон и команда
Перед началом хакатона мы ставили перед собой довольно простую, но довольно амбициозную задачу: по шуму лёгких определить, здоров ли человек. И если нет, то определить, чем он болен. Выдать соответствующие рекомендации.
Состав команды был такой:
- Команда «Сетевого завода» из СТМ
- Мы, ЦВТ
- Студенческий коллектив Санкт-Петербургскго университета информационных технологий, механики и оптики (ИТМО)
1. Анализ данных
На момент старта у нас был довольно скромный дата-сет: 470 записей больных людей (около 10 патологий) и 110 здоровых. Тот, кто в теме, понимает, что этого крайне мало. Для действительно хороших результатов нужны десятки тысяч.
Но получить больше в короткий срок было невозможно. Да и не нужно, ведь мы на хакатоне, и важен proof of concept.
Поэтому мы занялись аугментацией:
- Увеличили и замедлили скорость записей.
- Сдвинули шумы лёгких ближе к началу аудиофайла, ближе к концу аудиофайла.
- Комбинировали пункты 1 и 2.
В результате количество записей для анализа увеличилось до тысяч в каждой категории. Этого было достаточно.
Параллельно часть команды собирала данные прямо среди участников хакатона.
После аугментации произвели препроцессинг данных с помощью фреймворков SMOTE и Bootstrap, чтобы сбалансировать данные. И очистили данные, используя Быстрое преобразование Фурье (Fast Fourier transform, FFT).
Где-то на этом же этапе мы поняли, что решить задачу классификации патологий (иными словами, понять, чем болен человек) не получится. Поэтому сфокусировались на том, что можем: бинарно определять здоров ли исследуемый или что-то не так, и стоит обратиться к врачу.
2. Выбор модели и обучение сети
Для проверки наших гипотез был выбран один из самых простых типов сетей — нейронная сеть прямого распространения (Feedforward neural network, FNN).
Он отлично подходит для извлечения фич при помощи Мел-кепстральных коэффициентов (Mel-frequency cepstrum coefficients, MFCC).
Использовались 3 обучающих слоя. А сама структура сети была такой:
- Вход: 2400 нейронов
- Первый скрытый слой: 1000 нейронов
- Второй скрытый слой: 500 нейронов
- Третий скрытый слой: 150 нейронов
- Выход: 1 нейрон
За время хакатона были проверены следующие модели:
- Логистическая регрессия (Logistic Regression)
- Случайный лес (Random Forest)
- Многослойный перцептрон (Multilayer perceptron, MLP)
- Свёрточная нейронная сеть (Convolutional neural network, CNN)
Наилучшие результаты показали Логистическая регрессия и многослойный перцептрон. Именно на них и решили остановиться.
3. Демо-часть
В качестве демо мы реализовали простейший сервис на Python и Tornado. Настроили сервер, привязали домен и выложили на всеобщее обозрение.
Фреймворк Tornado мы видели на хакатоне в первый раз, так как компания большей частью специализируется в веб-разработке на PHP. Но разобрались очень быстро.
Вообще подавляющее большинство инструментов для создания нейросетей, например, самые популярные связки вроде Theano + Keras, Tensorflow + Keras, реализованы именно на Python. Поэтому сеть на Python идеально дружится с бэкендом на Python же.
Lungdiagnostics.ru
Посмотреть получившийся результат можно здесь: Lungdiagnostics.ru. Сервис позволяет загрузить запись своих лёгких в формате WAV. Нейронная сеть произведёт анализ данных и выдаст результат.
Стоит оговориться, что сейчас получить качественную запись шума своих лёгких затруднительно. Для этого требуется специальное устройство.
4. Презентация и результаты
Почти вся работа была закончена к середине последнего дня хакатона. Поэтому, пока половина команды колдовала над презентацией, мы с коллегами из ИТМО потратили время на обсуждение проделанной работы, подходов, и планов на будущее.
В результате наша сеть показала результат в 85% — 90% точности. Это очень хороший показатель для того объёма работы, который можно выполнить на хакатоне.
Именно это позволило нам занять на хакатоне 3 место.
В заключение
Вывод № 1
Нейронные сети — это легко и сложно одновременно.
Легко там, где создано множество инструментов для разработки. Хорошо проработана теория, она широко доступна в интернете. Большое количество задач уже решено, вплоть до написания непосредственно кода.
Сложно, потому что каждая задача по-своему уникальна. Нужно уметь работать с данными, знание матаппарата, опыт в работе с различными моделями, обучением нейронных сетей.
Вывод № 2
Участвуйте в хакатонах! Они действительно позволяют сделать очень много очень быстро, зарядиться энергией для дальнейшей работы и завести нужные знакомства.