深度学习实践基于深度学习的车牌识别(python,车牌检测+车牌识别)

Posted 嘟嘟太菜了

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习实践基于深度学习的车牌识别(python,车牌检测+车牌识别)相关的知识,希望对你有一定的参考价值。

车牌识别具有广泛的应用前景,基于传统方法的车牌识别效果一般比较差,随着计算机视觉技术的快速发展,深度学习的方法能够更好的完成车牌识别任务。

 本文提供了车牌识别方案的部署链接,您可以在网页上体验该模型的效果:车牌识别方案在线体验

本文介绍了使用PaddleOCR完成车牌识别任务的方法,其检测效果如下图:

原图如下:

 检测结果如下:

目录

一、概述 

二、使用

1、数据集准备

2、检测模型

3、识别模型

4、模型导出

5、联合推理

 三、总结

附录:


一、概述 

基于深度学习的车牌识别任务可以拆解为2个步骤:车牌检测-车牌识别。其中车牌检测的目的是确认图片中车牌的位置,根据检测到的车牌位置把图片中的ROI裁剪出来,车牌识别算法用于识别裁剪出的车牌图像中的具体内容。

本文使用PaddleOCR工具实现了车牌识别任务,首先使用PaddleOCR的检测算法DBNet检测出车牌位置,再将车牌位置裁剪送入文本识别算法CRNN来识别车牌的具体内容。

PaddleOCR github:https://github.com/PaddlePaddle/PaddleOCR.git

二、使用

1、数据集准备

本文选择的数据集为CCPD2020,下载链接为:CCPD2020(New energy plate) - 飞桨AI Studio

CPPD数据集的图片文件名具有特殊规则,具体规则如下:

例如: 025-95_113-154&383_386&473-386&473_177&454_154&383_363&402-0_0_22_27_27_33_16-37-15.jpg

每个名称可以分为七个字段,以-符号作为分割。这些字段解释如下。

  • 025:车牌面积与整个图片区域的面积比。025 (25%)

  • 95_113:水平倾斜程度和垂直倾斜度。水平 95度 垂直 113度

  • 154&383_386&473:左上和右下顶点的坐标。左上(154,383) 右下(386,473)

  • 386&473_177&454_154&383_363&402:整个图像中车牌的四个顶点的精确(x,y)坐标。这些坐标从右下角顶点开始。(386,473) (177,454) (154,383) (363,402)

  • 0_0_22_27_27_33_16:CCPD中的每个图像只有一个车牌。每个车牌号码由一个汉字,一个字母和五个字母或数字组成。有效的中文车牌由七个字符组成:省(1个字符),字母(1个字符),字母+数字(5个字符)。“ 0_0_22_27_27_33_16”是每个字符的索引。这三个数组定义如下。每个数组的最后一个字符是字母O,而不是数字0。我们将O用作“无字符”的符号,因为中文车牌字符中没有O。因此以上车牌拼起来即为 皖AY339S

  • 37:牌照区域的亮度。 37 (37%)

  • 15:车牌区域的模糊度。15 (15%)

下载好了数据集,需要把数据集转换为PaddleOCR需要的标注格式,代码如下(修改图片的存储路径为自己的路径):

import cv2
import os
import json
from tqdm import tqdm
import numpy as np

provinces = ["皖", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑", "苏", "浙", "京", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤", "桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁", "新", "警", "学", "O"]
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', 'O']
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', 'O']

