当前位置:   article > 正文

基于PaddleOCR史上最全车牌号识别实现(一)_paddleocr车牌识别

paddleocr车牌识别

前言

        最近在做关于字符识别的项目,发现好多人在问关于车牌号识别方案,了解现在最火的文字识别PaddleOCR,发现只使用PaddleOCR就可以达到很好的效果,而且从头到尾只需要动PaddOCR上少许代码,就能达到很好的效果。

        PaddleOCR分为三个模型检测、方向分类和识别,车牌号识别只需用到检测和识别模型即可,而且现在车牌号识别很少能覆盖全部的车牌类型,今天我发布的这个模型将支持蓝牌、黄牌(单行)、绿牌、大型新能源(黄绿)、领使馆车牌、警牌、武警牌(单行)、军牌(单行)、港澳出入境车牌,覆盖极大部分类型的车牌。

准备工作

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

社区版即可

2、在git上下载最新版的PaddleOCR版本,Download PyCharm: Python IDE for Professional Developers by JetBrains

3、导入Pycharm中如下界面:

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

pip install -r requirements.txt

一、车牌号检测模型实现

使用PaddleOCR自带的文字检测功能进行车牌号检测训练,可以不需要加载预训练模型,我们要训练一份只需要能检测出车牌号的模型即可,文章结尾有数据集和检测模型下载地址。

1、导入数据集

目前收集了1万多张左右的真实图片,其中有几千张是手动标注的

 2、创建配置文件

复制一份yml文件,注:Eval.transforms.DetResizeForTest设置resize_long: 960

  1. Global:
  2. use_gpu: true
  3. epoch_num: 1200
  4. log_smooth_window: 20
  5. print_batch_step: 2
  6. save_model_dir: ./output/ch_db_mv3_car/
  7. save_epoch_step: 1200
  8. # evaluation is run every 5000 iterations after the 4000th iteration
  9. eval_batch_step: 1500
  10. cal_metric_during_train: False
  11. pretrained_model: ./pretrained_models/ch_ppocr_mobile_v2.0_det_train/best_accuracy
  12. checkpoints:
  13. save_inference_dir: ./inference/ch_db_mv3_car
  14. use_visualdl: False
  15. infer_img: doc/imgs_en/img_10.jpg
  16. save_res_path: ./output/det_db/predicts_db.txt
  17. Architecture:
  18. model_type: det
  19. algorithm: DB
  20. Transform:
  21. Backbone:
  22. name: MobileNetV3
  23. scale: 0.5
  24. model_name: large
  25. disable_se: True
  26. Neck:
  27. name: DBFPN
  28. out_channels: 96
  29. Head:
  30. name: DBHead
  31. k: 50
  32. Loss:
  33. name: DBLoss
  34. balance_loss: true
  35. main_loss_type: DiceLoss
  36. alpha: 5
  37. beta: 10
  38. ohem_ratio: 3
  39. Optimizer:
  40. name: Adam
  41. beta1: 0.9
  42. beta2: 0.999
  43. lr:
  44. name: Cosine
  45. learning_rate: 0.001
  46. warmup_epoch: 2
  47. regularizer:
  48. name: 'L2'
  49. factor: 0
  50. PostProcess:
  51. name: DBPostProcess
  52. thresh: 0.3
  53. box_thresh: 0.6
  54. max_candidates: 1000
  55. unclip_ratio: 1.5
  56. Metric:
  57. name: DetMetric
  58. main_indicator: hmean
  59. Train:
  60. dataset:
  61. name: SimpleDataSet
  62. data_dir: ./train_data/
  63. label_file_list:
  64. - "./train_data/car1/det_gt_train.txt"
  65. - "./train_data/car2/det_gt_train.txt"
  66. ratio_list: [ 1.0, 1.0 ]
  67. transforms:
  68. - DecodeImage: # load image
  69. img_mode: BGR
  70. channel_first: False
  71. - DetLabelEncode: # Class handling label
  72. - IaaAugment:
  73. augmenter_args:
  74. - { 'type': Fliplr, 'args': { 'p': 0.5 } }
  75. - { 'type': Affine, 'args': { 'rotate': [ -30, 30 ] } }
  76. - { 'type': Resize, 'args': { 'size': [ 0.3, 3 ] } }
  77. - EastRandomCropData:
  78. size: [ 960, 960 ]
  79. max_tries: 50
  80. keep_ratio: true
  81. - MakeBorderMap:
  82. shrink_ratio: 0.4
  83. thresh_min: 0.3
  84. thresh_max: 0.7
  85. - MakeShrinkMap:
  86. shrink_ratio: 0.4
  87. min_text_size: 8
  88. - NormalizeImage:
  89. scale: 1./255.
  90. mean: [ 0.485, 0.456, 0.406 ]
  91. std: [ 0.229, 0.224, 0.225 ]
  92. order: 'hwc'
  93. - ToCHWImage:
  94. - KeepKeys:
  95. keep_keys: [ 'image', 'threshold_map', 'threshold_mask', 'shrink_map', 'shrink_mask' ] # the order of the dataloader list
  96. loader:
  97. shuffle: True
  98. drop_last: False
  99. batch_size_per_card: 2
  100. num_workers: 4
  101. Eval:
  102. dataset:
  103. name: SimpleDataSet
  104. data_dir: ./train_data/
  105. label_file_list:
  106. - "./train_data/car/car1/det_gt_test.txt"
  107. - "./train_data/car/car2/det_gt_test.txt"
  108. ratio_list: [ 1.0, 1.0 ]
  109. transforms:
  110. - DecodeImage: # load image
  111. img_mode: BGR
  112. channel_first: False
  113. - DetLabelEncode: # Class handling label
  114. - DetResizeForTest:
  115. # image_shape: [736, 1280]
  116. resize_long: 960
  117. - NormalizeImage:
  118. scale: 1./255.
  119. mean: [ 0.485, 0.456, 0.406 ]
  120. std: [ 0.229, 0.224, 0.225 ]
  121. order: 'hwc'
  122. - ToCHWImage:
  123. - KeepKeys:
  124. keep_keys: [ 'image', 'shape', 'polys', 'ignore_tags' ]
  125. loader:
  126. shuffle: False
  127. drop_last: False
  128. batch_size_per_card: 1 # must be 1
  129. num_workers: 2
  130. use_shared_memory: False

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_car.yml

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

4、显示运行图

visualdl --logdir=output/ch_db_mv3_car/vdl --port 8081
检测模型效果最高能到达:hmean:0.99

5、验证模型

  1. python tools/infer_det.py -c configs/det/ch_ppocr_v2.0/ch_det_mv3_db_v2.0_car.yml -o Global.pretrained_model="./output/ch_db_mv3_car/best_accuracy"  Global.inf
  2. er_img=C:\Users\YY007\Desktop\car\1.jpg PostProcess.unclip_ratio=1.8

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

    

6、导出模型

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

导出模型验证:

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

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

导出模型进行预测需将这一行禁掉,否则会导致导出模型的预测结果与训练模型的预测结果出现不一致的情况

详细解释在这里:

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

修改方案如下:

文件一:tools/infer/utility.py

添加参数如下参数:

 文件二:tools/infer/predict_det.py

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

deploy/hubserving/ocr_system/params.py

小结

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

数据集下载地址: 

车牌号检测数据集

检测模型下载地址:

车牌号检测模型PP-OCRv2版

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/670421
推荐阅读
相关标签
  

闽ICP备14008679号