基于pytorch的车牌识别(一)

news2025/1/13 13:56:51

目录

  • CCPD2019数据集
  • CCPD数据集标注信息
  • 单例再现

CCPD2019数据集

本项目所有的数据都是基于CCPD2019数据集,CCPD2019数据集包含了25万多幅中国城市车牌图像和车牌检测与识别信息的标注,主要采集于合肥市,采集人员手持Android POS机对停车场的车辆拍照进行数据采集。所拍摄的车牌照片涉及多种复杂环境,包括模糊、倾斜、雨天、雪天等。具体分类如下

类别描述数量级
CCPD-base通用车牌图片200k
CCPD-blur由于摄像机镜头抖动导致的模糊车牌图片5k
CCPD-challenge在车牌检测识别任务中较有挑战性的图片10k
CCPD-db车牌区域亮度较亮、较暗或者不均匀20k
CCPD-fn车牌离摄像头拍摄位置相对较近或较远20k
CCPD-np没有安装车牌的新车图片3k
CCPD-rotate车牌水平倾斜20到50度,竖直倾斜-10到10度10k
CCPD-tilt车牌水平倾斜15到45度,竖直倾斜15到45度10k
CCPD-weather车牌在雨雪雾天气拍摄得到10k

同目录下的splits文件夹包含各类别的标签 ,包含了由CCPD-Base中的图像被拆分成的训练train集,验证val集,测试test则由非CCPD-Base中的图像组成。

CCPD数据集标注信息

CCPD数据集里面的每张图像的文件名就是该图像对应的数据标注。例如图片

ccpd_base\01-86_91-298&341_449&414-458&394_308&410_304&357_454&341-0_0_14_28_24_26_29-124-24.jpg的文件名可以由分割符’-'分为多个部分:
  • ccpd_base 表示图片所属的类别,这是base类;
  • 01为区域(应该是哪个区域);
  • 86_91对应车牌的两个倾斜角度-水平倾斜角和垂直倾斜角, 水平倾斜97度, 竖直倾斜100度。水平倾斜度是车牌与水平线之间的夹角。二维旋转后,垂直倾斜角为车牌左边界线与水平线的夹角。CCPD数据集中这个参数标注可能不那么准,这个指标具体参考了论文Hough Transform and Its Application in Vehicle License Plate Tilt Correction;
  • 298&341_449&414对应边界框左上角和右下角坐标:左下角坐标(298,341), 右上角坐标(449,414);
  • 458&394_308&410_304&357_454&341对应车牌四个顶点坐标(右上角开始逆时针走):右上(458,394),左上(308,410),左下(304,357),右下(454,341);
  • 0_0_14_28_24_26_29为车牌号码,第一位为省份代码,后面6位是大写字母和数字,有对应的关系表;
  • 124为亮度,数值越大车牌越亮;
  • 24 为模糊度,数值越小车牌越模糊。

单例再现

在知道数据大体情况和每张图片携带的信息后,其实可以情景再现,下面任选一张图片,提取像素信息和位置信息和内容信息进行展示以便更好的掌握数据集具体情况。

# -*- encoding: utf-8 -*-
'''
@Project :   license_plate
@Desc    :   车牌识别,包括车牌语义分割,车牌识别
@Time    :   2023/04/19 20:42:53
@Author  :   帅帅de三叔,zengbowengood@163.com
'''
import os
from PIL import Image, ImageDraw, ImageFont

provincelist = [
    "皖", "沪", "津", "渝", "冀",
    "晋", "蒙", "辽", "吉", "黑",
    "苏", "浙", "京", "闽", "赣",
    "鲁", "豫", "鄂", "湘", "粤",
    "桂", "琼", "川", "贵", "云",
    "西", "陕", "甘", "青", "宁",
    "新"]

