HOG行人检测

从零开始的C++ opencv的人脸识别程序——人脸检测 之前我们做了第一个C++程序,中间有opencv的测试,这个在opencv入门教程中有,很详细。我这里印象深刻的几个错误给大家列出来,如果有同类错误可以参考一下。 第一,是程序输入后记得打上#include "stdafx.h"这句话; 第二,是测试用的图片记得放在可执行程序的目录下。这个意思就是说比如你的工程名叫opencv,那么打开这个工程文件夹,里面有一个也叫opencv的文件夹,打开, 阅读详情

HOG特征描述

首先我们来了解一下HOG特征描述子。

HOG特征描述子(HOG descriptors)是由Navneet Dalal和 Bill Triggs在2005年的一篇介绍行人检测方法的论文提到的特征描述子(论文以及演讲可参见参考资料1、2)。

其主要思想是计算局部图像梯度的方向信息的统计值,来作为该图像的局部特征值。

  • 如上图,归一化图像后,由于颜色数据对我们没有帮助,所以将图片转为灰度图。
  • 然后将图片分割成一定“块”数,称作细胞单元。
  • 计算每个细胞单元的梯度大小方向。
  • 得到每个单元的梯度方向组成一个图片的特征向量。
  • 将这个特征向量交给SVM来学习或辨认。

SVM的简单介绍可以参考:OpenCV 2.4+ C++ SVM文字识别。

 

算法分析

  • 梯度计算

 OpenCV 2.4+ C++ 边缘梯度计算中,介绍了Sobel算子和Scharr滤波器的梯度计算方法,但是论文作者使用这些复杂方法的效果并不好,最好的是使用简单的一维梯度算子:[-1, 0, 1],进行卷积计算,分别算出x方向梯度Gx与y方向梯度Gy。然后利用下面两个公式计算梯度大小和方向:

    G = \sqrt{ G_{x}^{2} + G_{y}^{2} }

    

  •  平滑处理

 论文作者使用了高斯模糊进行平滑处理,结果效果变差了。其可能原因是:许多有用的图像信息是来自变化剧烈的边缘,而在计算梯度之前加入高斯滤波会把这些边缘滤除掉。

  •  细胞方向选择
  1. 细胞的统计方向,由细胞中的每一个像素点投票取得。
  2. 票箱是0 - PI(无向)角度范围平分为9个角度,即PI/9为每个票箱的角度范围。
  3. 每个投票像素点的投票权重,由其梯度幅值计算出来,可采用幅值本身(实验效果最佳),或者他的函数来表示这个权重。
  • 块 

局部关照变化或者前景和背景的对比变化,可能使梯度强度产生剧烈变化,但我们关注的不是这些信息,所以需要对这些信息弱化处理。利用数个细胞单元组成空间上连通的块。这样,HOG描述就成了由各个块所有细胞单元的直方图组成的一个向量,这些区域是互相重叠的。这样就减小了这些剧烈变化的影响。

每个细胞是8*8个像素点,以四个细胞组成一个块。

 再由块组成检测窗。

  • 块向量归一化

最后是利用L2-norm或者L1-norm进行归一化。

设v是未被归一化的向量,| vk |是k阶范数,ε为任意小常数,当k=2时,L2-norm为:

    

当k=1时,L1-norm为:

    

还有一种归一化方式L2-Hys:

    首先进行L2-norm,然后进行截短(即值被限制为v - 0.2v之间),然后再归一化。

 

HOGDescriptor API

gpu::HOGDescriptor::HOGDescriptor

创建HOG描述符和检测器。

C++:   gpu::HOGDescriptor:: HOGDescriptor (Size  win_size=Size(64, 128), Size  block_size=Size(16, 16), Size block_stride=Size(8, 8), Size  cell_size=Size(8, 8), int  nbins=9, double  win_sigma=DEFAULT_WIN_SIGMA, double threshold_L2hys=0.2, bool  gamma_correction=true, int  nlevels=DEFAULT_NLEVELS )
参数
  • win_size – 检测窗大小。需要和块的大小、步长匹配。
  • block_size – 块的大小。需要和细胞大小匹配。目前只支持(16,16)的大小。
  • block_stride – 块的步长,必须是细胞大小的整数倍。
  • cell_size – 细胞大小。目前只支持(8, 8)的大小。
  • nbins – 投票箱的个数。目前只支持每个细胞9个投票箱。
  • win_sigma – 高斯平滑窗口参数。
  • threshold_L2hys – L2-Hys归一化收缩率。
  • gamma_correction – 伽马校正预处理标志,需要或不需要。
  • nlevels – 检测窗口的最大数目。

gpu::HOGDescriptor::getDescriptorSize

返回分类所需的系数的数目。

C++:  size_t  gpu::HOGDescriptor:: getDescriptorSize ( )  const

gpu::HOGDescriptor::getBlockHistogramSize

返回块直方图的大小。

C++:  size_t  gpu::HOGDescriptor:: getBlockHistogramSize ( )  const

gpu::HOGDescriptor::setSVMDetector

设置线性SVM分类器的系数。

C++:  void  gpu::HOGDescriptor:: setSVMDetector (const vector<float>&  detector )

gpu::HOGDescriptor::getDefaultPeopleDetector

返回人的分类训练检测(默认的窗口大小)的默认系数。

C++:   static vector<float>  gpu::HOGDescriptor:: getDefaultPeopleDetector ( )

gpu::HOGDescriptor::getPeopleDetector48x96

返回人的分类训练检测(48*96窗口大小)的系数。

C++:   static vector<float>  gpu::HOGDescriptor:: getPeopleDetector48x96 ( )

gpu::HOGDescriptor::getPeopleDetector64x128

返回人的分类训练检测(64*128窗口大小)的系数。

C++:   static vector<float>  gpu::HOGDescriptor:: getPeopleDetector64x128 ( )

gpu::HOGDescriptor::detect

在没有多尺度的窗口执行对象检测

C++:  void  gpu::HOGDescriptor:: detect (const GpuMat&  img, vector<Point>&  found_locations, double  hit_threshold=0, Size win_stride=Size(), Size  padding=Size() )
Parameters:
  • img – 源图像。只支持CV_8UC1和CV_8UC4数据类型。
  • found_locations – 检测出的物体的边缘。
  • hit_threshold – 特征向量和SVM划分超平面的阀值距离。通常它为0,并应由检测器系数决定。但是,当系数被省略时,可以手动指定它。
  • win_stride – 窗口步长,必须是块步长的整数倍。
  • padding – 模拟参数,使得CUP能兼容。目前必须是(0,0)。

gpu::HOGDescriptor::detectMultiScale

在多尺度窗口中执行对象检测。

C++:  void  gpu::HOGDescriptor:: detectMultiScale (const GpuMat&  img, vector<Rect>&  found_locations, double  hit_threshold=0, Size  win_stride=Size(), Size  padding=Size(), double  scale0=1.05, int  group_threshold=2 )
参数
  • img – 源图像。只支持CV_8UC1和CV_8UC4数据类型。
  • found_locations – 检测出的物体的边缘。
  • hit_threshold – 特征向量和SVM划分超平面的阀值距离。通常它为0,并应由检测器系数决定。但是,当系数被省略时,可以手动指定它。
  • win_stride – 窗口步长,必须是块步长的整数倍。
  • padding – 模拟参数,使得CUP能兼容。目前必须是(0,0)。
  • scale0 – 检测窗口增长参数。
  • group_threshold – 调节相似性系数的阈值。检测到时,某些对象可以由许多矩形覆盖。 0表示不进行分组。

gpu::HOGDescriptor::getDescriptors

返回整个图片的块描述符。

C++:  void  gpu::HOGDescriptor:: getDescriptors (const GpuMat&  img, Size  win_stride, GpuMat&  descriptors, int descr_format=DESCR_FORMAT_COL_BY_COL )
参数
  • img – 源图像。只支持CV_8UC1和CV_8UC4数据类型。
  • win_stride – 窗口步长,必须是块步长的整数倍。
  • descriptors – 描述符的2D数组。
  • descr_format –

    描述符存储格式:

    • DESCR_FORMAT_ROW_BY_ROW - 行存储。
    • DESCR_FORMAT_COL_BY_COL - 列存储。

这个函数主要用于分类学习。

 

检测代码

复制代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/gpu/gpu.hpp>

#include <stdio.h>

using namespace cv;

int main(int argc, char** argv){
    Mat img;
    vector<Rect> found;

     img = imread(argv[1]);

    if(argc != 2 || !img.data){
        printf("没有图片\n");
        return -1;
    }

    HOGDescriptor defaultHog;
    defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());

    //进行检测
    defaultHog.detectMultiScale(img, found);

    //画长方形,框出行人
    for(int i = 0; i < found.size(); i++){
        Rect r = found[i];
        rectangle(img, r.tl(), r.br(), Scalar(0, 0, 255), 3);
    }

    
    namedWindow("检测行人", CV_WINDOW_AUTOSIZE);
    imshow("检测行人", img);

    waitKey(0);

    return 0;
}
复制代码

这段代码虽然可以检测出行人,但是可能会出现,一个人身上有几个框框。例如下图左边的行人:

所以我们需要对found进行筛选,把那些被嵌套的长方形去除。

复制代码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/gpu/gpu.hpp>

#include <stdio.h>

using namespace cv;

int main(int argc, char** argv){
    Mat img;
    vector<Rect> found, foundRect;

     img = imread(argv[1]);

    if(argc != 2 || !img.data){
        printf("没有图片\n");
        return -1;
    }

    HOGDescriptor defaultHog;
    defaultHog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());

    //进行检测
    defaultHog.detectMultiScale(img, found);

    //遍历found寻找没有被嵌套的长方形
    for(int i = 0; i < found.size(); i++){
        Rect r = found[i];

        int j = 0;
        for(; j < found.size(); j++){
            //如果时嵌套的就推出循环
            if( j != i && (r & found[j]) == r)
                break;
        }
        if(j == found.size()){
            foundRect.push_back(r);
        }
    }

    //画长方形,圈出行人
    for(int i = 0; i < foundRect.size(); i++){
        Rect r = foundRect[i];
        rectangle(img, r.tl(), r.br(), Scalar(0, 0, 255), 3);
    }

    
    namedWindow("检测行人", CV_WINDOW_AUTOSIZE);
    imshow("检测行人", img);

    waitKey(0);

    return 0;
} 
复制代码

 

PS:输入图片不能比检测窗还小,这样会抛出错误的。

 

参考资料

Histograms of Oriented Gradients for Human Detection . Navneet Dalal & Bill Triggs . 2005

Histograms of Oriented Gradients for Human Detection Talk . Navneet Dalal & Bill Triggs

OpenCV HOGDescriptor 参数图解 . Excalibur . 2011-03-11

C++ Opencv 视频处理 行人检测 检测一个区域内是否有行人出现 源码 利用帧差法检测区域内是否有人出现,如果出现行人就报警。 不同的区域位置需要调参,根据摄像头内行人大小调节一下参数 const double RECT_HW_RATIO = 1.5; // 人体长宽比阈值 const double RECT_AREA_RATIO = 0.001; // 人体占整个图像最小比例阈值 const double RECT_AREA_... 阅读详情

相关推荐

利用Hog特征和SVM分类器进行行人检测

