编写的没有自定义丢失功能的OCR代码

时间:2019-02-20 16:47:40

标签: keras deep-learning ocr coreml text-recognition

我正在研究OCR model。我的最终目标是将OCR代码转换为coreML并将其部署到ios。

我查看并运行了几个github源代码,即:

here

here

当您查看它们时,它们都将loss实施为custom layer with lambda layer

当我要将其转换为coreML时,问题就开始了。

我要转换为CoreMl的代码:

import coremltools

def convert_lambda(layer):
    # Only convert this Lambda layer if it is for our swish function.
    if layer.function == ctc_lambda_func:
        params = NeuralNetwork_pb2.CustomLayerParams()

        # The name of the Swift or Obj-C class that implements this layer.
        params.className = "x"

        # The desciption is shown in Xcode's mlmodel viewer.
        params.description = "A fancy new loss"

        return params
    else:
        return None


print("\nConverting the model:")

# Convert the model to Core ML.
coreml_model = coremltools.converters.keras.convert(
    model,
    # 'weightswithoutstnlrchangedbackend.best.hdf5',
    input_names="image",
    image_input_names="image",
    output_names="output",
    add_custom_layers=True,
    custom_conversion_functions={"Lambda": convert_lambda},
    )

但是会引发错误

Converting the model:
Traceback (most recent call last):
  File "/home/sgnbx/Downloads/projects/CRNN-with-STN-master/CRNN_with_STN.py", line 201, in <module>
    custom_conversion_functions={"Lambda": convert_lambda},
  File "/home/sgnbx/anaconda3/envs/tf_gpu/lib/python3.6/site-packages/coremltools/converters/keras/_keras_converter.py", line 760, in convert
    custom_conversion_functions=custom_conversion_functions)
  File "/home/sgnbx/anaconda3/envs/tf_gpu/lib/python3.6/site-packages/coremltools/converters/keras/_keras_converter.py", line 556, in convertToSpec
    custom_objects=custom_objects)
  File "/home/sgnbx/anaconda3/envs/tf_gpu/lib/python3.6/site-packages/coremltools/converters/keras/_keras2_converter.py", line 255, in _convert
    if input_names[idx] in input_name_shape_dict:
IndexError: list index out of range
Input name length mismatch

我不确定我是否可以解决此问题,因为我没有找到与该错误有关的任何东西来解决。

另一方面,OCR的大多数代码都具有“自定义损失”功能,可能我再次遇到相同的问题。

所以最后我有两个问题:

  1. 您知道如何解决此错误
  2. 我的主要问题,您是否知道KERAS中存在任何OCR源代码(因为我必须将其转换为coreMl)并且没有自定义损失功能因此可以毫无问题地转换为CoreMl吗?

提前感谢:)

只是为了让我的问题更彻底:

这是我正在工作的源代码中的自定义损失函数:

    def ctc_lambda_func(args):
        iy_pred, ilabels, iinput_length, ilabel_length = args
        # the 2 is critical here since the first couple outputs of the RNN
        # tend to be garbage:
        iy_pred = iy_pred[:, 2:, :]  # no such influence
        return backend.ctc_batch_cost(ilabels, iy_pred, iinput_length, ilabel_length)
    loss_out = Lambda(ctc_lambda_func, output_shape=(1,), name='ctc') 
([fc_2, labels, input_length, label_length])

然后在编译中使用它:

model.compile(loss={'ctc': lambda y_true, y_pred: y_pred}, optimizer=sgd)

1 个答案:

答案 0 :(得分:0)

CoreML不允许您训练模型,因此是否具有损失函数并不重要。如果您只想在iOS上使用CRNN作为预测变量,则只需在第二个链接中转换base_model。