OpenCV_机器学习-Hog特征+SVM(支持向量机)完成小狮子识别

‘’’
opencv_机器学习-Hog特征+SVM(支持向量机)完成小狮子识别
Hog特征:特征是某个像素经过某种运算得到的结果
Hog特征实现步骤:
1.完成Hog特征模块划分
2.根据Hog特征模板计算梯度和方向
3.根据梯度和方向进行bin的投影
4.计算每个模块的Hog特征
在这里插入图片描述
几个概念:
1.image(整个图片),windows窗体win(蓝色) block(红色),cell(绿色),size
image>win>block>cell
block step,win step,cell bin
窗体是特征计算最顶层单元->一个窗口必须包含一个目标所有的描述信息
窗体的大小win size = 任意(推荐64128)
block的大小block size < win size,win size的w,h/block size 的w,h = 整数(block size推荐16
16)
block step描述的是如何在Windows下进行滑动,推荐88
计算block cout(总共可以滑动多少个block) = ((64-16)/8+1)
((128-16)/8+1) = 105 block
cell size = 推荐88 cell是不进行滑动的
block中cell的个数 = 4 16
16 = 22->4cell
梯度:是一个运算,每个像素都有一个梯度,梯度有大小f和方向angle两个属性
0~360度按照40度划分成九个块,即九个bin,一个bin=40度
在cell中必须完整包含完整一个360度信息,即只需要让cell完整包含九个bin的信息
Hog特征的维度:Haar特征得到的是一个值,Hog特征得到的是一个向量即维度,完全描述一个对象的所有信息
Hog特征维度 = win中的block数105每个block中cell的个数4每个cell下的bin个数9 = 3780
梯度的方向计算单位是像素,所有的像素组合在一起构成了Hog特征
特征模板->Haar类似
水平方向模板[1 0 -1] 竖直方向模板[[1] [0] [-1]]
a = p11+p20+p3*(-1) = 相邻像素之差
b = 上下像素之差
f = 根号下(a^2 + b^2)
angle = arctan(a/b)
bin的投影:主要依赖于梯度
在bin中将0~360度角度划分成9个bin
bin1连续范围:0~20度 另外一个是180~200度,在这两个范围的bin都是bin1
若i j f a = 10
0~20 center->投影到了bin1上
若i j f a = 190
180~200 center->投影到了bin1上
f 25 bin1 bin2
‘’’
‘’’
1.准备样本,pos是正样本,包含所检测的目标,neg是负样本,不包含所检测的目标
样本的获取:网络/公司内部/自己获取
2.训练
(1)完成参数的设置
(2)创建Hog实例对象
(3)创建SVM
(4)计算Hog
(5)label标签
(6)完成训练
(7)完成预测
(8)完成绘图
3.test 预测
‘’’

import cv2
import numpy as np
import matplotlib.pyplot as pit
#1.参数定义
PosNum = 820
NegNum = 1931
winSize = (64,128)
blockSize = (16,16) #block的个数
blockStride = (8,8) #block的步长
cellSize = (8,8)    #cell的大小
nBin = 9            #一个cell中bin的个数 
#2.Hog的创建,创建Hog对象
hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,nBin)
#3.SVM的创建
svm = cv2.ml.SVM_create()
#4.计算Hog
featureNum = int(((128-16)/8+1)*((64-16)/8+1)*4*9)#3780
featureArray = np.zeros(((PosNum+NegNum),featureNum),np.float32)
labelArray = np.zeros(((PosNum+NegNum),1),np.int32)
#5.svm训练 监督学习 样本+标签 SVM在进行学习时学习的是图片中的Hog特征
#读取正样本
for i in range(0,PosNum):
    #文件数据的加载
    fileName = 'pos/'  +str(i+1) + '.jpg'
    img = cv2.imread(fileName)
    #Hog特征的计算
    hist = hog.compute(img,(8,8))#维度3780
    #将当前的Hog特征装到featureArray中
    for j in range(0,featureNum):
        featureArray[i,j] = hist[j]
    #正样本label标签是1
    labelArray[i,0] = 1
#读取负样本
for i in range(0,NegNum):
    #文件数据的加载
    fileName = 'neg/' + str(i+1) + '.jpg'
    img = cv2.imread(fileName)
    #Hog特征的计算
    hist = hog.compute(img,(8,8))#维度3780
    #将当前的Hog特征装到featureArray中
    for j in range(0,featureNum):
        featureArray[i+PosNum,j] = hist[j]
    #正样本label标签是1
    labelArray[i+PosNum,0] = -1
#正样本 label=1,负样本label=-1
#使用SVM完成属性设置
svm.setType(cv2.ml.SVM_C_SVC)#设置类型
svm.setKernel(cv2.ml.SVM_LINEAR)#设置线性内核
svm.setC(0.01)
#6.开始训练
ret = svm.train(featureArray,cv2.ml.ROW_SAMPLE,labelArray)
#7.检测
alpha = np.zeros((1),np.float32)
rho = svm.getDecisionFunction(0,alpha)
print(rho,alpha)
alphaArray = np.zeros((1,1),np.float32)
supportVArray = np.zeros((1,featureNum),np.float32)
resultArray = np.zeros((featureNum),np.float32)
alphaArray[0,0] = alpha
resultArray = -1 * alphaArray * supportVArray 
##detect
#myHog的创建
myDetect = np.zeros((3781),np.float32)
for i in range(0,3780):
    myDetect[i] = resultArray[0,i]
myDetect[3780] = rho[0]
myHog = cv2.HOGDescriptor()#创建myHog
myHog.setSVMDetector(myDetect)
#load
imageSrc = cv2.imread('Test2.jpg',1)
#(8,8)是win的步长,1.5是缩放系数,(32,32)是窗体大小
objs = myHog.detectMultiScale(imageSrc,0,(8,8),(32,32),1.5,2)#此代码的核心在这
#x y w h三维信息,放到最后一维
x = int(objs[0][0][0])
y = int(objs[0][0][1])
w = int(objs[0][0][2])
h = int(objs[0][0][3])
#绘制和展示
cv2.rectangle(imageSrc,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('dst',imageSrc)   
cv2.waitKey(0)

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

yhwang-hub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值