最近参加“中国软件杯”的一个OCR识别相关的比赛。
赛题链接:http://www.cnsoftbei.com/plus/view.php?aid=516
部分要求如下:
手撕代码害怕鸭。
我们团队在题目的允许上,去寻找开源的OCR识别算法的模型,在github上有AdvancedEAST和AttentionOCR算法,知名度还是比较高的,还有EasyOCR,还有PaddleOCR。对这几种OCR识别算法模型做了分析,得出了一些结论,并且选择了一个精确度特别高的模型,具体是谁,还需要继续往下看。
想了解一个东西,肯定要先看一下效果如何。就像看论文一样,肯定先看摘要,如果摘要里提及的内容个关键点并不是自己想要的,那么就没必要往下看了。
她的识别效果有如下:
识别效果图她不管你是横着、还是竖着、还是标点符号;只要是文字就能给你检测出来,精度肯定也没的说,大都在0.98以上。
她现在已经支持汉语、英语、日语、德语、法语等等语言的识别。
她关键还有直接操作式 的网页版和移动版,没编程基础,没开发环境也能让你轻松使用。
移动端识别效果图 网页版识别效果图不得不承认,这个开源的项目真是的良品。这效果太棒了,方便、简单、实用、识别的还贼快。真的爱了。
哈哈,她看起来是不是很棒呀!
但是看这么多了,你还不知道我说的她是谁,是不是挺着急的。
她有着一层神秘的面纱,咱们慢慢的来揭开这层神秘的面纱。
她就是百度开源的PaddleOCR项目。
光说不练假把式下面就具体介绍下OCR以及PaddleOCR的优越性能和开发一个简单的示例使用步骤。
我们的参赛作品(部分PPT展示):
PPT可能做的不太好,大家有问题可以尽管提出来,嘿嘿,多多交流嘛!
真的很牛逼,PaddleOCR搭配上我们自己写的NLP,简直就是无敌呀!
当然了,现在还在参赛阶段,其他的还不方便公开,如果想要源代码和其他资料的话,赛后我都可以提供,可以留言邮箱,或者加我的粉丝群,等待我上传即可。
OCR——光学字符识别(Optical Character Recognition)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。亦即将图像中的文字进行识别,并以文本的形式返回。
OCR技术有着丰富的应用场景,包括已经在日常生活中广泛应用的面向垂类的结构化文本识别,如车牌识别、银行卡信息识别、身份证信息识别、火车票信息识别等等,此外,通用OCR技术也有广泛的应用,如在视频场景中,经常使用OCR技术进行字幕自动翻译、内容安全监控等等,或者与视觉特征相结合,完成视频理解、视频搜索等任务。
如此多的难点,肯定是要解决的啊,所以有难点就有解决的办法——PaddleOCR解决了上述所有的问题。是不是很期待的了解PaddleOCR呢?
下面揭开PaddleOCR的神秘面目。一起来认识一下PaddleOCR。
上面是官方解释,总结几点:
1、体积小;2、运行快;3、方便简单;4、性能还贼好。为了方便小伙伴们后期的使用,我把我使用的网址给大家总结汇总了一下,如下所示。
该模型已经开源,而且还给了很多的教程:
1、GitHub开源地址:https://github.com/PaddlePaddle/PaddleOCR
2、源码PaddleHub在线体验:https://aistudio.baidu.com/aistudio/projectdetail/507159
3、AI快车道2020-PaddleOCR学习教程: https://aistudio.baidu.com/aistudio/education/group/info/1519
4、网页版体验网址:https://www.paddlepaddle.org.cn/hub/scene/ocr
5、移动端下载二维码:
OCR用户的需求很难通过一个通用模型来满足,为了方便开发者使用自己的数据自定义超轻量模型,除了3.5M超轻量模型外(可识别6622个汉字),PaddleOCR同时提供了2种文本检测算法(EAST、DB)、4种文本识别算法(CRNN、Rosseta、STAR-Net、RARE),基本可以覆盖常见OCR任务的需求,并且算法还在持续丰富中。
特别是模型训练/评估中的中文OCR训练预测技巧,更是让人眼前一亮,点进去可以看到中文长文本识别的特殊处理、如何更换不同的backbone等业务实战技巧,相当符合开发者项目实战中的炼丹需求。
以上这些在其官方GitHub上有详细的使用文档教程,建议把该项目克隆到本地,直接看那个md格式的中文版文档,介绍的非常详细,从安装部署到运行测试,每一步都有,堪称最全OCR开发者文档大礼包。
首先这些教程大都是基于Linux的,对一些没有服务器或者刚接触深度学习的同学来说运行运行起来可能有点困难。
下面博主就来讲下怎么在Windows系统上直接运行。
相信想尝试源码的同学大都要有Python深度学习的环境,可能有些没有paddle的环境,当然这安装起来也很简单,而且pip下载极快,毕竟是国产的框架嘛!嘿嘿😎。
飞桨官网paddle环境配置教程:https://www.paddlepaddle.org.cn/install/quick
配好环境之后将GitHub的源码下载或者Git克隆到本地,在PaddleOCR里建个py文件输入以下内容:
from paddleocr import PaddleOCR from tools.infer.utility import draw_ocr from PIL import Image # Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换 # 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。 ocr = PaddleOCR(use_angle_cls=True, lang="ch") img_path = 'img/test.png'#改成自己图片的地址 result = ocr.ocr(img_path, cls=True) for line in result: print(line) # 显示结果 image = Image.open(img_path).convert('RGB') boxes = [line[0] for line in result] txts = [line[1][0] for line in result] scores = [line[1][1] for line in result] im_show = draw_ocr(image, boxes, txts, scores, font_path='/doc/simfang.ttf') im_show = Image.fromarray(im_show) im_show.show() im_show.save('img/result.jpg')当然,也可以对整个文件夹里的图片内容进行检测识别并可以保存识别结果。
from paddleocr import PaddleOCR from tools.infer.utility import draw_ocr from PIL import Image import os import csv def pre_save(img_path,save_path,csv_path): f = open(csv_path, 'w', encoding='utf-8') writer = csv.writer(f) writer.writerow(["img", "result"]) # Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换 # 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。 ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory i=0 for img in os.listdir(img_path): print(img_path+'/'+img) i+=1 result = ocr.ocr(img_path+'/'+img, cls=True) image = Image.open(img_path+'/'+img).convert('RGB') boxes = [line[0] for line in result] txts = [line[1][0] for line in result] scores = [line[1][1] for line in result] im_show = draw_ocr(image, boxes, txts, scores, font_path='/doc/simfang.ttf') im_show = Image.fromarray(im_show) #im_show.show() im_show.save(save_path+img) al = [] for res in result: result = res[1][:][:] al.append(result) print(str(al)) writer.writerow([img,str(al)]) print(i) ##img_path是要检测的图片的文件夹地址,save_path是要保存结果的文件夹的地址(注意后面要有个/),csv_path是识别结果要保存的csv文件地址(可以自动创建) img_path=r'F:\lzpython\PaddleOCR-develop\doc\imgs' save_path=r'F:\chrome\zrbdata\imgs\result1/' csv_path=r'F:\chrome\zrbdata\imgs\result.csv' pre_save(img_path,save_path,csv_path)不管你电脑是否有GPU,用这个代码,该模型都能跑(只是有GPU跑的更快一些罢了)。
回归正题,我们是来分析哪个模型算法比较好的;也到了最精彩的片段。
单说肯定也看不出优秀之处,不如对比来看,嘿嘿! 现在主流的ocr开源项目主要有easyocr、chineseocr_lite当然还有大牛paddleocr
我们分别对比下面几种:
1、教程的完备性对比;2、易用性对比;3、运行速度对比;4、精准度对比;5、多角度对比。总结:
1、EasyOCR和chineseocr_lite教程不便于没基础的人使用;
2、PaddleOCR的文档齐全,通俗易懂,适合无基础的人使用。
评价一个算法的好坏,我们往往都是从时空复杂度来评价。
用我的低配置电脑,同样的图片,从开始识别到打印出内容,PaddleOCR耗时2.15秒,EasyOCR耗时9.96秒,这只是一张图片,几秒钟看不出啥区别,要是对很多张图片或者视频中的文字进行识别的话,差距确实有点大。
接下来用多张图片进行运行时间上的对比,其主要差距有:
在我的电脑上运行,其运行时间上有明显差距,PaddleOCR跑了141张图片,仅仅用了6.9秒,平均耗时为0.048s,与官方给的耗时数据相吻合;而EasyOCR跑了121张图片却用了40.24秒,平均耗时为0.33s。为啥EasyOCR用了121 张图片呢?因为他不支持.gif格式的图片的识别,所以我将20张.gif格式的图片删了。这是官方给的评估耗时数据:
在GPU T4上,移动端模型只需要137ms,而在骁龙855移动端处理时延也只有300ms左右。
当然了,评价一个模型是否可以使用,肯定要看准确度了,如果识别的都不准确,那肯定是无法进行应用的。以下面这个图片为例。
(1)PaddleOCR:
PaddleOCR识别出了53段横竖文字(可以从图上看出,已经包含了该图片的所有文字了),其中错别字也就五个左右吧,置信度在0.6以下的有3段,大部分文字置信度都在0.8以上。
(2)EasyOCR:
EasyOCR识别出了63段文字(没图片框,看不出所有文字是否全被识别),从识别内容和精度上来看,与paddleocr还有一定距离。
( '红动中国WWW. REDOCN.COM', 0.14594213664531708) ( 'Hey,', 0.9193199872970581) ('The happxienffgefgiga', 0.000323598796967417) ( 'nian le fan tian', 0.537309467792511) ( 'look, theres', 0.22078940272331238) ('alot ofwild flowers', 0.057002753019332886) ('你怏乐所以我快乐', 0.531562089920044) ('开心童年乐翻夭', 0.8216490149497986) ('-野凰青', 0.004080250393599272) ('on the lawn.', 0.44294288754463196) ('暗香', 0.9942429661750793) ('.RE', 0.18314962089061737) ( 'Thats', 0.7607358694076538) ('my', 0.6383113861083984) ('frend', 0.45365384221076965) ('FOREVER', 0.7280043363571167) ('童年的伙侔', 0.7070863246917725)(3)chineseocr_lite:
该模型识别出了35段文字,总体来说和paddle差不多,但是置信度上却相差了一大截,chineseocr_lite置信度最高0.59,大部分是0.3~0.5之前的。
对于OCR方向开发者而言,开源repo最吸引人的莫过于:
① 高质量的预训练模型;
② 简单易上手的训练代码;
③ 好用无坑的部署能力。
简单对比一下目前主流OCR方向开源repo的核心能力
语种预训练模型大小F1-Score端侧部署自定义训练支持pip安装chineseocr_lite中英文4.7M0.3899支持不支持不支持easyOCR多语言218M0.2214不支持不支持支持PaddleOCR多语言3.5M0.521支持支持支持对于语种方面,chineseocr_lite仅支持中英文,easyOCR的优势在于多语言支持,非常适合有小语种需求的开发者,但PaddleOCR支持的语种也越来越丰富,目前支持中英文、英文、法语、德语、韩语、日语等多国语言。
从预训练模型来看,easyOCR目前暂无超轻量模型,chineseocr_lite最新的模型是4.7M左右,而PaddleOCR提供的3.5M是目前业界已知最轻量的;
对于部署方面,easyOCR模型较大不适合端侧部署,Chineseocr_lite和PaddleOCR相对较小,都具备端侧部署能力,而且目前PaddleOCR已经给出了移动端的APP应用;
对于自定义训练,实际业务场景中,预训练模型往往不能满足需求,对于自定义训练和模型微调,但目前只有PaddleOCR支持;
从性能指标来看:针对OCR实际应用场景,包括合同,车牌,铭牌,火车票,化验单,表格,证书,街景文字,名片,数码显示屏等,收集的300张图像,每张图平均有17个文本框,PaddleOCR的F1-Score超过0.5,这个性能已经很不错了。
我们知道,训练与测试数据的一致性直接影响模型效果,为了更好的模型效果,经常需要使用自己的数据训练超轻量模型。PaddleOCR本次开源内容除了3.5M超轻量模型,同时提供了2种文本检测算法、4种文本识别算法,并发布了相应的4种文本检测模型、8种文本识别模型,用户可以在此基础上打造自己的超轻量模型。
PaddleOCR本次开源了多种业界知名的文本检测和识别算法,每种算法的效果都达到或超越了原作。在ICDAR2015文本检测公开数据集上,算法效果如下:
模型骨干网络precisionrecallHmean下载链接EASTResNet50_vd88.18%85.51%86.82%下载链接EASTMobileNetV381.67%79.83%80.74%下载链接DBResNet50_vd83.79%80.65%82.19%下载链接DBMobileNetV375.92%73.18%74.53%下载链接SASTResNet50_vd92.18%82.96%87.33%下载链接在Total-text文本检测公开数据集上,算法效果也是惊人的好。
文本识别算法部分,借鉴DTRB[3]文字识别训练和评估流程,实现了CRNN、Rosseta、STAR-Net、RARE四种文本识别算法,覆盖了主流的基于CTC和基于Attention的两类文本识别算法。使用MJSynth和SynthText两个文字识别数据集训练,在IIIT, SVT, IC03, IC13, IC15, SVTP, CUTE数据集上进行评估,算法效果如下:
模型骨干网络Avg Accuracy模型存储命名下载链接RosettaResnet34_vd80.24%rec_r34_vd_none_none_ctc下载链接RosettaMobileNetV378.16%rec_mv3_none_none_ctc下载链接CRNNResnet34_vd82.20%rec_r34_vd_none_bilstm_ctc下载链接CRNNMobileNetV379.37%rec_mv3_none_bilstm_ctc下载链接STAR-NetResnet34_vd83.93%rec_r34_vd_tps_bilstm_ctc下载链接STAR-NetMobileNetV381.56%rec_mv3_tps_bilstm_ctc下载链接RAREResnet34_vd84.90%rec_r34_vd_tps_bilstm_attn下载链接RAREMobileNetV383.32%rec_mv3_tps_bilstm_attn下载链接SRNResnet50_vd_fpn88.33%rec_r50fpn_vd_none_srn下载链接使用LSVT街景数据集根据真值将图crop出来30w数据,进行位置校准。此外基于LSVT语料生成500w合成数据训练中文模型,相关配置和预训练文件如下:
模型骨干网络配置文件预训练模型超轻量中文模型MobileNetV3rec_chinese_lite_train.yml下载链接通用中文OCR模型Resnet34_vdrec_chinese_common_train.yml下载链接具体结果怎么出来的呢?可以参考PaddleOCR官方给的文档——模型训练/评估中的文本识别部分
PaddleOCR总结几点:
体积小运行快部署方便使用简单性能还贼好通过各种维度的对比,我们还是决定使用PaddleOCR做为我们参加比赛的模型,现在已经开发的差不多了,可以持续关注我,等我们参加完比赛,可以把具体所有代码给公布出来,也方便大家学习。
也可以从https://github.com/trending和https://paperswithcode.com/看一下开源项目的排名,排名也都是很不错的,说明关注这个的人还是比较多的,说明用户群体也是很多的。
当然了,现在还在参赛阶段,其他的还不方便公开,如果想要源代码和其他资料的话,赛后我都可以提供,可以留言邮箱,赛后会一一发给大家的。
GitHub开源地址:https://github.com/PaddlePaddle/PaddleOCR
个人建议给国产开源项目一个Star,如果喜欢也可以点下Fork,我觉得这样他们会更有动力去继续创作,创新。
嘿嘿,如果Star了之后,可以找我拿我参赛的源代码。也算是给国产开源项目PaddleOCR一份支持的力量了。
嘿嘿,偷偷放一张官方技术交流小组,嘘别告诉别人,使用微信扫描下面的二维码,就可以加入。 TrueDei 认证博客专家 Linux 分布式 Java 不荒废现在,不畏惧未来!我认为把知识给别人讲会,讲明白,自己才彻底明白。努力把文章写好,写明白每一篇文章,分享给更多人。