飞桨常规赛:中文场景文字识别4月第一名方案分享及答疑

博主参加了百度飞桨的中文场景文字识别比赛,通过调整Resnet34+CTC模型获得了不错排名。文章详述了比赛中遇到的数据集疑问、提交异常问题及其解决办法,分享了训练和预测的具体方案,包括训练数据的选择、学习率调整、预测结果排序等技巧。此外,还提出了优化方向,如更换更深的backbone、尝试Attention模块等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

好久没更新了,因为最近忙着弄很多东西,现在终于能挤出一点时间来写一些上个月参加百度飞桨的常规赛:中文场景文字识别。很高兴能获得不错的名次,这也是对我的这个调参侠一点点的激励。希望自己可以再接再厉,有不错方案的盆友也可以来和我分享一下。

参赛地址: https://aistudio.baidu.com/aistudio/competition/detail/20

我的方案:
https://aistudio.baidu.com/aistudio/projectdetail/1757733

(PS:记得点赞和fork跑一跑!!!记得点赞和fork跑一跑!!!记得点赞和fork跑一跑!!!重要的事情要说三遍)

好了,接下来写一下我的参赛历程,首先我个人觉得这个常规赛的社区环境不太好,就是很少人答疑,也很少人提问。这一点阿里天池做的相对要好一点。因此,飞桨常规赛难度要比阿里天池的学习赛要难一点,如果纯小白,建议先去阿里天池的学习赛锻炼锻炼先。我之前也写了相关的方案你们可以去看一看。

零基础:
https://editor.youkuaiyun.com/md/?articleId=115182198

进阶版:
https://editor.youkuaiyun.com/md/?articleId=115949455

回到正题,其实我3月就参加过了,但是时间太少,而且用了一些S操作(excel)才弄上去,这到后面是代码审核是过不了的,不过我也大概知道怎么做,所以4月准备全心全意去弄这个比赛。

答疑部分

1.训练集是5W还是30W?

我看到很多参赛者说训练数据的问题,官网给的训练数据集是5W,而大神的方案用的都是30W数据集,导致很多人望而却步,而且也没人答疑。在这里我可以答疑,2个数据都可以,官方给的5W数据集是真,这个30W数据集是官方给的5W数据集进行离线扩充得来的,而且这个常规赛没有禁止使用离线数据,只是说不能使用别的数据集,所以是符合比赛要求的。5W,30W数据集,到底选哪个呢?答案还是很明显的吧,肯定选多的呀,训练数据越多,训练出来的权重也会越好,准确率越高。

2.提交后显示异常是什么原因?

在这里插入图片描述

我之前经历过无数次提交异常的状态,但是在讨论区只看到有提问,基本没什么人回答。这就让人很抓狂,因此我只能一个坑一个坑的去踩,然后得出结论。

主要原因有一下几个

1.预测结果是乱序的,这样会报错,比赛要求预测结果是按顺序才行。
2.提交结果是只有1W张图片的结果,多了或者少了也不行,都会报错。
3.提交结果文件里面没有标题, name value.没有这些标题也会显示异常
4.提交结果文件的解码格式是utf-8,不是这个格式也会报错。

别问我为啥知道这么多,这都是血泪的教训啊(放声痛哭~~~~~~)

**

正赛部分

**

其实官网的榜首大神方案已经做了很不错了,我是fork他的方案进行微调并且把结果正确的输出,而我贡献的地方主要在第二部分。

首先表示尊敬也把榜首的方案先放出来:https://aistudio.baidu.com/aistudio/personalcenter/thirdview/262900

大家看看他的就好哈,记得要fork我的哈,哈哈哈哈。

其实我的方案在飞桨社区也写的很详细的了,这里只是顺带提一下。

**我的方案:**飞桨常规赛:https://aistudio.baidu.com/aistudio/projectdetail/1757733

思路介绍

使用PaddleOCR库进行训练和预测

个人方案亮点

在现有的数据中进行 fine-tune,并且正确输出结果

具体方案分享–trian

大致思路和步骤:

因为最后的评定标准是准确率,所以优选考虑Resnet,常用的是Resnet34结构,所以Backbone选用Resnet34。在阅读PaddleOCR库资料,有表明CTC比Attention具有优势,
尤其是对长文本识别,因此Head,Loss选用了CTC模块。Optimizer则选用常用的Adam。

