javascript для глубокого обучения tensorflow js

Обнаружение эмоций на лице в браузере с помощью глубокого обучения и TensorFlow.js. Часть 2

javascript для глубокого обучения tensorflow js

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

В этой статье мы используем ключевые ориентиры лица, чтобы получить больше информации о лице из изображений. Мы используем глубокое обучение на отслеженных лицах из набора данных FER+ и попытаемся точно определить эмоции человека по точкам лица в браузере с помощью TensorFlow.js.

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

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

Настройка по данным об эмоциях на лице FER2013

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

Давайте изменим окончательный код из проекта отслеживания лиц, чтобы обучить нейросетевую модель и применить её к данным о лицах. Набор данных FER2013 состоит более чем из 28 тысяч помеченных изображений лиц; он доступен на веб-сайте Kaggle. Мы загрузили эту версию, в которой набор данных уже преобразован в файлы изображений, и поместили её в папку web/fer2013. Затем мы обновили код сервера NodeJS в index.js, чтобы он возвращал список ссылок на изображения по адресу http://localhost:8080/data/. Поэтому вы можете получить полный объект JSON, если запустите сервер локально.

Чтобы упростить задачу, мы сохранили этот объект JSON в файле web/fer2013.js, чтобы вы могли использовать его напрямую, не запуская сервер локально. Вы можете включить его в другие файлы скриптов в верхней части страницы:

Далее добавим служебную функцию, чтобы задать изображение для элемента, и ещё одну, чтобы перетасовать массив данных. Так как исходные изображения имеют размер всего 48×48 пикселей, давайте для большего выходного размера зададим 500 пикселей, чтобы получить более детальное отслеживание лиц и возможность видеть результат в более крупном элементе canvas. Также обновим служебные функции для линий и многоугольников, чтобы масштабировать в соответствии с выходными данными.

Нам понадобятся некоторые глобальные переменные: для списка категорий эмоций, списка агрегированных массивов данных FER и индекса массива:

Внутри блока async мы можем подготовить и перетасовать данные FER и изменить размер элемента canvas до 500×500 пикселей:

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

1. Глубокое изучение эмоций на лице

В этом первом файле веб-страницы мы собираемся задать обучающие данные, создать нейросетевую модель, а затем обучить её и сохранить веса в файл. В код включена предварительно обученная модель (см. папку web/model), поэтому при желании можно пропустить эту часть и перейти к части 2.

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

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

Скомпилировав достаточное количество обучающих данных, мы можем передать их функции trainNet. В верхней части функции trackFace давайте закончим цикл отслеживания лиц и выйдем из него после 200 изображений и вызовем функцию обучения:

Наконец, мы пришли к той части, которую так долго ждали: давайте создадим функцию trainNet и обучим нашу модель ИИ!

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

javascript для глубокого обучения tensorflow js

На этом всё! На этой веб-странице модель ИИ будет обучена распознавать выражения лиц в различных категориях, и вы получите модель для загрузки и применения. Это мы и сделаем далее.

1. Финишная прямая

2. Обнаружение эмоций на лице

Мы почти достигли своей цели. Применение модели обнаружения эмоций проще, чем её обучение. На этой веб-странице мы собираемся загрузить обученную модель TensorFlow и протестировать её на случайных лицах из набора данных FER.

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

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

Чтобы между тестовыми изображениями можно было делать паузу в несколько секунд, давайте создадим служебную функцию wait:

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

javascript для глубокого обучения tensorflow js

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

2. Финишная прямая

Что дальше? Позволит ли это определять наши эмоции на лице?

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

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

javascript для глубокого обучения tensorflow js

Узнайте подробности, как получить Level Up по навыкам и зарплате или востребованную профессию с нуля, пройдя онлайн-курсы SkillFactory со скидкой 40% и промокодом HABR, который даст еще +10% скидки на обучение.

Источник

Представляем TensorFlow.js: Машинное обучение в Javascript

Браузерный Machine Learning

javascript для глубокого обучения tensorflow js

Превратите вашу веб-камеру в контроллер для PAC-MAN с помощью нейронной сети.

javascript для глубокого обучения tensorflow jsEmoji Scavenger Hunt является еще одним веселым примером приложения, построенного с использованием TensorFlow.js. Попробуйте на своем телефоне. Источник ищите здесь.

