深入浅出OCR:基于DBNet的文字检测实战

释放双眼,带上耳机,听听看~!
本文介绍了基于DBNet算法的文字检测实战项目,使用PaddleOCR框架进行环境安装、模型构建、训练与预测,以及icdar15数据集的介绍和标注格式。

深入浅出OCR:基于DBNet的文字检测实战

深入浅出OCR:基于DBNet的文字检测实战

专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。

💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 704932595 |💜个人简介 : 掘金签约作者、百度飞桨PPDE、领航团团长、开源特训营导师、CSDN、阿里云社区人工智能领域博客专家、新星计划计算机视觉方向导师等,专注大数据与人工智能知识分享。

💻文章目录

《深入浅出OCR》前言知识(二):深度学习基础总结 (✨文末深度学习总结导图)

《深入浅出OCR》前言知识(一):机器学习基础总结 (✨文末机器学习总结导图)

《深入浅出OCR》第一章:OCR技术导论

《深入浅出OCR》第二章:OCR技术发展与分类

《深入浅出OCR》第三章:OCR文字检测

《深入浅出OCR》项目实战:文字检测

💻本篇导读:在上一章【《深入浅出OCR》第三章:OCR文字检测】,本人着重介绍文字检测算法的发展、分类及各自领域经典算法,为了进一步熟悉文字检测流程,本次作者将以基于DBNet的文字检测实战为例,全面对文字检测技术流程进行解读,方便学习者快速上手实战。

一、项目简介:

本次实战项目以开源的百度飞桨PaddleOCR为框架,采用主流的检测DBNet算法进行文字检测实战,结合数据增强及模型微调,采用MobileNetV3模型作为骨干网络,进行训练及预测,并且可自己更改其他网络。本人将本次实战流程大致分为环境安装、检测模型与构建、训练与预测及模型导出等部分。

二、数据集介绍:

本次项目数据集以icdar15为例,数据集样例如下。本文参照其标注格式进行检测模型的训练、评估与测试。

深入浅出OCR:基于DBNet的文字检测实战

注:官方数据~/icdar2015/text_localization 有两个文件夹和两个文件,分别是:

~/icdar2015/text_localization 
  └─ icdar__train_imgs/         icdar数据集的训练数据
  └─ test_images/             icdar数据集的测试数据
  └─ train_icdar2015_label.txt    icdar数据集的训练标注
  └─ test_icdar2015_label.txt     icdar数据集的测试标注

官方提供的标注文件格式为:

" 图像文件名                    json.dumps编码的图像标注信息"
test_images/img_10.jpg    [{"transcription": "data", "points": [[210, 101], [316, 142], [418, 216], [313, 178]], ...}]

json.dumps编码前的图像标注信息是包含多个字典的list,字典中的pointspoints表示文本框的四个点的坐标(x, y),从左上角的点开始顺时针排列。
transcriptiontranscription表示当前文本框的文字,在文本检测任务中并不需要这个信息。

三、框架介绍与环境安装

3.1 PaddleOCR框架

PaddleOCR框架: 链接

PaddleOCR是一款超轻量、中英文识别模型,目标是打造丰富、领先、实用的文本识别模型,支持服务器及各类终端上进行部署,支持中英文识别;支持多角度方向文字识别,同时可运行于Linux、Windows、MacOS等多种系统。

深入浅出OCR:基于DBNet的文字检测实战

3.2 项目环境克隆

本次项目环境需要先克隆PaddleOCR项目,具体命令:

!cd ~/work && git clone -b develop <https://gitee.com/paddlepaddle/PaddleOCR.git>

3.3 安装PaddleOCR环境

其次,需要安装PaddleOCR项目提供环境文件requirements.txt,具体命令:

!pip install -r ./requirements.txt && python setup.py install

3.4 解压数据集

解压训练集与测试集

!cd ~/data/data62842/ && unzip train_images.zip
!cd ~/data/data62843/ && unzip test_images.zip

 四、DBNet检测模型介绍

论文连接:arxiv.org/pdf/1911.08…

项目链接:algorithm_overview

