适用于 Win10 x64 平台的离线OCR软件。批量导入本地图片 / 读取剪贴板,识别图片中的文本,输出到软件面板或本地 .txt / .md 文件。
- 免费:本项目所有代码开源,完全免费。
- 方便:解压即用,无需安装。不需要网络。
- 高效:OCR识别引擎是C++编译的 PaddleOCR-json (PP-OCRv2.6 cpu_avx_mkl),比前代提速20%。只要电脑性能足够且支持mkldnn,通常能比在线OCR服务更快。
- 精准:默认使用PPOCR-v3模型库。除了能准确辨认常规文字,对非常规字形(手写、艺术字、小字、方向不正、杂乱背景等)也有不错的识别率。可设置忽略区域进一步提高精准性。支持载入自己训练的模型以适应任务需求。
-
系统支持 Win10 x64 。
-
不建议使用 Win7 ,识别引擎很可能无法运行。如果想尝试,win7 x64 sp1 打满系统升级补丁+安装vc运行库后有小概率能跑起来。
-
CPU必须具有AVX指令集。常见的家用CPU一般都满足该条件。
AVX 支持的产品系列 不支持 存疑 Intel 酷睿Core,至强Xeon 凌动Atom,安腾Itanium 赛扬Celeron,奔腾Pentium AMD 推土机架构及之后的产品,如锐龙Ryzen、速龙Athlon、FX 等 K10架构及之前的产品
注意,Umi-OCR 软件本体只含简体中文&英文识别库。下面链接中的 多国语言识别扩展包 可导入 繁中,日,韩,德,法
语言,请按需下载。
Github下载:
蓝奏云下载:(请留意发布日期和版本号)
https://wwn.lanzoul.com/b036wwa4d
密码:1111
Umi-OCR 批量图片转文字软件 ◁
关于忽略指定区域的特殊功能:
类似含水印的视频截图、含有UI/按钮的游戏截图等,往往只需要提取字幕区域的文本,而避免提取到水印和UI文本。本软件可设置忽略某些区域内的文字,来实现这一目的。
当有大量的影视和游戏截图需要整理归档,或者想翻找包含某一段台词/字幕的截图;将这些图片提取出文字、然后Ctrl+F是一个很有效的方法。这是开发本软件的初衷。
关于OCR引擎 PaddleOCR-json :
对 PaddleOCR 2.6 cpu_avx_mkl C++ 的封装。效率高于Python版本PPOCR及部分Python编写的OCR引擎,通常比在线OCR服务更快(省去网络传输的时间)。支持更换Paddle官方模型(兼容v2和v3版本)或自己训练的模型,支持修改PPOCR各项参数。通过添加不同的语言模型,软件可识别多国语言。
下载压缩包并解压全部文件即可。
- 打开主程序,将任意 图片/文件夹 拖入窗口中的白色背景表格区域,或点击左上方的 浏览 选择图片。
- 点击右上方 开始任务 ,等待进度条走完。
- 点击 识别内容 选项卡查看输出文字,或者前往 第一张图片的目录 查看识别结果txt文件。
-
按 [Win+Shift+S] 截取一张系统截图,或者在网页等地方复制一张图片。
-
切换到 识别内容 选项卡,点击 剪贴板读取。
-
可以在 设置 选项卡中录制并启用 全局快捷键,快速唤起程序识别。若此时程序窗口处在被覆盖的后方或者被最小化,则会自动挪到最前的位置。
点击 设置 选项卡,配置参数。大部分设置项修改后会自动保存。
- 识图任务完成后,额外执行的任务。可执行打开生成文件/目录,自动关机/待机等。
- 即使识图任务正在进行中,也可以随意修改这些选项。
自定义计划任务
- 您可创建自己的计划任务,本质是调用一段cmd命令。
- 点击 打开设置文件 ,在
okMission
中添加一项元素。 - 键为任务名称,值为字典,其中
code
为cmd命令。多条命令可用&
分隔。例:
"我的任务": {"code": "cmd命令1 & 命令2"}
- 点击 添加区域 展开配置忽略区的新窗口。具体配置方式见后。
- 点击 清空区域 清空已配置的所有忽略区域参数。
- 已添加区域后,上方标题文字提示当前忽略区域的 生效分辨率 。
- 点击 录制按键 后按下想要的快捷键,如
ctrl+shift+s
。然后勾选 启用全局快捷键 。 - 按下快捷键后,程序检查当前剪贴板的第一位是否为图片,是则程序跳到顶层并展示识别文字。
- 请检查并避免全局快捷键与其它程序冲突。
- 可设置识图后 自动复制识别内容(不含任务时间等信息的纯内容文本)。此设置只对剪贴板识图生效,批量任务时无效。
- 重要提示:
v1.2.6
版本提高了批量处理的平均速度,但代价是需要花费更长时间进行初始化。这可能影响剪贴板识图的速度(每次剪贴板任务都要重新初始化)。若频繁使用此功能,建议先使用旧版v1.2.5
。
- 递归读取子文件夹中所有图片 若勾选,拖入文件夹到处理列表时,会导入所有子文件夹中的图片。否则只会导入一层文件夹下的图片。
图片后缀正常情况无需改动。
- 图片后缀 配置软件允许载入的图片后缀,不同后缀以空格分隔,必须全为小写。
- 如果你有必要添加新的图片后缀,要保证该图片同时满足c++模块的
PaddleOCR
和python的PIL
均可识别。比如 .gif 图片,虽然PIL
可以识别,但PaddleOCR
无法识别,载入gif文件会导致软件任务失败,因此不允许载入 .gif 。 - 不在许可后缀范围内的文件,拖入软件也不会被载入。目前默认的图片后缀为:
.jpg .jpe .jpeg .jfif .png .webp .bmp .tif .tiff
- 如果你有必要添加新的图片后缀,要保证该图片同时满足c++模块的
- 将 识别内容写入本地文件 取消勾选后,不会再生成本地文件,只能在 识别内容 选项卡中查看输出信息。若设置了本次任务完成后自动关机,请务必勾选此项,以免至今为止的努力全部木大。
其他项正常情况无需改动。
- 输出调试信息 若勾选,则会额外输出程序工作状态的内容。
- 忽略无文字的图片 若勾选,则不含文字(或文字全被忽略区域屏蔽掉)的图片名称不会出现在输出信息中。
- 若想生成一份用于浏览的markdown文件,则建议取消勾选。
- 生成文件可选择两种风格:纯文本.txt文件 和 Markdown风格.md文件 。前者可用于查找等一般用途。后者在编辑器或浏览器中渲染为图文并茂的页面,可用于浏览和欣赏图集。
- 输出目录 和 输出文件名 设置生成的文件的位置和名称。
- 当拖入第一张图片且这两项设置为空时,自动设置输出路径为第一张图片的父目录,输出文件名为
[转文字]_{父目录}.txt
。除非要自定目录和名称,否则这两项默认留空即可。
- 当拖入第一张图片且这两项设置为空时,自动设置输出路径为第一张图片的父目录,输出文件名为
- 处理列表标签页的 清空表格 按钮,除了会清空已导入的图片列表,还会清空 输出目录 和 输出文件名 设置。这样下次拖入新图片时,就能在新的位置存放输出文件。
- 识别语言 选择当前识别语言(即OCR参数文件)。英文无需切换,所有语言均支持英文字母识别。
- 启动参数 可输入字符串配置参数,调整识别过程,适应任务需求。
如何添加多国语言?
扩展包内置语言:繁中,日,韩,德,法
- 模型分为三种:det检测,cls方向分类,rec识别。其中det和cls是多语言通用的,只需下载新语言的rec识别模型即可。
- 前往 PP-OCR系列 V3多语言识别模型列表 ,下载一组rec识别模型。
- 若V3模型列表里没有找到目标语言,可以去支持语言列表查看PPOCR有没有提供这种语言。若有,则可能它暂未推出V3模型,可以先使用旧版V2模型。(V3模型网址中的2.x一路换成更小的数字可以查看旧版页面)
- 前往 PP-OCR系列 字典列表 ,下载对应语言的字典文件。
- 将下载好的文件解压放进软件目录的
PaddleOCR-json
文件夹中。 - 复制一份
PaddleOCR_json_config_[模板].txt
,改一下名。 - 打开复制好的
PaddleOCR_json_config_目标语言.txt
,将 rec路径rec_model_dir
和 字典路径rec_char_dict_path
改成目标语言的文件(夹)的名称。若模型库是v2版本,还必须加上一行rec_img_h 32
。 - 回到上一层目录
Umi-OCR
,打开Umi-OCR_config.json
,在"ocrConfig"
中添加新语言的信息。键为语言名称,值的path
为config txt文件的名称。保持json格式,注意逗号。 - 打开软件,检查设置页是否已经能选择该识别语言。
识别不准怎么办? 我的 i9 CPU超牛逼怎么办?
- 若图片中的文字方向不是正朝上,启动参数添加:
--cls=1 --use_angle_cls=1
- 为了提高速度,PaddleOCR预先将长度超标的图片进行压缩,再执行文字识别。这可能导致超大分辨率(4k以上)图片的识别准确度下降。若有识别不出文字或漏掉小字的现象发生,启动参数添加:
--limit_side_len=压缩阈值
- 压缩阈值建议填图片的最大边长的一半,4000x3000的图片填2000。值越大,识别小字的准确率可能提高,但速度会大幅降低,请谨慎使用。
- 若电脑的CPU大于8核16线程,启动参数添加:
--cpu_threads=线程
- 线程建议填CPU线程数,如16。值越大,识别速度可能提高。不应超过CPU线程数。
- 若软件初始化识别引擎时频繁报错或崩溃,且电脑CPU是早期AMD型号,启动参数尝试添加:
--enable_mkldnn=0
- 禁用mkldnn加速可能提高对早期AMD的兼容性,但识别速度会大幅降低。Intel和AMD锐龙系列一般不存在这个问题。
- 若确实无法使用mkldnn,建议使用
1.2.5
旧版本Umi-OCR,它在禁用加速时的效率高于1.2.6
。
- 启动参数可以叠加,用空格隔开,如:
--cls=1 --use_angle_cls=1 --use_angle_cls=1 --limit_side_len=1920 --cpu_threads=20
- 更多启动参数详见 PaddleOCR-json 配置信息说明
忽略区域是本软件特色功能,可用于排除图片中水印的干扰,让识别结果只留下所需的文本。
展开详情
“忽略区域”是指图片上指定位置与大小的矩形区域,完全处于这些区域内的文字块,将被排除。
- 点击 设置 选项卡中的 添加忽略区域 ,进入忽略区域选择窗口。
- 将任意图片 拖入 该窗口,可预览该图片。将新图片拖入窗口可切换预览,但已绘制的忽略区域不会消失;可切换不同图片来仔细调整忽略区域。
- 绘制 忽略区域 :拖入图片后,点击选中左起第一按钮 +忽略区域 A ,然后在图片上按住左键拖拽,绘制矩形区域。可 撤销 步骤。
- 绘制完后,点击 完成 返回软件主窗口。若不想应用此次绘制,则右上角X,取消。
简单案例见下。
- 打开忽略区域设置窗口,拖入任一张截图。 稍等约1秒,面板上会显示出图片,识别到的文字区域会被虚线框起来。发现右上角的水印也被识别到了。
- 点击选择 +忽略区域 A 。在画面上按住左键拖拽,绘制方框完全包裹住水印区域,范围可以大一些。可绘制多个方框。
- 点击 完成 。返回主窗口, 开始任务 。
- 假设有一组游戏截图,主要分为两类图片,这两类图片的文字位置和UI位置不太相同:
- 甲类(上图左)为对话模式,字数少,要保留的台词文本在画面下方,要排除的UI分布于底端。
- 乙类(上图右)为历史文本模式,字数多,从上到下都有要保留的文本(与甲类UI位置有重合),要排除的UI分布在两侧。
- 拖入一张甲类图片。选择 +忽略区域 A ,绘制方框包裹住要排除的 底端UI 。可绘制多个方框。
- 拖入一张乙类图片。选择 +识别区域 ,绘制方框包裹住 小部分要保留的文本 。注意只要该区域内含有任意保留文本即可,不需要画得很大,不需要包裹住所有保留文本;不能与甲类图中 可能存在的任何文本 重合。
- 然后选择 +忽略区域 B ,绘制方框包裹住乙类图要排除的 两侧UI 。可绘制多个方框。
- 点击 完成 。返回主窗口, 开始任务 。
-
忽略区域A :正常情况下,处于 忽略区域A 内的文字 不会 输出。
-
识别区域 :当识别区域内存在文本时,忽略区域A失效 ;即处于忽略区域A内的文字也 会 被输出。
-
忽略区域B :当 忽略区域A失效 时,忽略区域B才生效;即处于区域1内的文字 会 输出、区域2内的文字 不会 输出。
识别区域 忽略区域A 忽略区域B × 不存在文字 √ 生效 × 失效 √ 存在文字 × 失效 √ 生效 -
“忽略区域配置”只针对一种分辨率生效。假如配置的分辨率是1920x1080,那么批量识别图片时,只有符合1920x1080的图片才会排除干扰文本;1920x1079的图片中的文字会全部输出。
-
拖入预览的图片必须分辨率相同。假如先拖入1920x1080的图片,再拖入其它分辨率的图片;软件会弹窗警告。只有点击 清空 删除当前已配置的忽略区域,才能拖入其他分辨率图片,并应用此分辨率。
展开详情
测试机器:
CPU | TDP | RAM | 是否兼容mkldnn |
---|---|---|---|
r5 4600u | 15w | 16g | 无报错 |
测试集:
图片张数 | 测试条件 | 分辨率 | 平均字块数量 | 平均字符数量 | 文字语言 |
---|---|---|---|---|---|
100 | 环境相同,多次测量取平均值 | 1920x1080 | 15 | 250 | 简体中文 |
测试结果:
Umi-OCR版本 | 1.2.5 | 1.2.5 | 1.2.6 | 1.2.6 | 1.2.6 | 1.2.6 |
---|---|---|---|---|---|---|
PaddleOCR-json版本 | 1.1.1 | 1.1.1 | 1.2.0 | 1.2.0 | 1.2.0 | 1.2.0 |
PP-OCR C++版本 | 2.1 | 2.1 | 2.6 | 2.6 | 2.6 | 2.6 |
是否开启mkldnn | ✅ | ✅ | ✅ | ✅ | ||
PP-OCR模型库版本 | v2 | v2 | v2 | v3 | v3 slim | v3 |
总耗时(秒) | 90 | 120 | 65 | 63 | 170 | 400 |
平均单张耗时(秒) | 0.9 | 1.2 | 0.65 | 0.63 | 1.7 | 4.0 |
内存占用(MB) | 1000 | 350 | 1200 | 1700 | 5800 | 500 |
结论:
- 在启用mkldnn情况下,新版本比前代的效率具有显著优势。新版调教倾向于榨干硬件的性能,内存占用高于旧版。
- 不启用mkldnn时,新版本效率不如前代。故您的CPU若不支持mkldnn(如早期AMD型号),建议使用旧版本Umi-OCR。
- 虽然Paddle官方文档中说经过压缩剪枝蒸馏量化的slim版模型的性能指标会超过传统算法,但实测 v3 slim 模型的性能远不如原始版本,还可能伴随着内存泄漏的问题。也许是 PP-OCR C++ 引擎不适配。在该问题解决之前,Umi-OCR发行版提供原始版本模型。
- 如果想用接口调用OCR,可试试 PaddleOCR-json 图片转文字程序 。
- 由于PaddleOCR-json只接受硬盘文件,所以读取剪贴板图片时,会先将内存中的图片保存到同目录下的
Umi-OCR_temp
。每次任务时清空前一次的缓存。 - PPOCR v2.6 (PaddleOCR-json v1.2.0) 版本提高了批量处理的平均速度,但代价是需要花费更长时间进行初始化。提高了启用mkldnn加速时的识别速度,但代价时不开启加速时效率更低。(CPU只要不是特别早期的AMD,一般都能使用mkldnn,但加速幅度可能不如同档次的Intel。)
- 未来将增加 openblas 版识别引擎,进一步优化AMD的效率。
- 代码很丑,有空重构
下次一定 - 使用
pyinstaller
打包,参数为pyinstaller -F -w -i icon/icon.ico -n "Umi-OCR 批量图片转文字" main.py
- 输出内容可选为markdown风格并嵌入图片路径。
- 设置项能保存。
- 自动打开输出文件or文件夹。
- 识别剪贴板中的图片。
- 任务进行时,禁用部分设置项。
- 计划任务:完成后自动关机/休眠等。
- 递归导入文件夹。
- 优化适配PaddleOCR v3模型。
- 自动检测CPU指令集是否兼容。
低(有)优(生)先(之)级(年):
- 对图片重命名。
- 提高初始化速度。
- 忽略区域能保存预设。
- 缩减离线OCR模块的体积。
- 离线OCR模块增加
no_avx
和openblas
版本。
- 更新PaddleOCR-json模块至
v1.2.0
,提高识别速度、准确度。 - 调整UI:更方便地用下拉框切换识别语言。
- 调整UI:可以从主窗口任意位置/任意选项卡拖入图片。
- 修正了漏洞:提高程序健壮性,增加启动子进程时的更多异常处理情况。
- 修正了漏洞:彻底解决了对边缘过窄的图片,识别结果不准确的问题 issue #7 。
- 优化适配PP-OCRv3模型,彻底解决了v3版模型比v2慢、不准的问题 issue #4 。
- 添加新功能:计划任务。识图完成后执行自动关机等任务。
- 添加新功能:可选拖入文件夹时递归导入子文件夹中所有图片。
- 调整UI:添加一些配置文件的快捷入口。
- 添加新功能:可选识别剪贴板图片后自动复制识别的文本。
- 补充功能:快捷键调用剪贴板识图时,若程序窗口被最小化,则恢复前台状态并挪到最前位置。
- 添加新功能:读取剪贴板图片。配置全局快捷键调用该功能。
- 添加新功能:可选任务完成后自动打开输出文件或目录。
- 更新PaddleOCR-json模块至
v1.1.1
,修正了可能得到错误包围盒的漏洞。
- 可选生成Markdown风格的图文并茂的.md文件,作为索引使用有更佳的观感。当然也可以继续选择生成纯文本.txt文件。
- 修改设置面板的样式,改为滚动面板以容纳更多设置选项。
- 用户修改配置项后可自动保存。
- 修正了漏洞:退出 [忽略区域窗口] 时,OCR子进程未关闭。
- 添加新功能:[忽略区域窗口] 以虚线框 展示识别出的文字块。
- “梦开始的地方”