10

使用飞桨一步步实现多语言OCR文字识别软件

 3 years ago
source link: https://my.oschina.net/u/4067628/blog/4882502
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

使用飞桨一步步实现多语言OCR文字识别软件 - 飞桨PaddlePaddle的个人空间 - OSCHINA - 中文开源技术交流社区

目录

急速版:

一、算法篇:

a. OCR算法

b. 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部分:算法篇、软件篇。

下载安装命令

## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

一、算法篇:

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,不过在软件中还没使用),这样就可以看懂爱情动作片的字幕啦。更长远地,还会加入语音识别功能。嗯,毕竟我们也可以实现让阅读无国界。。。

下载安装命令

## CPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/cpu paddlepaddle

## GPU版本安装命令
pip install -f https://paddlepaddle.org.cn/pip/oschina/gpu paddlepaddle-gpu

    其他语种的文字识别标注脚本:

    PaddleOCR也提供了文字标注工具,可以标注矩形框、四边形,同时也提供预标注信息节约标注时间。因此标注文字检测时我们完全可以使用这个工具,在标注汉语、英语的数据时,检测+识别可以同时标注。但是标注其他语言时候,如日语,一般大家不懂日语,虽然知道这个字的形状,但一般人不会发音所以打不出来这个字,这时候检测和识别无法同时标注。此时我们一般把检测,识别的数据分开标注。标注检测时用上面的工具就行,之后把标注检测的图片抠出来再标注识别。标识别的时候虽然我们不懂这个词的发音,但可以判断它的形状,基于这个情况,使用opencv简单做了一个标注工具。未完待续。。。

本文同步分享在 博客“ming.zhang”(CSDN)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK