hans

hans

【Machine Learning】【Python】一、HoG + SVM 物体分类 ---- 《SVM物体分类和定位检测》


----------【2018.09.07 更新】---

如果你看到了这篇文章,并且从 github 下载了代码想走一遍整个流程。我强烈建议你把《SVM 物体分类和定位检测》这一系列的 6 篇文章都仔细看一遍。内容不多,但会对你理解算法和代码有很大的帮助。

----------【2018.01.22 更新】---- 降维算法 -----

看了一篇文章介绍 t-SNE 降维算法的,文章中给出的数据效果比 PCA 好点,大家可以尝试看看。

文章地址

--------【2017.12.22 更新】---- 流程说明 ------

总结一下我用着最好的方法流程吧。

  1. 先 HoG 提取特征 features。

  2. PCA 对 features 降维,然后用 PSO 优化参数 C 和 gamma。降维的目的是加快 PSO 运行速度,否则太慢,但分类效果降低。

  3. 用第一步拿到的 features 和第二步拿到的参数训练一个初始 SVM 模型。

  4. Hard Negative Mining 优化 SVM 模型。

  5. 进行 滑窗 detection,最后 NMS 边框回归。

目前 2700 正样本,2700 负样本。测试集 1200 负样本,700 正样本。


** 最新代码 Github 地址:** https://github.com/HansRen1024/SVM-classification-localization

最近在研究传统方法的物体分类,使用的方法是 Hog + SVM,不过分类正确率不是很高。我写一写心得体会。

首先声明我不会具体将原理。因为网上信息太多了,大家自己先看看大致了解了再看这篇文章。

ImageNet 上所有杯子数据集: https://pan.baidu.com/s/18ho4UI50x4YP6lkrjPm7Kw

一、HoG 特征数计算#

先说一下两个参数:

  1. pixels of a cell

  2. cells of a block

HoG 是对图片进行滑框提取特征的,block 就是这个框。block 里有 cell,在 cell 中进行特征提取。将 bolck 中所有 cell
的特征整合在一起,就是这个 block 的特征。再将所有 block 的特征整合一起就是整张图片的特征了。

HoG 在 cell 中提取特征的时候可以理解成是按角度来的,一般分 9 组,一组有 40 度,9 组一共 360 度。每一组就代表一个特征值。那么我们就可以计算整张图的特征数了。

对于一张 300 × 600 的图片,我定义每个 cell 里像素是 15 × 15, 每个 block 里有 2 × 2 个 cell, 图片一共有 10 × 20
个 block

一个 cell: 9 个特征

一个 block: 4 × 9 = 36 个特征

图片一共有: 10 × 20 × 36 = 3600 个特征

二、说明#

如果不对图片进行处理而直接丢如 HoG 的话,背景等因素会对最后提取的特征造成很大的不好影响。所以我提供的提取特征值的代码中包含两部分,一部分是根据 xml 文件中 bbox 信息切割出物体进行特征提取。另一部分是直接对整图进行特征提取。因为最后的特征值数量和输入图片大小有关,所以要对切割后的图片和整图统一 resize 到固定大小。更多细节看代码中注释。

路径说明:

./train/positive # 存放需要切图的带分类物体的训练集

./test/positive # 存放带分类物体的测试集

./train/positive_rest # 存放不需要切图的带分类物体的训练集

./train/negative # 存放不带分类物体的训练集

./test/negative # 存放不带分类物体的测试集

后记#

我是从 ILSVRC 拿的图片,训练集 8000 多张,正样本和负样本一种一半。测试集 2000 多张图片,正负样本各一半。后续我又做了 PCA,对正确率没什么影响,会增加模型的鲁棒性。下一篇我文章我放出加上 PCA 的代码。做 PCA 主要是后来我选择 PSO 求解最优化 SVM 参数 C 和 gamma 需要把特征降维,否则计算量太大。

加载中...
此文章数据所有权由区块链加密技术和智能合约保障仅归创作者所有。