def make_label(img_dir, save_gt_folder, phase):
    crop_img_save_dir = os.path.join(save_gt_folder, phase, 'crop_imgs')
    os.makedirs(crop_img_save_dir, exist_ok=True)

    f_det = open(os.path.join(save_gt_folder, phase, 'det.txt'), 'w', encoding='utf-8')
    f_rec = open(os.path.join(save_gt_folder, phase, 'rec.txt'), 'w', encoding='utf-8')

    i = 0
    for filename in tqdm(os.listdir(os.path.join(img_dir, phase))):
        str_list = filename.split('-')
        if len(str_list) < 5:
            continue
        coord_list = str_list[3].split('_')
        txt_list = str_list[4].split('_')
        boxes = []
        for coord in coord_list:
            boxes.append([int(x) for x in coord.split("&")])
        boxes = [boxes[2], boxes[3], boxes[0], boxes[1]]
        lp_number = provinces[int(txt_list[0])] + alphabets[int(txt_list[1])] + ''.join([ads[int(x)] for x in txt_list[2:]])

        # det
        det_info = ['points':boxes, 'transcription':lp_number]
        f_det.write('\\t\\n'.format(os.path.join(phase, filename), json.dumps(det_info, ensure_ascii=False)))

        # rec
        boxes = np.float32(boxes)
        img = cv2.imread(os.path.join(img_dir, phase, filename))
        # crop_img = img[int(boxes[:,1].min()):int(boxes[:,1].max()),int(boxes[:,0].min()):int(boxes[:,0].max())]
        crop_img = get_rotate_crop_image(img, boxes)
        crop_img_save_filename = '_.jpg'.format(i,'_'.join(txt_list))
        crop_img_save_path = os.path.join(crop_img_save_dir, crop_img_save_filename)
        cv2.imwrite(crop_img_save_path, crop_img)
        f_rec.write('/crop_imgs/\\t\\n'.format(phase, crop_img_save_filename, lp_number))
        i+=1
    f_det.close()
    f_rec.close()

def get_rotate_crop_image(img, points):
    '''
    img_height, img_width = img.shape[0:2]
    left = int(np.min(points[:, 0]))
    right = int(np.max(points[:, 0]))
    top = int(np.min(points[:, 1]))
    bottom = int(np.max(points[:, 1]))
    img_crop = img[top:bottom, left:right, :].copy()
    points[:, 0] = points[:, 0] - left
    points[:, 1] = points[:, 1] - top
    '''
    assert len(points) == 4, "shape of points must be 4*2"
    img_crop_width = int(
        max(
            np.linalg.norm(points[0] - points[1]),
            np.linalg.norm(points[2] - points[3])))
    img_crop_height = int(
        max(
            np.linalg.norm(points[0] - points[3]),
            np.linalg.norm(points[1] - points[2])))
    pts_std = np.float32([[0, 0], [img_crop_width, 0],
                          [img_crop_width, img_crop_height],
                          [0, img_crop_height]])
    M = cv2.getPerspectiveTransform(points, pts_std)
    dst_img = cv2.warpPerspective(
        img,
        M, (img_crop_width, img_crop_height),
        borderMode=cv2.BORDER_REPLICATE,
        flags=cv2.INTER_CUBIC)
    dst_img_height, dst_img_width = dst_img.shape[0:2]
    if dst_img_height * 1.0 / dst_img_width >= 1.5:
        dst_img = np.rot90(dst_img)
    return dst_img

img_dir = 'CCPD2020/ccpd_green'   # 改成自己的路径
save_gt_folder = 'CCPD2020/PPOCR'   # 改成自己的路径
# phase = 'train' # change to val and test to make val dataset and test dataset
for phase in ['train','val','test']:
    make_label(img_dir, save_gt_folder, phase)

2、检测模型

准备好了数据集,首先需要训练车牌检测模型,这里我们使用PaddleOCR提供的文本检测预训练模型进行fine-tuning,这样可以减少训练时间,首先下载预训练检测模型(先进入PaddleOCR文件夹):

mkdir models
cd models
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_det_distill_train.tar
tar -xf ch_PP-OCRv3_det_distill_train.tar
cd PaddleOCR

下载好了预训练模型,下面训练检测模型(其中的data_dir和label_file_list换成自己的数据集路径):

