hog+SVM

OpenCV+python计算机视觉图像处理_哔哩哔哩_bilibili

目录

HOG(梯度直方图)

应用场景

HOG 基本概念

模块划分

计算模块的梯度和方向,

bin投影,

各个模块的hog如何计算

cell的复用?

svm的判决image

小狮子识别:SVM+HOG

样本

样本准备

hog+SVM 代码


HOG(梯度直方图)

应用场景

主要是将这种方法应用在静态图像中的行人检测上,但在后来,他们也将其应用在电影和视频中的行人检测,以及静态图像中的车辆和常见动物的检测。

HOG描述器最重要的思想是:在一副图像中,局部目标的表象和形状(appearance and shape)能够被梯度或边缘的方向密度分布很好地描述。

首先将图像分成小的连通区域,我们把它叫细胞单元。然后采集细胞单元中各像素点的梯度的或边缘的方向直方图。最后把这些直方图组合起来就可以构成特征描述器。

为了提高性能,我们还可以把这些局部直方图在图像的更大的范围内(我们把它叫区间或block)进行对比度归一化(contrast-normalized),所采用的方法是:

先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化。通过这个归一化后,能对光照变化和阴影获得更好的效果。

HOG 基本概念

模块划分

  • win :特征计算最顶层单元,包含一个目标——得到所有描述信息
    • SIZE 大小任意:50*100,20*50,64*128(推荐)
  • block 滑动窗口
    • size: 是win大小的整数倍 16*16
    • step:blcok如何在win下滑动 8*8
    • count:可以滑动多少次 105 水平滑动次数 (64-16)/8+1 * 竖直滑动次数(128-16)/8+1
  • cell 不可滑动
    • size 8*8
    • block中多少个cell = 4 cell1 cell2 cell3 cell4
    • bin :和方向有关(360度按40度划分,9块,9bin)bin1:20度一个连续范围 bin,投影在0-20 180-200,在此夹角内的在一个方向 bin1 和bin2在同一个方向
      • cell中完整包含一个360度的信息,包含9个bin的信息。

计算模块的梯度和方向,

  • 特征维度:向量 几维空间
    • 维度计算:计算单位bin——每个win中有几个block——hog特征用来分类,所以包含win的所有信息。 105 * 4*9 = 3780
  • 梯度——计算单位:像素 【每个像素都有一个梯度(大小,方向angle)】,所有像素组合在一起构成特征。
    • 特征模板:水平【1 0 -1】,竖直【【1】 【0】 【-1】】 与像素进行卷积运算
    • a = 左中右像素* 模板相乘 相邻像素之差
    • b= 上下像素之差
    • 幅值 根号下a方+b方
    • 角度 arctan a/b

bin投影,

  • bin的投影——梯度
    • 某个像素到底在哪个bin范围
    • bin1:20度一个连续范围 bin,投影在0-20 180-200,在此夹角内的在一个方向 bin1 和bin2在同一个方向
    • 对某个像素ij 幅值f角度10°,位于中心位置 投影到了bin1 190°,也投影在bin1上——在当前bin上的投影就是f
    • 如果不在正中间,分解到bin1 bin2上 f1=f*g(夹角) f2= f*(1-f(夹角)) f夹角(0,1.0) 运算量大
      • 优化算法:投影到某区间,就+1

各个模块的hog如何计算

  • 整体的hog特征:3780维(win(block cell bin))
    • bin的计算:
      • 一个block下 cell0 -cell3,将cell0 分成9份bin0-bin8:
        • cell0 bin0-bin8 :[ bin0,bin1,bin2,bin3,bin4,bin5,bin6,bin7]
        • cell1 bin0-bin8
        • cell2 bin0-bin8
        • cell3 bin0-bin8
      • 像素ij :投影在了cell 0 的 bin0上, bin0 的内容 是f0
      • 像素i+1 j:投影在了cell0上的bin0, bin0 的内容是f1
      • 遍历完 bin0 累加 ==》bin0 =(f0+f1,。。。) cell0下所有bin0的值

cell的复用?

  • cell0 bin0-bin8
  • cell1 bin0-bin8
  • cell2 bin0-bin8
  • cell3 bin0-bin8
  • 每个block 分成3组:cellx0 cellx2 cellx4

svm的判决image

