HOG特征原理梳理与实验分析

重读了HOG特征的论文,比起SIFT特征这种磨人小妖级别的特征,HOG还是naive. 但HOG特征的使用效果使得其在目前的应用中热度不减。讨论其设计思路是有意思的事情。本文试图从算法的步骤上分析算法设计的意义。但这毕竟是个人观点,各位自己也要判断,要是各位看官阅后理解出现了偏差,乃们自己也有责任。

几个问题

HOG特诊也是人工设计的特征,既然是人工设计,那就一定包含了作者的深厚内力在里面,也是充满了经验主义,更多的是实验论证,疗效是关键,而不是理论上的优雅。关于它为什么就这么好,原作者本人也是做了经验上和工程上的分析。 本文主要探讨四个问题,为什么使用局部方向直方图,和作者强调的三个优点:良好的梯度尺度良好的方向和粗糙的空间划分高质量的有交叠的块描述子的局部对比度归一化在HOG特征的设计上是如何体现的。

原理框架

这里写图片描述

输入图像

HOG特征与SIFT特征不同的是它检测窗口尺度固定,通过降采样原始图片来获得与窗口尺寸匹配的输入图像,而SIFT把这部分直接做到了检测算子的构造流程中去。论文中选择64*128的窗口也是根据数据集的特点和待检测目标的性质决定的。

归一化伽马校正与彩色空间

和硕士论文一样,做图像的总喜欢加一个图像的预处理,一来为了凑字数,二来为了保证系统的完整性。在这里作者也试图通过伽马校正来抑制光照的影响,并试图改变色彩空间来提高性能。但针对行人检测,也或许是因为后续步骤对光照已经有较好的抑制,此步骤的引入会降低实验效果。

彩色空间(基准:RGB) 校正方法(基准:无校正) 效果
LAB -- 近似无区别
灰度 -- ↓1.5%
-- 平方根 ↓1%
-- 对数压缩 ↓2%

计算梯度(良好的梯度尺度)

作者对图像在x和y方向各做了一个[1 0 -1]的差分,得到了x和y方向的梯度图。但何为良好的梯度尺度呢?好不好都是对比出来的。在做完差分后,一般加一个高斯平滑。但在这里,作者选择了最简单的操作,因为在这个任务中任何使用复杂操作的企图都会导致性能下降。

梯度算子 高斯平滑 效果
1-D point derivatives [1, 0, -1] σ=0 baseline
Cubic corrected 1-D [1, -8, 0, 8, -1] σ=0 ↓1%
1-D point derivatives [-1,1] σ=0 ↓1.5%
2×2 diagonal ones σ=0 ↓1.5%
-- σ=2 ↓9%

构造cell,bins权重投票(良好的方向和粗糙的空间划分)

与上一节一样,之所以称为良好,是因为比对比试验的结果都好。 作者试验了选取360度方向的情况,效果比180度差。作者最终选择了9个bin,因为试验的其他bin数效果都不如9,18的效果和9差不多,但在作者的评价点上略差。 划分的具体原理是,将方向按照距离相邻两个bin的距离按照幅值按比例划分。

Block的构造(高质量的有交叠的块描述子的局部对比度归一化)

作者将4个cell作为一个block,把每个cell中的9维向量连起来,得到一个block的36维特征,为什么是2×2的4个cell组成一个block,因为作者使用2×1的和1×2的各种试都不如2*2的效果好。 作者滑动block,每个block之间是有重叠的,因为不重叠性能会大幅下降,同时,有重叠也是类似工程问题的通用解决方法。这个过程类似卷积操作的滑动,不做赘述。

归一化

对得到的36维特征做归一化,增强特征间的对比度。作者选择了l2-hys, 即,先做l2-norm,结果中如果有值大于0.2,则截断设置为0.2,再重新做l2-norm.着也是大量实验对比得到的结果。

为什么用局部方向直方图

方向梯度直方图的使用,也是相关工程的通用手法。在形状上下文,SIFT,边缘向直方图等算法中都用到了这种操作。

这里写图片描述

可以看到,梯度的设定能够有效抑制光照导致的像素点绝对值的变化。局部的统计信息能够有效地提高算法的鲁棒性,抑制单一像素点的个体干扰。

延伸

DPM算法 OpenCV人脸识别中HOG特征的实现

HOG特征原理梳理与实验分析

linux压缩与解压

File Type 解压 压缩
.tar tar zxvf FileName.tar tar czvf FileName.tar DirName(打包)
.gz gzip -d FileName.gz gzip FileName
.tar.gz 和 .tgz tar zxvf FileName.tar.gz tar zcvf FileName.tar.gz DirName
.bz2 bzip2 -d FileName.bz2 bzip2 -z FileName
.tar.bz2 tar jxvf FileName.tar.bz2 tar jcvf FileName.tar.bz2 DirName
.Z uncompress FileName.Z compress FileName
.tar.Z tar Zxvf FileName.tar.Z tar Zcvf FileName.tar.Z DirName
.zip unzip FileName.zip zip FileName.zip DirName
linux压缩与解压

支持向量分类实用指南

说明:本文翻译总结自 Chih-Wei Hsu等的论文 A Practical Guide to Support Vector Classification. 该论文也是libsvm的指导教程,在libsvm的homepage上可以下载阅读。

1 Introduction

  • SVM在数据分类上是很有用的工具。
  • 虽然它比神经网络更易于使用,但不熟悉的使用者在第一次使用时往往得不到好的结果。
  • 一个分类任务需要把数据分成训练集和测试集。
  • 给出训练集的样本对\( (x_i,y_i),i = 1, ...,l , x \in R^n, y \in {1, -1}^l \) 求解最优化问题: \( \min \limits _{ w,b,\xi } { 1 \over 2 } { W^T W + C \sum \limits _{i = 1}^l \xi_i } \) \( \quad subject \ to \quad y_i (W^T\phi(X_i)+b) \ge 1-\xi_i , \xi_i \ge 0\)
  • 四种基本核函数:
    • 线性: \( K (X_i, X_j) = X_i ^TX_j \)
    • 多项式: \( K (X_i,X_j) = (\gamma X_i^TX_j + r)^d , \gamma > 0\)
    • 径向基函数(RBF): \( K(X_i, X_j) = e^{-\gamma||X_i - X_j||^2}, \gamma > 0 \)
    • sigmoid: \(K(X_i,X_j) = tanh(\gamma X_i^TX_j +r) \)

Continue reading "支持向量分类实用指南"

支持向量分类实用指南

Google C++ Style Guide 阅读笔记

Background

C++是谷歌开源项目的主要使用语言,虽然Google Code 黄了。C++是很强大的语言,以致于增加了其复杂性。为了让代码被其他程序员看懂,减少出bug的可能,所以有了这个谷歌C++风格指导。

Header Files

  • 每个.cc文件都应该与一个.h文件关联,除非是单元测试或者只包含一个main();

The #define Guard

  • 每个头文件都应该避免被重复包含。宏定义可以用PROJECT_PATH_FILE_H_ 的格式。 例如:

Continue reading "Google C++ Style Guide 阅读笔记"

Google C++ Style Guide 阅读笔记

机器学习与智能优化

注意:本文是对Machine Learning plus Intelligent Optimization章节要点的部分翻译,译文不求规范,不求顺序,只挑感兴趣的译,作为笔记之用,错误难免

KNN

KNN(最近邻)是原始且懒惰的机器学习形式:仅仅将所有训练数据存储下来。

当有新的待估计点输入时,搜寻得到存储数据中阈值最接近的K个数据点。用它们的多数的类别或者均值作为输出。简单的训练方式导致了搜寻大量数据时的漫长的响应等待。 KNN在很多实际应用中是有效的。因为输入简单通常输出也简单,这是机器学习的一个基本假设。它很像人类推理的案例学习过程。尽管简单粗暴,但它在很多情况下确实成效非凡。

  • KNN之所以实现是因为基于 Natura non facit saltus(拉丁语“自然不会跳变”)这一规律。自然万物和属性总是渐变的,而不是突变。
  • WKNN加权KNN

Continue reading "机器学习与智能优化"

机器学习与智能优化