python tools/train.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml -o \\
    Global.pretrained_model=models/ch_PP-OCRv3_det_distill_train/student.pdparams \\
    Global.save_model_dir=output/CCPD/det \\
    Global.eval_batch_step="[0, 772]" \\
    Optimizer.lr.name=Const \\
    Optimizer.lr.learning_rate=0.0005 \\
    Optimizer.lr.warmup_epoch=0 \\
    Train.dataset.data_dir=CCPD2020/ccpd_green \\
    Train.dataset.label_file_list=[CCPD2020/PPOCR/train/det.txt] \\
    Eval.dataset.data_dir=CCPD2020/ccpd_green \\
    Eval.dataset.label_file_list=[CCPD2020/PPOCR/test/det.txt]

训练好了模型以后,可以使用下面的命令验证一下精度(此步可以跳过,也要更换data_dir和label_file_list路径):

python tools/eval.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml -o \\
    Global.pretrained_model=output/CCPD/det/best_accuracy.pdparams \\
    Eval.dataset.data_dir=CCPD2020/ccpd_green \\
    Eval.dataset.label_file_list=[CCPD2020/PPOCR/test/det.txt]

可以使用如下命令来实现检测模型推理(路径修改为自己需要的路径):

python3 tools/infer_det.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml \\
    -o Global.infer_img="src.jpg" Global.pretrained_model="./output/CCPD/det/best_accuracy" \\
    PostProcess.box_thresh=0.6 PostProcess.unclip_ratio=2.0

3、识别模型

训练好了检测模型,再来训练识别模型,同样先下载预训练权重再fine-tuning,下载权重命令如下:

mkdir models
cd models
wget https://paddleocr.bj.bcebos.com/PP-OCRv3/chinese/ch_PP-OCRv3_rec_train.tar
tar -xf ch_PP-OCRv3_rec_train.tar
cd PaddleOCR

这个权重中包含不需要的内容(Teacher的权重),需要提取需要的权重:

import paddle
# 加载预训练模型
all_params = paddle.load("models/ch_PP-OCRv3_rec_train/best_accuracy.pdparams")
# 查看权重参数的keys
print(all_params.keys())
# 学生模型的权重提取
s_params = key[len("Student."):]: all_params[key] for key in all_params if "Student." in key
# 查看学生模型权重参数的keys
print(s_params.keys())
# 保存
paddle.save(s_params, "models/ch_PP-OCRv3_rec_train/student.pdparams")

开启训练(注意路径):

python tools/train.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml -o \\
    Global.pretrained_model=models/ch_PP-OCRv3_rec_train/student.pdparams \\
    Global.save_model_dir=output/CCPD/rec/ \\
    Global.eval_batch_step="[0, 90]" \\
    Optimizer.lr.name=Const \\
    Optimizer.lr.learning_rate=0.0005 \\
    Optimizer.lr.warmup_epoch=0 \\
    Train.dataset.data_dir=CCPD2020/PPOCR \\
    Train.dataset.label_file_list=[PPOCR/train/rec.txt] \\
    Eval.dataset.data_dir=CCPD2020/PPOCR \\
    Eval.dataset.label_file_list=[PPOCR/test/rec.txt]

验证精度:

python tools/eval.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml -o \\
    Global.pretrained_model=output/CCPD/rec/best_accuracy.pdparams \\
    Eval.dataset.data_dir=CCPD2020/PPOCR \\
    Eval.dataset.label_file_list=[PPOCR/test/rec.txt]

使用如下命令测试识别模型的效果(需要注意的是,识别模型的输入是车牌号图片,不是完整的图片,可以使用数据集处理时的PPOCR文件夹内生成的裁剪后的车牌图片):

python3 tools/infer/predict_det.py --det_algorithm="DB" --det_model_dir="output/CCPD/det/infer" --image_dir="/home/aistudio/src.jpg" --use_gpu=True

4、模型导出

上面训练好的模型都是动态图模型,将他们导出为静态图模型来部署,可以加快速度,首先导出检测模型:

