使用飞桨一步步实现多语言OCR文字识别软件
最近熟悉了一下飞浆paddle 2.0,使用过程很方便,整体使用方法和pytorch相差不大。同时PaddleOCR也进行了适配。相关链接:最终的软件:https://github.com/zhangming8/Dango-ocrOCR算法服务:https://github.com/zhangming8/ocr_algo_server整个文章分为2部分:算法篇、软件篇。一、算法篇:a. OCR算法
目录
太长不看版:
做了一个OCR文字识别工具。
软件及源码:https://github.com/zhangming8/Dango-ocr
OCR算法服务(非必需):https://github.com/zhangming8/ocr_algo_server
好了,看到这里就行了,使用方法上面链接里有。
-----------------------------------------
如果您是普通用户,可以直接使用上面提供打包好的软件;如果您是一名技术爱好者程序员,算法工程师,想了解相关技术,可以继续浏览啦。
详细版:
最近研究了一下百度开源的OCR算法,很感兴趣,于是在前人的基础上,做了一个OCR文字识别工具。
先说一下这个工具的特点:
1. 通过选取待识别区域,自动截屏获取对应区域图片后调用自己搭建的OCR算法服务获取识别结果。
2. 可设置快捷键截屏、识别。
3. 识别结果可以可视化,对识别错误的可以手动进行修改。
4. 文档导出,支持txt,docx。
5. 对于没有GPU或不能搭建OCR算法服务的同学,可以直接使用我已经打包好的软件。里面会调用我搭建好的OCR算法服务,不过IP地址我没放出来,哈哈,不能让你们知道。
还未完成部分:
后面可能会支持本地离线识别,毕竟GPU比较贵比较穷。。。
整个软件的实现可以分为2部分:算法篇、软件篇。
一、算法篇:
a. OCR算法
算法主要使用PaddleOCR的develop分支(https://github.com/PaddlePaddle/PaddleOCR/tree/develop),(飞桨已经发布了2.0rc1版本,开始支持动态图了,用法和pytorch一样流畅,后面会尝试用一下,但是本项目还是静态图develop分支)。
整个文字识别过程包括。1.文字检测,获取位置坐标;2. 把检测的文字抠出来送入文字识别模型。
针对文字检测:目前文字检测主要有基于回归的方式和基于分割的方式,这里我使用的是DBNet(https://arxiv.org/pdf/1911.08947.pdf)。DBNet是一个很简洁的基于分割的文字检测算法,针对排列较密集的场景也有不错的检测效果,细节部分可以看一下原论文。
针对文字识别:使用的是CRNN(https://arxiv.org/abs/1507.05717)。虽然这篇论文比较早,但是目前这种方法仍然使用广泛。在训练的时候不需要对每个文字进行切分、对齐。
在PaddleOCR工程中提供了各种预训练模型,根据里面的使用方法很容易搭建一个文字识别系统。每个人使用的场景可能不太一样,所以针对个人场景最好使用预训练模型在自己的数据集上进行微调。在这里检测我使用的是backbone为resnet18的DBNet,识别采用的是backbone为mobilenet的CRNN。对于检测和识别模型,我针对自己的使用场景进行微调。算了,考虑的每个人的使用场景都不一样,目前还是用百度开源的通用模型吧。所有模型都是用百度开源的。。。
b. OCR算法服务
在文字识别中,考虑到了支持多种语言的识别。在具体实现的时候,可以共用一个文字检测器,接多个不同语言的文字识别模型,目前识别语言支持:汉语、日语、韩语。由于模型比较多,在部署的时候并没有使用飞桨自带的部署工具。这里使用flask来部署OCR服务。
详见(https://github.com/zhangming8/ocr_algo_server)。其中ppocr文件夹包括了检测、识别模型的定义,算法的前后处理大部分代码来自PaddleOCR。
ocr_server.py是服务的主文件,包括了接收base64格式的图片,调用ocr识别算法,返回结果。do_work函数是对模型进行了初始化;ocr_server包括了接收图片,调用ocr算法,并返回结果。里面也集成了调用百度翻译的接口,但是目前在DangoOCR软件里面还没使用到。
config.py为配置文件,里面包括了的模型路径,及后处理参数设置。从配置文件里面可以看到,里面有DB的检测模型,RCNN日语、英语、韩语、汉语识别模型。
sh prod_deploy.sh启动服务。里面给了2种启动方式。a. 一个检测,后面串联多个不同的语言识别模型。b. 一个检测,后面接1个语言识别模型。设置reco_language为文字检测后面跟的识别模型,模型直接用“,”分割。如reco_language="ch,japan,en,korean"表示一个模型后面并联了汉语、日语、英语、韩语识别模型。port=8811可以设置服务的端口。
log文件夹会在启动服务的时候自动创建,并保存相关请求的日志。
test.py可以向服务端口发送图片,主要用于进行测试服务有没有错误。如下为请求的一张图片,返回识别结果并进行可视化,具体请求方式可以参考代码。
二、软件篇:
算法服务有了,需要再开发一个操作界面。在这里发现了一个和不错的开源项目,所以界面部分主要参考了该工程。
界面进行了改动,最终的repo为:https://github.com/zhangming8/Dango-ocr
该工具主要使用pyqt5开发的。
main.py为程序入口。注释写的很详细这里就不一一介绍了。deploy.sh或者deploy.bat是使用pyinstaller分别对ubuntu/windows系统下进行了打包。由于macOS界面稍微不一样,所以重新建了一个macos分支,打包也在macos分支下面。
需要注意的是使用的时候需要修改“configs.py”,填入OCR算法服务端口,如ocr_port=8811;请求的ip地址,如ocr_request_url = "http://0.0.0.0:{}/dango/algo/ocr/server".format(ocr_port)
使用方法:
下载解压已经打包好的软件,windows/ubuntu下找到DangoOCR双击打开,MacOS下右键打开方式选择终端。或者执行python main.py打开界面。
点击“设置”按钮设置待识别的语言。点击“截屏”按钮选择待识别区域,之后自动调用OCR算法服务返回识别结果。
识别汉语(注:下面的界面不是最新的,目前新增加了加载本地图片按钮):
可视化并修改识别结果:
点击“设置”按钮,勾选可视化结果。再次识别会自动弹出识别的图片及对应的识别结果。如果识别的有错误,可以进行修改,修改后可以进行导出为txt或者docx格式。
日语识别:
修改英语识别结果:
三、总结
好了,整个流程就是这样啦。后面可能会增加翻译功能(目前OCR算法有这个翻译功能,是调用的百度翻译API,不过在软件中还没使用)。更长远地,还会加入语音识别功能,这个貌似比较难。。。。
附:
其他语种的文字识别标注脚本:
PaddleOCR也提供了文字标注工具,可以标注矩形框、四边形,同时也提供预标注信息节约标注时间。因此标注文字检测时我们完全可以使用这个工具,在标注汉语、英语的数据时,检测+识别可以同时标注。但是标注其他语言时候,如日语,一般大家不懂日语,虽然知道这个字的形状,但一般人不会发音也打不出来这个字,这时候检测和识别无法同时标注。此时我们一般把检测,识别的数据分开标注。标注检测时用上面的工具就行,之后把标注检测的图片抠出来再标注识别。标识别的时候虽然我们不懂这个词的发音,但可以判断它的形状,基于这个情况,使用opencv简单做了一个标注工具。未完待续。。。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)