WebAssembly 和计算机视觉的实验

今年夏天,四位时间紧迫的工程师,没有先前的 WebAssembly 经验,开始了实验。经过六周的探索,他们创造了 WebSight:一个基于 OpenCV 的实时人脸检测演示。

通过将 OpenCV 编译为 WebAssembly,该团队能够直接在浏览器中重用经过充分测试的 C/C++ 库,并实现比类似 JavaScript 库快一个数量级的性能。

我请团队成员——Brian FeldmanDebra DoYervant BastikianMark Romano——撰写他们的经验。

注意: 以下报告由上述团队成员撰写。

WebAssembly(“wasm”)今年凭借其 MVP 版本 引起轰动,我们迫切希望参与其中,着手构建一个利用这项新技术的应用程序。

我们看到了像 WebDSP 这样的项目将自己的 C++ 视频过滤器编译为 WebAssembly,这是一个 JavaScript 在历史上因某些算法的计算需求而举步维艰的领域。这也让我们对突破 wasm 的极限产生了兴趣。我们想要使用一个现有的、专门的、经过时间考验的 C++ 库,经过深思熟虑,我们选择了 OpenCV,这是一个流行的开源计算机视觉库。

计算机视觉对 CPU 的要求很高,因此非常适合 wasm。借鉴了 UC Irvine SysArch 小组和 Github 用户 njor 所做的出色工作,我们能够更新 OpenCV 过时的 asm.js 版本,使其与现代版本的 Emscripten 兼容,在 JavaScript 可调用格式中公开 OpenCV 的大部分核心功能。

使用这些 Emscripten 版本的过程与我们的预期大相径庭。作为 Web 开发人员,我们习惯于编写代码并能够非常快速地迭代和测试。引入一个构建时间为 10-15 分钟的大型 C++ 库是一种陌生的体验,尤其是在我们的正常工作环境是 Webpack、Nodemon 和无处不在的热重载的情况下。编译完成后,我们以黑盒的方式处理 wasm 构建:模块从一个不可变的庞大对象开始,虽然我们在整个过程中对它越来越了解,但它从未变得“透明”。

用于编译 wasm 文件,然后将其整合到我们的 JavaScript 中的努力是值得的:它轻松地超越了 JavaScript,并且比 WebAssembly 的前身 asm.js 快得多。

我们通过使用人脸检测算法比较了这些格式。驱动这些算法的功能的体系结构相同,唯一的区别是每种算法的实现语言。使用 Web Workers,我们将视频流数据传递给算法,算法返回一个矩形的坐标,该矩形将框住图像中的任何面部,并计算一个 FPS 度量。虽然 FPS 的范围取决于用户的机器和所使用的浏览器(Firefox 占据主导地位!),但我们注意到 wasm 驱动的算法的 FPS 始终是 asm.js 实现的 FPS 的两倍,并且是 JS 实现的 FPS 的 20 倍,这巩固了 WebAssembly 的优势。

构建尖端技术可能很痛苦,但回报值得暂时的痛苦。能够在浏览器中使用本机、可移植的 C/C++ 代码,无需第三方插件,这是一个突破。我们的项目 WebSight 成功展示了将 OpenCV 作为 WebAssembly 模块用于人脸和眼睛检测。我们对 WebAssembly 的未来感到非常兴奋,尤其是最终添加垃圾收集,这将使在浏览器中高效运行其他高级语言变得更加容易。

您可以在 github.com/Web-Sight/WebSight 上查看演示的 GitHub 存储库。

关于 Dan Callahan

Mozilla 开发者关系工程师,前 Mozilla Persona 开发人员。

更多由 Dan Callahan 撰写的文章…


5 条评论

  1. Samat Jain

    既然我们谈论的是移植到 WebAssembly 的高性能计算库……是否有一条路线图可以包含 OpenMP(例如,emscripten 将 OpenMP 指令转换为 WebAssembly 线程逻辑)?

    2017 年 9 月 12 日 下午 8:29

  2. Ningxin Hu

    精彩展示!OpenCV 的内置 JS 和 WebAssembly 支持正在开发中:https://github.com/opencv/opencv/pull/9466

    2017 年 9 月 13 日 上午 8:02

  3. moh

    查看上个月发布的 OpenCV.js 项目,该项目使用最新的 Emscripten 并且同时针对 asm.js 和 wasm。该代码预计很快将在 Opencv.org 上上线。
    Facebook:https://#/opencvlibrary/
    LinkedIn:https://www.linkedin.com/feed/update/urn:li:activity:6303327596541280256
    Twitter:https://twitter.com/MohHghighat/status/897509410221596674

    OpenCV.js:https://huningxin.github.io/opencv_docs/tutorial_js_root.html

    特别是,查看 OpenCV.js 演示和交互式文档,它们本身使用 OpenCV.js 来帮助开发人员在 JS 中交互式地创建 CV 代码并立即查看结果,所有这些都可以在任何设备的浏览器中完成,包括智能手机。

    OpenCV.js 也可用于节点。
    NPM:https://npmjs.net.cn/package/opencv.js

    2017 年 9 月 13 日 上午 8:33

  4. voracity

    我想我会重复我对 WebAssembly 的保留意见。

    我们真的想向所有人传递这样的信息,即封闭/专有代码可以在浏览器中运行速度比标准的开放语言快 15 倍吗?

    (我一周前发表了这条评论。我假设它还没有发布,因为没有人来得及批准它。)

    2017 年 9 月 23 日 下午 7:56

    1. Dan Callahan

      抱歉延迟。

      您能详细说明您的顾虑吗?我个人已经以两种方式接受了二进制文件在 Web 上引入的现状。

      1. 我认为 WebAssembly 将 Web 提升到与本机平台相当的水平,而本机平台已经混合了专有软件和开源软件。因此,二进制文件的引入似乎不会 necessarily 挤压开源软件。

      2. 我发现大多数现代 Web 应用程序中的压缩、打包代码几乎与普通二进制文件一样不透明,所以我不知道在实践层面上是否会损失太多;事实上,Web 现在几乎已经可以看作是二进制文件了。

      2017 年 10 月 2 日 上午 11:39

本文的评论已关闭。