机器学习-SVM明星图像分类

步骤:
(1):准备正负样本数据和测试样本;
(2):对样本数据进行简单的图像预处理,并加上标签分类;
(3):选用合适的SVM参数,对整个样本集进行训练得到SVM模型;
(4):根据SVM模型对测试样本进行测试。

准备样本:
正样本:500;负样本:700;测试样本:10。(样本大小为64128:宽高)
files
positive:

positive
negative:

negative
test:

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)

预测结果:
result
最后测试的结果还是很准确。后面要学习算法推导过程,这里只是调用了ML模块。比较遗憾的是第6张图被识别成了other,咋也不敢说,咋也不敢问,直接上图吧,让大伙瞧瞧为什么?
cxk
参考文献:SVM 判别车牌 实例 – python

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 14
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值