基于PaddleOCR银行卡识别实现(一)

目录

前言

一、PaddleOCR环境搭建

二、银行卡检测模型实现

1、导入数据集

2、创建配置文件

3、执行命令进行GPU训练

4、显示运行图

5、验证模型

6、导出模型

解决训练模型与导出模型结果不一致问题 

小结



前言


最近在做关于字符识别的项目,发现好多人在问关于银行卡识别方案,了解现在最火的文字识别PaddleOCR,发现只使用PaddleOCR就可以达到很好的效果,而且从头到尾不需要动PaddOCR上的任何代码,PaddleOCR分为三个模型检测、方向分类和识别,银行卡识别只需用到检测和识别模型即可,我们就先将将检测模型的训练和实现。

一、PaddleOCR环境搭建

建议使用PyCharm进行开发,Download PyCharm: Python IDE for Professional Developers by JetBrains

社区版即可

在git上下载最新版的版本

github.com

导入Pycharm中如下界面:

切换到2.3目录,执行下面的命令,安装环境:

 pip install -r requirements.txt

二、银行卡检测模型实现

使用PaddleOCR自带的文字检测功能进行银行卡号检测训练,但不需要加载预训练模型,我们要训练一份只需要能检测出卡号的模型即可

1、导入数据集

目前收集了3000多张左右的真实图片,并进行了卡号标注,文章结尾有下载地址

2、创建配置文件

复制一份yml文件

        

文件内容如下: 

Global:
  use_gpu: true
  epoch_num: 1200
  log_smooth_window: 20
  print_batch_step: 2
  save_model_dir: ./output/ch_db_mv3_bank/
  save_epoch_step: 1200
  # evaluation is run every 5000 iterations after the 4000th iteration
  eval_batch_step: 1500
  cal_metric_during_train: False
  pretrained_model: 
  checkpoints:
  save_inference_dir: ./inference/ch_db_mv3_bank
  use_visualdl: False
  infer_img: doc/imgs_en/img_10.jpg
  save_res_path: ./output/det_db/predicts_db.txt

Architecture:
  model_type: det
  algorithm: DB
  Transform:
  Backbone:
    name: MobileNetV3
    scale: 0.5
    model_name: large
    disable_se: True
  Neck:
    name: DBFPN
    out_channels: 96
  Head:
    name: DBHead
    k: 50

Loss:
  name: DBLoss
  balance_loss: true
  main_loss_type: DiceLoss
  alpha: 5
  beta: 10
  ohem_ratio: 3

Optimizer:
  name: Adam
  beta1: 0.9
  beta2: 0.999
  lr:
    name: Cosine
    learning_rate: 0.001
    warmup_epoch: 2
  regularizer:
    name: 'L2'
    factor: 0

PostProcess:
  name: DBPostProcess
  thresh: 0.3
  box_thresh: 0.6
  max_candidates: 1000
  unclip_ratio: 1.5

Metric:
  name: DetMetric
  main_indicator: hmean

Train:
  dataset:
    name: SimpleDataSet
    data_dir: ./train_data/
    label_file_list:
        - "./train_data/bank/bank1/real_det_train.txt"
        - "./train_data/bank/bank2/real_det_train.txt"
        - "./train_data/bank/bank3/real_det_train.txt"
    ratio_list: [ 1.0, 1.0 , 1.0 ]
    transforms:
      - DecodeImage: # load image
          img_mode: BGR
          channel_first: False
      - DetLabelEncode: # Class handling label
      - IaaAugment:
          augmenter_args:
            - { 'type': Fliplr, 'args': { 'p': 0.5 } }
