Как стать автором
Обновить
90.65
Skillfactory
Онлайн-школа IT-профессий

Делаем детектор настроения собаки с использованием Google Cloud и Raspberry Pi на основе Arm

Время на прочтение8 мин
Количество просмотров3.3K
Автор оригинала: Nicholas Larsen
В главной роли на кдпв — Боб, песель Денискина

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

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

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



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

Чтобы максимально использовать зарегистрированные сигналы, крайне важно перенести этап обработки сигналов на сами устройства конечных пользователей.

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

Начало


Для обучения мы рассмотрим Google AudioSet. Это самая большая коллекция 10-секундных аудиоклипов из видео на YouTube. Данные предоставляются в предварительно обработанном формате, совместимом с начальным комплектом YouTube-8M. Он будет использоваться для обучения модели, способной классифицировать аудиоклипы.

Обучение этой модели может занять некоторое время, поэтому мы перенесём обработку на платформу Google Cloud AI и после её завершения загрузим модель. Подготовив все компоненты, мы перенесём модель на Raspberry Pi. Мы также создадим скрипт Python, чтобы захватывать входные сигналы с подключённого микрофона и пытаться раз в секунду прогнозировать все идентифицированные звуки, издаваемые собаками.

Создание нужной модели


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

Чтобы создать модель, необходимо загрузить набор данных. Он доступен по ссылке под заголовком «Features dataset». Проще всего загрузить один архивный gzip-архив на локальный компьютер.
 
Затем распакуйте его и извлеките файлы. В этом пакете три папки: одна содержит сбалансированную обучающую выборку, другая – оценочный набор, а третья – несбалансированную обучающую выборку. Каждая папка содержит более 4000 файлов.

Файлы TFRecord содержат предварительно обработанные признаки. Имена файлов начинаются с первых двух символов идентификатора видео на YouTube. Поскольку в идентификаторах видео учитывается регистр, при извлечении файлов следует соблюдать осторожность, если в локальной файловой системе регистр не учитывается, как в ОС Windows.

Полезный совет! Для извлечения таких файлов признаков используется программа 7zip. 7zip поддерживает параметры командной строки. Это позволяет автоматически переименовывать уже существующие файлы, следя за тем, чтобы файлы переименовывались, а не перезаписывались.

Получив правильно извлечённый набор данных, клонируем репозиторий YouTube-8M Github, в котором содержится код для обучения модели. Рекомендуется клонировать его в папку, которая была создана для извлечённого набора данных.

Затем обновите файл readers.py в папке YouTube-8M для поддержки старых файлов AudioSet TFRecord. Этот процесс включает два этапа:

  • Изменить все вхождения «id» на «video_id».
  • Изменить значение параметра num_classes по умолчанию на 527. Это число соответствует количеству различных категорий в этом наборе аудиоданных.

Идентификатор необходимо изменить в пяти местах, а num_classes – в двух.

Чтобы выполнить данную программу, разверните новую виртуальную среду Python 3.6+ и установите пакет tensorflow==1.14. Сейчас также удобно задать требования  для скрипта вывода, который мы собираемся создать на следующем этапе. Хотя номера версий свои у каждого пакета, единственное жёсткое требование — использование версии tensorflow 1.14. В случае остальных пакетов можно просто установить последнюю версию.

На этом этапе вы готовы обучить модель. Сначала запустите сценарий обучения локально, чтобы проверить его. Это не займёт много времени на сбалансированной обучающей выборке. Откройте окно командной строки, перейдите к папке, созданной на первом этапе этого раздела, и введите следующую команду (обратите внимание, что всё это одна строка):

