PaddleOCR数字仪表识别——3.(New)PaddleOCR迁移学习


安装
参考百度PaddleOCR的 快速安装,记得提前安装gcc就行。(参考 PaddleOCR数字仪表识别——3.paddleocr迁移学习3.1部分)

1. 数据准备

1.1 数据集

参考PaddleOCR数字仪表识别——2(New). textrenderer使用及修改使之符合PaddleOCR数据标准

1.2 字典

PaddleOCR提供了一些默认的字典,位置(PaddleOCR/ppocr/utils/dict/)比如

ppocr/utils/ppocr_keys_v1.txt 是一个包含6623个字符的中文字典,
ppocr/utils/ic15_dict.txt 是一个包含36个字符的英文字典,
ppocr/utils/dict/french_dict.txt 是一个包含118个字符的法文字典
ppocr/utils/dict/japan_dict.txt 是一个包含4399个字符的日文字典

字典的格式也很简单,就是一个txt文件,每行一个字符(会自动 id-char映射)

我的项目只需要进行数字识别,所以字典就是0-9这10个数字。然后把自己的文件放到上面同样的目录里去,这里存在一个坑

根据PaddleOCR Q&A部分
在这里插入图片描述
所以修改字典后,其实就不是迁移学习了,而是重新训练

2. 启动训练

2.1 确定模型和对应的配置文件

之前训练使用的预训练模型是:

模型骨干网络Avg Accuracy模型存储命名
CRNNMobileNetV379.37%rec_mv3_none_bilstm_ctc
配置文件用的是:
配置文件算法名称backbonetrans
rec_icdar15_train.ymlCRNNMobilenet_v3 large 0.5None

之前是2400张图,训练了1000次,在测试集上准确率都是1了。

2.1.1 选择的模型

根据 PaddleOCR-算法介绍部分的文档
在这里插入图片描述
推荐使用CRNN(考虑到稳定性),还是使用CRNN,CRNN支持的配置文件也最多,这次用下面的这个试试看(骨干网络变了,准确率高了3%左右):

模型骨干网络Avg Accuracy模型存储命名
CRNNResnet34_vd82.20%rec_r34_vd_none_bilstm_ctc

下载并解压该模型

cd PaddleOCR/
# 下载MobileNetV3的预训练模型
wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/rec_r34_vd_none_bilstm_ctc.tar
# 解压模型参数
cd pretrain_models
tar -xf rec_r34_vd_none_bilstm_ctc.tar && rm -rf rec_r34_vd_none_bilstm_ctc.tar

查看解压后的文件夹,有三个文件

(py37) root@hsh:XXXX$ ls
best_accuracy.pdmodel  best_accuracy.pdopt  best_accuracy.pdparams

2.1.2 选择的配置文件

可选的配置文件有:

配置文件算法名称backbonetransseqpred
rec_chinese_common_train_v1.1.ymlCRNNResNet34_vdNoneBiLSTMctc
rec_chinese_common_train.ymlCRNNResNet34_vdNoneBiLSTMctc
rec_r34_vd_none_bilstm_ctc.ymlCRNNResnet34_vdNoneBiLSTMctc
大概看一下三者的区别,确实挺多参数不一样的,选一个和自己最靠近的,这样改的少一点(反正模型都是那个)

参考:PaddleOCR-可选参数列表

最终决定选择rec_chinese_common_train_v1.1.yml这个,因为这个看起来略复杂一点,而且跟我之前使用的配置文件最后学习率那块比较像。

rec_chinese_common_train_v1.1.yml修改后如下
(注意 yml每个字段冒号后面加个空格 再跟着值 )
我这里只训练300轮

Global:
  use_gpu: false
  epoch_num: 300
  save_model_dir: ./output/rec_CRNN_r34
  image_shape: [3, 32, 200]
  eval_batch_step: 500
  max_text_length: 8
  character_dict_path: ./ppocr/utils/num_dict.txt
  distort: false #是否使用数据增强,只有gpu才支持,如果是cpu的话,写true也白搭,还会多给一个warning信息 
  reader_yml: ./configs/rec/rec_chinese_reader.yml
  # reader文件也要修改 后面再改
  pretrain_weights: ./pretrain_models/rec_r34_vd_none_bilstm_ctc/best_accuracy
  total_epoch: 300
  # total_epoch	总共迭代多少个epoch, cosine_decay/cosine_decay_warmup时有效	默认值1000	与Global.epoch_num 一致 

rec_chinese_reader.yml修改后如下

#trainreader
img_set_dir: ./train_data/num_data
label_file_path: ./train_data/num_data_02/train.txt
#evalreader
 img_set_dir: ./train_data/num_data
 label_file_path: ./train_data/num_data_02/test.txt