#            - { 'type': Affine, 'args': { 'rotate': [-10, 10] } }
            - { 'type': Affine, 'args': { 'rotate': [ -30, 30] } }
            - { 'type': Resize, 'args': { 'size': [ 0.5, 3 ] } }
      - EastRandomCropData:
          size: [ 960, 960 ]
          max_tries: 50
          keep_ratio: true
      - MakeBorderMap:
          shrink_ratio: 0.4
          thresh_min: 0.3
          thresh_max: 0.7
      - MakeShrinkMap:
          shrink_ratio: 0.4
          min_text_size: 8
      - NormalizeImage:
          scale: 1./255.
          mean: [ 0.485, 0.456, 0.406 ]
          std: [ 0.229, 0.224, 0.225 ]
          order: 'hwc'
      - ToCHWImage:
      - KeepKeys:
          keep_keys: [ 'image', 'threshold_map', 'threshold_mask', 'shrink_map', 'shrink_mask' ] # the order of the dataloader list
  loader:
    shuffle: True
    drop_last: False
    batch_size_per_card: 2
    num_workers: 4

Eval:
  dataset:
    name: SimpleDataSet
    data_dir: ./train_data/
    label_file_list:
      - "./train_data/bank/bank1/real_det_test.txt"
      - "./train_data/bank/bank2/real_det_test.txt"
      - "./train_data/bank/bank3/real_det_test.txt"
    ratio_list: [ 1.0, 1.0 ,1.0 ]
    transforms:
      - DecodeImage: # load image
          img_mode: BGR
          channel_first: False
      - DetLabelEncode: # Class handling label
      - DetResizeForTest:
      #           image_shape: [736, 1280]
          resize_long: 960
      - NormalizeImage:
          scale: 1./255.
          mean: [ 0.485, 0.456, 0.406 ]
          std: [ 0.229, 0.224, 0.225 ]
          order: 'hwc'
      - ToCHWImage:
      - KeepKeys:
          keep_keys: [ 'image', 'shape', 'polys', 'ignore_tags' ]
  loader:
    shuffle: False
    drop_last: False
    batch_size_per_card: 1 # must be 1
    num_workers: 2

3、执行命令进行GPU训练

python -m paddle.distributed.launch --gpus 0 tools/train.py -o Global.use_visualdl=True -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0_bank.yml

注意显存问题,需要大于4G的显存,2G显存会溢出

4、显示运行图

visualdl --logdir=output/ch_db_mv3_bank/vdl --port 8081

检测模型效果最高能到达:hmean:0.98271 

5、验证模型

python tools/infer_det.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0_bank.yml -o Global.pretrained_model="./output/ch_db_mv3_bank/best_accuracy"  Global.inf
er_img=C:\Users\YY007\Desktop\bank\1.jpg PostProcess.unclip_ratio=2.5

效果如下,左边原图,右边检测效果图:

6、导出模型

python tools/export_model.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0_bank.yml -o Global.pretrained_model="./output/ch_db_mv3_bank/best_accuracy" Global.save
_inference_dir="./inference/ch_db_mv3_bank/"

 

 导出模型验证:

python tools/infer/predict_det.py --det_algorithm="DB" --det_model_dir="./inference/ch_db_mv3_bank/" --image_dir="C:\Users\YY007\Desktop\bank\1.jpg" --use_gpu=True
--det_db_unclip_ratio=2.5

解决训练模型与导出模型结果不一致问题 

导出模型进行预测需将这一行禁掉,否则会导致导出模型的预测结果与训练模型的预测结果出现不一致的情况,官方截至到2.3版本还未解决此问题

详细解释在这里:

关于文字检测训练模型和导出模型效果不一样的问题 · Issue #4371 · PaddlePaddle/PaddleOCR (github.com)

修改方案如下:

文件一:tools/infer/utility.py

添加参数如下参数:

文件二:tools/infer/predict_det.py

其他文件:修改部署预测文件,以hubserving部署为例:

deploy/hubserving/ocr_system/params.py

 

小结

 到这一步,银行卡检测模型就完成了,总体上讲效果还可以,如果需要更好的检测效果,可以更换更深的神经网络,或者通过语义分割来实现,下一章我们讲讲银行卡识别模型训练【基于PaddleOCR银行卡识别实现(二)】。

数据集下载地址:

3000多张银行卡号已标注文本检测数据集

  • 6
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

番茄小能手

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值