查看原文
其他

实时监测手部运动的 JS 库,可以实现很多有趣功能

前端大全 2022-06-29

The following article is from 开源前哨 Author Elaine

【导语】:Handtrack.js是一个可以直接在浏览器中实现实时手部动作跟踪和检测的原型库,它是经过 Tensorflow 训练产生的开源模型,不需要用户自己训练。有了它,你只需要通过几行代码就能检测图片中手部的动作。

GitHub 主页

https://github.com/victordibia/handtrack.js

1、简介

Handtrack.js ,是基于 TensorFlow 对象检测 API 训练模型搭建的,能够实现通过摄像头实时监测手部运动,它的特点主要包含:

  • 它可以让开发人员使用经过训练的手部检测模型快速创建手势交互原型;
  • 它通过为用户提供有用的函数,允许用户在没有任何 ML 经验的情况下检测图像中的手,不需要自己训练模型;
  • 用户无需导出任何图或已保存的模型,可以直接在 Web 应用程序中引用handtrack.js 库,然后调用它提供的方法。

2、应用场景

如果你对基于手势的交互式体验感兴趣,Handtrack.js会很有用。用户不需要使用任何额外的传感器或硬件,就可以立即获得基于手势的交互体验。

一些相关的应用场景:

  • 将鼠标移动映射到手部移动,达到控制的目的;
  • 当手和其他物体重叠时可以表示某些有意义的交互信号(例如触碰物体或选择物体);
  • 人的手部运动可以作为某些活动识别的代理的场景(例如,自动跟踪视频或图像中下棋者的动作), 或者简单地计算图像或视频帧中有多少个人;
  • 创建演示,任何人都可以通过最少的设置轻松运行或体验这些东西。

3、使用方法

你可以直接在 script 标签中包含这个库的 URL 地址,或者使用构建工具从 npm 中导入它。

3.1 使用script标签

Handtrack.js 的最小化 js 文件目前托管在 jsdelivr 上,jsdelivr 是一个免费的开源 CDN,让你可以在 Web 应用程序中包含任何的 npm包。

<script src="https://cdn.jsdelivr.net/npm/handtrackjs/dist/handtrack.min.js"> </script>

<img id="img" src="hand.jpg"/> 
<canvas id="canvas" class="border"></canvas>

将上面的 script 标签添加到 html 页面后,就可以使用 handTrack 变量引用 handtrack.js,如下所示:

<script>
  const img = document.getElementById('img'); 
  const canvas = document.getElementById('canvas');
  const context = canvas.getContext('2d');
  
  // Load the model.
  handTrack.load().then(model => {
    model.detect(img).then(predictions => {
      console.log('Predictions: ', predictions); 
    });
  });
</script> 

上面的代码段将打印出通过 img 标签传入的图像的预测边框,如果换了视频或通过摄像头提交图像帧,那么就可以“跟踪”在每一帧中出现的手。

3.2 使用 NPM

你可以使用以下命令将 handtrack.js 作为 npm 包来安装:

npm install --save handtrackjs

然后,你就可以在web应用程序中导入和使用它的示例:

import * as handTrack from 'handtrackjs';

const img = document.getElementById('img');

// Load the model.
handTrack.load().then(model => {
  // detect objects in the image.
  console.log("model loaded")
  model.detect(img).then(predictions => {
    console.log('Predictions: ', predictions); 
  });
});

3.3 Handtrack.js 的 API

Handtrack.js 提供了2个主要的方法, load() 方法和 detect() 方法,分别用于加载手部检测模型和获取预测结果。

load() 方法:接收一个可选的模型参数,返回一个模型对象,通过该可选模型参数来允许用户控制模型的性能:

const modelParams = {
  flipHorizontaltrue,   // flip e.g for video 
  imageScaleFactor0.7,  // reduce input image size for gains in speed.
  maxNumBoxes20,        // maximum number of boxes to detect
  iouThreshold0.5,      // ioU threshold for non-max suppression
  scoreThreshold0.79,    // confidence threshold for predictions.
}

handTrack.load(modelParams).then(model => {

});

detect() 方法:接收一个输入源参数(可以是img、video或canvas对象),返回图像中手部位置的边框预测结果:

一个带有类名和置信度的边框数组。

model.detect(img).then(predictions => { 
        
});

预测结果格式如下:

[{
  bbox: [x, y, width, height],
  class"hand",
  score0.8380282521247864
}, {
  bbox: [x, y, width, height],
  class"hand",
  score0.74644153267145157
}]

Handtrack.js 还提供了其他的方法:

  • model.getFPS() : 获取FPS,即每秒检测次数;

  • model.renderPredictions(predictions, canvas, context, mediasource): 在指定的画布上绘制边框(和源图像)。其中predictionsdetect()方法的结果数组。canvas是对渲染predictionshtml canvas对象的引用,context是canvas 2D上下文对象,mediasource是对predictions中使用的输入帧(img、视频、canvas等)的引用(首先渲染它,并在其上绘制边框)。

  • model.getModelParameters(): 返回模型参数;

  • model.setModelParameters(modelParams): 更新模型参数;

  • dispose() : 删除模型实例;

  • startVideo(video) : 在给定的视频元素上启动摄像头视频流。返回一个promise,可用于验证用户是否提供了视频权限的;

  • stopVideo(video) : 停止视频流;

4、下一步

  • 计算消耗大,这主要是因为在预测边界框时需要进行神经网络操作,这是后续需要改进和优化的一个点;
  • 跨帧跟踪ID:实现在每个对象进入一帧时为其分配 ID 并持续跟踪;
  • 添加一些离散的姿势:例如,不只是手,而是检测张开的手、拳)。

5、参考资料

  • Handtrack.js库的源代码:https://github.com/victordibia/handtrack.js
  • 线上Demo:https://victordibia.github.io/handtrack.js/
  • Egohands数据集:http://vision.soic.indiana.edu/projects/egohands/



- EOF -


推荐阅读  点击标题可跳转

1、精读《12 个评估 JS 库你需要关心的事》

2、RxJS:给你如丝一般顺滑的编程体验(建议收藏)

3、2.2 万 Star!前端开发必收藏的 JS 开发资源


觉得本文对你有帮助?请分享给更多人

推荐关注「前端大全」,提升前端技能

点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存