目录

1--前言

2--生成车牌数据集

3--构建车牌数据集标签

4--自定义字典

5--训练模型

6--模型转换和推理

7--模型转换为onnx模型

8--参考


1--前言

①系统:Ubuntu18.04

②Cuda:11.0

③CudaNN:8.04

④配置Paddle环境

2--生成车牌数据集

①具体可见GitHub项目:Github生成车牌数据集

#coding=utf-8
import random
import numpy as npfrom PlateCommon import *if __name__ == "__main__":import all_kinds_plate
else:from . import all_kinds_platedef aug_generate(com):# cv2.imwrite('03.jpg', com)com = rot(com, r(20)-10, com.shape, 10) # 矩形-->平行四边形# cv2.imwrite('04.jpg', com)com = rotRandrom(com, 5, (com.shape[1], com.shape[0])) # 旋转# cv2.imwrite('05.jpg', com)com = tfactor(com) # 调灰度# cv2.imwrite('06.jpg', com)com, loc = random_scene(com, "./background")    # 放入背景中# com,loc = random_scene_dangerous(com,"./dangerous_background") #针对黄牌大货车带危险品字样识别不好的情况进行特点生成if com is None or loc is None:return None, None# cv2.imwrite('07.jpg', com)com = AddGauss(com, 5) # 加高斯平滑# cv2.imwrite('08.jpg', com)com = addNoise(com)         # 加噪声# cv2.imwrite('09.jpg', com)return com, locclass Draw:_draw = [all_kinds_plate.BlackPlate(),all_kinds_plate.BluePlate(),all_kinds_plate.GreenPlate(),all_kinds_plate.YellowPlate(),all_kinds_plate.WhitePlate(),all_kinds_plate.SpecialPlate(),all_kinds_plate.RedPlate(),all_kinds_plate.RedPlate1(),]_provinces = ["皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新"]_alphabets = ["A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]_ads = ["A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9"]def __call__(self):draw = random.choice(self._draw)candidates = [self._provinces, self._alphabets]if type(draw) == all_kinds_plate.GreenPlate:candidates += [self._ads] * 6label = "".join([random.choice(c) for c in candidates])return draw(label, random.randint(0, 1)), labelelif type(draw) == all_kinds_plate.BlackPlate:if random.random() < 0.5:candidates += [self._ads] * 4candidates += [["港", "澳"]]else:candidates += [self._ads] * 5label = "".join([random.choice(c) for c in candidates])return draw(label), labelelif type(draw) == all_kinds_plate.YellowPlate:if random.random() < 0.1:candidates += [self._ads] * 4candidates += [["学"]]else:candidates += [self._ads] * 5label = "".join([random.choice(c) for c in candidates])return draw(label), labelelif type(draw) == all_kinds_plate.WhitePlate:candidates += [self._ads] * 4candidates += [["警"]]label = "".join([random.choice(c) for c in candidates])return draw(label), labelelif type(draw) == all_kinds_plate.SpecialPlate:candidates = [self._alphabets, self._alphabets]candidates += [self._ads] * 5label = "".join([random.choice(c) for c in candidates])return draw(label), labelelse:candidates += [self._ads] * 5label = "".join([random.choice(c) for c in candidates])return draw(label), labelif __name__ == "__main__":import mathimport argparseimport matplotlib.pyplot as pltimport cv2parser = argparse.ArgumentParser(description="Random generate all kinds of chinese plate.")parser.add_argument("--num", help="set the number of plates (default: 9)", type=int, default=10000)parser.add_argument("--savepath", help="savepath", type=str, default="./Save_Result/train_dataset")args = parser.parse_args()draw = Draw()for i in range(args.num):plate, label = draw()print(label)img = cv2.cvtColor(plate,cv2.COLOR_RGB2BGR)img,loc = aug_generate(img)path = os.path.join(args.savepath,label+".jpg")cv2.imwrite(path,img)

②终端调用:

# --num 表示生成的车牌数目
# --savepath 生成车牌数据集存放的位置
python main.py --num 10000 --savepath ./Save_Result/train_dataset

这里博主生成10000个车牌作为训练集,1000个车牌作为测试集:

python main.py --num 10000 --savepath ./Save_Result/train_dataset
python main.py --num 1000  --savepath ./Save_Result/test_dataset

3--构建车牌数据集标签

