HOG+SVM实现小狮子的识别

HOG特征基本介绍:

HOG(方向梯度直方图)是一种在计算机视觉图像处理中用来进行物体检测的特征描述。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。

Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功。需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主。

主要思想
在一副图像中,局部物体的表象和形状能够被光强梯度或边缘的方向密度分布描述。(本质:梯度的统计信息,而梯度主要存在于边缘的地方)。

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

提高性能
把这些局部直方图在图像的更大的范围内(区间或block)进行对比度归一化,所采用的方法是:先计算各直方图在这个区间(block)中的密度,然后根据这个密度对区间中的各个细胞单元做归一化,即能对光照变化和阴影获得更好的效果。

优点
首先,由于HOG是在图像的局部方格单元上操作,所以它对图像几何的和光学的形变都能保持很好的不变性;其次,在粗的空域抽样、精细的方向抽样以及较强的局部光学归一化等条件下,只要行人大体上能够保持直立的姿势,可以容许行人有一些细微的肢体动作。

算法实现流程

  1. 将你要检测的Image进行灰度化(将图像看做一个x,y,z(灰度)的三维图像);

  2. 采用Gamma校正法对输入图像进行颜色空间的标准化(归一化);进而调节图像的对比度,降低图像局部的阴影和光照变化的影响;

  3. 计算图像每个像素的梯度(包括大小和方向);主要是为了捕获轮廓信息,同时进一步弱化光照的干扰。

  4. 将图像划分成小cells(例如6*6像素/cell);

  5. 统计每个cell的梯度直方图(不同梯度的个数),即可形成每个cell的descriptor;

  6. 将每几个cell组成一个block(例如3*3个cell/block),一个block内所有cell的特征descriptor串联起来便得到该block的HOG特征descriptor;

  7. 将图像image内的所有block的HOG特征descriptor串联起来就可以得到该image的HOG特征descriptor了,即最终的可供分类使用的特征向量。
    这是用图片展示一下具体流程如下:
    HOG+SVM实现小狮子的识别_第1张图片
    下面实现HOG+SVM小狮子的识别:

#训练 1 参数 2hog 3 svm 4 computer hog 5 label 6 train 7 pred 8 draw
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 1 par 各个具体的参数展示
PosNum = 820
NegNum = 1931
winSize = (64, 128)
blockSize = (16, 16)  # 105
blockStride = (8, 8)  # 4 cell
cellSize = (8, 8)
nBin = 9  # 9 bin 3780
# 2 hog create hog 1 win 2 block 3 blockStride 4 cell 5 bin HOG特征的基本流程
hog = cv2.HOGDescriptor(winSize, blockSize, blockStride, cellSize, nBin)
# 3 svm 分类器的调用
svm = cv2.ml.SVM_create()
# 4 computer 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 监督学习 样本 标签 svm -》image hog
for i in range(0, PosNum):
    fileName = 'pos//' + str(i + 1) + '.jpg'
    img = cv2.imread(fileName)
    hist = hog.compute(img, (8, 8))  # 3780
    for j in range(0, featureNum):
        featureArray[i, j] = hist[j]
    # featureArray hog [1,:] hog1 [2,:]hog2
    labelArray[i, 0] = 1
    # 正样本的训练数据进行学习 label 1
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
# 负样本的训练数据进行学习 label -1
svm.setType(cv2.ml.SVM_C_SVC)
svm.setKernel(cv2.ml.SVM_LINEAR)
svm.setC(0.01)
# 6 train  对数据进行训练
ret = svm.train(featureArray, cv2.ml.ROW_SAMPLE, labelArray)
# 7 myHog :《-myDetect
# myDetect-《resultArray  rho
# myHog-》detectMultiScale
# 7 检测  核心:create Hog -》 myDetect—》array-》
# resultArray-》resultArray = -1*alphaArray*supportVArray
# rho-》svm-〉svm.train
alpha = np.zeros((1), np.float32)
rho = svm.getDecisionFunction(0, alpha)
print(rho)
print(alpha)
alphaArray = np.zeros((1, 1), np.float32)
supportVArray = np.zeros((1, featureNum), np.float32)
resultArray = np.zeros((1, featureNum), np.float32)
alphaArray[0, 0] = alpha
resultArray = -1 * alphaArray * supportVArray
# detect
myDetect = np.zeros((3781), np.float32)
for i in range(0, 3780):
    myDetect[i] = resultArray[0, i]
myDetect[3780] = rho[0]
# rho svm (判决)
myHog = cv2.HOGDescriptor()
myHog.setSVMDetector(myDetect)
# load
imageSrc = cv2.imread('Test4.jpg', 1)
# (8,8) win
objs = myHog.detectMultiScale(imageSrc, 0, (8, 8), (32, 32), 1.05, 2)
# xy wh 三维 最后一维
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)

识别效果如下图所示:
HOG+SVM实现小狮子的识别_第2张图片
这里使用正样本(PosNum) 820张图片,负样本(NegNum)1931张图片进行训练模型,最终完成训练,最后采用带有小狮子的图片进行测试,测试效果如上图所示。

这里使用的正负样本的数据集如下百度云链接中:
链接:https://pan.baidu.com/s/1jNpN8ecMKhOHLiy1KlEj4w
提取码:61hr
若有不足欢迎私信或评论
更新---------------------------------------------------------------------------------------------------------------------------------------------------
有很多同学说遇到各种问题待解决,下面我将把我学习期间看的视频教程放上去,希望可以帮到你
链接:https://pan.baidu.com/s/1lh4UGXnbJ9smvq3QVTM8ww 提取码:h2s7 我是看的这里面第六章的视频后 操作的,如果出现各种问题,希望可以通过视频学习解决,谢谢大家

你可能感兴趣的:(机器学习)