✨专栏介绍: 经过几个月的精心筹备,本作者推出全新系列《深入浅出OCR》专栏,对标最全OCR教程,具体章节如导图所示,将分别从OCR技术发展、方向、概念、算法、论文、数据集等各种角度展开详细介绍。
💙个人主页: GoAI |💚 公众号: GoAI的学习小屋 | 💛交流群: 704932595 |💜个人简介 : 掘金签约作者、百度飞桨PPDE、领航团团长、开源特训营导师、CSDN、阿里云社区人工智能领域博客专家、新星计划计算机视觉方向导师等,专注大数据与人工智能知识分享。
💻文章目录
《深入浅出OCR》前言知识(二):深度学习基础总结 (✨文末深度学习总结导图)
《深入浅出OCR》前言知识(一):机器学习基础总结 (✨文末机器学习总结导图)
《深入浅出OCR》项目实战:文字检测
💻本篇导读:在上一章【《深入浅出OCR》第三章:OCR文字检测】,本人着重介绍文字检测算法的发展、分类及各自领域经典算法,为了进一步熟悉文字检测流程,本次作者将以基于DBNet的文字检测实战为例,全面对文字检测技术流程进行解读,方便学习者快速上手实战。
一、项目简介:
本次实战项目以开源的百度飞桨PaddleOCR为框架,采用主流的检测DBNet算法进行文字检测实战,结合数据增强及模型微调,采用MobileNetV3模型作为骨干网络,进行训练及预测,并且可自己更改其他网络。本人将本次实战流程大致分为环境安装、检测模型与构建、训练与预测及模型导出等部分。
二、数据集介绍:
本次项目数据集以icdar15为例,数据集样例如下。本文参照其标注格式进行检测模型的训练、评估与测试。
注:官方数据~/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等多种系统。
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检测模型介绍
项目链接:algorithm_overview
TPS
small
,large
MobileNetV3
,ResNet
small
,large
SequenceEncoder
,DBFPN
reshape
,fc
,rnn
CTCHead
,DBHead
,ClsHead
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:
六、问题汇总
问:文本行较紧密的情况下如何准确检测?
答:使用DBNet的方法检测密集文本行时,最好收集一批数据进行训练,并在训练时可以将生成二值图像,调小shrink_ratio参数。另外,预测时可适当减小unclip_ratio参数,其参数值与检测框大小成正比。
问:特定文字检测(如车票检测姓名),检测指定区域文字还是检测全部区域再筛选更好?
两个角度来说明一般检测全部区域再筛选更好。
问:针对DB的预处理部分,图片的长和宽为什么要处理成32的倍数?
答:以resnet骨干网络为例,在图像输入网络后,需要经过一共5次2倍降采样,共32倍,因此其原因与下采样的倍数有关,本人建议输入的图像尺寸为32的倍数。
七、总结:
-
针对模型方法,后续可以更换Resnet等骨干网络,提升检测检测效果。
-
后续继续对数据进行增强操作或结合更多相关数据集,增加模型的泛化性;
-
针对不同场景检测效果,可以适当调整DBnet参数(box_thresh、unclip_ratio)和其余参数学习率、Batchsize等。
本篇总结: 本篇主要介绍《深入浅出OCR》实战:基于DBNet的文字检测,以PaddleOCR框架完成文字检测任务,尽可能详细介绍代码及项目流程,如有错误请指正,后续本人也将介绍更多实战项目,欢迎大家交流学习。
参考资料:
PaddleOCR官方教程