Запуск ML в браузере означает, что с точки зрения пользователя нет необходимости устанавливать какие-либо библиотеки или драйверы. Просто откройте веб-страницу, и ваша программа готова к запуску. Кроме того, она готова к работе с ускорением GPU. TensorFlow.js автоматически поддерживает WebGL и ускорит ваш код сразу, как появится графический процессор. Пользователи также могут открывать вашу веб-страницу с мобильного устройства, и в этом случае ваша модель может использовать данные датчиков, например, с гироскопа или акселерометра. Важно еще и то, что все данные остаются у клиента, что делает TensorFlow.js полезным для low-latency вывода, а также для приложений, сохраняющих конфиденциальность.

Что вы можете сделать с TensorFlow.js?

Если вы работаете с TensorFlow.js, ниже представлены три рабочих процесса, которые вы можете рассмотреть.

Посмотрим на код

Если хотите, можете обратиться прямо к примерам или учебным пособиям для того, чтобы начать. Они показывают, как экспортировать модель, определенную в Python, для вывода в браузере, а также как полностью определять и обучать модели в Javascript. В качестве быстрого предварительного просмотра приведен фрагмент кода, который определяет нейронную сеть для классификации цветов, как в руководстве по началу работы на TensorFlow.org. Здесь мы определим модель, используя стек слоев.

Используемый здесь API-интерфейс слоев поддерживает все слои Keras, находящиеся в каталоге примеров (включая Dense, CNN, LSTM и т.д.). Затем мы можем обучить нашу модель, используя тот же Keras-совместимый API с вызовом метода:

Теперь модель готова к использованию для прогнозирования:

TensorFlow.js также включает низкоуровневый API (ранее deeplearn.js) и поддержку Eager execution. Вы можете узнать больше об этом, посмотрев доклад на саммите разработчиков TensorFlow.

javascript для глубокого обучения tensorflow jsОбзор API TensorFlow.js. TensorFlow.js работает на основе WebGL и предоставляет высокоуровневый API для определения моделей и низкоуровневый API для линейной алгебры и автоматического дифференцирования. Tensor Flow.js поддерживает импорт моделей TensorFlow SavedModels и Keras.

Как TensorFlow.js связан с deeplearn.js?

Хороший вопрос! TensorFlow.js, экосистема инструментов JavaScript для машинного обучения, является преемником deeplearn.js, который теперь называется TensorFlow.js Core. TensorFlow.js также включает в себя Layers API, которые являются библиотекой более высокого уровня для построения моделей машинного обучения с использованием Core, также как инструменты для автоматического переноса моделей TensorFlow SavedModels и Keras hdf5.

Где можно узнать больше?

Чтобы узнать больше о TensorFlow.js, посетите домашнюю страницу проекта, ознакомьтесь с руководством и рассмотрите примеры. Вы также можете посмотреть выступление на саммите разработчиков TensorFlow в 2018 году и следить за TensorFlow в Twitter.

Источник

Машинное обучение для фронтенд разработчиков с Tensorflow.js

javascript для глубокого обучения tensorflow js

javascript для глубокого обучения tensorflow js

Краткое резюме: Использование JavaScript и таких фреймворков, как Tensorflow.js, — отличный способ начать работу и узнать больше о машинном обучении. В этой статье Charlie Gerard раскрывает три основных способа использования машинного обучения во фронтенде с помощью Tensorflow.js и проливает свет на их границы.

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

Что такое машинное обучение?

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

Определение

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

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

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

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

Основные концепции

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

Модель

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

Метки и свойства

Метки и свойства относятся к данным, которые вы предоставляете алгоритму в процессе обучения.

Метка — ваша классификация записи в наборе данных. Например, если набор данных представляет собой CSV-файл, описывающий животных, то метками могут быть «кошка», «собака» или, например, «змея».

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

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

Нейронные сети

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

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

Теперь, когда мы определились со значением нескольких наиболее распространенных в машинном обучении терминов, давайте поговорим о том, что можно сделать с помощью JavaScript и инфраструктуры Tensorflow.js.

Способы использования

В настоящее время доступно три способа использования:

Давайте начнем с самого простого.

Предварительно обученная модель

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

Например, мы создаем веб-сайт для определения, изображен ли на картинке кот. Популярная модель классификации изображений называется MobileNet и доступна в виде предварительно обученной модели с Tensorflow.js.

Код для сайта будет выглядеть следующим образом:

Мы начинаем с импорта Tensorflow.js и модели MobileNet в теге head нашего HTML:

Затем внутри тега body у нас есть элемент изображения, который будет использоваться для прогнозов:

Вот и все! Так вы можете использовать предварительно обученную модель в браузере с Tensorflow.js!

Примечание. Если вы хотите узнать, что еще может классифицировать модель MobileNet, вы можете найти список различных классов на Github.

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