python tools/export_model.py -c configs/det/ch_PP-OCRv3/ch_PP-OCRv3_det_student.yml -o \\
    Global.pretrained_model=output/CCPD/det/best_accuracy.pdparams \\
    Global.save_inference_dir=output/CCPD/det/infer

测试一下导出的检测模型推理效果(注意图片路径):

python3 tools/infer/predict_det.py --det_algorithm="DB" --det_model_dir="output/CCPD/det/infer" --image_dir="src.jpg" --use_gpu=True

下面导出识别模型:

python tools/export_model.py -c configs/rec/PP-OCRv3/ch_PP-OCRv3_rec.yml -o \\
    Global.pretrained_model=output/CCPD/rec/best_accuracy.pdparams \\
    Global.save_inference_dir=output/CCPD/rec/infer

测试一下导出的识别模型推理效果(注意图片路径):

python3 tools/infer/predict_rec.py --image_dir="PPOCR/test/crop_imgs" \\
    --rec_model_dir="output/CCPD/rec/infer" --rec_image_shape="3, 48, 320" --rec_char_dict_path="ppocr/utils/ppocr_keys_v1.txt"

5、联合推理

训练好了检测和识别模型,下面就是联合推理,测试效果,命令如下(det_model_dir和rec_model_dir是上面导出的模型文件夹):

python tools/infer/predict_system.py \\
    --det_model_dir=output/CCPD/det/infer/ \\
    --rec_model_dir=output/CCPD/rec/infer/ \\
    --image_dir="src.jpg" \\
    --rec_image_shape=3,48,320

这是识别的结果:

 三、总结

本文总结了PaddleOCR提供的车牌识别方案,并进行了简化,根据识别的结果来看可以很好地检测车牌图像。

附录:

PaddleOCR轻量级车牌识别方案

本文提供了车牌识别方案的部署链接,您可以再网页上体验该模型的效果:

车牌识别方案在线体验

基于深度学习的中文车牌识别与管理系统(含UI界面,Python代码)

摘要:本文详细介绍基于深度学习的中文车牌识别与管理系统,在介绍算法原理的同时,给出Python的实现代码以及PyQt的UI界面。在界面中既可以选择需要识别的车牌视频、图片文件、批量图片进行检测识别,也可以通过电脑自带的摄像头进行实时检测、识别、管理车牌,通过车牌记录查看历史识别的车牌。博文提供了完整的Python代码和使用教程,适合新入门的朋友参考,完整代码资源文件请转至文末的下载链接。本博文目录如下:

文章目录

➷点击跳转至文末所有涉及的完整代码文件下载页☇


前言

        车牌识别其实是个经典的机器视觉任务了,通过图像处理技术检测、定位、识别车牌上的字符,实现计算机对车牌的智能管理功能。如今在小区停车场、高速公路出入口、监控场所、自动收费站等地都有车牌识别系统的存在,车牌识别的研究也已逐步成熟。尽管该技术随处可见了,但其实在精度和识别速度上还需要进一步提升,自己动手实现一个车牌识别系统有利于学习和理解图像处理的先进技术。

        车牌识别的算法经过了多次版本迭代,检测的效率和准确率有所提升,从最初的基于LBP和Haar特征的车牌检测,到后来逐步采用深度学习的方式如SSD、YOLO等算法。车牌的识别部分也由字符匹配到深度神经网络,通过不断验证和测试,其检测和识别效果和适用性都更加突出,支持的模型也更为丰富。

        网上的车牌识别程序代码很多,大部分都是采用深度学习的目标检测算法等识别单张图片中的车牌,但几乎没有人将其开发成一个可以展示的完整软件,即使有的也是比较简单的界面。对此这里给出博主设计的界面,不算精美但比较简约风,功能也可以满足单张图片、批量图片、视频和摄像头的识别检测了,初始界面如下图:


        检测车牌时的界面截图(点击图片可放大)如下图,也可开启摄像头或视频检测:


         详细的功能演示效果参见博主的B站视频或下一节的动图演示,觉得不错的朋友敬请点赞、关注加收藏!系统UI界面的设计工作量较大,界面美化更需仔细雕琢,大家有任何建议或意见和可在下方评论交流。


