Глава 6. Работа с данными
265
тите, что передается значение
undefined
соответствующего HTMLэлементу ар
гумента, так что API создаст скрытый элемент в представлении DOM в качестве
дескриптора видео.
Листинг 6.15.
Создание простого объекта Dataset для веб-камеры с использованием объекта
конфигурации
С помощью объекта конфигурации можно также кадрировать части видеопотока
и менять размер изображения. Сочетая HTMLэлемент и объект конфигурации,
можно задавать место начала кадрирования и желаемый выходной размер. При этом
выходной тензор будет интерполироваться к желаемому размеру. В листинге 6.16
приведен пример выбора прямоугольного фрагмента квадратного видео и уменьше
ния его размера так, чтобы можно было использовать маленькую модель.
Листинг 6.16.
Кадрирование и изменение размера данных, получаемых от веб-камеры
Важно отметить несколько очевидных различий между подобной разновидно
стью набора данных и наборами данных, с которыми мы работали до сих пор. На
пример, вебкамера выдает различные значения в разные моменты времени. А набор
данных CSV выдает строки в одном порядке вне зависимости от того, насколько
быстро или медленно они извлекаются. Более того, можно получать сколько угодно
примеров данных от вебкамеры, пока пользователь их запрашивает. Вызывающая
API сторона должна явным образом завершать поток данных, когда больше данных
не требуется.
Доступ к данным от итератора вебкамеры производится с помощью метода
capture()
, возвращающего тензор, который отражает последний кадр. Пользова
тели API могут использовать этот тензор в своей работе, не забывая освобождать
выделенную под него память, во избежание утечки. Изза нюансов асинхронной
266
Часть III • Продвинутые возможности глубокого обучения с TensorFlow.js
обработки данных с вебкамеры лучше производить необходимую предварительную
обработку непосредственно захваченного кадра, а не использовать функциональ
ность отложенной обработки
map()
модуля
tf.data
.
Другими словами, вместо обработки данных с помощью
data.map()
:
// Плохо:
let webcam = await tfd.webcam(myElement)
webcam = webcam.map(myProcessingFunction);
const imgTensor = webcam.capture();
// Используем imgTensor здесь
tf.dispose(imgTensor)
лучше применить функцию непосредственно к изображению:
// Хорошо:
let webcam = await tfd.webcam(myElement);
const imgTensor = myPreprocessingFunction(webcam.capture());
// Используем imgTensor здесь
tf.dispose(imgTensor)
Не следует использовать методы
forEach()
и
toArray()
для итератора веб
камеры. Для обработки длинных последовательностей полученных с устройства
кадров пользователям API
tf.data.webcam()
лучше описать свой собственный
цикл с помощью, например, функции
tf.nextFrame()
и вызывать
capture()
с под
ходящей частотой кадров. Дело в том, что при вызове метода
forEach()
для веб
камеры фреймворк будет извлекать кадры с максимальной частотой, с какой только
движок JavaScript браузера способен запрашивать их от устройства. В результате
тензоры будут создаваться с частотой, превышающей частоту кадров устройства,
что приведет к дублированию кадров и расходу вычислительных ресурсов впустую.
По аналогичным причинам итератор вебкамеры
не
следует передавать в качестве
аргумента методу
model.fit()
.
В листинге 6.17 показана сокращенная версия цикла предсказания из приме
ра webcamtransferlearning (Пакман), который мы видели в главе 5. Учтите, что
внешний цикл выполняется до тех пор, пока
isPredicting
=
true
, что определяется
элементом UI. А внутри скорость выполнения цикла ограничивается вызовом функ
ции
tf.nextFrame()
, привязанным к частоте обновления UI. Следующий код взят
из файла
tfjs-examples/webcam-transfer-learning/index.js
.
Одно последнее примечание: при использовании вебкамеры часто имеет смысл
получать, обрабатывать изображение и освобождать выделенную под него память,
прежде чем выполнять предсказание. Вопервых, полная обработка изображения
моделью гарантирует, что соответствующие весовые коэффициенты модели уже
загружены в GPU, а значит, предотвращает возможное подтормаживание в начале
работы. Вовторых, дает аппаратному обеспечению вебкамеры время прогреться
и приступить к отправке настоящих кадров. В зависимости от аппаратного обе
спечения вебкамеры иногда отправляют пустые кадры до тех пор, пока устройство
не прогреется. См. фрагмент кода в листинге 6.18, демонстрирующий реализацию
описанной методики в примере webcamtransferlearning (из файла
webcam-transfer-
learning/index.js
).
Do'stlaringiz bilan baham: |