Если вы предпочитаете использовать Tensorflow.js в качестве npm-модуля, вы можете импортировать модуль следующим образом:

Не стесняйтесь «поиграть» с этим примером на CodeSandbox.

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

Трансферное обучение

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

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

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

javascript для глубокого обучения tensorflow js

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

Нам все еще нужно начать с импорта Tensorflow.js и MobileNet, но на этот раз нам также нужно добавить классификатор KNN (k-ближайших соседей):

Причина, по которой нам нужен классификатор, заключается в том, что (вместо того, чтобы использовать только модуль MobileNet) мы добавляем пользовательские образцы, которые модель никогда не встречала. Классификатор KNN позволит нам соединить все вместе и выполнить прогнозы для объединенных данных.

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

Теперь перейдем к файлу JavaScript, в котором мы начнем работу, установив несколько важных переменных:

Размер изображения, установленный на 227, представляет собой размер элемента видео в пикселях. На основе примеров Tensorflow.js это значение должно быть установлено равным 227, чтобы соответствовать формату данных, с которыми была обучена модель MobileNet. Чтобы иметь возможность классифицировать новые данные, они должны соответствовать тому же формату.

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

Затем мы устанавливаем значение K равным 10. Значение K в алгоритме KNN важно, потому что оно представляет количество экземпляров, которые мы учитываем при определении класса нашего ввода.

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

Наконец, мы получаем элемент видео. Давайте начнем с загрузки модели и классификатора:

Затем получим доступ к видео-каналу:

После этого давайте настроим некоторые события кнопок для записи образцов данных:

Давайте напишем функцию, которая будет брать образцы изображений с веб-камеры, форматировать и комбинировать их с модулем MobileNet:

И, наконец, собрав несколько изображений с веб-камеры, мы можем проверить прогнозы с помощью следующего кода:

Вы можете избавится от данных веб-камеры, поскольку они нам больше не нужны:

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

Создание, запуск и использование собственной модели

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

Мы создадим нейронную сеть, классифицирующую ирисы по трем категориям (видам): Setosa, Virginica и Versicolor на основе набора данных с открытым исходным кодом.

Прежде чем мы начнем, вот ссылка на демоверсию и вот CodeSandbox, если вы хотите ознакомиться с полным кодом.

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

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

Примечание. Чтобы упростить задачу, я уже разделила тренировочный и тестовый наборы на два файла JSON, которые можно найти в CodeSanbox.

Тренировочный набор содержит 130 элементов, а тестовый — 14. Если вы загляните в данные, вы увидите что-то вроде этого:

Мы видим четыре различных свойства: длины и ширины чашелистика и лепестка, а также метка вида.

Чтобы иметь возможность использовать эти данные с Tensorflow.js, нам нужно преобразовать их в понятный для него формат. Для тренировочных данных это будет [130, 4] (130 выборок с четырьмя свойствами).

Далее также необходимо сформировать выходные данные:

Затем, раз данные готовы, мы можем перейти к созданию модели:

В приведенном выше примере кода мы создаем экземпляр последовательной модели, добавляем слои ввода и вывода.

Раз модель готова, мы можем обучить ее данным:

Если все отработает хорошо, вы можете заменить тестовые данные пользовательскими.

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

На этом простая нейронная сеть на Tensorflow.js готова!

Мы поговорили только о небольшом наборе данных ирисов, но если вы хотите перейти к более крупным наборам данных или работать с изображениями, шаги останутся теми же:

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

Примечание. Дополнительную информацию о том, как сохранить модель, можно найти на этом ресурсе.

Ограничения

Вот и все! Мы только что обсудили три основных способа использования Tensorflow.js!

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

Производительность

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

Качество входных данных

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

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

Ответственность

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

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

Заключение

Использование JavaScript и таких фреймворков, как Tensorflow.js, — отличный способ начать работу и узнать больше о машинном обучении. Несмотря на то, что конечное приложение, вероятно, должно быть построено на языке, подобном Python, JavaScript делает машинное обучение действительно доступным для разработчиков, чтобы «поиграть» с различными функциями и лучше понять фундаментальные концепции, прежде чем тратить время на изучение другого языка.

В этой статье мы рассмотрели только то, что было возможно с помощью Tensorflow.js, однако экосистема других библиотек и инструментов растет. Также доступны более узконаправленные фреймворки, позволяющие изучать использование машинного обучения в других доменах, таких как музыка, с помощью Magenta.js, или прогнозировать навигацию пользователей по сайту с помощью guess.js!

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

Дополнительная информация

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *