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) 运算量大
各个模块的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)
|