【问题标题】:Keras Captcha OCR - How to pass single jpeg image to loaded (trained) model and receive prediction in string?Keras Captcha OCR - 如何将单个 jpeg 图像传递给加载(训练)的模型并接收字符串中的预测?
【发布时间】:2021-08-22 17:26:08
【问题描述】:

在过去的几个小时里,我一直在互联网上寻找有关如何将单个 jpeg 图像传递到我的预训练模型(保存和加载)并以字符串格式接收预测的答案。

我正在使用来自此来源的验证码 OCR - https://keras.io/examples/vision/captcha_ocr/

以下这两种方法让我走得最远(我认为),但它们仍然不起作用:

方法 1:

model = load_model('trained_models/my_trained_model.h5', custom_objects={'CTCLayer': CTCLayer})

img_path = '/test/my_image.jpeg'

img = image.load_img(img_path, target_size=(200, 50))

img_array = image.img_to_array(img)
img_batch = np.expand_dims(img_array, axis=0)

img_preprocessed = preprocess_input(img_batch)

prediction = model.predict(img_preprocessed)

使用这种方法,我没有将图像转换为灰度,但在它可能造成任何麻烦之前我收到了这个错误:

ValueError: Layer ocr_model_v1 expects 2 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 200, 50, 3) dtype=float32>]

方法 2: 这种方法几乎是从 OCR 模型的数据预处理中复制而来的:

img = tf.io.read_file(img_path)
img = tf.io.decode_jpeg(img, channels=1)
img = tf.image.convert_image_dtype(img, tf.float32)
img = tf.image.resize(img, [200, 50])
img_preprocessed = tf.transpose(img, perm=[1, 0, 2])

prediction = model.predict(img_preprocessed)

它给了我几乎相同的错误:

ValueError: Layer ocr_model_v1 expects 2 input(s), but it received 1 input tensors. Inputs received: [<tf.Tensor 'IteratorGetNext:0' shape=(None, 200, 1) dtype=float32>]

但这一次看起来图像格式也有问题。

我认为这个错误是由 OCR 中的这一行引起的:

# Define the model
model = keras.models.Model(
    inputs=[input_img, labels], outputs=output, name="ocr_model_v1"
)

由于模型需要两个值(在训练时,我们传递带有图像和图像名称的 dict(验证码的答案))。但现在,我希望这个模型能够实际预测图像,所以我无法传递答案/标签。

几个小时后,我能够把它推到现在,但现在我没有想法了。

有人可以指点我正确的方向吗?

/// ---------- /// 编辑 /// ---------- ///

嗨!我想编辑我的问题。与此同时,我能够将 jpeg 传递到这个模型中,但不是那么干净。我基本上从本教程的最低部分复制了所有代码 - https://keras.io/examples/vision/captcha_ocr/

感谢我没有收到任何错误,但确实有很多代码看起来是多余的,但我无法有效地重构它。

修改了这段代码:

prediction_model = keras.models.Model(
    trained_model.get_layer(name="image").input, trained_model.get_layer(name="dense2").output
)

现在我收到关于错误形状等的错误消息。是否可以从本教程的“推理”部分重构代码?

【问题讨论】:

    标签: python tensorflow keras ocr captcha


    【解决方案1】:

    从最后的代码 sn-p 和“由于模型需要两个值(在训练时我们传递带有图像和图像名称的 dict(对验证码的回答))。但是现在,我希望这个模型能够实际预测图像,所以我无法传递答案/标签。”你的声明。

    您正在尝试训练一个输出验证码图像标签的模型。因此,您的模型必须是多类分类模型(如果图像标签数量有限)或图像相似性搜索字典学习方法(如果有非常多的类)。但是,在这两种模型架构下,您的数据集格式必须是 {X : Captcha image , y : related image label}。
    model = keras.model.fit(inputs=input_img, outputs=labels)
    或者如果在数据预处理步骤中输出数据集对象
    model = keras.model.fit(data=img_preprocessed)
    生成的模型将支持上述两种推理 [进行预测] 方法。

    【讨论】:

    • 嗨!对不起,我不确定我是否遵循。所以你是说这段代码的“培训”部分 - keras.io/examples/vision/captcha_ocr 是用错误的方式构造的?
    • 是的。更新代码库后,您必须再次训练。
    • 但是如果你在“预处理”部分查看最后一行代码是return {'image': img, 'label': label}。也就是说,单个样本是一个字典,其中编码图像和标签转换为数字。你说的不是这个吗?
    • 是的。但该模型只有一个输入变量 [image] 和一个输出变量 [label]。因为如果在训练阶段有两个输入变量,那么在评估、测试和推理阶段必须有相同数量的输入变量。
    • 但是模型将如何学习呢?我认为所有模型都需要有对象和答案,验证码 - 验证码答案,动物形象 - 猫,动物形象 - 狗等。也许我错过了一些核心概念。我可以请您扩展您的答案以包含来自 keras.io 示例的更多固定代码吗?
    猜你喜欢
    • 2017-07-16
    • 2021-09-25
    • 1970-01-01
    • 2019-12-30
    • 1970-01-01
    • 2018-04-15
    • 2022-11-25
    • 2017-07-28
    • 2018-02-22
    相关资源
    最近更新 更多