如何使用 Keras OCR 示例来推断新图像?
How can I use Keras OCR example to inference a new image?
我正在尝试通过 Keras.So 实现一个 OCR 项目 我尝试向 Keras OCR example 学习。我已经使用我自己的训练数据来训练新模型并获得 .H5 模型文件。
现在我想测试一张新图像以查看我的模型性能,所以我编写了一个
test.py 像这样:
from keras.models import Model
import cv2
from keras.preprocessing.image import img_to_array
import numpy as np
from keras.models import load_model
from keras import backend as K
from allNumList import alphabet
def labels_to_text(labels):
ret = []
for c in labels:
if c == len(alphabet): # CTC Blank
ret.append("")
else:
ret.append(alphabet[c])
return "".join(ret)
def decode_predict_ctc(out, top_paths = 1):
results = []
beam_width = 5
if beam_width < top_paths:
beam_width = top_paths
for i in range(top_paths):
lables = K.get_value(K.ctc_decode(out, input_length=np.ones(out.shape[0])*out.shape[1],
greedy=False, beam_width=beam_width, top_paths=top_paths)[0][i])[0]
text = labels_to_text(lables)
results.append(text)
return results
def test(modelPath,testPicTest):
img=cv2.imread(testPicTest)
img=cv2.resize(img,(128,64))
img=img_to_array(img)
img=np.array(img,dtype='float')/255.0
img=np.expand_dims(img, axis=0)
img=img.swapaxes(1,2)
model=load_model(modelPath,custom_objects = {'<lambda>': lambda y_true, y_pred: y_pred})
net_out_value = model.predict(img)
top_pred_texts = decode_predict_ctc(net_out_value)
return top_pred_texts
result=test(r'D:\code\testAndExperiment\py\KerasOcr\weights.h5',r'D:\code\testAndExperiment\py\KerasOcr\test\avo.jpg')
print(result)
但是我得到这样的错误:
Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 4 array(s), but instead got the following list of 1 arrays: [array([[[[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], ..., [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], [[1., 1., 1.], [1., 1., 1.],...
我有一些参考material:
https://www.dlology.com/blog/how-to-train-a-keras-model-to-recognize-variable-length-text/
How to predict the results for OCR using keras image_ocr example?
一些答案表明我们应该在训练中使用 4 个输入 [input_data, labels, input_length, label_length]
但除了 input_data
之外,其他所有信息仅用于计算损失,因此在测试中可能使用 input_data 是 enough.So 我只是用了一张没有 labels, input_length, label_length
的图片。但是我得到上面的错误。
我对模型在测试中需要 4 个输入还是 1 个输入感到困惑?
测试时需要4个输入似乎不合理process.and现在我有model.h5,接下来我应该做什么?
提前致谢。
也许我知道 why.Because 在 OCR 示例中,我们制作了一个 lambda 层来计算 CTC loss.This 层需要 4 个输入!
正确的测试方法是我们在 inference.Then 期间创建一个没有这个 lambda 层的模型通过名称加载模型权重来做 inference.After 我们得到推理结果,只需使用 CTC 解码它!
我稍后会在 github 更新我的代码.....
我正在尝试通过 Keras.So 实现一个 OCR 项目 我尝试向 Keras OCR example 学习。我已经使用我自己的训练数据来训练新模型并获得 .H5 模型文件。 现在我想测试一张新图像以查看我的模型性能,所以我编写了一个 test.py 像这样:
from keras.models import Model
import cv2
from keras.preprocessing.image import img_to_array
import numpy as np
from keras.models import load_model
from keras import backend as K
from allNumList import alphabet
def labels_to_text(labels):
ret = []
for c in labels:
if c == len(alphabet): # CTC Blank
ret.append("")
else:
ret.append(alphabet[c])
return "".join(ret)
def decode_predict_ctc(out, top_paths = 1):
results = []
beam_width = 5
if beam_width < top_paths:
beam_width = top_paths
for i in range(top_paths):
lables = K.get_value(K.ctc_decode(out, input_length=np.ones(out.shape[0])*out.shape[1],
greedy=False, beam_width=beam_width, top_paths=top_paths)[0][i])[0]
text = labels_to_text(lables)
results.append(text)
return results
def test(modelPath,testPicTest):
img=cv2.imread(testPicTest)
img=cv2.resize(img,(128,64))
img=img_to_array(img)
img=np.array(img,dtype='float')/255.0
img=np.expand_dims(img, axis=0)
img=img.swapaxes(1,2)
model=load_model(modelPath,custom_objects = {'<lambda>': lambda y_true, y_pred: y_pred})
net_out_value = model.predict(img)
top_pred_texts = decode_predict_ctc(net_out_value)
return top_pred_texts
result=test(r'D:\code\testAndExperiment\py\KerasOcr\weights.h5',r'D:\code\testAndExperiment\py\KerasOcr\test\avo.jpg')
print(result)
但是我得到这样的错误:
Error when checking model input: the list of Numpy arrays that you are passing to your model is not the size the model expected. Expected to see 4 array(s), but instead got the following list of 1 arrays: [array([[[[1., 1., 1.], [1., 1., 1.], [1., 1., 1.], ..., [1., 1., 1.], [1., 1., 1.], [1., 1., 1.]], [[1., 1., 1.], [1., 1., 1.],...
我有一些参考material:
https://www.dlology.com/blog/how-to-train-a-keras-model-to-recognize-variable-length-text/
How to predict the results for OCR using keras image_ocr example?
一些答案表明我们应该在训练中使用 4 个输入 [input_data, labels, input_length, label_length]
但除了 input_data
之外,其他所有信息仅用于计算损失,因此在测试中可能使用 input_data 是 enough.So 我只是用了一张没有 labels, input_length, label_length
的图片。但是我得到上面的错误。
我对模型在测试中需要 4 个输入还是 1 个输入感到困惑?
测试时需要4个输入似乎不合理process.and现在我有model.h5,接下来我应该做什么?
提前致谢。
也许我知道 why.Because 在 OCR 示例中,我们制作了一个 lambda 层来计算 CTC loss.This 层需要 4 个输入! 正确的测试方法是我们在 inference.Then 期间创建一个没有这个 lambda 层的模型通过名称加载模型权重来做 inference.After 我们得到推理结果,只需使用 CTC 解码它! 我稍后会在 github 更新我的代码.....