车牌识别程序python代码_Python+Tensorflow+CNN实现车牌识别的示例代码

本文介绍了使用Python、Tensorflow和CNN实现车牌识别的详细步骤,包括生成车牌数据集、模型训练和预测。通过示例代码展示了如何处理噪声、透视变换和高斯模糊等,最后探讨了模型优化和实际应用中的挑战。
摘要由CSDN通过智能技术生成

摘要:这篇Python开发技术栏目下的“Python+Tensorflow+CNN实现车牌识别的示例代码”,介绍的技术点是“TensorFlow、Python、示例代码、车牌识别、CNN、代码”,希望对大家开发技术学习和问题解决有帮助。这篇文章主要介绍了Python+Tensorflow+CNN实现车牌识别的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、项目概述

本次项目目标是实现对自动生成的带有各种噪声的车牌识别。在噪声干扰情况下,车牌字符分割较困难,此次车牌识别是将车牌7个字符同时训练,字符包括31个省份简称、10个阿拉伯数字、24个英文字母('O'和'I'除外),共有65个类别,7个字符使用单独的loss函数进行训练。

(运行环境:tensorflow1.14.0-GPU版)

二、生成车牌数据集

import os

import cv2 as cv

import numpy as np

from math import *

from PIL import ImageFont

from PIL import Image

from PIL import ImageDraw

index = {"京": 0, "沪": 1, "津": 2, "渝": 3, "冀": 4, "晋": 5, "蒙": 6, "辽": 7, "吉": 8, "黑": 9,

"苏": 10, "浙": 11, "皖": 12, "闽": 13, "赣": 14, "鲁": 15, "豫": 16, "鄂": 17, "湘": 18, "粤": 19,

"桂": 20, "琼": 21, "川": 22, "贵": 23, "云": 24, "藏": 25, "陕": 26, "甘": 27, "青": 28, "宁": 29,

"新": 30, "0": 31, "1": 32, "2": 33, "3": 34, "4": 35, "5": 36, "6": 37, "7": 38, "8": 39,

"9": 40, "A": 41, "B": 42, "C": 43, "D": 44, "E": 45, "F": 46, "G": 47, "H": 48, "J": 49,

"K": 50, "L": 51, "M": 52, "N": 53, "P": 54, "Q": 55, "R": 56, "S": 57, "T": 58, "U": 59,

"V": 60, "W": 61, "X": 62, "Y": 63, "Z": 64}

chars = ["京", "沪", "津", "渝", "冀", "晋", "蒙", "辽", "吉", "黑",

"苏", "浙", "皖", "闽", "赣", "鲁", "豫", "鄂", "湘", "粤",

"桂", "琼", "川", "贵", "云", "藏", "陕", "甘", "青", "宁",

"新", "0", "1", "2", "3", "4", "5", "6", "7", "8",

"9", "A", "B", "C", "D", "E", "F", "G", "H", "J",

"K", "L", "M", "N", "P", "Q", "R", "S", "T", "U",

"V", "W", "X", "Y", "Z"]

def AddSmudginess(img, Smu):

"""

模糊处理

:param img: 输入图像

:param Smu: 模糊图像

:return: 添加模糊后的图像

"""

rows = r(Smu.shape[0] - 50)

cols = r(Smu.shape[1] - 50)

adder = Smu[rows:rows + 50, cols:cols + 50]

adder = cv.resize(adder, (50, 50))

img = cv.resize(img,(50,50))

img = cv.bitwise_not(img)

img = cv.bitwise_and(adder, img)

img = cv.bitwise_not(img)

return img

def rot(img, angel, shape, max_angel):

"""

添加透视畸变

"""

size_o = [shape[1], shape[0]]

size = (shape[1]+ int(shape[0] * cos((float(max_angel ) / 180) * 3.14)), shape[0])

interval = abs(int(sin((float(angel) / 180) * 3.14) * shape[0]))

pts1 = np.float32([[0, 0], [0, size_o[1]], [size_o[0], 0], [size_o[0], size_o[1]]])

if angel > 0:

pts2 = np.float32([[interval, 0], [0, size[1]], [size[0], 0], [size[0] - interval, size_o[1]]])

else:

pts2 = np.float32([[0, 0], [interval, size[1]], [size[0] - interval, 0], [size[0], size_o[1]]])

M = cv.getPerspectiveTransform(pts1, pts2)

dst = cv.warpPerspective(img, M, size)

return dst

def rotRandrom(img, factor, size):

"""

添加放射畸变

:param img: 输入图像

:param factor: 畸变的参数

:param size: 图片目标尺寸

:return: 放射畸变后的图像

"""

shape = size

pts1 = np.float32([[0, 0], [0, shape[0]], [shape[1], 0], [shape[1], shape[0]]])

pts2 = np.float32([[r(factor), r(factor)], [r(factor), shape[0] - r(factor)], [shape[1] - r(factor), r(factor)],

[shape[1] - r(factor), shape[0] - r(factor)]])

M = cv.getPerspectiveTransform(pts1, pts2)

dst = cv.warpPerspective(img, M, size)

return dst

def tfactor(img):

"""

添加饱和度光照的噪声

"""

hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)

hsv[:, :, 0] = hsv[:, :, 0] * (0.8 + np.random.random() * 0.2)

hsv[:, :, 1] = hsv[:, :, 1] * (0.3 + np.random.random() * 0.7)

hsv[:, :, 2] = hsv[:, :, 2] * (0.2 + np.random.random() * 0.8)

img = cv.cvtColor(hsv, cv.COLOR_HSV2BGR)

return img

def random_envirment(img, noplate_bg):

"""

添加自然环境的噪声, noplate_bg为不含车牌的背景图

"""

bg_index = r(len(noplate_bg))

env = cv.imread(noplate_bg[bg_index])

env = cv.resize(env, (img.shape[1], img.shape[0]))

bak = (img == 0)

bak = bak.astype(np.uint8) * 255

inv = cv.bitwise_and(bak, env)

img = cv.bitwise_or(inv, img)

return img

def GenCh(f, val):

"""

生成中文字符

"""

img = Image.new("RGB", (45, 70), (255, 255, 255))

draw = ImageDraw.Draw(img)

draw.text((0, 3), val, (0, 0, 0), font=f)

img = img.resize((23, 70))

A = np.array(img)

return A

def GenCh1(f, val):

"""

生成英文字符

"""

img =Image.new("RGB", (23, 70), (255, 255, 255))

draw = ImageDraw.Draw(img)

draw.text((0, 2), val, (0, 0, 0), font=f) # val.decode(&

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值