1. 效果演示

        首先还是用动图先展示一下效果,系统主要实现的功能是对图片、视频和摄像头画面中的车牌进行检测和识别,识别的结果可视化显示在界面和图像中,另外提供车牌识别历史记录和回看功能,演示效果如下。

(一)选择单张 / 批量车牌识别

        首先还是用动图先展示一下效果。进入软件界面后,点击图片选择按钮选择一张图片,点击“开始运行”即可自动识别车牌并显示结果在界面上;点击历史识别记录的表格序号可回看识别记录。本功能的界面展示如下图所示:


        同样的如果需要识别批量图片,可以选择一个包含多张图片文件的文件夹,选择好后点击“开始运行”则逐个对每个文件进行检测和识别,结果与单张图片时类似,可通过表格记录回看识别结果:

(二)车牌视频识别效果展示

        很多时候我们需要识别一段视频中的车牌,这里设计了视频选择功能。点击视频按钮可选择待检测的视频,系统会自动解析视频逐帧识别车牌,并将结果记录在右下角表格中,效果如下图所示:


(三)摄像头检测效果展示

        在真实场景中,我们往往利用设备摄像头获取实时画面,同时需要对画面中的车牌进行识别,因此本文考虑此功能。如下图所示,点击摄像头按钮后系统进入准备状态,再点击“开始运行”后,系统显示实时画面并开始检测画面中的车牌,识别结果展示并记录:


2. 车牌检测与识别

        目前,智能交通系统中集成运用计算机视觉、物联网、人工智能等多种技术成为未来发展方向。其中,车牌识别(License Plate Recognition, LPR)技术作为一项重要技术,从获取的图像中提取目标车辆的车牌信息,成为完善智能交通管理运行的基础。

        由于本文介绍的是中文车牌,所以可以简单了解一下国内汽车拍照的特点:字符数为七个,包括汉字、字母和数字。车牌颜色组合中,其中最常见的组合为普通小型汽车蓝底白字和新能源汽车的渐变绿底黑字1


        由于本文介绍的是中文车牌,所以可以简单了解一下国内汽车拍照的特点:字符数为七个,包括汉字、字母和数字,车牌轮廓长宽比例基本固定。车牌颜色组合中,其中最常见的组合为普通小型汽车蓝底白字和新能源汽车的渐变绿底黑字。总结来说,车牌是一个有特点的图像区域,几种特征可以综合起来确定车牌定位,所以之前就有利用车牌与周围环境的差异的算法。目前常见的车牌定位算法有以下 4 种:基于颜色、纹理、边缘信息的车牌定位算法和基于人工神经网络的车牌定位算法2

        为了方便演示,博主绘制了一张车牌识别的流程图,如下图所示,常规的步骤包括图像采集、预处理、车牌定位、字符分割、字符识别、输出结果。深度学习技术成熟之后,端到端的网络模型使得这一过程变得简单起来。从思想上来说,基于深度学习的车牌识别实现思路主要包括两个部分:(1)车牌检测定位;(2)车牌字符识别。


        其中,车牌的检测定位本质是一个特定的目标检测(Object Detection)任务,即通过算法框选出属于车牌的位置坐标,以便将其与背景区分开来。可以认为检测出的车牌位置才是我们的感兴趣区域(Region Of Interest, ROI)。好用的方法如Cascade LBP,它是一种机器学习的方法,可以利用OPenCV训练级联分类器,依赖CPU进行计算,参考网址:https://gitee.com/zeusees/HyperLPR。级联分类器的方法对于常用场景效果比较好,检测速度较快,曾经一度比较流行,但准确率一般。基于深度学习的检测算法有Mobilene-SSD、YOLO-v5等,利用大批量的标注数据进行训练,训练代码可以参考开源代码https://github.com/zeusees/License-Plate-Detector

        当ROI被检测出来,如何对这一区域中的字符进行识别,这就涉及到采取的处理方式。第一种处理方式,首先利用一系列字符分割的算法将车牌中的字符逐个分开,然后基于深度学习进行字符分类,得到识别结果,可参考的代码地址:https://github.com/LCorleone/A-Simple-Chinese-License-Plate-Generator-and-Recognition-Framework;第二种,区别于第一种先分割再分类的两步走方式,利用端到端的CTC( Connectionist Temporal Classification)网络直接进行识别,代码地址:https://github.com/armaab/hyperlpr-train

        这里我们使用网上开源的HyperLPR中文车牌识别框架,首先导入OpenCV和hyperlpr,读取一张车牌图片调用架构中的车牌识别方法获得结果,以下代码来自官方的示例:

