- Оригинальный адрес:Real-time Human Pose Estimation in the Browser with TensorFlow.js
- Оригинальный автор:Dan Oved
- Перевод с:Программа перевода самородков
- Постоянная ссылка на эту статью:GitHub.com/rare earth/gold-no…
- Переводчик:NoName4Me
- Корректор:luochen1992,isiyin
диктор:Dan Oved, внештатный креативный технолог в Google Creative Lab, аспирант ITP в Нью-Йоркском университете. Монтаж и иллюстрация: креативный технологIrene Alvaradoи внештатный графический дизайнер Google Creative LabAlexis Gallo.
В сотрудничестве с Google Creative Labs я рад сообщитьTensorFlow.jsВерсияPoseNet¹выпуск,²он можетОценка позы человека в реальном времени в браузеремодель машинного обучения.кликните сюдаонлайн опыт.
PoseNet использует алгоритмы позы одного человека или нескольких людей для обнаружения людей на изображениях и видео — и все это в браузере.
Итак, что же такое оценка позы?Оценка позы относится к методам компьютерного зрения, которые обнаруживают людей на изображениях и видео, например, для определения положения локтя человека на изображении. Чтобы было ясно, эта технология не идентифицируетВОЗ- Оценка позы не включает никакой личной информации. Алгоритм просто оценивает положение ключевых суставов в теле.
Ну почему это захватывающее начало? Оценка позы имеет множество применений, отинтерактивныйустройствоОбратная связьдаватьТело,прибытьДополненная реальность,анимация,использование фитнесаи Т. Д. Мы надеемся, что эта модель вдохновит больше разработчиков и производителей попробовать распознавание позы в своих уникальных проектах. Хотя многие аналогичные системы обнаружения поз такжеоткрытый источник, но все они требуют специализированного оборудования и/или камер, а также установки системы.запустив TensorFlow.js PoseNet на,Любой, у кого есть настольный компьютер или мобильный телефон с камерой, может испытать эту технологию в браузере.. А поскольку мы открыли исходный код этой модели, разработчики JavaScript могут модифицировать и использовать эту технику, написав всего несколько строк кода. Что еще более важно, это действительно может помочь защитить конфиденциальность пользователей. Поскольку PoseNet на основе TensorFlow.js работает в браузере, данные о позах никогда не покидают компьютер пользователя.
Прежде чем мы углубимся в детали того, как использовать эту модель, комплимент всем людям, которые сделали этот проект возможным: документТочная оценка позы нескольких человек на открытом воздухеиPersonLab: Восходящие модели локального геометрического встраивания для оценки позы человека и сегментации экземпляровавторGeorge PapandreouиTyler Zhu,а такжеTensorFlow.jsИнженеры из команды Google Brain за библиотекойNikhil ThoratиDaniel Smilkov.
Начало работы с PoseNet
PoseNetможно использовать для оценкисольный жестилижест нескольких лиц, что означает, что у алгоритма есть версия, которая обнаруживает только одного человека на изображении/видео, и версия, которая обнаруживает нескольких людей. Почему две версии? Потому что обнаружение позы одного человека быстрее и проще, но требует только одного субъекта на изображении (подробнее об этом позже). Мы начнем с монолитной позы, потому что ее легче понять.
В целом можно выделить два основных этапа оценки позы:
- Введите обратную связь через сверточную нейронную сетьRGB-изображение.
- Декодирование выходных данных модели с использованием алгоритмов декодирования позы одного или нескольких человек.поза, оценка уверенности в позе,расположение ключевой точки,а такжеОценка достоверности ключевой точки.
Подождите, к чему относятся все эти ключевые слова? Давайте рассмотрим самые важные из них:
- отношение - Из верхнего уровня PoseNet вернет объект позы, содержащий список ключевых точек и оценки достоверности на уровне экземпляра для каждого обнаруженного человека.
PoseNet возвращает значение достоверности для каждого обнаруженного человека и каждой обнаруженной ключевой точки позы. Изображение предоставлено: «Microsoft Coco: общие объекты в контекстных наборах данных»,cocodataset.org.
- Оценка уверенности в позе - определяет общую достоверность оценки позы. Он находится между 0,0 и 1,0. Его можно использовать, чтобы скрыть позы с недостаточным количеством очков.
- ключевой момент- Часть предполагаемой позы человека, например, нос, правое ухо, левое колено, правая ступня и т. д. Он содержит оценки достоверности местоположения и ключевых точек. В настоящее время PoseNet обнаруживает 17 ключевых точек, как показано ниже:
PosNet обнаруживает 17 ключевых точек позы.
- Оценка достоверности ключевой точки - Определяет достоверность того, что предполагаемые местоположения ключевых точек являются точными. Он находится между 0,0 и 1,0. Его можно использовать, чтобы скрыть ключевые точки, оценки которых недостаточно высоки.
- расположение ключевой точки- 2D-координаты x и y исходного входного изображения, где были обнаружены ключевые точки.
Часть 1. Импорт библиотек TensorFlow.js и PoseNet
Большая часть работы заключается в том, чтобы абстрагироваться от сложности модели и инкапсулировать функциональность в простые в использовании методы. Давайте рассмотрим основы построения проекта PoseNet.
Библиотеку можно установить через npm:
npm install @[tensorflow-models/posenet](https://www.npmjs.com/package/@tensorflow-models/posenet)
Затем импортируйте с помощью модуля es6:
import * as posenet from '@[tensorflow-models/posenet](https://www.npmjs.com/package/@tensorflow-models/posenet)';
const net = await posenet.load();
или через пакет на странице:
<html>
<body>
<!-- Load TensorFlow.js -->
<script src="[https://unpkg.com/@tensorflow/tfjs](https://unpkg.com/@tensorflow/tfjs)"></script>
<!-- Load Posenet -->
<script src="[https://unpkg.com/@tensorflow-models/posenet](https://unpkg.com/@tensorflow-models/posenet)">
</script>
<script type="text/javascript">
posenet.load().then(function(net) {
// posenet 模块加载成功
});
</script>
</body>
</html>
Часть 2a: Оценка позы одного человека
Пример алгоритма оценки позы одного человека, используемого на изображении. Изображение предоставлено: «Microsoft Coco: общие объекты в контекстных наборах данных»,cocodataset.org.
Как упоминалось ранее, алгоритмы оценки позы одного человека проще и быстрее. Его идеальный вариант использования — это когда в центре входного изображения или видео находится только один человек. Недостатком является то, что если на изображении несколько человек, ключевые точки двух людей могут быть оценены как часть позы одного и того же человека — например, левая рука прохожего A и правое колено прохожего B могут быть оценены с помощью Алгоритм определил принадлежность к одной и той же позе и объединил. Если входное изображение может содержать несколько человек, следует использовать алгоритм оценки позы нескольких человек.
Давайте посмотрим на алгоритм оценки позы одного человека.входить:
- входной элемент изображения-- содержит элемент html для прогнозирования изображения, например тег видео или изображения. Важно, чтобы входное изображение или элемент видео быликвадратныйиз.
- Масштабный коэффициент изображения- число от 0,2 до 1. По умолчанию 0,50. Как масштабировать изображение перед тем, как передать его в нейросеть. Установите это число на низкое значение, чтобы уменьшить изображение и увеличить скорость передачи по сети за счет точности.
- горизонтальный флип-- По умолчанию ложь. Указывает, должна ли поза отражаться горизонтально/вертикально. Должно быть установлено значение true для видео, в которых видео по умолчанию перевернуто горизонтально (например, веб-камера), так как вы хотите, чтобы поза возвращалась в правильной ориентации.
- выходной шаг- должно быть 32, 16 или 8. По умолчанию 16. Внутри этот параметр влияет на высоту и ширину слоев в нейронной сети. В верхнем слое это влияет на оценку позы.точностьискорость. ценностьменьшеБолее высокая точность, но более низкая скорость, значениебольшеБыстрее, но менее точно. Лучший способ увидеть влияние шага вывода на качество вывода — испытать это на себе.Демонстрация оценки позы одного человека.
Давайте взглянем на алгоритм оценки позы одного человека.вывод:
- Поза, содержащая показатель достоверности позы и массив из 17 ключевых точек.
- Каждая ключевая точка содержит местоположение ключевой точки и показатель достоверности ключевой точки. Точно так же все местоположения ключевых точек имеют координаты x и y в координатном пространстве входного изображения и могут быть непосредственно сопоставлены с изображением.
Этот блок кода показывает, как использовать алгоритм оценки позы одного человека:
const imageScaleFactor = 0.50;
const flipHorizontal = false;
const outputStride = 16;
const imageElement = document.getElementById('cat');
// 加载 posenet 模型
const net = await posenet.load();
const pose = await net.estimateSinglePose(imageElement, scaleFactor, flipHorizontal, outputStride);
Пример выходной позы выглядит следующим образом:
{
"score": 0.32371445304906,
"keypoints": [
{ // 鼻子
"position": {
"x": 301.42237830162,
"y": 177.69162777066
},
"score": 0.99799561500549
},
{ // 左眼
"position": {
"x": 326.05302262306,
"y": 122.9596464932
},
"score": 0.99766051769257
},
{ // 右眼
"position": {
"x": 258.72196650505,
"y": 127.51624706388
},
"score": 0.99926537275314
},
...
]
}
Часть 2b: оценка позы нескольких человек
Пример алгоритма оценки позы нескольких человек, примененного к изображению. Изображение предоставлено: «Microsoft Coco: общие объекты в контекстных наборах данных»,cocodataset.org.
Алгоритмы оценки позы нескольких людей могут оценивать несколько поз/людей на изображении. Он более сложен и немного медленнее, чем алгоритм позы одного человека, но имеет то преимущество, что если на изображении присутствует несколько человек, их обнаруженные ключевые точки с меньшей вероятностью будут связаны с неправильной позой. По этой причине алгоритм может быть более желательным, даже если вариант использования заключается в обнаружении позы одного человека.
Кроме того, привлекательным свойством алгоритма является то, что на производительность не влияет количество людей на входном изображении. Время расчета одинаковое, будь то 15 человек или 5 человек.
Давайте посмотрим на еговходить:
- входной элемент изображения- то же, что и оценка позы одного человека
- Масштабный коэффициент изображения- то же, что и оценка позы одного человека
- горизонтальный флип- то же, что и оценка позы одного человека
- выходной шаг- то же, что и оценка позы одного человека
- Максимальная поза обнаружения-- целое число. По умолчанию 5, что соответствует максимальному количеству поз для обнаружения.
- порог оценки уверенности в позе- от 0,0 до 1,0. По умолчанию 0,5. На более глубоком уровне это управляет минимальной оценкой достоверности для возвращаемой позы.
- Радиус немаксимального подавления (NMS, немаксимальное подавление)-- Число в пикселях. На более глубоком уровне это контролирует минимальное расстояние между возвращаемыми позами. Это значение по умолчанию равно 20, что, вероятно, подходит в большинстве случаев. Его можно увеличивать/уменьшать, чтобы отфильтровать менее точные позы, но корректировать его можно только в том случае, если нельзя изменить показатель достоверности позы.
Лучший способ увидеть, какое влияние оказывают эти параметры, — испытать это на себе.Демонстрация многопользовательской оценки позы.
Давайте посмотрим на еговывод:
- в серии жестов
resolve
изpromise
. - Каждая поза содержит ту же информацию, что и в алгоритме оценки позы одного человека.
Этот блок кода показывает, как использовать алгоритм оценки позы нескольких человек:
const imageScaleFactor = 0.50;
const flipHorizontal = false;
const outputStride = 16;
// 最多 5 个姿态
const maxPoseDetections = 5;
// 姿态的最小置信度
const scoreThreshold = 0.5;
// 两个姿态之间的最小像素距离
const nmsRadius = 20;
const imageElement = document.getElementById('cat');
// 加载 posenet
const net = await posenet.load();
const poses = await net.estimateMultiplePoses(
imageElement, imageScaleFactor, flipHorizontal, outputStride,
maxPoseDetections, scoreThreshold, nmsRadius);
Пример выходного массива показан ниже:
// 姿态/人的数组
[
{ // pose #1
"score": 0.42985695206067,
"keypoints": [
{ // nose
"position": {
"x": 126.09371757507,
"y": 97.861720561981
},
"score": 0.99710708856583
},
...
]
},
{ // pose #2
"score": 0.13461434583673,
"keypositions": [
{ // nose
"position": {
"x": 116.58444058895,
"y": 99.772533416748
},
"score": 0.9978438615799
},
...
]
},
...
]
Если вы дочитали до этого места, то должны знать достаточно, чтобы начатьPoseNetпродемонстрировал.Это может быть хорошей точкой остановки. Если вы хотите узнать больше технических подробностей о модели и реализации, мы приглашаем вас продолжить чтение ниже.
Для любознательных: глубокое погружение в технологии
В этом разделе мы представляем более технические подробности об алгоритме оценки позы одного человека. На высоком уровне процесс выглядит так:
Конвейер детектора позы одного человека с использованием PoseNet.
Важно отметить, что исследователи обучили PoseNetResNetмодель иMobileNetМодель. Хотя модель ResNet имеет более высокую точность, ее большой размер и многоуровневые характеристики делают время загрузки страницы и время вывода менее идеальным для любого приложения реального времени. Мы используем модель MobileNet, поскольку она предназначена для мобильных устройств.
Пересмотр алгоритмов оценки позы одного человека
Обработка входных данных модели: интерпретация выходных шагов
Сначала мы покажем, как обсуждатьвыходной шагдля получения выходных данных модели PoseNet (в основном тепловых карт и векторов смещения).
Удобно, что модель PoseNet не зависит от размера изображения, что означает, что она может предсказывать положения позы в том же масштабе, что и исходное изображение, независимо от того, уменьшено ли изображение. Это означает, что PoseNet можно запустить, установив упомянутое выше во время выполнения.выходной шаг,Более высокая точность за счет производительности.
Шаг вывода определяет, насколько мы уменьшаем вывод относительно размера входного изображения. Это влияет на размер слоя и вывод модели. выходной шагбольше, чем меньше разрешение слоев и выходов в сети, тем ниже точность. В этой реализации выходной шаг может быть 8, 16 или 32. Другими словами, выходной шаг 32 будет давать самый быстрый вывод, но с наименьшей точностью, а выходной шаг 8 будет самым точным, но самым медленным. Мы рекомендуем начинать с 16 лет.
Выходной шаг определяет, насколько выходное изображение уменьшается по сравнению с входным изображением. Более высокий выходной шаг будет быстрее, но приведет к меньшей точности.
По существу, когда выходной шаг установлен на 8 или 16, количество входных данных в слое уменьшается, так что может быть создано большее выходное разрешение. затем используйтеАтральная извилиначтобы сверточные фильтры в последующих слоях имели более широкое поле зрения (тяжелая свертка не применяется, когда выходной шаг равен 32). В то время как Tensorflow поддерживает сложные свертки, TensorFlow.js этого не делает, поэтому мы добавляемPRвключить это.
Выходные данные модели: тепловая карта и вектор смещения
Когда PoseNet обрабатывает изображение, он фактически возвращает тепловую карту вместе с вектором смещения, который можно декодировать, чтобы найти на изображении области с высокой достоверностью, соответствующие ключевым точкам позы. Мы обсудим их соответствующие значения через минуту, а пока на приведенной ниже иллюстрации показана связь каждой ключевой точки позы с тензором тепловой карты и тензором вектора смещения в высокоуровневой манере.
Каждая из 17 ключевых точек позы, возвращаемых PoseNet, связана с тензором тепловой карты и тензором вектора смещения, используемым для определения точного местоположения ключевой точки.
Оба выхода представляют собой трехмерные тензоры с высотой и шириной, которые мы будем называтьразрешение. Разрешение определяется размером входного изображения и выходным шагом по следующей формуле:
Resolution = ((InputImageSize - 1) / OutputStride) + 1
// 示例:宽度为 225 像素且输出步幅为 16 的输入图像产生输出分辨率为 15
// 15 = ((225 - 1) / 16) + 1
Тепловая карта
Каждая тепловая карта имеет размерresolution x resolution x 173D-тензор, поскольку 17 — это количество ключевых точек, обнаруженных PoseNet. Например, при размере изображения 225 и выходном шаге 16 это будет 15 x 15 x 17. Каждый срез в третьем измерении (17) соответствует тепловой карте для определенной ключевой точки. Каждое местоположение на этой тепловой карте имеет показатель достоверности, который представляет собой вероятность того, что часть характерной точки этого типа находится в этом местоположении. Его можно рассматривать как исходное изображение, разложенное на сетку 15 x 15, где оценка тепловой карты обеспечивает ранг вероятности существования каждой ключевой точки в каждой сетке.
вектор смещения
Каждый вектор смещения является измерениемresolution x resolution x 34Трехмерный тензор , где 34 — количество ключевых точек * 2. При размере изображения 225 и шаге вывода 16 оно составляет 15 x 15 x 34. Поскольку тепловая карта является аппроксимацией местоположений ключевых точек, вектор смещения соответствует по положению точкам на тепловой карте и используется для обхода вектора, соответствующего точкам тепловой карты, для предсказания точного местоположения характерной точки. Первые 17 срезов вектора смещения содержат координату x вектора, а последние 17 - координату y. размер вектора смещенияиметь тот же масштаб, что и исходное изображение.
Оцените позу на выходе модели
После того, как изображение передано через модель, мы выполняем некоторые вычисления, чтобы оценить позу на выходе. Например, алгоритм оценки позы одного человека возвращает показатель достоверности позы, который содержит массив ключевых точек (индексированных по идентификатору каждой части), каждая ключевая точка имеет показатель достоверности и местоположение x,y.
Чтобы получить ключевые моменты позы:
- вызвать тепловую картуsigmoidспособ получить оценку.
scores = heatmap.sigmoid()
-
argmax2dОн заключается в том, чтобы получить индексы x и y на тепловой карте в соответствии с оценкой достоверности ключевых точек и взять наивысшую оценку каждой части, которая обычно является наиболее вероятным местом для этой части. Это создает тензор размером 17 x 2, где каждая строка представляет собой индексы y и x на тепловой карте с наивысшим баллом для каждого раздела.
heatmapPositions = scores.argmax(y, x)
- каждой частивектор смещенияПолучая x и y из смещений, соответствующих индексам x и y в тепловой карте для этого раздела. Это создает тензор 17 x 2, где каждая строка является вектором смещения для соответствующей ключевой точки. Например, для детали с индексом k, когда позиции тепловой карты равны y и x, вектор смещения равен:
offsetVector = [offsets.get(y, x, k), offsets.get(y, x, 17 + k)]
- чтобы достичьключевой момент, умножьте тепловую карту x и y каждой секции на выходной шаг и добавьте их к соответствующему вектору смещения, который имеет тот же масштаб, что и исходное изображение.
keypointPositions = heatmapPositions * outputStride + offsetVectors
- Наконец, каждыйОценка достоверности ключевой точкиэто его тепловая картаОценка достоверности местоположения. Оценка достоверности для этой позы представляет собой среднее значение оценок ключевых точек.
Оценка позы нескольких человек
Детали алгоритма оценки позы нескольких человек выходят за рамки этой статьи. Основное отличие этого алгоритма в том, что он используетжадныйПроцесс группирует характерные точки в позы, следуя векторам смещения на основе графа детали. В частности, он использует исследовательские работыPersonLab: Восходящие модели локального геометрического встраивания для оценки позы человека и сегментации экземпляровсерединабыстрое жадное декодированиеалгоритм. Для получения дополнительной информации об алгоритмах поз для нескольких человек прочитайте полный исследовательский документ или просмотритекод.
Мы надеемся, что по мере того, как все больше и больше моделей будут перенесены на TensorFlow.js, мир машинного обучения станет более доступным, популярным и интересным для новых разработчиков и производителей. PoseNet на основе TensorFlow.js — небольшая попытка добиться этого. Мы будем рады увидеть, что вы придумаете — не забудьте поделиться своими замечательными проектами, используя #tensorflowjs и #posenet!
Программа перевода самородковэто сообщество, которое переводит высококачественные технические статьи из Интернета сНаггетсДелитесь статьями на английском языке на . Охват контентаAndroid,iOS,внешний интерфейс,задняя часть,блокчейн,продукт,дизайн,искусственный интеллектЕсли вы хотите видеть более качественные переводы, пожалуйста, продолжайте обращать вниманиеПрограмма перевода самородков,официальный Вейбо,Знай колонку.