项目背景
- 刚刚用谷歌的Inception V3尝试检测行人,效果一般,想看的点这
- 不死心,还想用传统方法挣扎下,因为传统方法计算很快,就尝试用HOG+SVM训练自己的样本集,再进行测试,主要参考这篇博客,但是不得不说,该博客用的python2,跑在Python3里面问题相当的多,代码也不知道从哪搬运过来的,被中英混合着注释各种改,但是初始代码想必是官方给的example
- 如果想直接看yolo检测,可以左转出门,下方有,后面更
还原参考博客内容
下载修改
不多说,weget指令就是好,linux就是牛逼。但是Windows也不差,直接选中weget的目标url右键转到(不确定其他浏览器,谷歌chrome安装迅雷插件)就可以跳出迅雷下载了,完了用IDE打开,一堆错误,毕竟是篇远古博客了,而且涂改也是相当严重。不过大部分就是print问题,花点功夫的事情
修改统一图片尺寸
还是上篇博客弄好的样本集,只不过这次先统一尺寸,因为OpenCV的SVM需要读入图片是64*128,虽然最后训练也都是一维的1024向量。没啥多说的,直接po代码
1 | import numpy as np |
train+predict.py
1 | # -*- coding: utf-8 -*- |
报错修改
train.py跑通后,尝试测试下训练集里面的第一个,一般都会预测准确,不然SVM也不用混了。除去一些可以立马解决的小问题,主要问题其实就三个:
第一个是里面的map函数,会报错TypeError: float() argument must be a string or a number, not ‘map’,老版本Python可以没有问题,但是3以后的基本需要外面套个list(),参考这个大哥的方法;
第二个就是集中在OpenCV更新后,SVM相关的函数都发生了变化,被移动到ml属性下面了,需要先调用ml再调用SVM,此外创建SVM和配置SVM都发生了变化;
第三个就是保存SVM模型后,调用模型文件预测会出问题,而且我没有解决,只好不保存,直接训练完后测试,最后直接和训练跑在一个py文件里面了。
SVM分类结果
非常心痛,测试了28个图片,错了三个,和神经网络跑出来准确率天差地别。可能原因其实很多,图片本身信息不够,区分度也不会好。SVM算法本身和神经网络准确率差别在那。不用做滑动窗口了,直接放弃,白瞎一下午功夫。
结论
可能先用CNN提取特征再用SVM分类识别会提高准确率,但是已经不想浪费精力了,直接yolo走起。
2019.5.20更新
windows下使用yolo检测视频还是不容易,听说用GPU跑个几百张图片都得几天时间,样本集制作也是麻烦,想了想换了个svm工具,不再使用OpenCV自带的svm分类器分类训练。因为它自带的只能分类,不能给出分类的置信度,另外分类效果也很差劲。改用sklearn工具包里的svm分类器,就可以得到近似的置信度,然后可以在非极大值抑制中使用。效果见封面,不过调参是个大工程(玄学)
介绍下sklearn的SVM
Scikit-learn is a free software machine learning library for the Python programming language. It features various classification, regression and clustering algorithms including support vector machines, …
上面是维基百科的一通blabla,反正就是Python的一个有用工具包。下面重点介绍下它的SVM,方法很简单:
1 | from sklearn import svm |
调参时直接参考下面三个博客
sklearn_svm_train.py
直接训练部分代码:
1 | # -*- coding: utf-8 -*- |
sklearn_svm_predict.py
直接测试图片部分代码:
1 | # -*- coding: utf-8 -*- |
效果
多人检测时候的效果如下:
三人检测时候效果如下:
单人检测效果如下:
可以看到还是有很多问题的,而且这只是找的几个效果还可以的参数下的。想要更加实用,就需要更多的时间调整参数,修改样本,更改步长这种。
耗时
用i7的CPU处理器,时间上是处理一个352*288的图片耗时零点几秒,这样即使是CPU也可以处理一个大概20000帧的视频,用时也就一两个小时
结论
好用,快捷,待改进