SVM 判别车牌 实例 -- python

2 篇文章 0 订阅

样本准备

 

准备三个文件夹   postdata 正样本   negdata 负样本  testdata 测试样本

所有样本 统一处理为灰度,尺寸 140*30

(文末提供一些样本,需要自取)

postdata: 正样本  

 

negdata:负样本

 

 testdata:测试样本,车牌图片命名开头为p,非车牌开头n   用于读取标签计算准确率

代码:

import cv2
import os
import numpy as np
import time
# 所有样本 统一处理为灰度,尺寸 140*30


def imgToVector(img):
    h,w=img.shape[:2]
    Vect = np.zeros(h * w)
    for i in range(w):
        for j in range(h):
            Vect[h * i + j] = img[j][i]
    return Vect

'''
post_path , neg_path: 正负样本存储目录
save_model:模型存储路径
'''
def train(post_path,neg_path,save_model):
    t1=time.time()

    '''
    训练集
    '''
    # 图片均以灰度形式读取。 将读取的图片二维矩阵转为一维向量存入训练集 trainningMat
    # 得到训练集尺寸: (样本数 , 4200)    数据类型:float32
    trainningMat = []  # 训练集
    pList, nList = os.listdir(post_path), os.listdir(neg_path)
    pNum, nNum = len(pList), len(nList)

    # 加入正样本
    for file in pList:
        src = cv2.imread(os.path.join(post_path, file),0)
        trainningMat.append(imgToVector(src))
    # 加入负样本
    for file in nList:
        src = cv2.imread(os.path.join(neg_path, file),0)
        trainningMat.append(imgToVector(src))
    trainningMat = np.array(trainningMat, dtype='float32')


    '''
    样本标签
    '''
    # 得到 label列表  尺寸: (pNum+nNum , 1)  
    # 前pNum个样本(正样本)标签为1,后面的(负样本)标签为-1
    Labels = np.zeros((pNum+nNum, 1), np.int32)
    Labels[:pNum]=1
    Labels[pNum:]=-1

    '''
    模型训练
    '''
    svm = cv2.ml.SVM_create()  # 创建SVM model
    # 属性设置
    svm.setType(cv2.ml.SVM_C_SVC)
    svm.setKernel(cv2.ml.SVM_LINEAR)
    svm.setC(0.01)
    # 训练
    svm.train(trainningMat, cv2.ml.ROW_SAMPLE, Labels)
    svm.save(save_model)
    t2 = time.time()
    print("train_time",t2-t1) #训练用时
'''
model: 模型存储路径
test_dir: 测试样本路径
'''
def test(model,test_dir):
    test_label = []  # 测试样本标签
    testMat=[] # 测试集
    correct_count = 0  # 正确数

    files = os.listdir(test_dir)
    test_num=len(files)
    for file in files:
        src=cv2.imread(os.path.join(test_dir,file),0)
        test_label.append(file[0])  # 存入标签
        testMat.append(imgToVector(src))

    testMat = np.array(testMat, dtype='float32')

    svm2 = cv2.ml.SVM_load(model)        #加载模型
    (par1, par2) = svm2.predict(testMat) #预测

    for i in range(test_num):
        if (par2[i][0] == 1 and test_label[i] == 'p') or (par2[i][0] == -1 and test_label[i] == 'n'):
            correct_count += 1

    accuracy = correct_count / test_num
    print("accuracy:", accuracy) #准确率

if __name__ == '__main__':
    train("postdata","negdata","svm.mat")  #训练
    test("svm.mat","testdata")  #测试

百度了一些车辆图片截了车牌样本:

链接:https://pan.baidu.com/s/1cGwRwy_QsxdEjjg4zGh3cg
提取码:ogtf

给个赞么~?

 

  • 31
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
很好,下面我来为你介绍一下 OpenCV-Python 实现目标检测的过程。 OpenCV-Python 是一款基于 Python 的计算机视觉库,它可以帮助我们完成各种图像处理任务,包括图像的读取、处理、显示等。在使用它进行目标检测时,我们可以使用传统方法 HOG+SVM 实现。 HOG(Histogram of Oriented Gradient)特征是一种常用的图像特征,它可以描述图像中的边缘、角点等信息,其中梯度方向直方图是 HOG 特征的核心部分。在目标检测中,我们需要先提取出图像中的 HOG 特征,然后再使用 SVM(Support Vector Machine)进行分类,从而实现目标检测。 下面是一个简单的 OpenCV-Python 实现目标检测的示例代码: ```python import cv2 # 加载 SVM 分类器 svm = cv2.ml.SVM_load('svm.xml') # 加载测试图片 img = cv2.imread('test.jpg') # 创建 HOG 描述符 hog = cv2.HOGDescriptor() # 设置 SVM 分类器 hog.setSVMDetector(svm) # 检测目标并绘制矩形框 rects, weights = hog.detectMultiScale(img, winStride=(8, 8), padding=(32, 32), scale=1.05) for (x, y, w, h) in rects: cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) # 显示结果 cv2.imshow('result', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在代码中,我们首先加载了训练好的 SVM 分类器,并加载了测试图片。然后创建了 HOG 描述符,并设置 SVM 分类器。最后使用 detectMultiScale 函数检测目标,并绘制矩形框,最终在窗口中显示检测结果。 当然,这仅仅是一个简单的示例,实际的目标检测过程还需要根据具体的应用场景进行调整和优化。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值