Tesseract识别斜体数字1误判为7/17、多识别字符问题优化
Tesseract斜体字符识别重复、结果错误问题优化方案
问题背景
使用Tesseract进行文档OCR识别时,斜体字符场景下频繁出现重复识别、识别结果错误的问题。当前核心识别代码为封装类的简化版本,实现如下:
std::string recognise(const cv::Mat pageImage) { std::unique_ptr<tesseract::TessBaseAPI> tesseract = std::make_unique<tesseract::TessBaseAPI>(); tesseract->Init(tessDataDir.c_str(), LANGUAGE, tesseract::OEM_LSTM_ONLY); tesseract->SetImage( pageImage.data, pageImage.cols, pageImage.rows, CHANNELS_PER_PIXEL, static_cast<int>(pageImage.step)); static constexpr auto DPI = 300; tesseract->SetSourceResolution(DPI); // 封装char*为string后释放原指针 auto *recognisedText_ptr = tesseract->GetUTF8Text(); std::string recognisedText{ recognisedText_ptr }; spdlog::debug("Recognised Text: {}", recognisedText); delete[] recognisedText_ptr; return recognisedText; }
测试复现场景
- 测试输入:内容为斜体文本
01A15, 01A15R的图片
- 实际输出:识别结果为
07A715, 071A15R, - 异常点:第一个数字
1被误判为7的误差可接受,但第二个文本片段01A被解析为071A,即单个斜体1被识别为两个字符17,出现无来源的重复识别。 - 已尝试方案:配置用户自定义匹配模式优化识别效果,未产生有效作用。
可行优化方案
- 前置图像校正预处理
斜体的本质是字符存在固定角度的横向切变,倾斜的笔画延伸很容易被LSTM模型误判为额外字符。在传入Tesseract前,先计算文本的斜体倾斜角度(常规印刷斜体倾斜角多在12°-15°区间),对图像做反向仿射变换把斜体拉正,再辅以二值化、噪点去除操作,可解决绝大多数斜体导致的误识别、重复识别问题。注意校正后要给图像边缘补白,避免边缘字符被裁切。 - 针对性调整Tesseract运行参数
当前代码仅启用了LSTM识别模式,未做场景适配,可补充以下配置:- 调用
SetPageSegMode设置分页分割模式,单行文本场景设为PSM_SINGLE_LINE,整块文本场景设为PSM_SINGLE_BLOCK,避免自动分割时把斜体延伸的笔画误判为字符间隔,导致重复识别。 - 设置字符白名单,如果识别场景仅包含数字、大写英文字母、逗号,直接调用
SetVariable("tessedit_char_whitelist", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ,"),从输出端限制模型只能返回指定范围内的字符,比事后做自定义模式匹配的效果稳定很多。 - 关闭无关字典校验,调用
SetVariable("load_system_dawg", "0")、SetVariable("load_freq_dawg", "0"),关闭默认的英文单词字典纠错,避免模型把无意义的编号类文本强行纠正为常见英文单词,引入额外错误。
- 调用
- 固定字体场景做模型微调
如果业务场景下识别的斜体是固定字体(比如文档统一使用的斜体Arial、斜体Consolas等),不需要从头训练模型,只需要准备几百张对应字体的斜体字符标注样本,对现有Tesseract LSTM模型做微调训练,即可将该场景下的识别准确率提升到99%以上,落地成本很低。 - 结合置信度做结果后处理
如果识别目标是固定格式的编号类文本(比如测试样例中的01A15类编码),可以在拿到识别结果的同时,调用AllWordConfidences接口获取每个字符的识别置信度,把置信度低于阈值(通常设为30%即可)的冗余字符直接剔除,过滤掉斜体笔画导致的误识别多余字符。
内容的提问来源于stack exchange,提问作者Yuru Baku
相关产品推荐
相关产品推荐