总结:
Backbone: Resnet34
Head: CTC
Loss: CTC
Optimizer: Adam
由于PaddleOCR集成度、模块化非常的好,因此可以在work/PaddleOCR/configs/rec/rec_r34_vd_none_bilstm_ctc.yml,选择适合比赛所需要的结构,只需要改相对应的参数。
大致的框架选择完毕,就进行训练,在训练前期学习率可以选择大一点,到后期的学习率要适当的降低,这是一个常用的提分trick。batch_size可以适当的提高,在AI
studio上,我本想用batch_size:256,但是内存爆了,只好相对于的降低一点。batch_size小了,学习率也要相对应降低一点。

具体方案分享–test

经过几轮训练,Loss稳定了即可拿来进行预测。原作者输出文档存在2点错误,1.是没有标题。2.预测结果是乱序的。 进行提交的会出现下图错误。
在这里插入图片描述

所以要进行必要的修改。对症下药,第一点.没有标题。我们可以在预测结果输出前,先对预测文档进行写入标题的操作。
因此我们先找到执行预测文件:work/PaddleOCR/tools/infer_rec.py。 我们可以看见此文件第96行左右f = open('test2.txt',mode='w',encoding='utf8'),即创
建输出文件并授予可输入的权限。因此我们可以在它的下面进行写入标题的操作:f.write('new_name\tvalue\n')

在这里插入图片描述

这样就解决了第一个错误。
第二个错误,是把预测结果变成有序的。方案有2个:1.是对输入预测图片进行排序后再送入预测。2.是对输出结果的文档进行排序。

我们优选第一个方案,因为难度比较低,也比较符合操作思维。

我们首先要找出输入预测图片的所在代码。我们可以看到99-105行左右是执行了预测操作。
在这里插入图片描述

我们要特别注意img,img_path这两个参数。它是读取了blobs的参数,我们又转而去看到85行左右,它读取了执行test操作,总而言之,应该就是进行test操作。

接下来留意87-88行左右
在这里插入图片描述

我们可以大致知道它的意思创建了一个List存放了infer_img的路径。这里有个小窍门,就是我们要善用print函数。 我们可以把它输出的List给print出来看看,

输出看了会发现,存放的路径居然和预测结果顺序是一样的,我们也就是找到我们需要修改的地方了。也就是只要我们把存放的路径给整理成有序的,输出的结果
就可以符合比赛要求。

这是我们就可以用**sort()函数。**因此我们可以再它们后面,增加一行代码:infer_list.sort()。这时候我们可以执行预测文件查看结果,也可以直接进
行print()函数,看存放的路径变得如何了。个人倾向于第二个方案。然后我们发现预测结果顺序变了,变得相对规则了。但是发现从预测结果是 0.jpg xxx 1.jpg xxx 10.jpg xxx 11.jpg xxx

查了资料发现这是 因为数字数据类型是字符串,不是整型。因此我们需要把这些数字的类型把字符串转为整型,可以调用int()函数。

但是我们输出存放路径的List发现,数字之前还有一堆路径:/home/aistudio/work/PaddleOCR/test_images并且还有后缀.jpg

这时候我们可以用split函数进行路径的分割,因为我们要提取中间的数字并进行排序,所以我们要用调用两次split函数,即re.split(),并用’|'进行分开。

最后把无关的路径和后缀删去,并进行整型转换,便可完成我们的任务。

89行 增加下图的代码

在这里插入图片描述

此时我们可以print查看路径是否已经有序排列了,经查看是有序的,便可执行预测文件,从输出结果来看,我们完成了比赛提交的要求。

在这里插入图片描述

总结

这是第一次在百度AI studio完整的独立完成比赛,幸运的是获得较好的名次。让我对OCR这一块有了新的认识,也对百度飞桨框架有了初步的认识。

在这里要感谢百度飞桨提供训练平台,提供baseline以及优秀的方案供大家进行学习。在这次比赛,我也学到了很多东西,代码能力也进步了一点点。希望百度飞桨可以做的越来越好。

AIStudio提供了AI Studio为选手提供了免费 GPU Tesla V100算力。 对于硬件资源匮乏的同学来说,这是一个非常棒的平台。

最后也期待有更多优秀的作者可以开源他们代码给大家学习。

改进的方向:
1. 最简单的操作把backbone换成resnet50,resnet101及以上的,更深层次的网络,准确率理论上会更高。
2. 因为本次比赛预测图片的结果文字不算太长,CTC模块可以尝试换成Attention,可能效果会好一点。
3.也可以尝试重新把数据进行数据增强,加标签平滑。
4.可以尝试用模型融合

个人觉得用resnet深层次的网络进行训练再把几种权重进行模型融合,应该可以逼近榜首的分数,由于实力不够,所以只是提了个大概的方向,希望有小伙伴能够实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值