目前的进度有些缓慢了。。。
要想用CUDA实现HOG特征的并行计算,那么首先就要熟悉HOG计算的相关内容、思想,以便实现并行计算方案。
关于HOG特征的介绍,在网上有非常非常多,其中英文原文:http://vision.stanford.edu/teaching/cs231b_spring1213/papers/CVPR05_DalalTriggs.pdf
故这里不作详细介绍,简单摘抄其他博客内容进行介绍:
HOG特征提取方法就是将一个image(你要检测的目标或者扫描窗口):
1)灰度化(将图像看做一个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了。这个就是最终的可供分类使用的特征向量了。
摘抄自:http://blog.csdn.net/liulina603/article/details/8291093
当然上述过程只是一个简单的介绍,其中还有很多重要的细节没有体现,比如说权重的分配等等。为了我们自己写的HOG特征和OpenCV中的HOG特征、SVM算法的接口匹配,这样的话,会使得我们的项目进展得更加顺利。显而易见,要想达到这种目的,最简单的方法就是研究OpenCV中的源码,接下来,我将尝试理解源码。
首先,我们要找到这个源码。我们用CMake对OpenCV249进行编译,得到一个新的文件夹,在这里面我们可以找到
OpenCV.sln的项目文件(我这里CMake选择的编译器是VS2012,各位视情况而定哦)。用VS2012打开该项目文件,找到
打开hog.cpp,其中就是hog的源码。
要得到HOG特征,并且结合我们要移植到CUDA一侧进行改写成并行HOG特征算法,于是,我们要对HOG特征源码中的核心函数进行分析,尤其是计算过程。http://www.cnblogs.com/tornadomeet/archive/2012/08/15/2640754.html博客中有比较详细的hog源码的介绍,拜读之后受益匪浅,既然前人已经有了成熟的经验,那在这里我也就借鉴一下了!
这里主要注意
void HOGDescriptor::compute
void HOGCache::init
void HOGDescriptor::computeGradient
三个函数,这些是和HOG特征向量的计算有着直接的关系。
这里我把一些值得注意的地方列举出来,希望对理解源码有所帮助!
1. gradPtr[x*2] = mag*(1.f - angle);
gradPtr[x*2+1] = mag*angle;
乍一看,gradPtr的长度是width,而for循环中x的最大值也是width,那岂不是越界了么?
我们看到gradPtr定义的地方:
float* gradPtr = (float*)grad.ptr(y);
看gard定义的地方:
grad.create(gradsize, CV_32FC2); // <magnitude*(1-alpha), magnitude*alpha>
这里是CV_32FC2,明显是两通道,所以实际上gradPtr的大小是2*width,偶数第一通道,奇数第二通道。
2.幅值统计的时候,并不是落在那个bin,就只有该bin+幅值,而是与其最近的一个bin也受到影响
3.一个block内的cell是相互影响的,具体可参见我上列的博客
CUDA移植方案:
我的目的是将hog.cpp中的特征计算函数移植到CUDA处进行并行计算加速,那么简单的计算当然是没问题,但是涉及到opencv的内容,CUDA是hold不住的,因为CUDA是类似C语言的编程语言,没有提供opencv的相关API。于是有关内容都要自己改写。
比如说:
struct HOGCache { struct BlockData { BlockData() : histOfs(0), imgOffset() {} int histOfs; Point imgOffset; }; struct PixData { size_t gradOfs, qangleOfs; int histOfs[4]; float histWeights[4]; float gradWeight; }; HOGCache(); HOGCache(const HOGDescriptor* descriptor, const Mat& img, Size paddingTL, Size paddingBR, bool useCache, Size cacheStride); virtual ~HOGCache() {}; virtual void init(const HOGDescriptor* descriptor, const Mat& img, Size paddingTL, Size paddingBR, bool useCache, Size cacheStride); Size windowsInImage(Size imageSize, Size winStride) const; Rect getWindow(Size imageSize, Size winStride, int idx) const; const float* getBlock(Point pt, float* buf); virtual void normalizeBlockHistogram(float* histogram) const; vector<PixData> pixData; vector<BlockData> blockData; bool useCache; vector<int> ymaxCached; Size winSize, cacheStride; Size nblocks, ncells; int blockHistogramSize; int count1, count2, count4; Point imgoffset; Mat_<float> blockCache; Mat_<uchar> blockCacheFlags; Mat grad, qangle; const HOGDescriptor* descriptor; };
HOGCache这个类型我们需要重写。具体重写办法下回我将介绍!
最后能得到HOG特征,再在opencv cpp处进行SVM训练。
相关推荐
在实现3D-HOG源码时,需要注意优化计算效率,因为3D空间的计算量比2D大得多。此外,还需要考虑如何有效地存储和处理大量的3D数据,以及如何适应不同的应用场景,如机器人导航、自动驾驶或3D视频分析。 通过理解并...
"HOG-LBP detection"这个主题聚焦于两种常见的局部特征表示方法:Histogram of Oriented Gradients(方向梯度直方图,简称HOG)和Local Binary Patterns(局部二值模式,简称LBP),并结合Support Vector Machines...
标题中的“HOG-Pedestrian-Detector-master_image_”指的是一个人行检测算法的实现,基于Histogram of Oriented Gradients(HOG)特征。HOG是一种在计算机视觉和图像处理中广泛使用的局部特征提取方法,特别适用于...
% HOG特征提取------------ % 第1步:计算水平,竖直方向, 像素梯度矩阵:Ix、Ty % 第2步:计算image对应:angle,magnitude矩阵 % 第3步:遍历, 第1层遍历block, 第2层遍历cell, 第3层遍历pixel % 计算每个pixel...
【标题】HOG-SVM图片分类 在计算机视觉领域,图像分类是一项基本任务,它涉及到将图像分成不同的预定义类别。HOG(Histogram of Oriented Gradients,方向梯度直方图)和SVM(Support Vector Machine,支持向量机)...
行人检测中的HoG和HoG-LBP算法的对比试验。
《HOG-LBP检测技术与SVM分类器的结合应用》 在计算机视觉领域,物体检测是一项关键的技术,它能够帮助计算机理解图像中的目标对象。HOG(Histogram of Oriented Gradients,方向梯度直方图)和LBP(Local Binary ...
标题中的“HOG.rar_ HOG matlab_HOG-LBP_hog_hog matlab”指的是一个包含与Histogram of Oriented Gradients(HOG)特征提取相关的MATLAB代码的压缩包。HOG是一种广泛应用于计算机视觉和图像处理领域,特别是物体...
【基于HOG-SVM的算法】 HOG(Histogram of Oriented Gradients,导向梯度直方图)是一种在计算机视觉领域广泛使用的特征提取方法,特别适用于物体检测。它通过计算和统计图像局部区域中像素点的梯度方向直方图来...
【标题】"hogsvmmatlab代码-qrcode-detection-hog-svm-matlab:qrcode-detection-hog-svm" 提供的是一个基于MATLAB实现的二维码检测系统,利用了Histogram of Oriented Gradients(HOG)特征和Support Vector ...
标题中的“HOG+LBP_HOG-LBP_objectrecognition_形状纹理_纹理特征_lbp_源码.zip”表明这是一个关于对象识别技术的压缩包,其中包含使用HOG(Histogram of Oriented Gradients,方向梯度直方图)和LBP(Local Binary ...
本程序包“HOG-matlab.zip”专门针对MATLAB环境,提供了一套完整的HOG特征提取流程以及基于KNN(K-Nearest Neighbor)的分类验证过程,旨在帮助用户理解和应用HOG特征。 HOG特征的原理是通过计算和统计图像局部区域...
标题中的“HOG-SVM-classifer-master.zip”指的是一个基于HOG(Histogram of Oriented Gradients,方向梯度直方图)特征和SVM(Support Vector Machine,支持向量机)分类器的项目源代码压缩包。这个项目的核心是...
机器视觉作业-基于HOG特征检测和SVM分类器的手势识别项目matlab实现源码+实验报告.zip 【资源说明】 【1】项目代码完整且功能都验证ok,确保稳定可靠运行后才上传。欢迎下载使用!在使用过程中,如有问题或建议,请...
定向梯度直方图(Histogram of Oriented Gradients, HOG)是一种计算机视觉中的特征提取方法,常用于行人检测、图像分类等任务。HOG描述符由Dimitri L. Dalal和Trinh Van Nguyen在2005年提出,其核心思想是通过计算...
【谷速软件】提供的MATLAB代做源码主要涉及了HOG(Histogram of Oriented Gradients,方向梯度直方图)特征提取的过程。HOG是一种用于计算机视觉和图像处理的特征描述符,尤其在行人检测等领域有广泛应用。以下是...
### HOG-LBP人体检测器及其对部分遮挡的处理 #### 摘要与引言 本文介绍了一种结合直方图方向梯度(Histograms of Oriented Gradients, HOG)和局部二值模式(Local Binary Pattern, LBP)特征的人体检测方法,该...