wordlist = [
    "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 DrawBox(im, box): #车牌边框
    draw = ImageDraw.Draw(im)
    draw.rectangle(box, outline='red', width=3)

def DrawPoint(im, points):#绘制车牌四个边界点
    draw =  ImageDraw.Draw(im)
    for p in points:
        radius =3
        draw.ellipse((p[0]-radius, p[1]-radius, p[0]+radius, p[1]+radius), fill='green')
        
def DrawLable(im,  label): #绘制车牌
    draw = ImageDraw.Draw(im)
    font = ImageFont.truetype('simsun.ttc',  64)
    draw.text((30, 30), label, font=font, fill='red')

def ImgShow(imgpath, box, points, label):  #显示效果
    im = Image.open(imgpath)
    DrawBox(im, box)
    DrawPoint(im, points)
    DrawLable(im, label)
    im.show()
    im.save(r"D:\项目\车牌\result.jpg")

if __name__=="__main__":
    imgpath = r"D:\项目\车牌\CCPD\CCPD2019\ccpd_base\01-86_91-298&341_449&414-458&394_308&410_304&357_454&341-0_0_14_28_24_26_29-124-24.jpg"
    im = Image.open(imgpath)
    imgname = os.path.basename(imgpath).split('.')[0]
    _,_,box, points,label,brightness,blurriness = imgname.split('-')
    box  = box.split('_')
    box= [tuple(map(int, i.split('&')))  for i in  box]
    
    # DrawBox(im, box) 
    # im.show() #显示带车牌框的图片

    points = points.split('_')
    points = [tuple(map(int, i.split('&'))) for i in points]
    # DrawPoint(im, points)
    # im.show()

    label = label.split('_')
    province  = provincelist[int(label[0])]
    word = [wordlist[int(i)] for i in label[1:]]
    label = province+''.join(word)
    # print(label)
    # DrawLable(im, label)
    # im.show()

    ImgShow(imgpath,box,points,label)

展示效果如下

展示效果
从展示效果图可以看到车牌框圈出来了,车牌四个角也用绿色点描上了,车牌内容也在左上角标注了,是不是对数据集有了更深的了解呢?

参考文献
1,CCPD车牌数据集介绍
https://blog.csdn.net/LuohenYJ/article/details/117752120

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/471308.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

轻量级网络EfficientNetB0,利用迁移学习中的微调技术进行小样本轴承故障诊断(Python代码,带有数据集,训练集集的每类只需10个样本)

1. 训练集数量(正常类别:10个,内圈故障:10个,外圈故障:10个,滚动体故障:10个) 测试集数量(正常类别:90个,内圈故障:90个&…

LeetCode第160题——相交链表(Java)

题目描述: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交**:** 题目数据 保证 整个链式结构中不存在环。 注意&…

非线性扰动观测器的基本设计

非线性扰动观测器的基本设计 目录 非线性扰动观测器的基本设计前言问题描述扰动观测器设计小结参考资料 前言 因为看到论文中有扰动观测器的设计,但只是大概地明白设计的原理,实际上不明白扰动观测器是如何设计出来的。因此在查阅了相关文献和文章后&am…

树的刷题,嗝

今天忘记带本子了,就没有学习java了,于是一心刷题,好烦遇到了两个奇怪的题目,我没跟题解写的,但是我是没想到奇怪的样例. no.1 617. 合并二叉树 难度简单1221收藏分享切换为英文接收动态反馈 给你两棵二叉树: root1 和 root2 。 想象一下,当你将其中…

【数据结构】第十三站:排序(中)快速排序

本文目录 一、快速排序递归法1.快速排序思想2.hoare版本实现快速排序3.hoare版本的优化1>使用随机值rand()函数2>三数取中3>三路划分 4.证明hoare版本的key在左边,必须让右边先走5.挖坑法实现快速排序6.将前面快排的一趟排序给提取出来7.双指针法实现快速排…

java小技能:使用FeignClient

文章目录 引言I FeignClient1.1 定义FeignClient1.2 启用FeignClient1.3 使用FeignClient引言 一款不错的SpringCloud 脚手架项目:注册中心(nacos)+RPC(feign) https://blog.csdn.net/z929118967/article/details/127966912 RPC(feign):使用Feign的方式,进行微服务调…

AlgoC++第九课:手写AutoGrad

目录 手写AutoGrad前言1. 基本介绍1.1 计算图1.2 智能指针的引出 2. 示例代码2.1 Scale2.2 Multiply2.3 Pow 总结 手写AutoGrad 前言 手写AI推出的全新面向AI算法的C课程 Algo C,链接。记录下个人学习笔记,仅供自己参考。 本次课程主要是手写 AutoGrad …

逆向动态调试工具简介

常用逆向工具简介: 二进制尽管属于底层知识,但是还是离不开一些相应工具的使用,今天简单介绍一下常用的逆向工具OD以及他的替代品x96dbg,这种工具网上很多,也可以加群找老满(184979281)&#x…

java实现乘法的方法

我们都知道,乘法运算的核心思想就是两个数相乘,如果能将乘法运算转化成一个加数的运算,那么这个问题就很容易解决。比如我们要实现23的乘法,首先需要定义两个变量:2和3。我们将这两个变量定义为一个变量:2x…

如何利用Mybatis-Plus自动生成代码(超详细注解)

1、简介 MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 特性 无侵入:只做增强不做改变,引入…

一例感染型病毒样本的分析

这个样本是会释放两个dll和一个驱动模块,通过感染USB设备中exe文件传播,会向C&C下载PE执行,通过rookit关闭常用的杀软,是一例典型的感染型病毒,有一定的学习价值。 原始样本 样本的基本信息 Verified: Unsigned …

免费无需魔法会语音聊天的ChatGPT

今天发现了一个很好的ChatGPT,可以语音聊天,而且免费无需魔法 角色目前包括夏洛克、雷电影等等,对话的声调完全模拟了原角色! 目前只有英文和日语两种对话,我们可以文字输入或者语音输入,中文即可&#xff…

泰克Tektronix DPO5204B混合信号示波器

特征 带宽:2 GHz输入通道:4采样率:1 或 2 个通道上为 5 GS/s、10 GS/s记录长度:所有 4 个通道 25M,50M:1 或 2 个通道上升时间:175 皮秒MultiView zoom™ 记录长度高达 250 兆点>250,000 wf…

M序列测量幅频特性

M序列 M 序列是一种伪随机序列,具有很好的伪噪声特性,常用于信道噪声测试和保密通信。不过 M 序列还有一个用途,也就是本文所介绍的——通过 M 序列测量频率响应。在讨论这个问题之前,我们先介绍 M 序列的特征与生成方法。 M 序列…

活力二八:CRM助力销售管理再现“浓缩”新活力

活力28、沙市日化! 央视段子手朱广权再次喊出这句口号时,迅速激活了人们心中对于曾经“日化一哥”的记忆。 作为市场占率曾超 70% 的家清品牌,活力二八业务始于1950年,前身为沙市油脂化工厂,伴随中国改革开放大潮&…

第十一章_SpringBoot集成Redis

总体概述 redisTemplate-jedis-lettuce-redission之间的的联系 1、redisTemplate是基于某个具体实现的再封装,比如说springBoot1.x时,具体实现是jedis;而到了springBoot2.x时,具体实现变成了lettuce。封装的好处就是隐藏了具体的…

大家都在用的视频音频提取器,免费用!

随着互联网的日益普及,人们可以通过多种方式获取和分享媒体内容,例如通过社交媒体、视频共享网站等。但是,在处理媒体文件时,提取其中的音频或视频仍然是一个挑战。这就是为什么越来越多的人都在使用免费的视频音频提取器。 这些…

Node框架 【Koa】介绍、安装以及使用

文章目录 🌟前言🌟介绍🌟koa优势🌟洋葱模型🌟安装🌟具体步骤:🌟创建项目目录🌟初始化项目🌟进入目录,安装koa 🌟使用🌟案例&#x1f3…

C++STL详解(十一)-- 位图(bitset)

文章目录 位图的介绍位图的引入位图的概念位图的应用 位图的使用位图的定义位图的成员函数位图运算符的使用 位图的模拟实现成员函数构造函数set reset testflip,size,countnone,any,all 位图应用题扩展位图模拟实现代码 位图的介绍 位图的引入 有一道面试题: 给40亿个不重复…

QFIELD-GIS工具 定位功能使用方法

一、 简介 定位是一款GIS APP重要功能,可以帮助我们快速在地图上找到现在所处的位置。结合地图我们就可以快速了解我们所处环境的情况。同时可以利用APP的信息标注采集功能采集当前位置的信息到数据库中。 下面我们来介绍【QFIELD-GIS】如何进行GPS定位、如何…