Привет всем, коллеги!
Возможно, поклонники библиотеки Tensorflow, уже заметившие у нас в предзаказе эту книгу, также присматривались к возможностям машинного и глубокого обучения в браузере, тем более, что тему не обошел вниманием и сам Франсуа Шолле. Интересующихся приглашаем под кат, где рассказано, как при помощи библиотеки Tensorflow.js распознаются изображения.
TensorFlow.js – новая версия популярной опенсорсной библиотеки, обогащающей язык JavaScript возможностями глубокого обучения. Теперь разработчики могут определять, обучать и запускать модели при помощи высокоуровневого библиотечного API.
Благодаря предобученным моделям разработчики теперь могут с легкостью решать такие сложные задачи, как распознавание образов, генерация музыки или определение человеческих поз всего в нескольких строках JavaScript.
Tensorflow.js начиналась как фронтендовая библиотека для работы в браузере, но в этом году в нее была добавлена экспериментальная поддержка Node.js. Таким образом, TensorFlow.js можно использовать и в бэкендовых приложениях на JavaScript, что совершенно избавляет нас от необходимости прибегать к Python.
Читая об этой библиотеке, я решил испробовать ее на простой задаче…
Однако, через несколько дней долбежки я все-таки это сделал! Ура!
Прежде чем перейти к подробному разбору кода, давайте поговорим о других реализациях библиотеки TensorFlow.
TensorFlow
TensorFlow — это свободно распространяемая программная библиотека для приложений из области машинного обучения. TensorFlow можно применять для создания нейронных сетей и реализации других алгоритмов глубокого обучения.
Это библиотека, выпущенная Google в ноябре 2015, исходно была написана на Python. Для обучения и оценки создаваемых моделей в ней применяются вычисления на CPU или GPU. Изначально эта библиотека создавалась для работы на высокопроизводительных серверах с использованием ресурсозатратных GPU.
Последние обновления позволили оптимизировать эту библиотеку и использовать в средах с более ограниченными ресурсами – например, на мобильных устройствах и в веб-браузерах.
TensorFlow Lite
Tensorflow Lite, облегченная версия этой библиотеки для мобильных устройств и встраиваемых систем, была выпущена в мае 2017 года. Вместе с ней предоставляется новый набор предобученных глубоких моделей для задач, связанных с распознаванием образов; эта коллекция именуется MobileNet. Модели MobileNet были разработаны специально для эффективной работы в окружениях с ограниченным количеством ресурсов, например, на мобильных устройствах.
TensorFlow.js
Вслед за Tensorflow Lite в марте 2018 года была анонсирована TensorFlow.js. Эта версия библиотеки предназначена для работы в браузере и базируется на более раннем проекте под названием deeplearn.js. WebGL обеспечивает GPU-доступ к библиотеки. Разработчики используют API на JavaScript для обучения, загрузки и запуска моделей.
Позже TensorFlow.js была расширена для работы с Node.js, для этого применяется библиотечное дополнение
Импорт имеющихся моделей в TensorFlow.js
Готовые модели TensorFlow и Keras можно выполнять при помощи библиотеки TensorFlow.js. Перед выполнением модели необходимо перевести в новый формат при помощи этого инструмента. Предобученные и преобразованные модели для классификации изображений, определения поз и обнаружения k-ближайших соседей доступны на Github.
Использование TensorFlow.js с Node.js
Установка библиотек TensorFlow
TensorFlow.js можно установить из реестра NPM.
В обоих расширениях для Node.js используются нативные зависимости, которые будут компилироваться по запросу.
Загрузка библиотек TensorFlow
API на JavaScript для Tensorflow предоставляется из core-библиотеки. В модулях-расширениях, обеспечивающих поддержку Node.js, дополнительные API не предоставляются.
Загрузка моделей TensorFlow
В TensorFlow.js предоставляется библиотека NPM (
Модель MobileNet для классификации изображений – это глубокая нейронная сеть, обученная различать 1000 различных классов изображений.
В файле README к проекту в качестве примера приведен следующий код, используемый для загрузки модели.
Одна из первых проблем, с которыми мне довелось столкнуться – оказывается, этот код не работает с Node.js.
Изучив исходный код, видим, что библиотека mobilenet – это обертка для класса
Расширение Node.js на момент написания статьи еще не поддерживало HTTP-запросы для динамического извлечения моделей. Оставалось только вручную загружать модели в файловую систему.
Однако, вчитавшись в исходный код библиотеки, я нашел обходной путь…
Загрузка моделей из файловой системы
В случае, если класс MobileNet создается вручную, можно не вызывать метод
Круто, все работает!
Но откуда же берутся файлы моделей?
Модели MobileNet
Модели для TensorFlow.js состоят из файлов двух типов: файл конфигурации модели, хранимый в формате JSON, и веса моделей, хранимые в двоичном формате. Веса моделей зачастую фрагментируются на множество частей для оптимизации кэширования в браузерах.
Рассмотрев автоматический код загрузки для моделей MobileNet, видим, что модели, их конфигурации и весовые фрагменты извлекаются из общедоступного контейнера по следующему адресу.
Шаблонные параметры в URL описывают версии моделей, перечисленные здесь. Результирующая точность классификации также выводится на той же странице.
В исходном коде указано, что только модели версии MobileNet v1 можно загружать при помощи библиотеки
Код извлечения по HTTP загружает файл
Скачивание моделей вручную
Если нужно сохранить все файлы моделей в файловой системе, то можно поступить так: извлечь конфигурационный файл модели, разобрать синтаксис всех весовых файлов, на которые стоят ссылки в конфигурационном файле, после чего скачать каждый весовой файл вручную.
Я собирался использовать модуль MobileNet V1 с альфа-значением 1.0 и изображение размером 224 пиксела. Так я получаю следующий URL для конфигурационного файла модели.
Как только этот файл будет скачан локально, можно воспользоваться инструментом
При помощи инструмента
Команды
Классификация изображений
Этот пример кода, предоставляемый с TensorFlow.js, демонстрирует, как вернуть результат классификации изображения.
Это не работает в Node.js из-за отсутствия поддержки DOM.
Метод
Я решил не пытаться использовать внешний пакет для имитации DOM-элемента вручную, а обнаружил, что
Генерируем Tensor3D из изображения
Читая исходный код метода, применяемого для преобразования элементов DOM в классы Tensor3D, находим, что для генерации класса Tensor3D используются следующие входные параметры.
Создание входных значений для JPEG
Библиотека
В результате получим Uint8Array с четырьмя канальными значениями (
Требования ко входным значениям для моделей MobileNet
Используемая здесь модель MobileNet классифицирует изображения высотой и шириной по 224 пиксела. Входные тензоры должны содержать значения с плавающей точкой в диапазоне от -1 до 1 для каждого из трех канальных значений каждого пиксела.
Входные значения для изображений с другой размерностью перед классификацией нужно пересчитать в правильный размер. Кроме того, пиксельные значения, получаемые от JPEG-декодера, находятся в диапазоне 0 — 255, а не -1 — 1. Эти значения также необходимо преобразовать перед классификацией.
В TensorFlow.js есть библиотечные методы, упрощающие этот процесс, но, что еще лучше, есть специальная библиотека
Разработчик может передавать входные Tensor3D типа
Получение прогнозов
Модели MobileNet в Tensorflow обучаются распознаванию объектов из 1000 важнейших классов из множества данных ImageNet. На выходе модели дают вероятностные значения, характеризующие, каковы шансы найти данные объекты на классифицируе��ом изображении.
Полный список обученных классов для используемой модели находится в этом файле.
Библиотека
Пример
Итак, мы разобрались, как использовать библиотеку TensorFlow.js и модели MobileNet в Node.js, а теперь рассмотрим, как этот скрипт классифицирует изображение, заданное в качестве аргумента командной строки.
Исходный код
Сохраните этот файл скрипта и дескриптор пакета в локальных файлах.
Тестирование
Скачайте файлы модели в каталог mobilenet, следуя вышеизложенным инструкциям.
Установите зависимости проекта при помощи NPM
Скачайте образец JPEG-файла для классификации

Запустите скрипт, аргументами которого послужат файл модели и входное изображение.
Если все сработало верно, то в консоли должен появиться следующий вывод.
Изображение верно классифицировано как содержащее панду с вероятностью 99.93%!
Заключение
Библиотека TensorFlow.js открывает перед JavaScript-разработчиками возможности глубокого обучения. Использование предобученных моделей с библиотекой TensorFlow.js позволяет без труда надстраивать в JavaScript-приложениях новые возможности для решения сложных задач машинного обучения, обходясь минимальными усилиями и лаконичным кодом.
Библиотека TensorFlow.js создавалась сугубо для работы в браузере, но сейчас уже взаимодействует и с Node.js, хотя, не все инструменты и утилиты поддерживают эту новую среду исполнения. Повозившись с библиотекой несколько дней, я научился использовать ее с моделями MobileNet для визуального распознавания изображений из локального файла.
Возможно, поклонники библиотеки Tensorflow, уже заметившие у нас в предзаказе эту книгу, также присматривались к возможностям машинного и глубокого обучения в браузере, тем более, что тему не обошел вниманием и сам Франсуа Шолле. Интересующихся приглашаем под кат, где рассказано, как при помощи библиотеки Tensorflow.js распознаются изображения.
TensorFlow.js – новая версия популярной опенсорсной библиотеки, обогащающей язык JavaScript возможностями глубокого обучения. Теперь разработчики могут определять, обучать и запускать модели при помощи высокоуровневого библиотечного API.
Благодаря предобученным моделям разработчики теперь могут с легкостью решать такие сложные задачи, как распознавание образов, генерация музыки или определение человеческих поз всего в нескольких строках JavaScript.
Tensorflow.js начиналась как фронтендовая библиотека для работы в браузере, но в этом году в нее была добавлена экспериментальная поддержка Node.js. Таким образом, TensorFlow.js можно использовать и в бэкендовых приложениях на JavaScript, что совершенно избавляет нас от необходимости прибегать к Python.
Читая об этой библиотеке, я решил испробовать ее на простой задаче…
Использовать TensorFlow.js для визуального распознавания образов на изображениях при применении JavaScript из Node.jsК сожалению, документация и примеры кода в основном описывают использование этой библиотеки в браузере, Проектные утилиты, призванные упростить загрузку и использование предобученных моделей на момент написания статьи еще не поддерживали Node.js. Мне пришлось потратить немало времени, чтобы хорошенько прочитать исходники на Typescript для этой библиотеки.
Однако, через несколько дней долбежки я все-таки это сделал! Ура!
Прежде чем перейти к подробному разбору кода, давайте поговорим о других реализациях библиотеки TensorFlow.
TensorFlow
TensorFlow — это свободно распространяемая программная библиотека для приложений из области машинного обучения. TensorFlow можно применять для создания нейронных сетей и реализации других алгоритмов глубокого обучения.
Это библиотека, выпущенная Google в ноябре 2015, исходно была написана на Python. Для обучения и оценки создаваемых моделей в ней применяются вычисления на CPU или GPU. Изначально эта библиотека создавалась для работы на высокопроизводительных серверах с использованием ресурсозатратных GPU.
Последние обновления позволили оптимизировать эту библиотеку и использовать в средах с более ограниченными ресурсами – например, на мобильных устройствах и в веб-браузерах.
TensorFlow Lite
Tensorflow Lite, облегченная версия этой библиотеки для мобильных устройств и встраиваемых систем, была выпущена в мае 2017 года. Вместе с ней предоставляется новый набор предобученных глубоких моделей для задач, связанных с распознаванием образов; эта коллекция именуется MobileNet. Модели MobileNet были разработаны специально для эффективной работы в окружениях с ограниченным количеством ресурсов, например, на мобильных устройствах.
TensorFlow.js
Вслед за Tensorflow Lite в марте 2018 года была анонсирована TensorFlow.js. Эта версия библиотеки предназначена для работы в браузере и базируется на более раннем проекте под названием deeplearn.js. WebGL обеспечивает GPU-доступ к библиотеки. Разработчики используют API на JavaScript для обучения, загрузки и запуска моделей.
Позже TensorFlow.js была расширена для работы с Node.js, для этого применяется библиотечное дополнение
tfjs-node.Импорт имеющихся моделей в TensorFlow.js
Готовые модели TensorFlow и Keras можно выполнять при помощи библиотеки TensorFlow.js. Перед выполнением модели необходимо перевести в новый формат при помощи этого инструмента. Предобученные и преобразованные модели для классификации изображений, определения поз и обнаружения k-ближайших соседей доступны на Github.
Использование TensorFlow.js с Node.js
Установка библиотек TensorFlow
TensorFlow.js можно установить из реестра NPM.
@tensorflow/tfjs– библиотека Core TensorFlow.js@tensorflow/tfjs-node— расширение TensorFlow.js Node.js@tensorflow/tfjs-node-gpu– расширение TensorFlow.js Node.js с поддержкой вычислений на GPU
npm install @tensorflow/tfjs @tensorflow/tfjs-node
// или...
npm install @tensorflow/tfjs @tensorflow/tfjs-node-gpuВ обоих расширениях для Node.js используются нативные зависимости, которые будут компилироваться по запросу.
Загрузка библиотек TensorFlow
API на JavaScript для Tensorflow предоставляется из core-библиотеки. В модулях-расширениях, обеспечивающих поддержку Node.js, дополнительные API не предоставляются.
const tf = require('@tensorflow/tfjs')
// Загружаем привязку (вычисления CPU)
require('@tensorflow/tfjs-node')
// Или загружаем привязку (вычисления GPU)
require('@tensorflow/tfjs-node-gpu')Загрузка моделей TensorFlow
В TensorFlow.js предоставляется библиотека NPM (
tfjs-models), упрощающая загрузку предобученных и преобразованных моделей для классификации изображений, определения поз и обнаружения k-ближайших соседей.Модель MobileNet для классификации изображений – это глубокая нейронная сеть, обученная различать 1000 различных классов изображений.
В файле README к проекту в качестве примера приведен следующий код, используемый для загрузки модели.
import * as mobilenet from '@tensorflow-models/mobilenet';
// загрузить модель
const model = await mobilenet.load();Одна из первых проблем, с которыми мне довелось столкнуться – оказывается, этот код не работает с Node.js.
Error: browserHTTPRequest is not supported outside the web browser.Изучив исходный код, видим, что библиотека mobilenet – это обертка для класса
tf.Model. При вызове метод load() автоматически загружает нужные файлы моделей, расположенные по внешнему HTTP-адресу, и инстанцирует модель TensorFlow.Расширение Node.js на момент написания статьи еще не поддерживало HTTP-запросы для динамического извлечения моделей. Оставалось только вручную загружать модели в файловую систему.
Однако, вчитавшись в исходный код библиотеки, я нашел обходной путь…
Загрузка моделей из файловой системы
В случае, если класс MobileNet создается вручную, можно не вызывать метод
load модуля, а перезаписать автоматически генерируемую переменную path, содержащую HTTP-адрес модели, заменив этот адрес на локальный путь в файловой системе. После этого при вызове метода load в экземпляре класса будет срабатывать класса загрузчика файловой системы; в таком случае мы отказываемся от использования браузерного HTTP-загрузчика.const path = "mobilenet/model.json"
const mn = new mobilenet.MobileNet(1, 1);
mn.path = `file://${path}`
await mn.load()Круто, все работает!
Но откуда же берутся файлы моделей?
Модели MobileNet
Модели для TensorFlow.js состоят из файлов двух типов: файл конфигурации модели, хранимый в формате JSON, и веса моделей, хранимые в двоичном формате. Веса моделей зачастую фрагментируются на множество частей для оптимизации кэширования в браузерах.
Рассмотрев автоматический код загрузки для моделей MobileNet, видим, что модели, их конфигурации и весовые фрагменты извлекаются из общедоступного контейнера по следующему адресу.
https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v${version}_${alpha}_${size}/Шаблонные параметры в URL описывают версии моделей, перечисленные здесь. Результирующая точность классификации также выводится на той же странице.
В исходном коде указано, что только модели версии MobileNet v1 можно загружать при помощи библиотеки
tensorflow-models/mobilenet.Код извлечения по HTTP загружает файл
model.json из места хранения, а затем рекурсивно выбирает все фрагменты моделей с весовыми коэффициентами, на которые стоят ссылки. Это файлы в формате groupX-shard1of1.Скачивание моделей вручную
Если нужно сохранить все файлы моделей в файловой системе, то можно поступить так: извлечь конфигурационный файл модели, разобрать синтаксис всех весовых файлов, на которые стоят ссылки в конфигурационном файле, после чего скачать каждый весовой файл вручную.
Я собирался использовать модуль MobileNet V1 с альфа-значением 1.0 и изображение размером 224 пиксела. Так я получаю следующий URL для конфигурационного файла модели.
https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/model.jsonКак только этот файл будет скачан локально, можно воспользоваться инструментом
jq для синтаксического разбора имен всех весовых файлов. $ cat model.json | jq -r ".weightsManifest[].paths[0]"
group1-shard1of1
group2-shard1of1
group3-shard1of1
...При помощи инструмента
sed можно поставить перед именем каждого элемента HTTP URL, чтобы сгенерировать URL для каждого весового файла. $ cat model.json | jq -r ".weightsManifest[].paths[0]" | sed 's/^/https:\/\/storage.googleapis.com\/tfjs-models\/tfjs\/mobilenet_v1_1.0_224\//'
https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/group1-shard1of1
https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/group2-shard1of1
https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_1.0_224/group3-shard1of1
...
Команды
parallel и curl позволяют затем скачать все эти файлы в мой локальный каталог.cat model.json | jq -r ".weightsManifest[].paths[0]" | sed 's/^/https:\/\/storage.googleapis.com\/tfjs-models\/tfjs\/mobilenet_v1_1.0_224\//' | parallel curl -OКлассификация изображений
Этот пример кода, предоставляемый с TensorFlow.js, демонстрирует, как вернуть результат классификации изображения.
const img = document.getElementById('img');
// Классифицируем изображение
const predictions = await model.classify(img);Это не работает в Node.js из-за отсутствия поддержки DOM.
Метод
classify принимает разнообразные элементы DOM (canvas, video, image) и автоматически извлекает и преобразует «картиночные» байты из этих элементов в класс tf.Tensor3D, используемый в качестве ввода модели. В качестве альтернативы вхо��ную информацию tf.Tensor3D можно передавать напрямую.Я решил не пытаться использовать внешний пакет для имитации DOM-элемента вручную, а обнаружил, что
tf.Tensor3D проще собрать вручную.Генерируем Tensor3D из изображения
Читая исходный код метода, применяемого для преобразования элементов DOM в классы Tensor3D, находим, что для генерации класса Tensor3D используются следующие входные параметры.
const values = new Int32Array(image.height * image.width * numChannels);
// заполняем пикселы информацией пиксельных каналов, взятой с картинки
const outShape = [image.height, image.width, numChannels];
const input = tf.tensor3d(values, outShape, 'int32');pixels – это двухмерный массив типа (Int32Array), содержащий последовательный список канальных значений для каждого пиксела. numChannels – это количество канальных значений на пиксел.Создание входных значений для JPEG
Библиотека
jpeg-js – это JPEG-кодировщик/декодировщик для Node.js, написанный на чистом JavaScript. При помощи этой библиотеки можно извлечь RGB-значения для каждого пиксела.const pixels = jpeg.decode(buffer, true);В результате получим Uint8Array с четырьмя канальными значениями (
RGBA) на каждый пиксел (width * height). В модели MobileNet для классификации используется всего три цветовых канала (RGB), альфа-канал игнорируется. Этот код преобразует четырехканальный массив в верную трехканальную версию. const numChannels = 3;
const numPixels = image.width * image.height;
const values = new Int32Array(numPixels * numChannels);
for (let i = 0; i < numPixels; i++) {
for (let channel = 0; channel < numChannels; ++channel) {
values[i * numChannels + channel] = pixels[i * 4 + channel];
}
}Требования ко входным значениям для моделей MobileNet
Используемая здесь модель MobileNet классифицирует изображения высотой и шириной по 224 пиксела. Входные тензоры должны содержать значения с плавающей точкой в диапазоне от -1 до 1 для каждого из трех канальных значений каждого пиксела.
Входные значения для изображений с другой размерностью перед классификацией нужно пересчитать в правильный размер. Кроме того, пиксельные значения, получаемые от JPEG-декодера, находятся в диапазоне 0 — 255, а не -1 — 1. Эти значения также необходимо преобразовать перед классификацией.
В TensorFlow.js есть библиотечные методы, упрощающие этот процесс, но, что еще лучше, есть специальная библиотека
tfjs-models/mobilenet, автоматически решающая эту проблему! Разработчик может передавать входные Tensor3D типа
int32, а также различные размерности методу classify, который перед классификацией переводит входные значения в правильный формат. То есть, нам здесь ничего делать не приходится. Супер! Получение прогнозов
Модели MobileNet в Tensorflow обучаются распознаванию объектов из 1000 важнейших классов из множества данных ImageNet. На выходе модели дают вероятностные значения, характеризующие, каковы шансы найти данные объекты на классифицируе��ом изображении.
Полный список обученных классов для используемой модели находится в этом файле.
Библиотека
tfjs-models/mobilenet предлагает метод classify в классе MobileNet, возвращающий топ-X наиболее вероятных классов, исходя из того, что изображено на картинке.const predictions = await mn_model.classify(input, 10);predictions – это массив из X классов и вероятностей в следующем формате. {
className: 'panda',
probability: 0.9993536472320557
}Пример
Итак, мы разобрались, как использовать библиотеку TensorFlow.js и модели MobileNet в Node.js, а теперь рассмотрим, как этот скрипт классифицирует изображение, заданное в качестве аргумента командной строки.
Исходный код
Сохраните этот файл скрипта и дескриптор пакета в локальных файлах.
{
"name": "tf-js",
"version": "1.0.0",
"main": "script.js",
"license": "MIT",
"dependencies": {
"@tensorflow-models/mobilenet": "^0.2.2",
"@tensorflow/tfjs": "^0.12.3",
"@tensorflow/tfjs-node": "^0.1.9",
"jpeg-js": "^0.3.4"
}
}const tf = require('@tensorflow/tfjs')
const mobilenet = require('@tensorflow-models/mobilenet');
require('@tensorflow/tfjs-node')
const fs = require('fs');
const jpeg = require('jpeg-js');
const NUMBER_OF_CHANNELS = 3
const readImage = path => {
const buf = fs.readFileSync(path)
const pixels = jpeg.decode(buf, true)
return pixels
}
const imageByteArray = (image, numChannels) => {
const pixels = image.data
const numPixels = image.width * image.height;
const values = new Int32Array(numPixels * numChannels);
for (let i = 0; i < numPixels; i++) {
for (let channel = 0; channel < numChannels; ++channel) {
values[i * numChannels + channel] = pixels[i * 4 + channel];
}
}
return values
}
const imageToInput = (image, numChannels) => {
const values = imageByteArray(image, numChannels)
const outShape = [image.height, image.width, numChannels];
const input = tf.tensor3d(values, outShape, 'int32');
return input
}
const loadModel = async path => {
const mn = new mobilenet.MobileNet(1, 1);
mn.path = `file://${path}`
await mn.load()
return mn
}
const classify = async (model, path) => {
const image = readImage(path)
const input = imageToInput(image, NUMBER_OF_CHANNELS)
const mn_model = await loadModel(model)
const predictions = await mn_model.classify(input)
console.log('classification results:', predictions)
}
if (process.argv.length !== 4) throw new Error('incorrect arguments: node script.js <MODEL> <IMAGE_FILE>')
classify(process.argv[2], process.argv[3])Тестирование
Скачайте файлы модели в каталог mobilenet, следуя вышеизложенным инструкциям.
Установите зависимости проекта при помощи NPM
npm installСкачайте образец JPEG-файла для классификации
wget http://bit.ly/2JYSal9 -O panda.jpg
Запустите скрипт, аргументами которого послужат файл модели и входное изображение.
node script.js mobilenet/model.json panda.jpgЕсли все сработало верно, то в консоли должен появиться следующий вывод.
classification results: [ {
className: 'giant panda, panda, panda bear, coon bear',
probability: 0.9993536472320557
} ]Изображение верно классифицировано как содержащее панду с вероятностью 99.93%!
Заключение
Библиотека TensorFlow.js открывает перед JavaScript-разработчиками возможности глубокого обучения. Использование предобученных моделей с библиотекой TensorFlow.js позволяет без труда надстраивать в JavaScript-приложениях новые возможности для решения сложных задач машинного обучения, обходясь минимальными усилиями и лаконичным кодом.
Библиотека TensorFlow.js создавалась сугубо для работы в браузере, но сейчас уже взаимодействует и с Node.js, хотя, не все инструменты и утилиты поддерживают эту новую среду исполнения. Повозившись с библиотекой несколько дней, я научился использовать ее с моделями MobileNet для визуального распознавания изображений из локального файла.
