Код OCR, написанный без пользовательской функции потери - PullRequest
0 голосов
/ 20 февраля 2019

Я работаю над OCR model.Моя последняя цель - преобразовать код OCR в coreML и развернуть его в ios.

Я посмотрел и запустил несколько исходных кодов github, а именно:

здесь

здесь

когда вы посмотрите на них, все они реализовали 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 имеют функцию Custom Loss, с которой, вероятно, я снова сталкиваюсь с той же проблемой.

Итак, в конце у меня два вопроса:

  1. Знаете ли вы, как решить эту ошибку
  2. мой главный вопрос знаете ли вы какие-либоисходный код для OCR, который находится в KERAS (так как я должен преобразовать его в 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 голосов
/ 21 марта 2019

CoreML не позволяет вам тренировать модель, поэтому не важно иметь функцию потерь или нет.Если вы хотите использовать только CRNN в качестве предиктора в iOS, вам просто нужно преобразовать base_model во вторую ссылку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...