Transform 设置变换方式 – 目前仅rec类型的算法支持, 具体见ppocr/modeling/transform name 变换方式类名 TPS 目前支持TPS num_fiducial TPS控制点数 20 上下边各十个 loc_lr 定位网络学习率 0.1 model_name 定位网络大小 small 目前支持small,large Backbone 设置网络backbone类名 – 具体见ppocr/modeling/backbones name backbone类名 ResNet 目前支持MobileNetV3,ResNet layers resnet层数 34 支持18,34,50,101,152,200 model_name MobileNetV3 网络大小 small 支持small,large Neck 设置网络neck – 具体见ppocr/modeling/necks name neck类名 SequenceEncoder 目前支持SequenceEncoder,DBFPN encoder_type SequenceEncoder编码器类型 rnn 支持reshape,fc,rnn hidden_size rnn内部单元数 48 out_channels DBFPN输出通道数 256 Head 设置网络Head – 具体见ppocr/modeling/heads name head类名 CTCHead 目前支持CTCHead,DBHead,ClsHead fc_decay CTCHead正则化系数 0.0004 k DBHead二值化系数 50 class_dim ClsHead输出分类数 2

Loss损失

字段 用途 默认值 备注
name 网络loss类名 CTCLoss 目前支持CTCLoss,DBLoss,ClsLoss
balance_loss DBLossloss中是否对正负样本数量进行均衡(使用OHEM) True
ohem_ratio DBLossloss中的OHEM的负正样本比例 3
main_loss_type DBLossloss中shrink_map所采用的的loss DiceLoss 支持DiceLoss,BCELoss
alpha DBLossloss中shrink_map_loss的系数 5
beta DBLossloss中threshold_map_loss的系数 10

后处理PostProcess

字段 用途 默认值 备注
name 后处理类名 CTCLabelDecode 目前支持CTCLoss,AttnLabelDecode,DBPostProcess,ClsPostProcess
thresh DBPostProcess中分割图进行二值化的阈值 0.3
box_thresh DBPostProcess中对输出框进行过滤的阈值,低于此阈值的框不会输出 0.7
max_candidates DBPostProcess中输出的最大文本框数量 1000
unclip_ratio DBPostProcess中对文本框进行放大的比例 2.0

 五、训练与预测

5.1 训练检测模型

第一,我们需要修改检测配置configs/det/det_mv3_db.yml文件中Train和Eval数据集的图片路径data_dir和标签路径label_file_list

其次,如果您安装的是paddle cpu版本,需要将det_mv3_db.yml配置文件中的use_gpu字段修改为false.

根据修改后的配置文件,输入以下命令就可以开始训练。

!pwd
!cd ~/work/PaddleOCR && python tools/train.py -c configs/rec/my_rec_ch_train.yml

5.2导出模型

通过export_model.py导出模型,设置配置文件及导出路径。

将训练好的模型转换成inference模型命令如下:

!python tools/export_model.py 
        -c configs/det/det_mv3_db.yml 
        -o Global.pretrained_model=./output/db_mv3/best_accuracy 
        Global.save_inference_dir=./inference/db_mv3/

5.3预测结果

修改模型路径,运行predict.py:

深入浅出OCR:基于DBNet的文字检测实战

六、问题汇总

问:文本行较紧密的情况下如何准确检测?

答:使用DBNet的方法检测密集文本行时,最好收集一批数据进行训练,并在训练时可以将生成二值图像,调小shrink_ratio参数。另外,预测时可适当减小unclip_ratio参数,其参数值与检测框大小成正比。

问:特定文字检测(如车票检测姓名),检测指定区域文字还是检测全部区域再筛选更好?

两个角度来说明一般检测全部区域再筛选更好。

问:针对DB的预处理部分,图片的长和宽为什么要处理成32的倍数?

答:以resnet骨干网络为例,在图像输入网络后,需要经过一共5次2倍降采样,共32倍,因此其原因与下采样的倍数有关,本人建议输入的图像尺寸为32的倍数。

七、总结:

  1. 针对模型方法,后续可以更换Resnet等骨干网络,提升检测检测效果。

  2. 后续继续对数据进行增强操作或结合更多相关数据集,增加模型的泛化性;

  3. 针对不同场景检测效果,可以适当调整DBnet参数(box_thresh、unclip_ratio)和其余参数学习率、Batchsize等。

本篇总结: 本篇主要介绍《深入浅出OCR》实战:基于DBNet的文字检测,以PaddleOCR框架完成文字检测任务,尽可能详细介绍代码及项目流程,如有错误请指正,后续本人也将介绍更多实战项目,欢迎大家交流学习。

参考资料
PaddleOCR官方教程

本网站的内容主要来自互联网上的各种资源,仅供参考和信息分享之用,不代表本网站拥有相关版权或知识产权。如您认为内容侵犯您的权益,请联系我们,我们将尽快采取行动,包括删除或更正。
AI教程

Meta发布Llama 2: Hugging Face全面支持,模型许可证、预训练词元数排行榜详解

2023-11-21 10:01:14

AI教程

AI助手制定旅行计划 - AI Travel项目介绍

2023-11-21 10:14:14

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索