----------【2018.09.07 更新】---
如果你看到了这篇文章,并且从 github 下载了代码想走一遍整个流程。我强烈建议你把《SVM 物体分类和定位检测》这一系列的 6 篇文章都仔细看一遍。内容不多,但会对你理解算法和代码有很大的帮助。
----------【2018.01.22 更新】---- 降维算法 -----
看了一篇文章介绍 t-SNE 降维算法的,文章中给出的数据效果比 PCA 好点,大家可以尝试看看。
--------【2017.12.22 更新】---- 流程说明 ------
总结一下我用着最好的方法流程吧。
-
先 HoG 提取特征 features。
-
PCA 对 features 降维,然后用 PSO 优化参数 C 和 gamma。降维的目的是加快 PSO 运行速度,否则太慢,但分类效果降低。
-
用第一步拿到的 features 和第二步拿到的参数训练一个初始 SVM 模型。
-
Hard Negative Mining 优化 SVM 模型。
-
进行 滑窗 detection,最后 NMS 边框回归。
目前 2700 正样本,2700 负样本。测试集 1200 负样本,700 正样本。
** 最新代码 Github 地址:** https://github.com/HansRen1024/SVM-classification-localization
最近在研究传统方法的物体分类,使用的方法是 Hog + SVM,不过分类正确率不是很高。我写一写心得体会。
首先声明我不会具体将原理。因为网上信息太多了,大家自己先看看大致了解了再看这篇文章。
ImageNet 上所有杯子数据集: https://pan.baidu.com/s/18ho4UI50x4YP6lkrjPm7Kw
一、HoG 特征数计算#
先说一下两个参数:
-
pixels of a cell
-
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 需要把特征降维,否则计算量太大。