自然场景数字识别的深度学习解决方案
Deep Learning solution for digit recognition on natural scene
我正在处理一个问题,我想自动读取图像上的数字如下:
可以看出,图片还是挺有挑战性的!这些不仅在所有情况下都没有连接线,而且对比度也相差很大。我的第一次尝试是在一些预处理之后使用 pytesseract。我还创建了一个 Whosebug post .
虽然这种方法在单个图像上效果很好,但它并不通用,因为它需要太多的预处理手动信息。到目前为止,我最好的解决方案是迭代一些超参数,例如阈值、erosion/dilation 的过滤器大小等。但是,这在计算上很昂贵!
因此我开始相信,我正在寻找的解决方案必须基于深度学习。我有两个想法:
- 在类似任务中使用预训练网络
- 将输入图像拆分为单独的数字并以 MNIST 方式自行训练/微调网络
关于第一种方法,我还没有找到好的地方。有人对此有想法吗?
关于第二种方法,我首先需要一种方法来自动生成单独数字的图像。我想这也应该是基于深度学习的。之后,我可能会通过一些数据扩充取得一些好的结果。
有人有想法吗? :)
你的任务真的很有挑战性。我有几个想法,可能会在路上帮助你。首先,如果你得到正确的图像,你可以使用 EasyOCR. It uses a sophisticated algorithm for detecting letters in the image called CRAFT 然后使用 CRNN 识别它们。它提供了对符号检测和识别部分的非常细粒度的控制。例如,在对图像进行一些手动操作(灰度、对比度增强和锐化)后,我得到了
并使用以下代码
import easyocr
reader = easyocr.Reader(['en']) # need to run only once to load model into memory
reader.readtext(path_to_file, allowlist='0123456789')
结果是 31197432
和 31197396
。
现在,对于对比度恢复部分,opencv
有一个工具叫做CLAHE。如果您 运行 以下代码
img = cv2.imread(fileName)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (25, 25), 0)
grayscaleImage = gray * ((gray / blurred) > 0.01)
clahe = cv2.createCLAHE(clipLimit=6.0, tileGridSize=(16,6))
contrasted = clahe.apply(grayscaleImage)
在原图上,你会得到
在视觉上与上面的非常相似。我相信经过一些清理后,您可以在不过多调整超参数的情况下让它变得可识别。
最后,如果你想训练自己的深度学习 OCR,我建议你使用 keras-ocr。它使用与 EasyOCR 相同的算法,但提供端到端的训练管道来构建新的 OCR 模型。它涵盖了所有必要的步骤:数据集下载、数据生成、扩充、训练和推理。
考虑到深度学习解决方案的计算量非常大。祝你好运!
关于您的第一种方法,
有两个综合准备的数据集可用:
- Text Recognition Data 由 900 万张图片组成。
- SynthText in the Wild 由 800 万张图像组成。
我已经使用上面的数据集对平板图像进行文本识别。图像非常具有挑战性,但现在我的准确率超过了 90%。我已经实现了以下模型来解决这个任务。它们是:
- CRAFT 用于文本本地化。
- Deep Text Recognition 用于文本识别。
如果您只处理 种图像,我强烈建议您尝试 深度文本识别 。它是 4 阶段框架。
转换可以选择TPS或None。在TPS的情况下,表现出了更高的性能。他们实施了 Spatial Transformer Networks.
在特征提取阶段,您将有以下选项:ResNet 或 VGG
对于顺序阶段,BiLSTM
Attn 或 CTC 用于预测阶段。
他们在 TPS-ResNet-BiLSTM-Attn 版本上取得了最佳精度。你可以很容易地微调这个网络,我希望它能解决你的任务。使用上述数据集训练的模型。
我正在处理一个问题,我想自动读取图像上的数字如下:
可以看出,图片还是挺有挑战性的!这些不仅在所有情况下都没有连接线,而且对比度也相差很大。我的第一次尝试是在一些预处理之后使用 pytesseract。我还创建了一个 Whosebug post
虽然这种方法在单个图像上效果很好,但它并不通用,因为它需要太多的预处理手动信息。到目前为止,我最好的解决方案是迭代一些超参数,例如阈值、erosion/dilation 的过滤器大小等。但是,这在计算上很昂贵!
因此我开始相信,我正在寻找的解决方案必须基于深度学习。我有两个想法:
- 在类似任务中使用预训练网络
- 将输入图像拆分为单独的数字并以 MNIST 方式自行训练/微调网络
关于第一种方法,我还没有找到好的地方。有人对此有想法吗?
关于第二种方法,我首先需要一种方法来自动生成单独数字的图像。我想这也应该是基于深度学习的。之后,我可能会通过一些数据扩充取得一些好的结果。
有人有想法吗? :)
你的任务真的很有挑战性。我有几个想法,可能会在路上帮助你。首先,如果你得到正确的图像,你可以使用 EasyOCR. It uses a sophisticated algorithm for detecting letters in the image called CRAFT 然后使用 CRNN 识别它们。它提供了对符号检测和识别部分的非常细粒度的控制。例如,在对图像进行一些手动操作(灰度、对比度增强和锐化)后,我得到了
import easyocr
reader = easyocr.Reader(['en']) # need to run only once to load model into memory
reader.readtext(path_to_file, allowlist='0123456789')
结果是 31197432
和 31197396
。
现在,对于对比度恢复部分,opencv
有一个工具叫做CLAHE。如果您 运行 以下代码
img = cv2.imread(fileName)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (25, 25), 0)
grayscaleImage = gray * ((gray / blurred) > 0.01)
clahe = cv2.createCLAHE(clipLimit=6.0, tileGridSize=(16,6))
contrasted = clahe.apply(grayscaleImage)
在原图上,你会得到
最后,如果你想训练自己的深度学习 OCR,我建议你使用 keras-ocr。它使用与 EasyOCR 相同的算法,但提供端到端的训练管道来构建新的 OCR 模型。它涵盖了所有必要的步骤:数据集下载、数据生成、扩充、训练和推理。
考虑到深度学习解决方案的计算量非常大。祝你好运!
关于您的第一种方法,
有两个综合准备的数据集可用:
- Text Recognition Data 由 900 万张图片组成。
- SynthText in the Wild 由 800 万张图像组成。
我已经使用上面的数据集对平板图像进行文本识别。图像非常具有挑战性,但现在我的准确率超过了 90%。我已经实现了以下模型来解决这个任务。它们是:
- CRAFT 用于文本本地化。
- Deep Text Recognition 用于文本识别。
如果您只处理
转换可以选择TPS或None。在TPS的情况下,表现出了更高的性能。他们实施了 Spatial Transformer Networks.
在特征提取阶段,您将有以下选项:ResNet 或 VGG
对于顺序阶段,BiLSTM
Attn 或 CTC 用于预测阶段。
他们在 TPS-ResNet-BiLSTM-Attn 版本上取得了最佳精度。你可以很容易地微调这个网络,我希望它能解决你的任务。使用上述数据集训练的模型。