步骤:
(1):准备正负样本数据和测试样本;
(2):对样本数据进行简单的图像预处理,并加上标签分类;
(3):选用合适的SVM参数,对整个样本集进行训练得到SVM模型;
(4):根据SVM模型对测试样本进行测试。
准备样本:
正样本:500;负样本:700;测试样本:10。(样本大小为64128:宽高)
positive:
negative:
test:
实现代码:
import datetime
#初始化时间
starttime=datetime.datetime.now()
import os
import cv2 as cv
import numpy as np
#创建空列表,用来存放训练样本数据
train_mat=[]
#(所有样本都提前resize为64*128)正样本
for root,dirs,files in os.walk("D:/testimage/video/positive",-1):
positive_num=len(files)
print(positive_num)
for image in files:
#灰度图像读取,并存放在一行。
pso_img=cv.imread("D:/testimage/video/positive/"+image,0)
Vect=np.zeros(64*128)
#先行后列
for i in range(128):
for j in range (64):
Vect[64*i+j]=pso_img[i][j]
train_mat.append(Vect)
#负样本
for root,dirs,files in os.walk("D:/testimage/video/negative",-1):
negative_num=len(files)
print(negative_num)
for image in files:
neg_img=cv.imread("D:/testimage/video/negative/"+image,0)
Vect=np.zeros(64*128)
#先行后列
for i in range(128):
for j in range (64):
Vect[64*i+j]=neg_img[i][j]
train_mat.append(Vect)
#将样本从列表转换为数组
train_mat=np.array(train_mat,dtype='float32')
train_num=len(train_mat)
#对样本进行标签(1:cxk;2:other)
labels_num = np.zeros((train_num, 1), np.int32)
for i in range(train_num):
if i < positive_num:
labels_num[i][0] = 1
else:
labels_num[i][0] = -1
#调用机器学习模块,创建SVM模型分类器
svm=cv.ml.SVM_create()
#SVM类型
svm.setType(cv.ml.SVM_C_SVC)
#线性核函数
svm.setKernel(cv.ml.SVM_LINEAR)
svm.setC(0.01)
#开始训练(数据,类型,标签)
result = svm.train(train_mat,cv.ml.ROW_SAMPLE,labels_num)
#创建列表存放测试样本
test_mat=[]
for root,dirs,files in os.walk("D:/testimage/video/test",-1):
test_num=len(files)
print(test_num)
for image in files:
test_img=cv.imread("D:/testimage/video/test/"+image,0)
Vect=np.zeros(64*128)
#先行后列
for i in range(128):
for j in range (64):
Vect[64*i+j]=test_img[i][j]
test_mat.append(Vect)
test_mat=np.array(test_mat,dtype='float32')
#SVM预测
(P1,P2) = svm.predict(test_mat)
#输出结果
for i in range(test_num):
if (P2[i] == 1):
print("test_picture "+str(i)+': ','cxk')
else:
print("test_picture "+str(i)+': ','other')
#结束时间
endtime = datetime.datetime.now()
print("time_consuming:",endtime - starttime)
预测结果:
最后测试的结果还是很准确。后面要学习算法推导过程,这里只是调用了ML模块。比较遗憾的是第6张图被识别成了other,咋也不敢说,咋也不敢问,直接上图吧,让大伙瞧瞧为什么?
参考文献:SVM 判别车牌 实例 – python