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

目录

急速版:

一、算法篇:

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

一、算法篇:

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可以向服务端口发送图片,主要用于进行测试服务有没有错误。如下为请求的一张图片,返回识别结果并进行可视化,具体请求方式可以参考代码。 

使用飞桨一步步实现多语言OCR文字识别软件_第1张图片

二、软件篇:

       算法服务有了,需要再开发一个操作界面。在这里发现了一个和不错的开源项目,所以界面部分主要参考了该工程。

       界面进行了改动,最终的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算法服务返回识别结果。

      识别汉语(注:下面的界面不是最新的,目前新增加了加载本地图片按钮):

使用飞桨一步步实现多语言OCR文字识别软件_第2张图片 中文识别界面

可视化并修改识别结果:

点击“设置”按钮,勾选可视化结果。再次识别会自动弹出识别的图片及对应的识别结果。如果识别的有错误,可以进行修改,修改后可以进行导出为txt或者docx格式。

使用飞桨一步步实现多语言OCR文字识别软件_第3张图片

日语识别:

使用飞桨一步步实现多语言OCR文字识别软件_第4张图片

修改英语识别结果:

   

三、总结

    好了,整个流程就是这样啦。后面可能会增加翻译功能(目前OCR算法有这个翻译功能,是调用的百度翻译API,不过在软件中还没使用)。更长远地,还会加入语音识别功能,这个貌似比较难。。。

 

附:

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

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

你可能感兴趣的:(文字识别,paddlepaddle,深度学习,文字识别,人工智能,paddlepaddle,ocr)