如何将deeplearning4j中MNIST训练的神经网络应用于大图像OCR识别
实拍整页手写图像预处理操作
- 几何畸变校正:先通过轮廓检测定位实拍图中的纸面边界,识别四个角点后做透视变换,将倾斜、有拉伸变形的纸面区域拉成标准正矩形,再旋转修正整体倾斜角度,保证后续文本走向完全水平。
- 光照与噪点修正:先将图像转为单通道灰度图,通过自适应阈值算法完成二值化,分离手写笔画和纸面背景;用小核中值滤波过滤纸张纹理、摄像头成像带来的椒盐噪点,全程注意保留手写笔画的完整边缘,避免细笔画被磨断。特别需要匹配MNIST的样本特征:MNIST数据集为纯黑背景(像素值0)、白色手写数字(高像素值),二值化后必须保证背景统一为0值,手写笔画为高值,颠倒颜色会导致模型识别准确率暴跌。
文本区域定位方案
- 粗筛有效文本区:对校正完成的整图做固定步长滑窗,计算每个滑窗内的像素梯度和,梯度值远高于纯纸面背景的滑窗即包含手写笔画,将连续的高梯度区域做合并,过滤掉纸面污渍、折痕、印章等孤立的非文本高梯度块,最终框出所有存在文本的连续区块。
- 行级拆分:对框出的连续文本区,做逐行水平投影计算——逐行统计该行内的二值化有效笔画像素总数,当统计值跌到和纯背景水平一致时,即为两行文字的间隙,按间隙位置把整段文本拆分为独立的手写行块,避免不同行的字符被合并到同一个处理单元。
适配模型输入的字符块拆分流程
- 单字符切分:拿到独立的手写行块后,做逐列垂直投影计算——逐列统计列内的二值化有效笔画像素总数,当列统计值跌到和纯背景水平一致时,即为两个相邻字符的间隙,按间隙位置把行块拆为单个字符的外接矩形。针对手写连笔导致的切块过宽问题,定位块内垂直投影的最低像素密度点做二次切分,避免两个相邻字符被绑定为一个块送入模型。
- 输入尺寸标准化:这里要避个常见的坑:切分得到的单字符块千万别直接粗暴拉伸到28×28尺寸,瘦长或者扁宽的字符被拉成正方形后形态完全变形,模型根本认不出来。正确操作是先将字符等比例缩放,让最长边占整体20像素尺寸,剩余空白区域用纯背景(0值)补齐为正方形,最后将正方形图块resize到28×28,保证字符重心位于图块正中心,和MNIST训练集的字符分布对齐。
- 逐块推理拼接:将所有处理好的28×28字符块按照“从上到下、每行从左到右”的自然阅读顺序排列,依次送入已完成训练的Deeplearning4j神经网络完成分类预测,按位置顺序拼接每个块的预测结果,即可得到整页手写内容的识别文本。
注意:当前训练的模型仅适配手写数字分类,若切分块为非数字字符,模型会输出错误预测结果,如需识别完整手写文本,需补充对应字符类别的训练样本优化模型。
内容的提问来源于stack exchange,提问作者Patriks
相关产品推荐
相关产品推荐

