基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)
基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)
一、数据集说明
训练样本来自于github上的EasyPR的c++版本,包含一万三千多张数字及大写字母的图片以及三千多张中文字符图片。图片为已经处理好的二值化图像,已贴好标签(见每个子文件夹名),像素均为20×20。数字和大写字母图片保存在train\chars2目录下,中文字符图片保存在train\ charsChinese目录下。
测试样本来源于较为广泛,从各种网站搜集得到的各类车辆图片,保存在test目录下。
二、模型概述
本模型主要由四部分构成:训练字符分类器、车牌定位、字符分割、字符识别。其中训练字符分类器部分,将训练样本图片进行进一步抗扭曲处理后提取特征向量——方向梯度直方图,然后利用OpenCV自带的SVM模型训练模型,模型分为两个分类器,其中一个存放中文字符另外一个存放数字及大写字母。车牌定位部分是将测试集图片进行灰度化处理、高斯去躁、开运算和闭运算、Canny算子边缘检测、根据矩形框位置及颜色检测等处理,将车牌位置找到。字符分割部分从图片的波形直方图中找到波峰的位置,每个波峰范围内是一个字符,将字符分割开。字符识别部分就是将分割开的字符分别放入对应的分类器中进行识别,给出测试结果。下面我将结合具体代码及结果就以上四个部分给出详细的说明。
三、训练字符分类器
本字符分类器的训练是运用SVM的思想,利用OpenCV自带的SVM模型进行训练。
(一)SVM介绍
支持向量机(support vector machines, SVM)是一种二分类模型,它的基本模型是定义在特征空间上的间隔最大的线性分类器,间隔最大使它有别于感知机;SVM还包括核技巧,这使它成为实质上的非线性分类器。SVM的的学习策略就是间隔最大化,可形式化为一个求解凸二次规划的问题,也等价于正则化的合页损失函数的最小化问题。SVM的的学习算法就是求解凸二次规划的最优化算法。
(二)具体实现过程
1、定义一个SVM类,用到OpenCV自带的方法
(1)参数说明
SVM模型有两个非常重要的参数C与gamma。其中C是惩罚系数,即对误差的宽容度。C越高,说明越不能容忍出现误差,容易过拟合。C越小,容易欠拟合。C过大或过小,泛化能力变差。
gamma是选择RBF函数作为kernel后(本模型即选用RBF为核函数),该函数自带的一个参数。隐含地决定了数据映射到新的特征空间后的分布,gamma越大,支持向量越少,gamma值越小,支持向量越多。支持向量的个数影响训练与预测的速度。
(2)相关代码
class SVM(StatModel):def __init__(self, C = 1, gamma = 0.5):self.model = cv2.ml.SVM_create()self.model.setGamma(gamma) #设置gamma参数self.model.setC(C) #设置正则化参数self.model.setKernel(cv2.ml.SVM_RBF) #核函数为RBF(径向基函数)self.model.setType(cv2.ml.SVM_C_SVC) #SVC为分类,SVR为回归
#训练svmdef train(self, samples, responses):self.model.train(samples, cv2.ml.ROW_SAMPLE, responses)
#cv2.ml.ROW_SAMPLE表示每一行是一个样本
#字符识别def predict(self, samples):r = self.model.predict(samples)return r[1].ravel() #返回值为一个行向量
2、训练集特征向量抗扭曲处理
相关代码:
#训练数据中有些图像是扭曲的,需要做抗扭曲处理,也就是把歪了的图片摆正
def deskew(img):m = cv2.moments(img) #算图像的中心矩if abs(m['mu02']) < 1e-2:return img.copy()skew = m['mu11']/m['mu02']M = np.float32([[1, skew, -0.5*SZ*skew], [0, 1, 0]])img = cv2.warpAffine(img, M, (SZ, SZ), flags=cv2.WARP_INVERSE_MAP | cv2.INTER_LINEAR)return img
3.获取训练集图片特征:方向梯度
(1)方向梯度直方图
对于本分类器研究的问题,图片的边缘十分重要,因此提取特征时应重点关注图像边缘。沿着一张图片X和Y轴的方向上的梯度是很有用的,因为在边缘和角点的梯度值是很大的,边缘和角点包含了很多物体的形状信息。因此本模型采用方向梯度直方图(HOG)中梯度的方向作为特征。
(2)具体步骤:
a.计算梯度图像:直接用OpenCV里面的kernel大小为1的Sobel算子来计算。
b.计算梯度的幅值g和方向theta。
c.将梯度量化为16×16个整数值。把每个图像分成四个子图方块。对于每个子正方形,计算加权其幅度的方向(16×16bins)的直方图。因此,每个子图有一个包含16×16个值的向量。四个这样的向量(分别代表四个子图的16×16向量)一起给我们一个特征向量包含1024个值。这就是我们用来训练数据的特征向量。
(3)HOG方法优缺点分析
优点:HOG表示的是边缘(梯度)的结构特征,因此可以描述局部的形状信息;位置和方向空间的量化一定程度上可以抑制平移和旋转带来的影响;采取在局部区域归一化直方图,可以部分抵消光照变化带来的影响。由于一定程度忽略了光照颜色对图像造成的影响,使得图像所需要的表征数据的维度降低了。
缺点:描述子生成过程冗长,导致速度慢,实时性差;很难处理遮挡问题;由于梯度的性质,该描述子对噪点相当敏感。
(4)相关代码:
#获取每张图片的特征,特征是方向梯度直方图
def preprocess_hog(digits):#方向梯度直方图samples = []for img in digits:gx = cv2.Sobel(img, cv2.CV_32F, 1, 0) #计算梯度图像gy = cv2.Sobel(img, cv2.CV_32F, 0, 1)mag, ang = cv2.cartToPolar(gx, gy) #计算梯度的幅值g和方向thetabin_n = 16bin = np.int32(bin_n*ang/(2*np.pi))bin_cells = bin[:10,:10], bin[10:,:10], bin[:10,10:], bin[10:,10:]mag_cells = mag[:10,:10], mag[10:,:10], mag[:10,10:], mag[10:,10:]
#bincount()统计出现的次数
#ravel()将数组降为一维hists = [np.bincount(b.ravel(), m.ravel(), bin_n) for b, m in zip(bin_cells, mag_cells)] hist = np.hstack(hists)# transform to Hellinger kerneleps = 1e-7hist /= hist.sum() + epshist = np.sqrt(hist)hist /= norm(hist) + epssamples.append(hist)return np.float32(samples)
4.将数据导入分类器进行训练
相关代码:
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"):
#root为正在遍历的文件夹的名字 dirs为子文件夹的集合
#files为在遍历的文件夹中的文件集合if len(os.path.basename(root))> 1:
#os.path.basename(root)返回文件名continueroot_int = ord(os.path.basename(root))
#ord返回的是ASCII值,此处是文件夹名字的ASCII值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(root_int) #标签是它文件夹名字的ASCII码chars_train = list(map(deskew, chars_train)) #得到抗扭曲后的图像chars_train = preprocess_hog(chars_train) #获取样本方向梯度直方图chars_label = np.array(chars_label) #把图片的标签存起来self.model.train(chars_train, chars_label) #数据喂进分类器if os.path.exists("svmchinese.dat"): #开始训练汉字分类器,具体流程同上self.modelchinese.load("svmchinese.dat")else:chars_train = []chars_label = []for root, dirs, files in os.walk("train\\charsChinese"):if not os.path.basename(root).startswith("zh_"):continuepinyin = os.path.basename(root)index = provinces.index(pinyin) + PROVINCE_START + 1
#1是拼音对应的汉字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(index)chars_train = list(map(deskew, chars_train))chars_train = preprocess_hog(chars_train)chars_label = np.array(chars_label)print(chars_train.shape)self.modelchinese.train(chars_train, chars_label)
数据集及所有代码资源链接:https://download.csdn.net/download/creampang/85766802
基于机器学习的车牌识别系统(Python实现基于SVM支持向量机的车牌分类)相关推荐
- python车牌识别系统开源代码_天津谁做车牌识别系统供应商,伸缩栅栏门_郑州荣锋科技有限公司...
首页 > 新闻中心 发布时间:2020-11-13 22:54:57 导读:郑州荣锋科技有限公司为您提供天津谁做车牌识别系统供应商,伸缩栅栏门的相关知识与详情: (1)门处于关闭状态,控制器应骆 ...
- python车牌识别系统抬杆_【小区停车场车牌识别系统 车辆进门道闸自动抬杆】 - 太平洋安防网...
[参数说明] 品牌:交安通 号牌检出率::白天≥99.9%:夜间≥99.7% 号牌识别率::白天≥98%:夜间≥97% 拍摄范围::3-10米 [详细描述] 小区停车场车牌识别系统 车辆进门道闸自动抬 ...
- pkr车牌识别系统服务器,JAT-PKR-交安通PKR停车场车牌识别管理系统
交安通PKR停车场车牌识别管理系统特点: 识别系统对环境的依赖性降低至zui低程度,可实现全天候正常工作,且识别率保持较高水平. 可识别的zui小号牌宽度为70个像素 适应复杂的气候及光照条件,如阴天 ...
- 商品识别系统Python,基于深度学习卷积神经网络
介绍 商品识别系统采用了Python.TensorFlow.ResNet50算法以及Django等技术栈.其中,Python作为主要的编程语言,它的清晰简洁的语法使得代码易于阅读和编写.TensorF ...
- python车牌识别系统开源代码_Python+Tensorflow+CNN实现车牌识别的示例代码
一.项目概述 本次项目目标是实现对自动生成的带有各种噪声的车牌识别.在噪声干扰情况下,车牌字符分割较困难,此次车牌识别是将车牌7个字符同时训练,字符包括31个省份简称.10个阿拉伯数字.24个英文字母 ...
- am5718_基于TI AM5718 车牌识别系统解决方案 - 飞凌嵌入式行业资讯 - 保定飞凌嵌入式技术有限公司...
随着ITS(智能交通系统)技术的发展,越来越多的新技术不断地在ITS中得到应用,其中在收费系统中,车牌识别系统得到广泛的重视,应用技术也日趋成熟.目前大多车牌识别系统都是基于PC机.DSP.FPGA的 ...
- 基于matlab的车牌识别系统程序,基于matlab的车牌识别系统的设计(附程序).doc
基于matlab的车牌识别系统的设计(附程序).doc 1车牌识别系统的设计1.摘要:汽车牌照自动识别系统是制约道路交通智能化的重要因素,包括车牌定位.字符分割和字符识别三个主要部分.本文首先确定车辆 ...
- 基于Matlab的车牌识别系统完整版课论文分享 快看
基于Matlab的车牌识别系统 一.设计原理 车辆车牌识别系统的基本工作原理为:将摄像头拍摄到的包含车辆车牌的图像通过视频卡输入到计算机中进行预处理,再由检索模块对车牌进行搜索.检测.定位,并分割出包 ...
- 基于Python_opencv的车牌识别系统
基于python_opencv的车牌识别系统 一.说明 根据现有的车牌识别系统,本人对代码进行了优化,原有功能: 1.对图片中的车牌号进行识别,并对车牌所属地可视化 2.将识别出的车牌号.车牌所属地等 ...
- java车牌识别系统_基于jsp的车牌识别系统-JavaEE实现车牌识别系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的车牌识别系统, 该项目可用各类java课程设计大作业中, 车牌识别系统的系统架构分为前后台两部分, 最终实现在线上 ...
最新文章
- 计算机视觉与深度学习 | 基于CAMShift的人脸检测与跟踪(Matlab版)
- golang rpc demo
- 如何给Linux操作系统(CentOS 7为例)云服务器配置环境等一系列东西
- ASP.Net中实现上传过程中将文本文件转换成PDF的方法
- 梦幻飞屋创意房产海报,温馨画面,梦中的家园
- GET请求与POST请求的区别
- JS学习笔记(二)变量、作用域及内存问题
- Python爬虫编程实践Task 01
- JAVA card 应用开发(六) 个人化数据的线路安全和数据安全
- 网站禁止复制类型的属性
- ORACLE OEM
- linux7设置上下文权限,【CONTEXT】自定义CONTEXT(上下文)
- (详细图解)VS2017安装教程
- RGBA转换成RGB
- Pascal调用与C调用
- 无线路由器WiFi密码破解
- matlab中各种线型-颜色-标记点
- oracle10g的系统视图(sys、system)
- LeetCode题解(1682):最长回文子序列II(Python)
- 锻铸件三维扫描逆向设计,助力新产品研发
热门文章
- SSM框架的介绍与搭建
- C++中的exit()函数
- 全国计算机一级考级考纲,全国计算机等级考试一级MSOffice考试大纲
- FPGA中inout端口使用方法总结
- Hello C(八)——内存字节对齐
- 计算机与网络应用word题目解析,计算机二级word真题:《计算机与网络应用》教材的编排...
- 根据 Excel 数据表的内容和 Word 模板文件,批量生成 Word 文档
- 【科研】如何在读研的道路上快速失败
- 计算机图形学(三)-图形学中的基本变换(缩放、平移、旋转、剪切、镜像)
- 程序员们,国庆长假快乐呀!