EAST文本检测+天池竞赛++经验分享+踩坑合集

EAST文本检测+天池竞赛++经验分享+踩坑合集

EAST的模型在检测自然场景下的英文文本有着较好的性能,要实现中文场景下的中文文本检测,需要重新训练模型,本篇文章就是在此基础上,经历了无数次的奔溃,虽然没有达到预期,也算跑出来一个结果。
CSDN链接:https://blog.csdn.net/weixin_42042397/article/details/95946118

一、前言

天池竞赛官网链接
EAST论文链接:https://arxiv.org/abs/1704.03155v2
EAST-github代码:https://github.com/argman/EAST

OpenCv-East文本检测这个地址是网上的朋友用python直接调用已经训练好的模型进行检测,附上代码分享
生活不易,喜欢就点个star吧~~

观点参考: 用EAST这个模型来进行中文文本检测存在着很大的缺陷,有些图片很清晰的文本也检测不出来,同时图片中的长文本检测也具有缺陷。如果你想要得到很高的精度,建议可以尝试其他模型。

二、论文分析

2.1 技术分析

亮点

简单的管道实现在当时较高精度的文本检测。
• 图像通过FCN处理产生像素级文本缩放地图和几何图形的多个频道。
• 可旋转的文本框,可以检测文本也可以检测单词。
具体的分析可以参照文本检测之EAST

三、重新训练

我的设备:
Ubuntu 16.04
tensorflos 1.4
CUDA 8.0

3.0 环境配置

安装tensoflow-gpu版本和CUDA以及cudnn这些我就不在这里详述,网络上有很多详细的教程,注意tensorflow下载的版本和CUDN要匹配。

3.1 下载

下载代码: 熟悉github使用的朋友可以直接用clone命令 git clone https://github.com/argman/EAST.git
当然也可以直接Download ZIP

下载预训练模型:
Resnet V1 50 provided by tensorflow slim: slim resnet v1 50
原作者在ICDAR2013+ICDAR2015 数据集上已经训练好的模型百度云盘 谷歌云盘

数据集处理:
数据集要按照原作者的命名方式修改,即使你使用的ICDAR3013这类的数据集,也需要修改一下图片命名方式。

原代码数据集的命名方式:图片1.jpg 图片1.txt

我用来处理数据集进行重命名的代码 处理后的数据集按照image1.jpg image2.jpg这样的命令方式

注:代码是通过获取文件类型然后重新命名以原来的文件类型保存的,所以文本数据和图片数据需要分开处理

训练命令:

python multigpu_train.py --gpu_list=0 --input_size=512 --batch_size_per_gpu=14 --checkpoint_path=/tmp/east_icdar2015_resnet_v1_50_rbox/ \ --text_scale=512 --training_data_path=/data/ocr/icdar2015/ --geometry=RBOX --learning_rate=0.0001 --num_readers=24 \ --pretrained_model_path=/tmp/resnet_v1_50.ckpt
  • gpu_list=0 :使用1块gpu,有多块就设置该命令为gpu_list = 0,1,2,3
  • checkpoint_path:训练结果保存路径,不需要修改,训练得到的模型可以在该路径查看
  • text_scale :文本尺度
  • training_data_path:训练用的数据集,如果使用自己的数据集,这里的路径修改了训练用的图片路径
  • pretrained_model_path: 预训练模型路径,不需要修改了

四、踩坑合集

这里记录了我大大小小的奔溃合集。希望可以对其他朋友有所帮助。

4.1 tensorflow安装后导入报错:libcudnn.so.6:cannot open sharedobject file :No such file or directory.

错误描述: 缺少这个文件,查看/usr/local/cuda/lib64/ 文件夹中是否对应存在libcudnn.so.6,没有的话到官网下载一个放在这个文件夹就可以了。

解决办法:

1、 查看cuda的版本 cat /usr/local/cuda/version.txt
查看你的系统信息 uname -m && cat /etc/*release

2、官网下载对应cudnn库 https://developer.nvidia.com/cudnn (要注册账号)

3、我下载的是libcudnn.so.6.0.21,下载后的文件放在文件夹中/usr/local/cuda/lib64/

4、 修改文件权限,并创建原本的软连接,把文件改为你下载的文件
sudo chmod u=rwx,g=rx,o=rx libcudnn.so.6.0.20

sudo ln -s libcudnn.so.6.0.20 libcudnn.so.6

sudo ln -s libcudnn.so.6 libcudnn.so

4.2 Faided to find any matching files for /tmp/resnet_v1_50.ckpt

错误描述: 奇怪令人奔溃的错误只有,只是文件夹的指向不对,按照github上复制的命令需要修改
解决办法: 把训练命令中--pretrained_model_path=/tmp/resnet_v1_50.ckpt 文件路径前的/去掉,改为--pretrained_model_path=tmp/resnet_v1_50.ckpt 如果出现无法找到图片文件,同样的修改方式,把文件路径前的/去掉

4.3 运行eval.py 出现 g++:error :unrecognized command line option ‘-fno-plt’以及 can't compile lanms

错误描述 最让我奔溃的错误,网上分析有说是编译版本问题,更新gcc版本并没有解决问题。鼓捣了一整天,然后在github项目里的issue找到了解决方法。
lanms是作者建立的一个C函数的库(描述可能有错误,大概是这个意思),在eval.py中import lanms,使用lanms来调整boxs,作者们可能是考虑到了编译问题等巴啦巴拉,在代码的上一行作者备注了使用python中自带的函数nms来解决相同的问题,据作者描述可能只是速度的问题。

解决方法:
直接将eval.py文件中100行的boxes = lanms.merge_quadrangle_n9(boxes.astype('float32'), nms_thres)
换作boxes = nms_locality.nms_locality(boxes.astype(np.float64), nms_thres)
使用python函数库而不是lanms的函数库
同时备注掉import lanms。这样就不会出现编译错误又可以运行代码拉。

4.4 test 过程,运行eval.py没有报错,但是在output_dir上也没有对应的输出图片等等。

错误分析: 1、图片就是检测不出来,模型训练的问题以及图片名称问题;
2、output_dir 路径应该和test的图片路径一致(可能只是我这里的问题);

解决方法: 多放点图片(这个只是我的数据集问题),将路径修改为一致,修改后的路径如下:
test命令

python eval.py --test_data_path=tmp/test_images/ --gpu_list=0 --checkpoint_path=tmp/east_icdar2015_resnet_v1_50_rbox/ \ --output_dir=tmp/test_images/