2.2 训练及评估

2.2.1 训练

> export CPU_NUM=1
> python3 tools/train.py -c configs/rec/ch_ppocr_v1.1/rec_chinese_common_train_v1.1.yml 2>&1 | tee train_rec.log
# 如果要查看完整的训练记录信息可以去这个log文件里看
# 然后再决定使用哪个模型去进行推理/测试

运行第二条命令后,会弹出一大堆提示说明信息
(这个模型比上次的要复杂许多,而且训练数据量翻了五倍。。从2400→10240 虽然训练次数从1000→300,但是每轮训练的时间变长了,从3-5分钟→35分钟,翻了7倍多。。)
出了一个训练结果就证明配置各种都没错,等它自己慢慢跑吧,关了。

然后还是按照之前训练时候使用screen的方式

screen -S train
# 然后在这里执行要训练的脚本
python3 XXX
# 然后
screen -d train #就是把这个会话从attached变成deattached 挂起
# 快捷键是 ctrl+a d 然后会提示类似下面的文字
[detached from 70971.train]
# 之后要恢复到这个会话就是
screen -r train 

# 训练结束要结束这个会话的话 进入这个会话中 输入
exit 

由于训练过程中命令行基本失效(输入无响应),所以还是用快捷键来完成。

快捷键用途
ctrl+a切换到之前显示的窗口
Ctrl+a d暂时断开screen会话

最常用的就是
screen -d XXX挂起XX这个会话
screen -r XXX 恢复XX这个会话

2.2.2 运行过程

在这里插入图片描述
速度不是一般的感人,哈哈哈。
在这里插入图片描述
我想有台GPU服务器,一天过去了,哈哈哈
在这里插入图片描述
两天了,才epoch10.。。。。要30呢,哎。。。但是开始有准确率了
算是个好事吧(希望后面会快一点???)
在这里插入图片描述
这个准确率上升的速度,可怕,早知道就不训练300轮了,100轮可能都够了
在这里插入图片描述
这个已经很低了。。。。基本可以考虑终止训练了,先把上面那个模型保存一下好了。
一直到epoch 29,acc都是1了,但是loss却慢慢变高了。。。上图可以看到epoch21的时候 loss才40多,但是到了epoch30的时候,loss就变成378多了,开始上升了,,,尴尬
打开目录才发现:原来不是覆盖式的保存,(只有best_accuracy这个文件是覆盖式保存,但是训练的会保存,每3个epoch保存一次 是由这个参数 save_epoch_step 设置模型保存间隔 3 控制的。)
在这里插入图片描述
也是按照epoch次数保存的

2.2.3 问题

经过同事大佬指点后,大概发现了问题是:PaddleOCR如果修改了待识别的字符词典,即网络的最后一层分类数被修改,则根据PaddleOCR中的Q&A,其实网络就重新训练了,不是迁移训练了。所以对于CRNN网络,使用几千张图去训练一个模型,很容易就过拟合了,包括这次使用了2w张图片,其实也没差。
因为可以看到,其他那些被公开出来的文字识别模型都是几十万图片训练的。。。

所以要考虑的是:如何使用PaddleOCR实现真正的迁移训练。之后的内容参考
3. 我又来撞南墙了

2.3 预测部署

2.3.1 基于Python脚本预测引擎推理

主要涉及到模型的转换,checkpoint模型转换成inference模型,推理会更快,主要参考PaddleOCR文档-基于Python预测引擎推理

3. 我又来撞南墙了

3.1 心理建设

3.2 挖掘Github信息


  • PaddleHub教程合集

  • 目前可以找到的关于PaddleOCR训练的东西:

    • X死路 AI studio-PaddleOCR:中文场景文字识别:这个干的事情基本和我之前一样,只是全部在jupyter上,看起来比我清晰很多,哎。
      • 试试看好了,看在百度提供的GPU上跑一边要多久,然后报错了。。。即便用GPU,算了
    • 惊喜Surprise-Paddle2.0-OCR实现验证码识别(CTC):不是迁移学习,1w长图片,训练出的模型,虽然生产的是验证码图片,但是贵在数量多啊。 虽然验证码图片也是从别人网站爬的,但是给我了一点启发,与其用那个textRenderer,还不如我自己写一个呢,封装可能没那么好,但是起码我改或者加功能都很方便。

感触

Github上的维护人员测试了一些模型,发布上去了,但是用户自己疏忽不按照操作,出了一些需要复现才明白的错误,去问,服务真的是件很难的事情哦。况且神经网络就是黑盒,难道不只能说一些可能的结果吗?

  1. 提问者中文,回复就是中文,提问者英文,回复就是英文,真是难为程序员了。