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

----------【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/HandsomeHans/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需要把特征降维,否则计算量太大。

猜你喜欢

转载自blog.csdn.net/renhanchi/article/details/73291523