之前介绍过Hog特征(http://blog.youkuaiyun.com/carson2005/article/details/7782726),也介绍过SVM分类器(http://blog.youkuaiyun.com/carson2005/article/details/6453502 );而本文的目的在于介绍利用Hog特征和SVM分类器来进行行人检测。         在2005年CVPR上,来自法国的研究人员

计算机视觉小菜鸟的专栏 12万+

OpenCV 2.4.2在VS2010下的安装(使用预编译库)

1)在网站上下载OpenCV安装包(目前最新版本是2.4.2) 下载地址:http://opencv.org/ 选择OpenCV for Windows进行下载 2)右键OpenCV-2.4.2.exe,在Windows 7下要选择,以管理员身份运行,在弹出窗口中选择解压路径,将其解压到某一目录下,如:C:\ProgramFiles (x86)\opencv。 3)配置VC 配置incl

Image Processing for Computer Graphics and Vision 1万+

【机器学习】HOG+SVM实现行人检测

HOG的全称是方向梯度直方图(Histogram of Oriented Gradient),它是计算机视觉中用于物体检测的一种特征描述子(Feature Descriptor)。特征描述子的作用是提取有用的信息,抛弃冗余的信息。对于一个物体而言,能够区分它的特征的往往是它的形状——也就是它的边界。而在边界处灰度一般有突变,所以我们考察图像的梯度就可以知道边界在什么地方。现在我们把一个图片利用HOG特征转化成了一个向量,接下来就可以利用SVM分类了。

qaqwqaqwq的博客 9130

人脸检测和人体检测4:C++实现人脸检测和人体检测(含源码,可实时检测)

这是项目《人脸检测和行人检测》系列之《C++实现人脸检测和行人检测(含源码,可实时检测)本篇主要分享将Python训练后的YOLOv5的行人检测(人体检测)模型转写成C/C++代码。我们将开发一个简易的、可实时运行的行人检测(人体检测)C/C++ Demo。人脸检测和行人检测C/C ++版本模型推理支持CPU和GPU加速,在GPU(OpenCL)加速下,可以达到实时的检测效果,基本满足业务的性能需求。先展示一下人脸检测和行人检测的效果:

AI吃大瓜的博客 5503

Python+OpenCV+HOG+SVM+行人检测

项目做得很多,机器学习,深度学习也搞了不少,对于图像的方面,现在就行人检测有关HOG+SVM这一块,做一下总结,当然也有车辆检测等等...这里就以行人检测为例做一个介绍: HOG:梯度直方图的缩写,涉及到Window大小,Block大小,Block的滑动步长,Cell大小和Bin大小(通常为9,360度等分9份),目的就是获取到Window中所有滑动后的block的cell的梯度直方图,组成特征...

nsh119的博客 1万+

基于python的行人与车辆检测和跟踪实现(HOG+SVM/HAAR)

如果想直接看代码请跳转至‘我的代码’基于python的行人与车辆检测和跟踪实现(HOG+SVM/HAAR)前言实现思想行人检测:车辆检测目标跟踪流程图参考代码我的代码 基于python的行人与车辆检测和跟踪实现(HOG+SVM/HAAR) 前言 身在国外正在做毕设,期间看到了很多国内外人士写的代码。由衷的感谢各位开源大神提供的资源,让我能自学入门Computer Vistion领域。此文不仅仅是为...

Kewei 的学习之旅 1万+

Opencv实现行人检测(HOG + SVM)

1. 理论基础 使用OpenCv进行行人检测的主要思想: HOG + SVM HOG: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。HOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征. SVM: (Support Vector Machine)指的是支持向量机,是...

YancyKahn 2万+

HOG+SVM实现行人检测

一、概述 行人检测过去流行采用的方法是DPM方法,其主要采用hog特征+SVM分类实现行人检测; 其中梯度方向直方图( Histogram of Oriented Gradients,HOG)的概念是 Dalal和Triggs在2005年提出,并将其用于行人检测, 该方法在 MIT行人数据库上获得近乎 100% 的检测成功率;在包含视角、 光照和背景等变化的 INRIA 行人数据库上,也取得了...

yph001的博客 4851

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

目录HOG是什么?HOG vs SIFTHOG步骤HOG在检测行人中的方式Opencv实现HOGDescriptor的构造函数:行人检测HOG+SVM步骤 HOG是什么? 方向梯度直方图( Histogram of Oriented Gradient, HOG )特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过 计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征结...

hanhan的博客 3168

基于HOG特征的Adaboost行人检测

1.方向梯度直方图(Histogramof Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。基本知识可以参考博客:http://blog.youkuaiyun.com/zouxy09/article/details/7929348   2.Adaboost的基础知识可以参考书籍:统计学习方法

van_ruin的专栏 6967

Hog+svm行人检测

(1)第一个工程是用来训练分类器和检测正样本检测率的 // PeopleDetectHog.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include "cv.h" #include "highgui.h" #include "stdafx.h" #include

5946

HOG+SVM行人检测python实现

HOG+SVM行人检测,NMS,python实现,Windows,INRIA 数据集

weixin_51672709的博客 5401

HOG-descriptor:在matlab中实现HOG(梯度直方图)特征提取

HOG描述符 在matlab中实现HOG(梯度直方图)特征提取。 此源代码最初来自[1] 我进行了一些更改,以便您可以直接运行hogtest.m进行测试。 HOG描述符的详细说明也可以在以下参考文献中找到。 [2] ; [3] 。

hog行人检测

本文只提供行人检测的效果图和源码链接 实验功能:   单击Open Image按钮,选择需要进行人检测的一张图片,确定后自动显示出来。该图片的大小没限制。   单击People Detect按钮,则程序会自动对该图片进行行人检测,且将检测到的效果显示出来,即用1个矩形框将行人框出来。   单击Close按钮,退出程序。 实验结果: 图片1效果:    图片2效果:

彼岸花 1446

GPU-HOG:HOG算法的GPU实现

CUDA 猪 具有默认参数的定向梯度直方图 [Dalal 2005] 的 GPU 实现。 该算法使用图像上的滑动窗口来生成直方图。 特征向量保存在“GPU_features”下,梯度幅度和角度计算步骤保存在“gradient.txt”中,虽然它并不漂亮:P 安装 从磁盘读取图像需要 。 它已经包含在内。 确保已安装 X11 库。 CImg 需要它们来编译。 运行包含的 makefile(在发布/调试中)。 用法 跑步: ./Debug/HOGCUDA [图像名称] 或者 ./Release/HOGCUDA [图像名称] 问题/错误 未实现块边缘的高斯权重。 仅支持 RGB 图像 内核无法启动小图像。 环境 用 Nsight 编译,gcc 4.8,CUDA 6.5,NVIDIA 驱动程序 340.65 GTX 780 上的 Debian Jessie(测试) 执照 在 MIT 许

hog(梯度方向直方图)的SSE加速实现

hog(histogram of oriented gradients)是行人检测,目标检测最重要的特征之一,但其运算速度相对比较慢。本程序是HOG的SSE实现加速,非常有价值。

HOG+SVM行人检测

前言 在前面的博客:HOG特征检测学习笔记中,介绍了HOG特征,也附有代码实现。这篇博客中将会使用HOG+SVM这一经典的目标检测算法来进行行人检测,但是不会讨论HOG或者SVM的理论部分,如果有不懂的请自行查阅以前的博客。我分别写了python版本和C++版本的demo,数据集是直接下载了别人的,这些都会附在文章的最后。 网上也有很多介绍HOG的不错的文章: HOG+SVM行人检测的...

hongbin_xu的博客 3万+

实战解析:利用Python requests库高效抓取京东商品评论并构建结构化数据集

本文详细介绍了如何利用Python requests库高效抓取京东商品评论并构建结构化数据集。通过分析京东评论接口、处理反爬机制以及数据解析存储,帮助开发者快速获取电商数据,适用于竞品监控、用户画像构建等商业场景。

weixin_42526415的博客 837
上一篇: 行人检测(Pedestrian Detection)资源2012
下一篇: 行人检测(总结)
淡淡的生活
博客等级 码龄16年 341粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值