我正在开发的网站中使用卷积神经网络,但不确定如何为图像创建输入。
CNN模型在keras中训练,然后转换为张量流.js格式,并且加载没有问题。但是,当我尝试使用 tensorflow.js中的 tf.fromPixel 方法将图像用作输入时,我遇到了一个问题,指出:
"未捕获的 DOMException:无法在 上执行'texImage2D' 'WebGL2RenderingContext':图像元素包含跨源 数据,并且可能无法加载。
图像本身在本地存储并显示在网页中(整个页面目前只是在本地运行(。我将如何将图像输入tensorflow.js
CNN 模型?是否可以通过html<img/>
标签使用本地图像,或者它必须在线托管?我的猜测是fromPixels()
方法导致了 CORS 错误,但我不确定是否肯定是这种情况,无论如何都要解决它。
你是对的,因为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;
请注意,某些服务器可能不授予权限。 在此处阅读有关WebGL CORS错误的更多信息。
如果您想在不收到此错误的情况下测试代码,则可以运行本地服务器
$ python3 -m http.server [port]
并且您不会收到 CORS 错误。
我的猜测是fromPixels((方法导致了CORS错误,但我不确定是否肯定是这种情况,无论如何都可以解决它。
是的,这是正确的,所以你需要使用相对路径,不要使用file://
关于<img>
元素,如果查看.fromPixels()
的文档,您可以看到它允许多种类型的像素格式:
像素(图像数据|HTMLImageElement|HTMLCanvasElement|HTMLVideoElement(要从中构造张量的输入图像。支持的图像类型均为 4 通道。
一个是HTMLImageElement
,因此您可以简单地将<img>
元素传递给.fromPixels()
。