天池OCR竞赛coggle baseline环境配置和训练

baseline地址:https://gitee.com/coggle/tianchi-intel-PaddleOCR

该方法采用的是百度的paddle框架,在配置时环境时遇到了一些问题,在这片文章中记录一下。

1 命令行

首先从文章开头的网址中把整个工程下载并解压。之后按照网站里面的教程需要运行run.sh文件,但是最近刚买的新电脑还没装ubuntu系统,而Anaconda的Powershell Prompt命令行虽然支持不少Linux系统的命令,但是无法执行./run.sh或者sh run.sh,所以这里我只能把run.sh文件打开,一条一条手动输入里面的命令。这样做虽然比较麻烦但是最后还是可以把环境配好的。

2 wget命令

Anaconda的Powershell Prompt里面支持wget命令,但是直接按照run.sh文件里面的写法,如wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_server_v2.0_det_infer.tar这样命令行里确实会显示正在下载,但是下完了之后本地并没有出现对应的文件。这个问题最后通过加-o参数解决了,即通过-o参数指定下载后的文件名(网上说应该用-O参数来指定用于保存的文件名,但这里我用的-o也成功了)。

3 安装paddle和其它库

在这一步遇到了非常大的问题,主要来源是paddle和imgaug对于numpy版本要求的冲突。这里非常坑,因为用conda安装imgaug的时候最后只提示有冲突,但是不说是什么冲突。后来换成用pip安装知道原来是numpy版本的问题。
paddle对numpy版本要求的冲突
我虚拟环境中的python版本是3.9,用conda安装numpy的时候系统默认装了1.20的版本,但是paddle要求numpy版本小于1.19。但是当我把numpy版本指定为1.19的时候,再安装imgaug,它又会自动把numpy的版本改到1.21,于是在用paddle的时候又会出现问题,提示找不到paddle库。
最后解决的方法也非常玄学:在新建了虚拟环境之后,最先装imgaug,再装paddle,这样numpy就不会出现冲突,然而我用conda list查看库的时候发现,numpy的版竟然本还是1.21,可是包括paddle、imgaug在内的所有库全都能正常用了,让人非常费解。
最终配好的环境中的numpy版本
除此之外还有一点其它的坑。一个是当我把原有的虚拟环境删了之后,重新建立了一个新的同名虚拟环境,在这个虚拟环境里面安装库的时候它会使用之前安装时留下的缓存来装,也就是说装的库和原先的是一样的,这样当我们因为库之间的冲突而重装虚拟环境时可能会发现最后还是会出现一样的库冲突,因为它默认会用之前的缓存来安装而不是重新下载。
还有一点是,当我们跑代码时发现某个库找不到,比如说yaml,然后我们直接conda install yaml,然后重新运行代码,这时候发现依然提示找不到这个库,这往往时因为我们装的时候把库的名字写错了,也就是说虽然它提示找不到yaml,但是我们实际在conda install的时候应该装的库不叫这个名字,比如yanl库就应该用conda install pyyaml来安装。
(被这个问题卡到了凌晨3点多,脑袋不太清醒,所以有些细节记不清了,可能写得有点混乱)

4 显存不够

paddle训练模型时有一个很坑的地方,就是如果在训练时现存不够导致代码无法运行,它会直接结束而不报任何错误,所以在测试时我经常发现程序结束了,但是没有任何结果留下。后来我在运行的时候把任务管理器打开,切换到“性能”选项卡下,发现每次在程序突然结束时显存占用会突然变成100%,所以可以确定是显存不够导致的问题。但是由于它不报错,想要找出是哪里导致的显存不够也非常麻烦。
对于这个问题暂时也没有很好的解决方法。一开始只是把batchsize改小就可以了,但是后来发现在测试时由于部分图像特别大,依然会导致显存不够(训练时它会把图像裁剪成 960 × 960 960\times960 960×960大小,但是在测试时不会),这时我只能在源代码中加入很多输出语句,然后看是在哪条语句输出后程序被中断了,以此来定位错误。最后发现是在basemodel.py文件中的self.backbone(x)和self.neck(x)这两个地方出的问题,原因应该是网络比较大而且会把一张图片拆成好几个张量输出,占用了很多显存,当图像比较大时显存就会不够用。所以我想当发现图像超过一定尺寸时,就对它进行下采样,于是在program.py文件的eval函数中加了几句代码:

while ( max(images.shape) >= 3968 ):
                print( images.shape )
                images = images[:, :, 0:-1:2, 0:-1:2]

但是依然会在self.neck(x)那里出问题,原因暂时还不清楚,有可能是因为这种写法不是原位(in-place)操作,每次下采样都会重新建立一个新的张量来存放结果,浪费了内存。参考pytorch的语法,改成类似images[:] = images[:, :, 0:-1:2, 0:-1:2]这样的写法就是原位操作了,但是这样写在paddle不行,具体为什么也不清楚。再后来我想看看直接resize行不行,但是paddle中的tensor竟然没有resize方法。所以这个问题到现在还没有解决掉。

####################################################

显存不够这个问题实在没办法,只能把那些比较大的图像跳过去了:

if ( max(images.shape) >= 3968 ):
                continue

最后放一张训练完之后的Powershell图(为了调试加了很多输出语句,所以有点乱):

训练完成之后的Powershell
测试完之后:
测试完成
提交后的成绩(不知道为什么没有排名):
提交后的成绩

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值