#导入包
from hyperlpr import *
#导入OpenCVimport cv2
#读入图片
image = cv2.imread("demo.jpg")
#识别结果
print(HyperLPR_plate_recognition(image))

        以上代码运行结果如下,可以看出该方法识别了车牌的车牌字符、置信度值、车牌位置坐标、图片尺寸等结果。


        这样的结果还不够直观,我们写一个函数将车牌的识别结果标注在图片上,首先导入相关依赖包,其代码如下:

# 导入包
from hyperlpr import *
# 导入OpenCVimport cv2 as cv
from PIL import Image, ImageDraw, ImageFont
import numpy as np

        新建一个函数drawRectBox,将图像数据、识别结果、字体等参数传入,函数内部利用OpenCV和PIL库添加标注框和识别结果的字符,其代码如下:

def drawRectBox(image, rect, addText, fontC):
    cv.rectangle(image, (int(round(rect[0])), int(round(rect[1]))),
                 (int(round(rect[2]) + 8), int(round(rect[3]) + 8)),
                 (0, 0, 255), 2)
    cv.rectangle(image, (int(rect[0] - 1), int(rect[1]) - 16), (int(rect[0] + 75), int(rect[1])), (0, 0, 255), -1, cv.LINE_AA)
    img = Image.fromarray(image)
    draw = ImageDraw.Draw(img)
    draw.text((int(rect[0] + 1), int(rect[1] - 16)), addText, (255, 255, 255), font=fontC)
    imagex = np.array(img)
    return imagex

        我们首先读取图片文件,利用前面的HyperLPR_plate_recognition方法识别出车牌结果,调用以上函数获得带标注框的图片,利用OpenCV的imshow方法显示结果图片,其代码如下:

image = cv.imread('test3.jpeg')  # 读取选择的图片
res_all = HyperLPR_plate_recognition(image)
fontC = ImageFont.truetype("./platech.ttf", 14, 0)
res, confi, axes = res_all[0]
image = drawRectBox(image, axes, res, fontC)
cv.imshow('Stream', image)
c = cv.waitKey(0) & 0xff

        此时运行以上代码可以得到如下结果:


        同理,识别视频中的车牌也可以做类似的操作,不过我们需要先对视频文件进行逐帧读取,然后采用以上的方式在图片中标识出车牌并显示。这部分代码如下:

capture = cv.VideoCapture("./车牌检测.mp4")  # 读取视频文件
fontC = ImageFont.truetype("./platech.ttf", 14, 0)  # 字体,用于标注图片