判决:SVM——线性分类器——得到3780维度的向量。

hog*svm向量 vs 判决门限 大于判决门限,是目标,小于判决门限,不是目标

小狮子识别:SVM+HOG

样本

正样本pos:需要检测的目标对象均包含在图片中。

特点:尽可能多样(环境多样,干扰多样,光照强弱,角度,是否完整,背景)

负样本neg:不包含所检测的目标

特点:尽可能多样,以及与正样本相似的背景或目标。

统一设置图像大小:64*128——方便计算

样本来源:

1. 网络 2.公司内部 3 自己设计

1.1 网络公司卖样本 1张 1¥

1.2 自己爬取

2.1 公司内部多年积累 新兴行业——eg 红外图像 mobile,eye,ADAS 99%

3.1 万级别——视频方式 100s*30帧 =3000张

hog:一个好的样本胜过一个复杂的神经网络 机器学习(k w) 深度(M)

样本准备

 整体步骤:

1. 视频分解图片

2. 规范图片大小:540*960————》缩放,裁剪——————》64*128

缩放

  • 等比缩放
  • 非等比缩放

缩放

等比缩放后不等于64*128,进行裁剪。

最终得到:

正样本个数:820 pos

负样本个数: 1931 neg

hog+SVM 代码

import cv2 
import numpy as np
import matplotlib.pyplot as plt
#1参数设置  2创建hog实例 3svm 4计算hog  5标签准备  6 完成训练 7完成预测 8 完成绘图查看效果
PosNum = 820
NegNum =1931 #与实际的一致
winSize=(64,128)
blockSize=(16,16)#win下105个blcok ,
blockStride = (8,8)#4个cell
cellSize =(8,8)#每个cell9个bin
binNum = 9

#2 hog创建
hog = cv2.HOGDescriptor(winSize,blockSize,blockStride,cellSize,binNum)

#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)
#svm训练时,监督学习:需要样本标签—————— 学习的是hog特征,是真正的样本

#5特征存储
for i in range(0,posNum):
  fileName='pos/'+str(i+1)+'.jpg' # mac
  img = cv2.imread(filename)#彩色图片
  hist =hog.compute(img,(8*8)) # 3780 hog计算
  for j in range(0,featureNum):
    featureArray[i,j] = hist[j] #装载特征
    labelArray[i,0]=1 #pos样本
    
for i in range(0,negNum):
  fileName='neg/'+str(i+1)+'.jpg'
  img = cv2.imread(filename)#彩色图片
  hist =hog.compute(img,(8*8)) # 3780
  for j in range(0,featureNum):
    featureArray[i+posNum,j] = hist[j] #装载特征
    labelArray[i+posNum,0]=-1 #neg样本

#svm属性设置
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setC(0.01)

#6 svm训练
ret = svm.train(featureArray,cv2.ml.ROW_SAMPLE,labelArray)

#7 检测
# 创建 hog mydetect<---resultArray,hro)
# myhog==》调用detectMultiScale
alpha = np.zeros((1),np.float32)
rho = svm.getDesisionFuction(0,alpha) #hog描述信息,用于svm判决
print(rho)
print(alpha)

alphaArray = np.zeros((1,1),np.float32)
supoortVArray = np.zeros((1,featureNum),np.float32)
resultArray = np.zeros((1,featureNum),np.float32)
alphaArray[0,0] = alpha
resultArray = -1*alphaArray*suportVArray

#detect
myDectect = np.zeros((3781),np.float32)
for i in range(0,3780):
  myDetect[i] = resultArray[0,i]  
myDetect[3780]=rho[0]

#构建hog:创建hog==》mydetect ==》resultArray,rho
#resultArray--》-1*alphaArray*suportVArray
#rho==》svm--》train
myHog = cv2.HOGDescriptor()
myHog.setSVMDetector(myDetect)

#待检测图片的加载
imageSrc = cv2.imread('Test2.jpg',1)
objs = myHog.detectMultiScale(imageSrc,0,(8*8),(32*32),1.05,2)
#获取检测到的目标 : objs三维,最后一维
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(imgSrc,(x,y),(x+w,y+h),(255,0,0),2)
cv2.imshow('dst',imageSrc)
cv2.waitKey(0)

  • 3
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

picoasis

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

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

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

打赏作者

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

抵扣说明:

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

余额充值