CV学习:传统(机器学习)目标检测——HOG+SVM检测器

目录

1. HOG概述

1.1. 主要思想

1.2. 算法实现

1.3. 目标检测

2. HOG原理

2.1. 图像预处理

2.2. cell梯度直方图

2.3. Block归一化

2.4. 提取HOG特征

2.5. 行人检测HOG+SVM

3. HOG Detector

3.1. 图像金字塔

3.2. 滑动窗口

4. opencv中的行人检测器

5. 参考内容


HOG(Histograms of Oriented Gradients:定向梯度直方图)是一种基于图像梯度的特征提取方法,被广泛应用于计算机视觉和机器学习领域。由Navneet Dalal和Bill Triggs在2005年提出。

HOG特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子,是与SIFT、SURF、ORB属于同一类型的描述符。HOG不是基于颜色值而是基于梯度来计算直方图的,它通过计算和统计图像局部区域的梯度方向直方图来构建特征。HOG特征结合SVM分类器已经被广泛应用到图像识别中,尤其在行人检测中获得了极大的成功。

1. HOG概述

1.1. 主要思想

此方法的基本观点是:局部目标的外表和形状可以被局部梯度或边缘方向的分布很好的描述,即使我们不知道对应的梯度和边缘的位置。(本质:梯度的统计信息,梯度主要存在于边缘的地方)

1.2. 算法实现

首先,将图像分成很多小的连通区域,我们把它叫做cell,然后采集cell中各像素点的梯度大小和方向,然后在每个cell中通过某种方式绘制一个一维的梯度方向直方图。

其次,为了对光照和阴影有更好的不变性,需要对直方图进行对比度归一化,这可以通过把这些直方图在图像的更大的范围内(我们把它叫做区间或者block)进行对比度归一化。我们把归一化的块描述符叫作HOG描述子。

1.3. 目标检测

将检测窗口中的所有块的HOG描述子组合起来就形成了最终的特征向量,然后使用SVM分类器进行行人检测。下图描述了特征提取和目标检测流程。检测窗口划分为重叠的块,对这些块计算HOG描述子,形成的特征向量放到线性SVM中进行目标/非目标的二分类。检测窗口在整个图像的所有位置和尺度上进行扫描,并对输出的金字塔进行非极大值抑制来检测目标。(检测窗口的大小一般为128×64128×64)

2. HOG原理

2.1. 图像预处理
  • 在与分类器一起使用时,我们需要对图像训练集进行变换大小的处理,大小视情况而定,但不宜过大。在这里我们按照64*128考虑。
  • 图像一般为灰度图。但并不要求是灰度图,这是因为彩色图也可以计算梯度图,对于彩色图像,先对三通道颜色值分别计算梯度,然后取梯度值最大的那个作为该像素的梯度。
  • Gamma校正。Gamma校正可以理解为提高图像中偏暗或者偏亮部分的图像对比效果,能够有效地降低图像局部的阴影和光照变化。换言之,Gamma校正可以让图片的局部的梯度更“明显”。

        Gamma校正公式为:

f(I)=Iγ

        其中I为图像像素值,γ为Gamma校正系数。γ系数设定影响着图像的调整效果,结合下图,我们来看一下Gamma校正的作用:

        γ<1在低灰度值区域内,动态范围变大,图像对比度增加强;在高灰度值区域,动态范围变小,图像对比度降低,同时,图像的整体灰度值变大;

        γ>1在低灰度值区域内,动态范围变小,图像对比度降低;在高灰度值区域,动态范围变大,图像对比度提高,同时,图像的整体灰度值变小;

        左边的图像为原图,中间图像的γ=12.2,右图γ=2.2。

        作者在他的博士论文里有提到,对于涉及大量的类内颜色变化,如猫,狗和马等动物,没标准化的RGB图效果更好,而牛,羊的图做gamma颜色校正后效果更好。是否用gamma校正需要分析具体的训练集情况。

  • 图像模糊,视情况
  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
HOG(Histogram of Oriented Gradients)特征检测是一种计算机视觉技术,可以用于目标检测SVM(Support Vector Machine)是一种常用的机器学习算法,可以用于分类问题。将两者结合起来可以实现目标检测。 下面是使用HOG特征检测和SVM分类器实现目标检测的C++代码示例: 1. 首先需要引入OpenCV库,并定义包含正样本和负样本的文件夹路径。 ``` #include <opencv2/opencv.hpp> #include <iostream> using namespace std; using namespace cv; string pos_path = "path/to/positive/samples"; string neg_path = "path/to/negative/samples"; ``` 2. 定义HOG特征检测器SVM分类器。 ``` HOGDescriptor hog; SVM svm; ``` 3. 训练SVM分类器。 ``` Mat train_data, train_labels; vector<string> pos_files, neg_files; // 读取正样本图像 glob(pos_path, pos_files); for (size_t i = 0; i < pos_files.size(); i++) { Mat img = imread(pos_files[i]); if (img.empty()) continue; resize(img, img, Size(64, 128)); // 调整图像大小 vector<float> descriptors; hog.compute(img, descriptors); // 计算HOG特征 train_data.push_back(Mat(descriptors).t()); // 将HOG特征转换为行向量 train_labels.push_back(1); // 正样本标签为1 } // 读取负样本图像 glob(neg_path, neg_files); for (size_t i = 0; i < neg_files.size(); i++) { Mat img = imread(neg_files[i]); if (img.empty()) continue; resize(img, img, Size(64, 128)); // 调整图像大小 vector<float> descriptors; hog.compute(img, descriptors); // 计算HOG特征 train_data.push_back(Mat(descriptors).t()); // 将HOG特征转换为行向量 train_labels.push_back(-1); // 负样本标签为-1 } // 训练SVM分类器 svm.train(train_data, ROW_SAMPLE, train_labels); ``` 4. 使用训练好的SVM分类器进行目标检测。 ``` Mat img = imread("path/to/test/image"); resize(img, img, Size(64, 128)); // 调整图像大小 vector<float> descriptors; hog.compute(img, descriptors); // 计算HOG特征 Mat sample = Mat(descriptors).t(); // 将HOG特征转换为行向量 float response = svm.predict(sample); // 使用SVM分类器进行预测 if (response > 0) { cout << "Object detected!" << endl; } else { cout << "No object detected." << endl; } ``` 以上就是使用HOG特征检测和SVM分类器实现目标检测的C++代码示例。需要注意的是,样本的数量和质量对训练和检测的效果有重要影响,需要根据具体情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值