• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

PaddleOCR史上车牌号识别实现一

武飞扬头像
番茄小能手
帮助1

前言

        最近在做关于字符识别的项目,发现好多人在问关于车牌号识别方案,了解现在最火的文字识别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.  
     
  18.  
    Architecture:
  19.  
    model_type: det
  20.  
    algorithm: DB
  21.  
    Transform:
  22.  
    Backbone:
  23.  
    name: MobileNetV3
  24.  
    scale: 0.5
  25.  
    model_name: large
  26.  
    disable_se: True
  27.  
    Neck:
  28.  
    name: DBFPN
  29.  
    out_channels: 96
  30.  
    Head:
  31.  
    name: DBHead
  32.  
    k: 50
  33.  
     
  34.  
    Loss:
  35.  
    name: DBLoss
  36.  
    balance_loss: true
  37.  
    main_loss_type: DiceLoss
  38.  
    alpha: 5
  39.  
    beta: 10
  40.  
    ohem_ratio: 3
  41.  
     
  42.  
    Optimizer:
  43.  
    name: Adam
  44.  
    beta1: 0.9
  45.  
    beta2: 0.999
  46.  
    lr:
  47.  
    name: Cosine
  48.  
    learning_rate: 0.001
  49.  
    warmup_epoch: 2
  50.  
    regularizer:
  51.  
    name: 'L2'
  52.  
    factor: 0
  53.  
     
  54.  
    PostProcess:
  55.  
    name: DBPostProcess
  56.  
    thresh: 0.3
  57.  
    box_thresh: 0.6
  58.  
    max_candidates: 1000
  59.  
    unclip_ratio: 1.5
  60.  
     
  61.  
    Metric:
  62.  
    name: DetMetric
  63.  
    main_indicator: hmean
  64.  
     
  65.  
    Train:
  66.  
    dataset:
  67.  
    name: SimpleDataSet
  68.  
    data_dir: ./train_data/
  69.  
    label_file_list:
  70.  
    - "./train_data/car1/det_gt_train.txt"
  71.  
    - "./train_data/car2/det_gt_train.txt"
  72.  
    ratio_list: [ 1.0, 1.0 ]
  73.  
    transforms:
  74.  
    - DecodeImage: # load image
  75.  
    img_mode: BGR
  76.  
    channel_first: False
  77.  
    - DetLabelEncode: # Class handling label
  78.  
    - IaaAugment:
  79.  
    augmenter_args:
  80.  
    - { 'type': Fliplr, 'args': { 'p': 0.5 } }
  81.  
    - { 'type': Affine, 'args': { 'rotate': [ -30, 30 ] } }
  82.  
    - { 'type': Resize, 'args': { 'size': [ 0.3, 3 ] } }
  83.  
    - EastRandomCropData:
  84.  
    size: [ 960, 960 ]
  85.  
    max_tries: 50
  86.  
    keep_ratio: true
  87.  
    - MakeBorderMap:
  88.  
    shrink_ratio: 0.4
  89.  
    thresh_min: 0.3
  90.  
    thresh_max: 0.7
  91.  
    - MakeShrinkMap:
  92.  
    shrink_ratio: 0.4
  93.  
    min_text_size: 8
  94.  
    - NormalizeImage:
  95.  
    scale: 1./255.
  96.  
    mean: [ 0.485, 0.456, 0.406 ]
  97.  
    std: [ 0.229, 0.224, 0.225 ]
  98.  
    order: 'hwc'
  99.  
    - ToCHWImage:
  100.  
    - KeepKeys:
  101.  
    keep_keys: [ 'image', 'threshold_map', 'threshold_mask', 'shrink_map', 'shrink_mask' ] # the order of the dataloader list
  102.  
    loader:
  103.  
    shuffle: True
  104.  
    drop_last: False
  105.  
    batch_size_per_card: 2
  106.  
    num_workers: 4
  107.  
     
  108.  
    Eval:
  109.  
    dataset:
  110.  
    name: SimpleDataSet
  111.  
    data_dir: ./train_data/
  112.  
    label_file_list:
  113.  
    - "./train_data/car/car1/det_gt_test.txt"
  114.  
    - "./train_data/car/car2/det_gt_test.txt"
  115.  
    ratio_list: [ 1.0, 1.0 ]
  116.  
    transforms:
  117.  
    - DecodeImage: # load image
  118.  
    img_mode: BGR
  119.  
    channel_first: False
  120.  
    - DetLabelEncode: # Class handling label
  121.  
    - DetResizeForTest:
  122.  
    # image_shape: [736, 1280]
  123.  
    resize_long: 960
  124.  
    - NormalizeImage:
  125.  
    scale: 1./255.
  126.  
    mean: [ 0.485, 0.456, 0.406 ]
  127.  
    std: [ 0.229, 0.224, 0.225 ]
  128.  
    order: 'hwc'
  129.  
    - ToCHWImage:
  130.  
    - KeepKeys:
  131.  
    keep_keys: [ 'image', 'shape', 'polys', 'ignore_tags' ]
  132.  
    loader:
  133.  
    shuffle: False
  134.  
    drop_last: False
  135.  
    batch_size_per_card: 1 # must be 1
  136.  
    num_workers: 2
  137.  
    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车牌号识别实现(二)】模型训练。

数据集下载地址:

车牌号检测和识别数据集

检测模型下载地址:

车牌号检测模型

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghafej
系列文章
更多 icon
同类精品
更多 icon
继续加载