首页 > 解决方案 > 字符识别结果不佳

问题描述

我正在尝试从图像中读取六位数字。我使用 tensorflow/keras 进行训练。这是我为此提出的模型:

model = Sequential()

model.add(Conv2D(20, (5, 5), padding="same", input_shape=(20, 20, 1), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(Conv2D(50, (5, 5), padding="same", activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))

model.add(Flatten())
model.add(Dense(500, activation="relu"))

model.add(Dense(10, activation="softmax"))

model.compile(loss="categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

model.fit(X_train, Y_train, validation_data=(X_test, Y_test), batch_size=40, epochs=30, verbose=1)

我采集了 97,000 多个样本,其中 30% 用于测试。训练结束后:

在此处输入图像描述

如您所见,样本上的结果非常好,但是当我使用相同的样本进行测试时,几乎每 10 个项目都会得到一个错误的结果。

我匹配了训练和测试样本,它们都是一样的。这是预处理部分:

letter_image = img_number[y: y + h, x: x + w]
letter_image = cv2.copyMakeBorder(letter_image, 5, 5, 5, 5, cv2.BORDER_CONSTANT, value=(255, 255, 255))
letter_image = cv2.cvtColor(letter_image, cv2.COLOR_BGR2GRAY)
letter_image = helper.resize_to_fit(letter_image, 20, 20)
raw = letter_image
letter_image = np.expand_dims(letter_image, axis=2)
letter_image = np.expand_dims(letter_image, axis=0)
prediction = cheque_number_model.predict(letter_image)
letter = cheque_number_label.inverse_transform(prediction)[0]

我会非常感谢任何建议。谢谢,也对不起我的英语。

标签: pythontensorflowkerasdeep-learningocr

解决方案


我认为您应该考虑以下几点来提高准确性。

  1. 尝试增加训练测试拆分。
  2. 您在 Conv2D 中添加的图层的形状非常小,为 5x5,而您的输入为 20x20。想想你在做什么,你实际上是在裁剪或忽略数据的重要特征。
  3. 当您继续添加新层时,形状保持不变,但神经元的数量正在增加,这是荒谬的。
  4. 还要考虑一下最大池对您的输入形状有什么影响。

请查看这 4 点并进行相应的更改。你会看到进步。请回复我的结果。


推荐阅读