
1、写在前面我答应一个小伙伴尽快把多文件识别做出来。这不周末就来兑现此承诺。对于真实的项目场景批量识别还真是一个十分方便的功能。一个一个识别简直是费时费力工作毫无效率可言。那我们今天就来完成这个功能顺便也优化一下其他小伙伴提到的小问题需求清单如下1、批量识别 API 支持批量文件识别2、桌面端新增文件夹导入功能也可以拖拽文件夹或者多个文件到队列3、桌面端新增进度与导出功能4、桌面端新增模型偏好本地记忆功能下次打开会自动选择上次使用的模型5、桌面端的预览自适应缩放功能根据窗口大小自动缩放预览图好了先就这么多。版本号定为OnnxOCRSharp v0.2.0。2、转换为功能列表交付物说明OnnxOcr.App新增批量识别 APIRecognizeManyAsyncOnnxOcr.Desktop多文件队列、拖拽、文件夹导入、进度与导出桌面体验模型偏好本地记忆、预览自适应缩放NuGet 包OnnxOCRSharpv0.2.0如果还没生成也别急我这边要等网络恢复才行这次不动Core 算法层多文件本质是外层循环调用同一个已加载好的引擎ORT Session 也适合串行复用。3、界面如何设计界面从原来的「左图右文」扩成三栏┌─ 工具栏模型 / 设备 / 添加文件 / 添加文件夹 / 开始识别 / 导出 … ─┐ ├──────────┬────────────────────┬───────────────────────┤ │ 文件队列 │ 图片预览 检测框 │ 当前文件识别结果 │ │ ○ a.jpg │ │ │ │ ● b.png │ │ │ │ ○ c.webp │ │ │ └──────────┴────────────────────┴───────────────────────┘日常用法添加文件可多选或添加文件夹扫顶层图片也可以直接把图片 / 文件夹拖进窗口点开始识别按队列串行跑失败的记状态然后继续执行点左侧某一行中间预览、右侧结果跟着变化复制当前/复制全部/导出 TXT再次点「开始识别」时优先重跑「等待 / 失败」项如果全成功了就整批重跑。多文件队列识别界面4、库侧怎么调用批量 API单图还是老样子用法usingvarservicenewOcrService(OcrModelPreset.PpOcrV6Tiny);varresultawaitservice.RecognizeAsync(a.jpg);多图新增varpathsnew[]{a.jpg,b.png,c.webp};varprogressnewProgressOcrBatchProgress(pConsole.WriteLine($[{p.CurrentIndex}/{p.Total}]{Path.GetFileName(p.CurrentPath)}));IReadOnlyListOcrBatchItemResultbatchawaitservice.RecognizeManyAsync(paths,progress);foreach(variteminbatch){if(!item.Success){Console.WriteLine($失败:{item.ImagePath}-{item.ErrorMessage});continue;}Console.WriteLine(${Path.GetFileName(item.ImagePath)});foreach(varlineinitem.Result!.Lines)Console.WriteLine(line.Text);}设计上我们倾向于简单使用串行一张接一张复用同一OcrService单张失败不中断结果里带Success/ErrorMessage可取消、可进度CancellationTokenIProgressOcrBatchProgress没有这个 API 也可自己foreach调RecognizeAsync。5、其他优化的体验点5.1 模型选择会记住以前每次打开都回到 Tiny。现在你切到 Small / Medium关掉再进还是上次那个。偏好落在本地%LocalAppData%\OnnxOCRSharp\settings.json就一个很小的 JSON本地偏好设置属于是。5.2 预览图自动适配窗口中间预览以前按原图来展示图要是很大就会非常不方便查看对比。现在打开 / 切换图片时会按预览区大小做contain 适配窗口尺寸变了也会重新适配。需要细看细节的话还是可以Ctrl 滚轮手动缩放的。6、分层设计回顾┌─────────────────────────────────────────┐ │ OnnxOcr.Desktop队列 / 预览 / 关于 │ ├─────────────────────────────────────────┤ │ OnnxOcr.AppOcrService 批量 API │ ├─────────────────────────────────────────┤ │ OnnxOcr.Core单图检测 识别流水线 │ └─────────────────────────────────────────┘Core 只处理一张图App 可处理一批图Desktop 把一批图处理的非常好。7、这个包为啥那么大这次我打包后发现不带模型就300MB上下。发现上次为了支持GPU推理加入了cuda包导致包体积增加。onnxruntime_providers_cuda.dll 就有285MB。好吧后续可能会做些优化。这次就先这样。8、开源地址# 源码https://github.com/lincyang/OnnxOCRSharp# NuGetdotnetaddpackage OnnxOCRSharp--version0.2.0# 桌面应用 Releasehttps://github.com/lincyang/OnnxOCRSharp/releases# 网盘获取公众号聊天输入OnnxOCRSharpv0.2.09、最后能看到这里的都是好朋友所以大家就多多支持下我的小程序「程序员Linc表格识别」。点击试用一下有反馈直接找我~~~欢迎关注公众号「程序员Linc」获取更多技术文章和项目更新参考OnnxOCRSharp GitHubhttps://github.com/lincyang/OnnxOCRSharp本系列前文《OnnxOCRSharp 支持 GPU 和竖排文字了 [PP-OCRv6]》本系列前文《PP-OCRv6 来了C# 离线 OCR OnnxOCRSharp再升级》本系列前文《表格识别从「一行行文字」到「一格一格的表」》