松原网站制作,网站需求怎么做,陕西做教学成果网站的公司,如何在网站做直播间本文代码已开源#xff0c;仅需关注 萤火初芒 公众号回复AISharp即可查看仓库地址#xff0c;获取完整项目及模型数据#xff0c;供学习交流使用#xff0c;无套路#xff08;部分测试图片为网图#xff0c;侵删#xff09;。
本文项目在笔记本电脑上#xff08;Window…本文代码已开源仅需关注 萤火初芒 公众号回复AISharp即可查看仓库地址获取完整项目及模型数据供学习交流使用无套路部分测试图片为网图侵删。本文项目在笔记本电脑上Windows, NET10, x64就可以自己动手尝试OCR, 实现如身份证识别、截图文本识别、扫描图转pdf等功能。一、OCR的实现基础实现OCR我们直接从TesseractApache 2.0star 71.4K开始。Tesseract 是目前最活跃、最精确的开源 OCR光学字符识别引擎之一由 Google 维护。它能把图片中的印刷或手写文字转换成可编辑的纯文本、PDF、HTML 等多种格式支持包括中文等 100 多种语言。Tesseract 4 以后引入基于深度学习的 LSTM 神经网络模型对整行文字进行识别准确率大幅提升。在C#中调用Tesseract (https://github.com/tesseract-ocr/tesseract) 有两个方式命令行调用带参数执行 tesseract.exe 文件读取控制台获取解析结果。适合简单直观不需要写代码直接在终端输入命令即可且跨语言通用。Wrapper调用使用封装好的C#库直接调用相关函数。适合深度集成提高性能,减少出错。命令行调用及参数网上已有很好的详细说明如https://tesseract-ocr.cn/tessdoc/Command-Line-Usage.html本文不再赘述已经包含在仓库项目文件中了噢。下面我们通过Wrapper调用的方式来使用Tesseract。C# 目前比较好用的Wrapper有同名的Tesseracthttps://github.com/charlesw/tesseract, A .NET wrapper for tesseract-ocr 5.2.0.在Nuget直接拉取可得到包含运行时和Wrapper库的完整程序直接开箱即用。二、Tesseract模型准备执行OCR之前要准备训练好模型可以在官方仓库找到https://github.com/tesseract-ocr/tessdata_besthttps://github.com/tesseract-ocr/tessdata_fast都是免费。其中语言类模型language .traineddata能直接下载的 100 多种命名规则就是“语言代码[方向/变体]”。常用举例的有 eng、chi_sim、chi_tra、jpn、kor、rus、ara、deu、fra、spa、lat 等。另外就是垂直排版变体 chi_sim_vert、chi_tra_vert、jpn_vert、kor_vert, 其他特殊格式等frak德文花体、equ数学公式、osd。三、四行代码实现OCR3.1 核心代码核心代码就四行非常简单代码及注释如下/* by 01130.hk - online tools website : 01130.hk/zh/checkkeyword.html */ // 1. 创建引擎实例参数语言包、数据路径 using (var engine new TesseractEngine(tessDataPath, chi_sim eng, EngineMode.LstmOnly)) { // 2. 加载图像 using (var img Pix.LoadFromFile(imgPath)) { // 3. 创建页面对象 using (var page engine.Process(img, PageSegMode.Auto)) { // 4. 获取识别结果 Console.WriteLine(识别结果\n page.GetText()); } } }3.2 模型参数模型加载时可同时加载多个语言与命令行参数相似直接用“”拼接即可如eng chi_sim osd。3.3 引擎模式EngineMode对应命令行参数OEM--oem N。4 选 1决定用哪套“底层引擎”0: 仅传统引擎tesseract 3 时代1: 仅 LSTM 神经网络tesseract 4 主推2: 二者都跑再合并结果3: 自动选择默认通常等于 13.4 页面分割模式PageSegMode对应命令行参数--psm N共 14 个等级0-13决定 Tesseract 把图像当成什么版式来处理0: OSD only1: 自动分栏 OSD2: 自动分栏但不做 OSD 也不 OCR未实现3: 完全自动分栏默认模式4: 单列可变尺寸文本5: 单一垂直文本块6: 单一统一文本块7: 单行8: 单个单词9: 圆圈内的单个单词10: 单个字符11: 稀疏文本无顺序12: 稀疏文本 OSD13: 原始行绕过 Tesseract 特殊调整3.5 注意事项根据实际需求选择合适的模型来OCReng对标点符号的处理比较好一般均可以带上。如果是识别车牌照文本或无规律的文本则需要自行考虑改变页面分割模式非常影响识别效果。普通文本OCR如下结果四 扩展应用4.1 文本块坐标导出及分级处理遍历page的内部按block、或word分级获取ocr结果的语言、文本及坐标这样可以更好辅助实现证件信息读取/* by 01130.hk - online tools website : 01130.hk/zh/checkkeyword.html */ using (var iter page.GetIterator()) { iter.Begin(); do { do { do { do { if (iter.IsAtBeginningOf(PageIteratorLevel.TextLine)) { iter.GetImage(PageIteratorLevel.TextLine, 0,out var x,out var y); Console.WriteLine($BLOCK ({x},{y}): {iter.GetWordRecognitionLanguage()}); } Console.Write(iter.GetText(PageIteratorLevel.Word)); Console.Write( ); if (iter.IsAtFinalOf(PageIteratorLevel.TextLine, PageIteratorLevel.Word)) { Console.WriteLine(); } } while (iter.Next(PageIteratorLevel.TextLine, PageIteratorLevel.Word)); if (iter.IsAtFinalOf(PageIteratorLevel.Para, PageIteratorLevel.TextLine)) { Console.WriteLine(); } } while (iter.Next(PageIteratorLevel.Para, PageIteratorLevel.TextLine)); } while (iter.Next(PageIteratorLevel.Block, PageIteratorLevel.Para)); } while (iter.Next(PageIteratorLevel.Block)); }效果如下识别后每个block后面的数字表示当前文本矩形框的左上角xy坐标4.2 pdf生成生成导入图像的pdf文件且pdf中OCR内容区域的文本可被拾取。using (IResultRenderer renderer Tesseract.PdfResultRenderer.CreatePdfRenderer(test.pdf, tessDataPath, false)) { // PDF Title using (renderer.BeginDocument(Serachablepdftest)) { using (TesseractEngine engine new TesseractEngine(tessDataPath, chi_simeng, EngineMode.Default)) { using (var img Pix.LoadFromFile(imgPath)) { using (var page engine.Process(img, Serachablepdftest)) { renderer.AddPage(page); } } } } }效果如下转成pdf文件后的文字拾取效果五、单文件打包问题单文件发布时可能存在发布成功但运行程序出现错误的问题。这个与wrapper在加载运行时过程中的文件路径及处理有关。本项目中对这个wrapper进行了处理将原来动态加载的非托管库直接写死为win环境下的x64了这样就可以很好的单文件发布13.4mb 模型及aot发布3mb 2.6mb 4mb 模型。修改后的tesseract(wrapper)可以在仓库里找到。算上chi_sim和eng模型所有必须文件加起来独立运行无依赖一共40mb。六、 最后有了tesseractC#实现ocr也是很方便的事情。简单ocr再也不需要花钱注册会员来整了随便自己或找个身边的程序员编译下分分钟就搞定。感谢您的阅读本案例及更加完整丰富的机器学习模型案例的代码已全部开源关注公众号回复AISharp即可查看仓库地址本期相关代码在仓库下面的OCRSharp文件夹里可以找到。