我使用以下公式创建了自己的Tensorflow图像分类模型:
make_image_classifier \
--image_dir my_image_dir \
--tfhub_module https://tfhub.dev/google/tf2-preview/mobilenet_v2/feature_vector/4 \
--image_size 224 \
--saved_model_dir my_dir/new_model \
--labels_output_file class_labels.txt
遵循this教程。在此过程中,该工具会识别我的三个自定义类并将其保存到文本文件中。该模型的准确性为0.99-1.00。
我还通过遵循以下公式成功地将saved_model.pb转换为Tensorflow.js:
tensorflowjs_converter \
--input_format=tf_saved_model \
--output_format=tfjs_graph_model \
--signature_name=serving_default \
--saved_model_tags=serve \
/mobilenet/saved_model \
/mobilenet/web_model
但是,我仍然以某种方式仍然感到我的课程在训练或预测过程中“丢失”。 在我的代码中,我通过将它们组成一个数组来检索我的标签(常量标签= [“动物”,“手”,“怪物”]);并计算argMax。但是,我仍然不确定当我得到不准确的结果时它们是否正确映射。现在只有我来决定数组的顺序,我想知道我是否按正确的顺序放置标签。我已经阅读了一些热编码的内容,我想知道这是否是我所缺少的步骤?因此,我的主要问题是:
例如,如何确定最高可信度0.64确实表示“手”类而不是“动物”类,因为它们只是命令行工具中的图像文件夹?
如果这不是访问正确标签的正确方法,那会是什么?制作标签的json是否有帮助-我想知道dataSync()
是否还希望如此?
对于新手的错误/条款,我们深表歉意。我在此处粘贴相关的预测代码:
const model = await tf.loadGraphModel(MODEL_URL);
console.log('Successfully loaded model');
const labels = ["animals", "hand", "monsters"];
console.log(labels);
--
const img = await webcam.capture();
const smalImg = tf.image.resizeBilinear(img, [224, 224]);
const resized = tf.cast(smalImg, 'float32');
const t4d = tf.tensor4d(Array.from(resized.dataSync()),[1,224,224,3]);
const result = await model.predict(t4d);
result.print();
result.as1D().argMax().print();
const labelIndex = result.as1D().argMax();
const predictionLabel = result.as1D().argMax().dataSync()[0];
const predict = await result.data();
const value = predict[predictionLabel];
document.getElementById("demo").innerHTML = `
I can see a: ${labels[predictionLabel]}\n
Confidence is: ${value}\n
`;