文章目录
0 前言
🔥这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 基于深度学习的车牌识别(源码分享)
🥇学长这里给一个题目综合评分(每项满分5分)
难度系数:3分
工作量:3分
创新点:4分
🧿 项目分享:见文末!
1 项目运行效果



视频效果:
毕业设计 深度学习车牌识别系统
2 车牌识别原理和流程
车牌识别是基于图像分割和图像识别理论,对含有车辆号牌的图像进行分析处理,从而确定牌照在图像中的位置,并进一步提取和识别出文本字符。
一个典型的车牌识别处理过程包括:图像采集、图像预处理、车牌定位、字符分割、字符识别及结果输出等处理过程。各个处理过程相辅相成,每个处理过程均须保证其高效和较高的抗干扰能力,只有这样才能保证识别功能达到满意的功能品质。
车牌识别系统的实现方式主要分两种,一种为静态图像识别,另一种为动态视频流识别。静态图像识别受限于图像质量、车牌污损度、车牌倾斜度等因素。动态视频流识别则需要更快的识别速度,受限于处理器的性能指标,特别是在移动终端实现车牌实时识别需要更多性能优化。
虽然车牌识别包含6大处理过程,但核心算法主要位于车牌定位、字符分割及字符识别这三个模块中。

2.1 车牌定位
车牌定位的主要工作是从静态图片或视频帧中找到车牌位置,并把车牌从图像中单独分离出来以供后续处理模块处理。车牌定位是影响系统性能的重要因素之一。目前车牌定位的方法很多,但总的来说可以分为两大类:

2.2 字符分割
字符分割的任务是把多列或多行字符图像中的每个字符从整个图像中切割出来成为单个字符图像。传统字符分割算法可以归纳为以下两类类:直接分割法、基于图像形态学的分割法。直接分割法简单,基于一些先验知识,如车牌字符分布情况等,同时辅助一些基本投影算法实现分割;基于形态学的分割方法使用边缘检测、膨胀腐蚀等处理来确定字符图像位置。传统的字符分割算法同样对外界干扰敏感,如车牌倾斜度、字符污损粘连等。车牌字符的正确分割对字符的识别是很关键的,在分割正确的情况下,才能保证识别的准确率。而随着神经网络理论的不断发展,端到端的图片分类识别技术也有很大突破,因此很多OCR软件逐步摆脱传统字符分割处理,由识别网络对多字符进行直接识别。

2.3 字符识别
字符识别是将包含一个或多个字符的图片中提取字符编码的过程。字符识别的典型方法即基于机器学习的图片分类方法。在图片分类方法中,一幅图片只能输出一个分类,也就是说一幅图片中只能包含一个字符图像。这就要求字符分割有很高的准确率。另一种识别方法即端到端的基于循环神经网络的字符识别方法。该方法将整个车牌图片输入网络,神经网络将直接输出所有字符。端到端的方法直接去除了字符分割过程,免去了字符分割错误带来的稳定性损失,但端到端方法同样对其他干扰如车牌倾斜度比较敏感。
3 基于机器学习的车牌识别

前面的车牌检测和字符分割学长这里就不多复述了,这里着重讲解如何使用机器学习中的支持向量机SVM来进行车牌字符识别。
3.1 支持向量机SVM
SVM是支持向量机(Support Vector Machine)的简称,对于解决小样本、非线性、高维的模式识别问题有很多特有的优势。
简单地讲呢,SVM分类算法的实质就是在样本的特征空间中找到一个最优的超平面,使这个超平面离所有的类的样本的距离最小者最大化。
如下图所示,总共有两类,每类的样本数为五,最优超平面即为可以将两类分开,且两类中离分类面最近的样本与分类面的距离最大。

总而言之: SVM实质上是一个类分类器,是一个能够将不同类样本在样本空间分隔的超平面。
3.2 SVM识别字符
定义
class SVM(StatModel):
def __init__(self, C = 1, gamma = 0.5):
self.model = cv2.ml.SVM_create()
self.model.setGamma(gamma)
self.model.setC(C)
self.model.setKernel(cv2.ml.SVM_RBF)
self.model.setType(cv2.ml.SVM_C_SVC)
#训练svm
def train(self, samples, responses):
self.model.train(samples, cv2.ml.ROW_SAMPLE, responses)
调用方法,喂数据
def train_svm(self):
#识别英文字母和数字
self.model = SVM(C=1, gamma=0.5)
#识别中文
self.modelchinese = SVM(C=1, gamma=0.5)
if os.path.exists("svm.dat"):
self.model.load("svm.dat")
训练,保存模型
else:
chars_train = []
chars_label = []
for root, dirs, files in os.walk("train\\chars2"):
if len(os.path.basename(root)) > 1:
continue
root_int = ord(os.path.basename(root))
for filename in files:
filepath = os.path.join(root,filename)
digit_img = cv2.imread(filepath)
digit_img = cv2.cvtColor(digit_img, cv2.COLOR_BGR2GRAY)
chars_train.append(digit_img)
#chars_label.append(1)
chars_label.append(root_int)
chars_train = list(map(deskew, chars_train))
chars_train = preprocess_hog(chars_train)
#chars_train = chars_train.reshape(-1, 20, 20).astype(np.float32)
chars_label = np.array(chars_label)
print(chars_train.shape)
self.model.train(chars_train, chars_label)
车牌字符数据集如下


这些是字母的训练数据,同样的还有我们车牌的省份简写:


核心代码
predict_result = []
roi = None
card_color = None
for i, color in enumerate(colors):
if color in ("blue", "yello", "green"):
card_img = card_imgs[i]
gray_img = cv2.cvtColor(card_img, cv2.COLOR_BGR2GRAY)
#黄、绿车牌字符比背景暗、与蓝车牌刚好相反,所以黄、绿车牌需要反向
if color == "green" or color == "yello":
gray_img = cv2.bitwise_not(gray_img)
ret, gray_img = cv2.threshold(gray_img,

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



