【问题标题】:how to save ocr model from keras author-A_K_Nain如何保存来自keras作者-A_K_Nain的ocr模型
【发布时间】:2023-01-24 17:01:36
【问题描述】:

我正在研究 A_K_Nain 编写的 keras 示例中的 tensorflow ocr 模型。该模型使用自定义对象(CTC 层)。它在网站上:https://keras.io/examples/vision/captcha_ocr/ 我使用我的数据集训练模型,然后预测模型的结果是完美的。 我想保存并加载这个模型,我试过了。但是我遇到了一些错误,所以我在 CTC Layer 类中附加了这段代码。

def get_config(self):
    config = super(CTCLayer, self).get_config()
    config.update({"name":self.name})
    return config

之后 我试图保存整个模型和重量,但没有任何效果。 所以我申请了2个保存点。 第一种方式。

history = model.fit(
    train_dataset,
    validation_data=validation_dataset,
    epochs=70,
    callbacks=[early_stopping],
)

model.save('./model/my_model')

---------------------------------------

new_model = load_model('./model/my_model', custom_objects={'CTCLayer':CTCLayer})

prediction_model = keras.models.Model(
  new_model .get_layer(name='image').input, new_model .get_layer(name='dense2').output
)

和第二种方式。

prediction_model = keras.models.Model(
  model.get_layer(name='image').input, model.get_layer(name='dense2').output
)

prediction_model.save('./model/my_model')

这些仍然没有用。它没有出错,但预测结果很糟糕。 当训练和保存和加载一起执行时,可以获得准确的结果。 如果我在没有一起训练的情况下加载相同的模型,结果会很糟糕。

我如何在每次不训练的情况下使用这个模型?请帮我。

【问题讨论】:

    标签: python tensorflow keras ocr ctc


    【解决方案1】:

    问题不是来自tensorflow。在captcha_ocr教程中,characters是一个集合,集合是无序的。所以使用StringLookup从字符到整数的映射依赖于当前跑步的笔记本。这就是为什么在没有重新训练的情况下在另一个笔记本上使用它时会出现垃圾的原因,映射不一样!
    一种解决方案是使用有序列表而不是 characters 的集合:

    characters = sorted(list(set([char for label in labels for char in label])))
    

    请注意,此处的 set 运算符允许获取每个字符的唯一版本,然后将其转换回列表并进行排序。然后它可以在任何脚本/笔记本上运行而无需重新训练(使用相同的公式)。

    【讨论】:

      【解决方案2】:

      问题不在保存的模型中,而在您用来将数字映射回字符串的字符列表中。每次重新启动笔记本时,它都会重置字符列表,并且当您加载模型时,它无法准确地将数字映射回字符串。要解决此问题,您需要保存字符列表。请遵循以下代码。

      train_labels_cleaned = []
      characters = set()
      max_len = 0
      
      for label in train_labels:
        label = label.split(" ")[-1].strip()
        for char in label:
          characters.add(char)
      
        max_len = max(max_len, len(label))
        train_labels_cleaned.append(label)
      
      print("Maximum length: ", max_len)
      print("Vocab size: ", len(characters))
      
      # Check some label samples
      train_labels_cleaned[:10]
      
      ff = list(characters)
      
      # save list as pickle file
      import pickle
      with open("/content/drive/MyDrive/Colab Notebooks/OCR_course/characters", "wb") as fp:   #Pickling
          pickle.dump(ff, fp)
      
      # Load character list again
      import pickle
      with open("/content/drive/MyDrive/Colab Notebooks/OCR_course/characters", "rb") as fp:   # Unpickling
          b = pickle.load(fp)
          print(b)
      
      AUTOTUNE = tf.data.AUTOTUNE
      
      # Maping characaters to integers
      char_to_num = StringLookup(vocabulary=b, mask_token=None)
      
      #Maping integers back to original characters
      num_to_chars = StringLookup(vocabulary=char_to_num.get_vocabulary(), mask_token=None, invert=True)
      

      现在,当您在预测后将数字映射回字符串时,它将保留原始顺序并准确预测。

      如果您仍然不明白其中的逻辑,您可以观看我的视频,我在视频中从头开始解释了这个项目并解决了您面临的所有问题。

      https://youtu.be/ZiUEdS_5Byc

      【讨论】:

        猜你喜欢
        • 2021-09-10
        • 2021-09-05
        • 2018-12-14
        • 2018-05-02
        • 1970-01-01
        • 2022-07-25
        • 2020-09-28
        • 2019-11-11
        • 1970-01-01
        相关资源
        最近更新 更多