①参考官方文档对于自制数据集的规定:

②标签构建代码:

import ospaths = os.listdir('./Save_Result')
for path in paths:count = 0total = []for item in os.listdir(os.path.join('./Save_Result', path)):if item[-3:] == 'jpg':#new_path = os.path.join('./CPDD_Dataset', path, item) # train_data_pathnew_path = os.path.join(item)line = new_path+'\t' + item[:-4]line = line[:] + '\n'total.append(line)count = count + 1print(count)with open('./Save_Result/'+path+'.txt', 'w', encoding='UTF-8') as f:for line in total:f.write(line)

③结果展示:

其中train_dataset存在车牌图片,txt文件存放标签,txt文件内容如下图所示,第一项是路径,第二项是标签,符合官方文档要求。

4--自定义字典

注:若使用默认提供的字典,可能会导致预测新数据时,出现不属于车牌的字符,因为默认字典拥有6000+字符。

①官方文档对于自制字典的要求:

②自制车牌字典的代码:

dic_list = ["A","B","C","D","E","F","G","H","J","K","L","M","N","P","Q","R","S","T","U","V","W","X","Y","Z","0","1","2","3","4","5","6","7","8","9","皖", "沪", "津", "渝", "冀","晋", "蒙", "辽", "吉", "黑","苏", "浙", "京", "闽", "赣","鲁", "豫", "鄂", "湘", "粤","桂", "琼", "川", "贵", "云","西", "陕", "甘", "青", "宁","新", "港", "澳", "学", "警"
]with open('./dictionary_dir/' + 'dic_license_plate' + '.txt', 'w', encoding='UTF-8') as f:for line in dic_list:if line == "警":f.write(line)else:f.write(line + '\n')

5--训练模型

①下载PaddleOCR源码:PaddleOCR项目源码

②下载CRNN识别模型,放在新建的pretrain_models文件夹中。

# 进入下载的OCR源码项目
# cd PaddleOCR/# 下载MobileNetV3的预训练模型
wget -P ./pretrain_models/ https://paddleocr.bj.bcebos.com/dygraph_v2.0/en/rec_mv3_none_bilstm_ctc_v2.0_train.tar# 解压模型参数
cd pretrain_models  # 进入新建的pretrain_models文件夹
tar -xf rec_mv3_none_bilstm_ctc_v2.0_train.tar && rm -rf rec_mv3_none_bilstm_ctc_v2.0_train.tar

③配置yml文件:

参考官方文档提供的yml文件:rec_chinese_lite_train_v2.0.yml

这里提供博主的设置:

Global:use_gpu: trueepoch_num: 200  # epoch数目log_smooth_window: 20print_batch_step: 10save_model_dir: /civi/license_plate_model/train10000_test1000save_epoch_step: 5 # 保存模型的间隔# evaluation is run every 5000 iterations after the 4000th iterationeval_batch_step: [0, 2000]cal_metric_during_train: Truepretrained_model: /civi/PaddleOCR-release-2.4/pretrain_models/rec_mv3_none_bilstm_ctc_v2.0_train # 预训练模型的地址checkpoints:save_inference_dir:use_visualdl: Falseinfer_img: /civi/generate_chinese_license_plate-master/Prediction_file/LMWWEZ9.jpg # 预测图片# for data or label processcharacter_dict_path: /civi/generate_chinese_license_plate-master/dictionary_dir/dic_license_plate.txtmax_text_length: 25infer_mode: Falseuse_space_char: Truesave_res_path: /civi/license_plate_model/train10000_test1000/rec/rec.txtOptimizer:name: Adambeta1: 0.9beta2: 0.999lr:name: Cosinelearning_rate: 0.001warmup_epoch: 5regularizer:name: 'L2'factor: 0.00004Architecture:model_type: recalgorithm: CRNNTransform:Backbone:name: ResNetlayers: 34Neck:name: SequenceEncoderencoder_type: rnnhidden_size: 256Head:name: CTCHeadfc_decay: 0.00004Loss:name: CTCLossPostProcess:name: CTCLabelDecodeMetric:name: RecMetricmain_indicator: accTrain:dataset:name: SimpleDataSetdata_dir: /civi/generate_chinese_license_plate-master/Save_Result/train_datasetlabel_file_list: ["/civi/generate_chinese_license_plate-master/Save_Result/train_dataset.txt"]transforms:- DecodeImage: # load imageimg_mode: BGRchannel_first: False- RecAug: - CTCLabelEncode: # Class handling label- RecResizeImg:image_shape: [3, 32, 320]- KeepKeys:keep_keys: ['image', 'label', 'length'] # dataloader will return list in this orderloader:shuffle: Truebatch_size_per_card: 200 # 256 训练_batch_sizedrop_last: Truenum_workers: 8Eval:dataset:name: SimpleDataSetdata_dir: /civi/generate_chinese_license_plate-master/Save_Result/test_datasetlabel_file_list: ["/civi/generate_chinese_license_plate-master/Save_Result/test_dataset.txt"]transforms:- DecodeImage: # load imageimg_mode: BGRchannel_first: False- CTCLabelEncode: # Class handling label- RecResizeImg:image_shape: [3, 32, 320]- KeepKeys:keep_keys: ['image', 'label', 'length'] # dataloader will return list in this orderloader:shuffle: Falsedrop_last: Falsebatch_size_per_card: 200 # 256 测试_batch_sizenum_workers: 8