i = 1
while (True):
    ref, frame = capture.read()
    if ref:
        i = i + 1
        if i % 5 == 0:
            i = 0
            res_all = HyperLPR_plate_recognition(frame)  # 识别车牌
            if len(res_all) > 0:
                res, confi, axes = res_all[0]  # 获取结果
                frame = drawRectBox(frame, axes, res, fontC)
            cv.imshow("num", frame)  # 显示画面

        if cv.waitKey(1) & 0xFF == ord('q'):
            break  # 退出
    else:
        break

        以上代码每5帧识别一次视频中的车牌,将车牌的结果标注在画面中进行实时显示,运行结果的截图如下所示:


        车牌的识别部分代码演示完毕,对此我们完成了图片和视频的识别,然而这些还是简单的脚本呈现。为了方便更换图片、视频以及管理车牌,还需要设计文件选择功能以及系统的UI界面。打开QtDesigner软件,拖动以下控件至主窗口中,车牌识别系统的界面设计如下图所示:

        控件界面部分设计好,接下来利用PyUIC工具将.ui文件转化为.py代码文件,通过调用界面部分的代码同时加入对应的逻辑处理代码。博主对其中的UI功能进行了详细测试,最终开发出一版流畅得到清新界面,就是博文演示部分的展示,完整的UI界面、测试图片视频、代码文件,以及Python离线依赖包(方便安装运行,也可自行配置环境),均已打包上传,感兴趣的朋友可以通过下载链接获取。


下载链接

    若您想获得博文中涉及的实现完整全部程序文件(包括测试图片、视频,py, UI文件等,如下图),这里已打包上传至博主的面包多平台和CSDN下载资源。本资源已上传至面包多网站和CSDN下载资源频道,可以点击以下链接获取,已将所有涉及的文件同时打包到里面,点击即可运行,完整文件截图如下:

    在文件夹下的资源显示如下,其中包含了Python的离线依赖包,读者可在正确安装Anaconda和Pycharm软件后,点击bat文件进行安装,详细演示也可见本人B站视频。


注意:本资源已经过调试通过,下载后可通过Pycharm运行;运行界面的主程序为runMain.py,测试识别图片脚本可运行testPic.py,视频测试脚本可运行testVideo.py文件,为确保程序顺利运行,请配置Python依赖包的版本如下:➷➷➷
(Python版本:3.7)
hyperlpr 0.0.2
Keras 2.2.4
tensorflow 1.13.1
numpy 1.21.5
Pillow 9.0.1
PyQt5 5.15.4
pyqt5-tools 5.15.4.3.2
opencv-python 3.4.9.31

完整资源下载链接1博主在面包多网站上的完整资源下载页

完整资源下载链接2https://mianbaoduo.com/o/bread/mbd-YpiUlphp

注:以上两个链接为面包多平台下载链接,CSDN下载资源频道下载链接稍后上传。


结束语

        由于博主能力有限,博文中提及的方法即使经过试验,也难免会有疏漏之处。希望您能热心指出其中的错误,以便下次修改时能以一个更完美更严谨的样子,呈现在大家面前。同时如果有更好的实现方法也请您不吝赐教。


  1. 中华人民共和国公安部.GA36-2014. 中华人民共和国公共安全行业标准–中华人民共和国机动车号牌[S]. 北京:群众出版社, 2014, 2-4 ↩︎

  2. Du S, Ibrahim M, Shehata M, et al. Automatic license plate recognition (ALPR): A state-of-the-art review[J]. IEEE Transactions on circuits and systems for video technology, 2012, 23(2): 311-325. ↩︎

以上是关于深度学习实践基于深度学习的车牌识别(python,车牌检测+车牌识别)的主要内容,如果未能解决你的问题,请参考以下文章

camera基于深度学习的车牌检测与识别系统实现(课程设计)

毕业设计python 机器视觉 车牌识别 - opencv 深度学习 机器学习

Python项目演练:使用深度学习自动识别车牌号附源代码

深度学习与图神经网络核心技术实践应用高级研修班-Day3基于深度学习的视频行为识别(action_recognition)

深度学习100例 - 卷积神经网络CNN实现车牌识别(万字长文全网首发)| 第15天

车牌识别01__车牌抠图(CNN深度学习—opencv实现方法)