- html - 我的下拉菜单的内容关闭得太快
- c# - 使用 Html Agility Pack 从网页中的表中获取值而不使用 "SelectNode'
- html - 内容容器下的 CSS 下拉菜单
- html - 如何停止嵌套列表重叠父列表?
我创建了一个模型,该模型将 Mobilenet V2 应用于 Google colab 中的卷积基础层。然后我使用这个命令转换它:
path_to_h5 = working_dir + '/Tensorflow_PY_Model/SavedModel.h5'
path_tfjs = working_dir + '/TensorflowJS'
!tensorflowjs_converter --input_format keras \
{path_to_h5} \
{path_tfjs}
我使用了一张图片来测试它在两者上的分类。在 python 中,我使用下面的代码进行预测:
from google.colab import files
from io import BytesIO
from PIL import Image
import matplotlib.pyplot as plt
uploaded = files.upload()
last_uploaded = list(uploaded.keys())[-1]
im = Image.open(BytesIO(uploaded[last_uploaded]))
im = im.resize(size=(224,224))
img = np.array(im)
img = img / 255.0
prediction1 = model.predict(img[None,:,:])
print(prediction1)
上面的代码返回这个数组:
[6.1504150e-05 4.8508531e-11 5.1813848e-15 2.1887154e-12 9.9993849e-01
8.4171114e-13 1.4638757e-08 3.4268971e-14 7.5719299e-15 1.0649443e-16]]
之后,我尝试使用以下代码在 Javascript 中进行预测:
async function predict(image) {
var model = await tf.loadLayersModel('./TFJs/model.json');
let predictions = model.predict(preprocessImage(image)).dataSync();
console.log(predictions);
return results;
}
function preprocessImage(image) {
let tensor = tf.browser.fromPixels(image);
const resizedImage = tensor.resizeNearestNeighbor([224,224]);
const batchedImage = resizedImage.expandDims(0);
return batchedImage.toFloat().div(tf.scalar(255)).sub(tf.scalar(1));
}
document.querySelector('input[type="file"]').addEventListener("change", async function () {
if (this.files && this.files[0]) {
img = document.getElementById("uploaded-img");
img.onload = () => {
URL.revokeObjectURL(img.src); // no longer needed, free memory
};
img.src = URL.createObjectURL(this.files[0]);
predictionResult = await predict(model, img);
displayResult(predictionResult);
}
});
但是,使用与我在 Python 上进行预测时使用的相同图像,它会返回此结果,并且无论我更改图像,它都永远不会改变。
Float32Array(10) [0.9489052295684814, 0.0036257198080420494, 0.000009185552698909305,
0.000029705168344662525, 0.04141413792967796, 1.4301890782775217e-9, 0.006003820803016424,
2.8357267645162665e-9, 0.000011812648153863847, 4.0659190858605143e-7]
那么如何解决这个问题呢?我还应该做什么?提前感谢您的回答和建议!
最佳答案
调试了一些可能的原因后,我意识到问题出在这段代码中:
document.querySelector('input[type="file"]').addEventListener("change", async function () {
if (this.files && this.files[0]) {
img = document.getElementById("uploaded-img");
img.onload = () => {
URL.revokeObjectURL(img.src); // no longer needed, free memory
};
img.src = URL.createObjectURL(this.files[0]);
predictionResult = await predict(model, img);
displayResult(predictionResult);
}
});
首先,我想让它自动化,这样它就会立即显示选取的图像并在管道中进行预测。但这是不可能的,因为 img
的 src
属性仍然是整个 block 执行之前的值。
在我的例子中,它执行了整个 block 直到预测和结果然后上传的和错误的预测一起出现。因此,我最终做出了更改,例如添加另一个仅用于预测的按钮,并从该 block 中取出预测线并将它们放入另一个函数中。最终效果很好。
document.querySelector('input[type="file"]').addEventListener("change", async function () {
if (this.files && this.files[0]) {
img = document.getElementById("uploaded-img");
img.onload = () => {
URL.revokeObjectURL(img.src); // no longer needed, free memory
};
img.src = URL.createObjectURL(this.files[0]);
}
});
document.querySelector('#predict-btn').addEventListener("click", async function () {
img = document.getElementById("uploaded-img");
predictionResult = await predict(model, img);
displayResult(predictionResult);
});
好吧,我仍然很好奇是否可以将这些功能放入管道过程中,这样就只有一个上传按钮,其余工作由系统完成。
关于tensorflow - 我转换后的 tensorflow 迁移学习模型总是在 Tensorflow JS 中返回相同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68574893/
我不明白 int 63823 为何比 double 1.0 占用更少的空间。在这个特定实例中,int 中是否没有存储更多信息? 最佳答案 I don't understand how an int 6
这可能不是一个直接的代码问题,但它是一个经常出现在 SO 上的问题,我发现阅读它非常有用。 App Store - Help answering “Missing Compliance” (using
我在我们的应用程序中使用 syncfusion 寻呼机和下拉列表请打开以下链接。 https://stackblitz.com/edit/angular-nv6myv?file=src%2Fapp%2
以便解释指针和引用in this question我写了这段代码。 MyClass& MyClass::MyInstance() { static MyClass & myLoca
在 C 和 C++ 中,assert 是一个非常 重量级例程,将错误写入 stdout 并终止程序。在我们的应用程序中,我们实现了一个更强大的 assert 替代品,并为其提供了自己的宏。已尽一切努力
我已经创建了一个 MVC webApi 项目,现在我想使用身份验证和授权。我想我已经实现了这种安全措施,但由于某种原因,有些事情变糟了,当我编写我的凭据并尝试调用一些 webApi 方法时,显示消息“
我发现自己使用一种奇怪的方式向我的函数添加回调函数,我想知道是否有更通用的方式向函数添加回调函数,最好的情况是我的所有函数都检查最后给定的作为函数的参数,如果是,则将其用作回调。 我以前是这样的: v
几乎从来没有我只想获取某个 Remote 的情况;我总是想要所有的 Remote 。我认为这将是一个足够常见的用例,git 会考虑它(与他们有 pull.rebase true 的方式相同)。 那么,
我正在尝试使用 inarray 但它总是返回 true?有任何想法吗? (所有 li 均已显示) $("#select-by-color-list li").hide(); // get the se
我正在尝试为我公司的开发环境设置过期网址。我们使用 lighttpd在此环境中提供上传的文件,我发现 these docs这似乎相当有希望。 问题是我似乎根本无法让它工作,而且我有点不知所措,试图找出
我无法让“文件夹”外部变量工作。我总是得到[:]。 我正在 Windows 下的 Grails 上进行开发(这就是为什么外部配置文件看起来像 file:C:\path\to/file)。 我在另一个项
这个问题是出于对 PL 如何工作的好奇,而不是其他任何事情。 (它实际上是在查看与 Haskell 不同的 SML 时想到的,因为前者使用按值调用 - 但我的问题是关于 Haskell。) Haske
我有一个高速缓存内存模块,我希望它是可字寻址的,但有字节的写使能信号。 always @ (posedge clk) begin //stuff... if(write) begin
我正在处理一些代码,其中一个对象“foo”正在创建另一个对象对象“bar”,并向其传递一个Callable。之后 foo 将返回bar,然后我希望 foo 变得无法访问(即:可用于垃圾收集)。 我最初
我已将我的程序与此方法相关联: public static void CreateFileAssociation(string extension, string key, string descri
所以我正在进行目录遍历,但我无法让 opendir 按照我想要的方式工作。它总是无法打开我发送的目录,它给出了一些未知的错误。我通常传入 argv[1],但我放弃了,只是开始硬编码路径。 char *
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 9 年前。 出于某种原因,我的(基本)程序总是打印我为 else 语句保留的
我不想冒为此提出破解的风险,因为它涉及 datetime 对象。基本上,我想按如下方式进行转换: 2010-04-21 06:37:53 -> 2010-04-21 06:40:00 2010-08-
我正在用 C 语言玩文件 I/O。我正在尝试使用 fgets 从一个文件中读取数据并将其输出到另一个文件。问题是它总是返回 NULL,因此没有任何内容被复制到输出文件中。这是我的代码: #includ
class MyClass { // empty class with no base class }; int main() { MyClass* myClass = new MyC
我是一名优秀的程序员,十分优秀!