注:着重关注以下几个参数:

use_gpu: true:使用GPU加速

epoch_num:epoch数目

save_model_dir:保存模型的地址

save_epoch_step:保存模型的间隔

data_dir:训练集和测试集图片的路径

label_file_list:训练集和测试集标签的路径

batch_size_per_card:训练集和测试集批大小

num_workers:线程数

④官方文档训练代码

# GPU训练 支持单卡,多卡训练
# 训练icdar15英文数据 训练日志会自动保存为 "{save_model_dir}" 下的train.log#单卡训练(训练周期长,不建议)
python3 tools/train.py -c configs/rec/rec_icdar15_train.yml#多卡训练,通过--gpus参数指定卡号
python3 -m paddle.distributed.launch --gpus '0,1,2,3'  tools/train.py -c configs/rec/rec_icdar15_train.yml

博主使用的是单卡训练:

# -c 表示yml文件的路径
python3 ./tools/train.py -c /civi/generate_chinese_license_plate-master/dic_plate.yml

6--模型转换和推理

①官方文档代码:

# -c 后面设置训练算法的yml配置文件
# -o 配置可选参数
# Global.pretrained_model 参数设置待转换的训练模型地址,不用添加文件后缀 .pdmodel,.pdopt或.pdparams。
# Global.save_inference_dir参数设置转换的模型将保存的地址。python3 tools/export_model.py -c configs/rec/ch_ppocr_v2.0/rec_chinese_lite_train_v2.0.yml -o Global.pretrained_model=./ch_lite/ch_ppocr_mobile_v2.0_rec_train/best_accuracy  Global.save_inference_dir=./inference/rec_crnn/

-c:yml文件地址

Global.pretrained_model:best_accuracy文件的路径

Global.save_inference_dir:模型转换后存在的路径

②转换结果:

③使用转换后的模型预测新车牌图片

python3 tools/infer/predict_rec.py --image_dir="./doc/imgs_words_en/word_336.png" --rec_model_dir="./your inference model" --rec_image_shape="3, 32, 100" --rec_char_type="ch" --rec_char_dict_path="your text dict path"

7--模型转换为onnx模型

①安装paddle2onnx

pip install paddle2onnx

②终端执行代码

paddle2onnx  --model_dir xx --model_filename model.pdmodel --params_filename model.pdiparams --opset_version 11 --save_file xx.onnx

--model_dir:存放pdmodel和pdiparams文件的路径

--save_file:存放onnx文件的路径

8--参考

paddle转换oonx

官方训练参考文档

