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 参数 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))  # 3780for j in range(0, featureNum):featureArray[i, j] = hist[j]# featureArray hog [1,:] hog1 [2,:]hog2labelArray[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))  # 3780for 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)

识别效果如下图所示:

这里使用正样本(PosNum) 820张图片,负样本(NegNum)1931张图片进行训练模型,最终完成训练,最后采用带有小狮子的图片进行测试,测试效果如上图所示。

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

HOG+SVM实现小狮子的识别相关推荐

  1. 07-机器学习(Hog+SVM实现小狮子识别)

    一.SVM支持向量机 什么是SVM支持向量机? SVM支持向量机本质仍是一个分类器,其核心为寻求一个最优超平面最终实现分类,实现分类问题 在寻求超平面的时候有多种方式,可以使用若干条直线或曲线进行分类 ...

  2. [附代码] 如何用HOG+SVM实现手写数字识别

    本文首发于微信公众号[DeepDriving],公众号后台回复关键字[手写数字识别]可获取本文代码链接. 前言 手写数字识别是机器学习和深度学习中一个非常著名的入门级图像识别项目,很多人都是从这个项目 ...

  3. 基于OpenCV实现的HOG+SVM自定义对象识别

    1,前言 该案例是很久以前学习课程,最近突然想起来了就实现记录一下.在深度学习逐渐流行的今天,HOG+SVM自定义对象识别的用武之地可能不是很大了,但是在固定场景下,自定义对象如果在图像中的大小较为恒 ...

  4. 车牌识别技术详解五--采用LBP+HOG SVM做目标分类,车牌检测,字符检测等

    在样本数量比较少的情况下,可以采用HOG.SVM对样本进行初步的筛选出,正负样本,本文接着上一节二值化出来部分样本后,用pictureRelate做初步筛选出正负样本各500,准确训练. 1.pict ...

  5. 基于python的HOG+SVM目标检测算法实现

    目录 一.场景需求解读 二.HOG算法简介 三.SVM算法简介 四.基于HOG的目标检测算法训练流程 五.目标检测代码实现 六.非极大值抑制(NMS)简介及代码实现 七.NMS效果展示与分析 八.思维 ...

  6. OpenCV实战【2】HOG+SVM实现行人检测

    目录 HOG是什么? HOG vs SIFT HOG步骤 HOG在检测行人中的方式 Opencv实现 HOGDescriptor的构造函数: 行人检测HOG+SVM步骤 简化版的HOG计算 HOG是什 ...

  7. OpenCV实战4: HOG+SVM实现行人检测

    目前基于机器学习方法的行人检测的主流特征描述子之一是HOG(Histogram of Oriented Gradient, 方向梯度直方图)HOG 特征是用于目标检测的特征描述子,它通过计算和统计图像 ...

  8. 行人检测HOG+SVM:综述、INRIADATA数据集、线性SVM

    目录 1. 行人检测算法研究综述 2. 基于机器学习的方法:人工特征+分类器 2.1 HOG+SVM 2.2 HOG+Adaboost 2.3 ICF+AdaBoost 2.4 DPM+ latent ...

  9. HOG+SVM行人检测

    前言 在前面的博客:HOG特征检测学习笔记中,介绍了HOG特征,也附有代码实现.这篇博客中将会使用HOG+SVM这一经典的目标检测算法来进行行人检测,但是不会讨论HOG或者SVM的理论部分,如果有不懂 ...

最新文章

  1. 在什么情况下我应该使用malloc和/或new?
  2. poj 1306 Combinations
  3. 《生命是什么》读书笔记
  4. wpf custom control
  5. 百度地图开发总结----3.判断一个点是否在一片区域内
  6. pl/sql中文显示为乱码解决
  7. Connection to node 0 (/192.168.204.131:9092) could not be established
  8. JZs3c2440裸板程序GPIO操作总结
  9. 周末爬山之圈门-潭柘寺
  10. 蓝桥杯 基础练习 回文数
  11. 修改linux下默认的python版本
  12. 简单类型参数是值传递,对象参数是引用传递
  13. 微信联系人一键导出的方法在这里
  14. 四叉树数据编码结构在电子狗中的应用
  15. 二哥杂货铺matlab安装步骤,Matlab2017a软件安装教程
  16. 记12306货运系统“抢订空车”插件的编写--订车流程梳理
  17. 无限循环小数与分数的对应关系证明
  18. 距离多普勒谱(RD谱)绘制方法及理解
  19. Excel 宏快捷键删除单元格所在的行
  20. Nginx 配置子域名

热门文章

  1. 四川计算机网络学校,成都计算机网络应用专业如何
  2. 企业能带给员工什么?
  3. 21.04.14-用友元的方式实现复数类Complex的+=和*运算符
  4. 两大技巧教你轻松应对IB数学
  5. 【IEEE T-PAMI 2020直播回放】完备性多模态融合技术
  6. 大学校园里有哪些创业机会?
  7. 团体程序设计天梯赛 L1-070 吃火锅 (15 分) C语言实现
  8. GRE填空解法——因果关系
  9. Vue 登录手机号、密码格式验证及验证码60s获取
  10. 如何获取阿里巴巴店铺的所有商品数据