python youtube-8m/train.py \ --train_data_pattern=./audioset_v1_embeddings/bal_train/*.tfrecord \
--num_epochs=100 \
--feature_names="audio_embedding" \
--feature_sizes="128" \
--frame_features \
--batch_size=512 \
--train_dir ./trained_models/yt8m \
--model=FrameLevelLogisticModel \
--start_new_model

Также обратите внимание, что, хотя символы разрыва строк \ отлично работают в системах Linux, в Windows их придётся заменить символом ^.

Через 100 эпох это продолжается, пока не достигнет примерно шага 8500. Модель FrameLevelLogisticModel будет работать с максимальной точностью примерно 58–59 %. В нашей тестовой системе весь процесс занял чуть менее 20 минут.

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

Обучение модели в облаке


Альтернатива – обучение на полном наборе звуков с использованием несбалансированного набора данных. В этом случае на обработку потребуется гораздо больше времени, но здесь существенно могут помочь графические процессоры на платформе Google Cloud AI. Простая логистическая модель обеспечивает точность примерно 88 % на несбалансированной обучающей выборке.

Чтобы запустить этот процесс в облаке, зарегистрируйтесь и войдите в учётную запись платформы Google Cloud AI, включите выставление счетов и загрузите инструменты командной строки, которые подробнее описаны здесь.

Настроив всё, перейдите к облачной консоли, создайте новый проект и новую корзину хранения. Имя корзины хранения должно быть глобально уникальным. Проще всего, если оно включает имя учётной записи пользователя. Загрузите в эту корзину хранения папки audioset_v1_embeddings и youtube-8m целиком.

Если всё сделано правильно, мы сможем открыть оболочку Google Cloud SDK и выполнить приведенные ниже команды, чтобы начать обучение. Обязательно замените your-project-name и your-storage-bucket-name соответствующими значениями учётной записи. Это написано для систем на базе Unix. Внесите соответствующие поправки для систем Windows.

BUCKET_NAME=gs://${USER}_yt8m_train_bucket

gsutil mb -p your-project-name $BUCKET_NAME

JOB_NAME=yt8m_train_$(date +%Y%m%d_%H%M%S)

gcloud --verbosity=debug ml-engine jobs submit training $JOB_NAME 
--python-version 3.5  --package-path=youtube-8m --module-name=youtube-8m.train --staging-bucket=$BUCKET_NAME --region=us-east1 --config=youtube-8m/cloudml-gpu.yaml -- --train_data_pattern='gs://your-storage-bucket-name/audioset_v1_embeddings/unbal_train/*.tfrecord' --model=FrameLevelLogisticModel --train_dir=$BUCKET_NAME/yt8m_train_frame_level_logistic_model

Опять же, обратите внимание, что последний вызов gcloud — это одна длинная команда с параметрами конфигурации.
Выполнение займёт больше половины дня. Когда всё сказано и сделано, загрузите выходные данные модели из своей облачной корзины хранения:

$BUCKET_NAME/yt8m_train_frame_level_logistic_model

Выполнение на Raspberry Pi


Мы демонстрируем это приложение на компьютере Raspberry Pi 4 на основе Arm под управлением ОС Raspbian с установленной версией Python 3. Установите PyAudio на данном устройстве. В случае проблем этот ответ должен помочь.

Подключите USB-микрофон (с дополнительной гарнитурой для вывода звука для тестирования). В данный момент микрофон проще всего настроить как устройство по умолчанию. Перейдите на рабочий стол Raspian и нажмите значок динамика рядом с часами в правом верхнем углу, а затем выберите микрофон для использования.

Последний важный шаг – получить инструменты, которые обрабатывают необработанный звук с таким же 128-мерным уплотнением, что и AudioSet. Используемый для этого инструмент входит в репозиторий Github моделей Tensorflow, указанный ранее. Выполните на Pi в точности ту же процедуру установки и не забудьте про установку на экземпляр Python 3. Кроме того, клонируйте этот репозиторий в ту же папку, в которую были клонированы набор данных и репозиторий YouTube-8M.

Запустите скрипт vggish_smoke_test.py, чтобы убедиться, что всё установлено правильно.
 
Теперь модель, загруженную из платформы Google Cloud, скопируйте в папку со скриптом прослушивания микрофона.

Выполните этот скрипт. Он запустит прослушивание на устройстве по умолчанию и будет записывать прогнозы в консоль.
 
Если нужное устройство невозможно настроить как устройство по умолчанию, выполните команду «python model-run.py list», чтобы отобразить список всех устройств по индексу. Найдите индекс устройства, затем снова выполните команду, передав этот индекс. Например:

python model-run.py 3

Скопируйте всё содержимое этой папки в Raspberry Pi и снова выполните скрипт с кодом. Раз в секунду должны появляться прогнозы того, какой шум собака издаёт, по мнению устройства! Этап вывода можно заменить любым механизмом, наиболее подходящим для устройства и целевого пользователя.

Заключение


Сегодня мы рассмотрели одно возможное применение машинного обучения на основе звука, поддерживаемого мобильными устройствами на основе Arm. Перед выходом на рынок эту концепцию необходимо проверить более подробно, но возможность выполнения произвольной модели обнаружения звука на мобильном устройстве уже есть.
 
Данные AudioSet включают 527 меток с надёжной онтологией городских звуков. Есть также возможности улучшения обработки звука перед его передачей нашему прогнозирующему устройству, такие как применение алгоритма коктейльной вечеринки и пропускание каждого источника звука через фильтр vggish.

Запускать детектор настроения собаки на Raspberry Pi с микропроцессором Arm очень интересно. Чтобы сделать это ещё интереснее, можно с помощью инструментов из пакета TensorFlow преобразовать и дискретизировать модель, а затем запустить её на недорогом микроконтроллере Arm с низким энергопотреблением, используя пакет TensorFlow Lite для микроконтроллеров.

Звучит интересно? Поэкспериментируйте и узнайте, какую проблему можно решить с помощью этого подхода. Никогда не знаешь, насколько сильно можешь повлиять на чью-то жизнь. А чтобы узнать, на что ещё способно машинное обучение в умелых руках, приходите учиться (не забывая про промокод HABR, конечно).



image
Теги:
Хабы:
Всего голосов 10: ↑9 и ↓1+8
Комментарии3

Публикации

Информация

Сайт
www.skillfactory.ru
Дата регистрации
Дата основания
Численность
501–1 000 человек
Местоположение
Россия
Представитель
Skillfactory School