利用PaddleOCR训练车牌识别模型相关推荐

  1. 基于TensorFlow训练花朵识别模型的源码和Demo

    基于TensorFlow训练花朵识别模型的源码和Demo 转发来源: https://blog.csdn.net/Anymake_ren/article/details/80550684 下面就通过对 ...

  2. paddle - crowdHuman数据集训练人体识别模型

    paddle - crowdHuman数据集训练人体识别模型 数据集annotation crowdhuman的odgt文件各项意义 转换为paddle yolo的格式 输入哪些数据? 输出模型 数据 ...

  3. python实现人脸检测及识别(2)---- 利用keras库训练人脸识别模型

    前面已经采集好数据集boss文件夹存放需要识别的对象照片,other存放其他人的训练集照片,现在,我们终于可以尝试训练我们自己的卷积神经网络模型了.CNN擅长图像处理,keras库的tensorflo ...

  4. 车辆搜索 -使用triplet loss 训练车辆识别模型

    最近读了LEARNING A REPRESSION NETWORK FOR PRECISE VEHICLE SEARCH 论文,将从中所了解的信息在此记录下来. 背景及模型介绍 此论文主要是讨论车辆的 ...

  5. Python+OpenCV实现AI人脸识别身份认证系统(3)—训练人脸识别模型

    目录 案例引入 本节项目 最近有小伙伴们一直在催本项目的进度,好吧,今晚熬夜加班编写,在上一节中,实现了人脸数据的采集,在本节中将对采集的人脸数据进行训练,生成识别模型. 案例引入 首先简要讲解数据集 ...

  6. Python+OpenCv实现AI人脸识别身份认证系统(3)——训练人脸识别模型

    目录 案例引入 本节项目 最近有小伙伴们一直在催本项目的进度,好吧,今晚熬夜加班编写,在上一节中,实现了人脸数据的采集,在本节中将对采集的人脸数据进行训练,生成识别模型. 案例引入 首先简要讲解数据集 ...

  7. 利用GPT2训练中文闲聊模型

    利用GPT2模型训练中文闲聊模型 最近看了一下GPT2模型,看到很多博主都用来写诗歌,做问答等,小编突然萌生一个想法,利用GPT2来训练一个闲聊模型!!(小说生成器模型已经破产,写出来的东西狗屁不通, ...

  8. 华为云GPU服务器使用PaddleServing方式部署PaddleClas多个自己训练的识别模型服务

    前言 最近公司需要对图片中的不同的货车品牌和车系进行识别,通过PaddleClas进行模型训练后得到一个品牌识别模型和一个车系识别模型,现在对两个模型部署到一台华为云的GPU服务器上,要对多个模型同时 ...

  9. 笔记记录--基于ccpd数据集利用Paddle OCR训练车牌检测模型

    目录 1-- 环境搭建 2-- 数据集划分 3-- 训练模型 4-- 推理测试 1-- 环境搭建 安装Paddle OCR参考 ① 创建环境 conda create -n paddle_env py ...

最新文章

  1. 关于机器翻译的三个话题的讨论
  2. go语言web开发框架_Iris框架讲解(六):Session的使用和控制
  3. ucos内存管理笔记
  4. banner轮播无缝滚动 jq代码
  5. Jeff Dean本科论文首次曝光!第一批90后出生时,他就在训练神经网络
  6. lesson1 ODE的几何解法:方向场,积分曲线
  7. Sourse Insight使用过程中的常使用功能简介
  8. WPS 2019使用技巧及WPS2019政府版最全合集
  9. 游戏公司岗位有哪些?各职位都是做什么的?有什么特点?
  10. 大胖子走迷宫 [蓝桥杯 ]
  11. 酒与茶--网友-心香一束著
  12. 【hadoop生态之Flume】概念【笔记+代码】
  13. 虚拟中3DMax2018打开报错
  14. 编码修养系列---提升性能必学篇
  15. java markdown转word_Markdown 格式如何转换成 Word?
  16. MySQL之DML操作
  17. ThinkPad笔记本电脑海淘简单教程及注意事项
  18. Maven中setting文件的配置
  19. python天天向上续。尽管每天坚持,但人的能力发展并不是无限的,它符合特定模型。实例1的修改。改造实例代码1.1。回文数。
  20. 基于cnn的人脸识别_基于卷积神经网络(CNN)的人脸在线识别系统

热门文章

  1. C语言学习———函数
  2. 淘宝店铺如何做好高质量高转化的详情页,制作高详情页的方法
  3. 差分约束 [HNOI2005]狡猾的商人(洛谷 P2294)
  4. [Nucleo-F411RE] 第1篇---新建一个工程
  5. 【树莓派】树莓派TXD、RXD的配置与使用可实现与STM32的通信
  6. 开源数学软件---Numbit
  7. Pandas中melt()的使用
  8. 风再起时?风继续吹........
  9. 文件处理小程序(包含哈夫曼文件压缩-解压等 C语言)
  10. Omni扫块,和非原生归集