【问题标题】:How to use image as input in tensorflow.js?如何在 tensorflow.js 中使用图像作为输入?
【发布时间】:2018-06-22 17:28:39
【问题描述】:

我正在开发的网站中使用卷积神经网络,但不确定如何为图像创建输入。

CNN 模型在 keras 中进行了训练,然后转换为 tensorflow.js 格式,并且可以正常加载。但是,当我尝试使用 tensorflow.js 中的 tf.fromPixels 方法将图像用作输入时,我遇到了以下问题:

"未捕获的 DOMException: 无法执行 'texImage2D' 'WebGL2RenderingContext':图像元素包含跨域 数据,可能无法加载。”

图像本身存储在本地并显示在网页中(整个页面目前只是在本地运行)。我将如何将图像输入tensorflow.js CNN 模型?无论如何通过 html <img/> 标签使用本地图像还是必须在线托管?我的猜测是 fromPixels() 方法会导致 CORS 错误,但我不确定是否确实如此,以及无论如何。

【问题讨论】:

    标签: javascript python tensorflow keras tensorflow.js


    【解决方案1】:

    你说得对,CORS 错误来自 WebGL 的 fromPixels() 方法。

    有两种方法可以绕过它。

    首先, 您可以使用类似的功能向服务器请求许可

    function requestCORSIfNotSameOrigin(img, url) {
      if ((new URL(url)).origin !== window.location.origin) {
        img.crossOrigin = ""; //this requests permission from the server
      }
    }
    

    并像这样使用它:

    ...
    requestCORSIfNotSameOrigin(img, url);
    img.src = url;
    

    请注意,某些服务器可能不会授予权限。 Read more about WebGL CORS error here.

    如果您想在不出现此错误的情况下测试您的代码,您可以运行本地服务器

    $ python3 -m http.server [port]
    

    而且您不会收到 CORS 错误。

    【讨论】:

      【解决方案2】:

      我的猜测是 fromPixels() 方法会导致 CORS 错误,但我不确定是否确实如此,以及是否围绕它。

      是的,没错,所以你需要使用相对路径,不要使用file://

      关于<img> 元素,如果查看documentation of .fromPixels(),您会发现它允许多种类型的像素格式:

      pixels (ImageData|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement) 构造张量的输入图像。支持的图像类型均为 4 通道。

      一个是HTMLImageElement,因此您可以简单地将<img>-元素传递给.fromPixels()

      【讨论】:

      • 即使这样做,我仍然会看到同样的错误。我传入了一个与图像 ID 对应的 document.getElementById,但显示了相同的 CORS 错误。
      • 您使用的是相对路径还是file://
      • 我使用的是相对路径。这会导致问题吗?
      • CORS 错误通常仅来自跨域访问,例如 yoururl.com -> anotherurl.com 或 localhost -> file:// 或 file:// -> anotherurl.com。
      • file:// 到 file:// 始终是跨域的
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-25
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-18
      相关资源
      最近更新 更多