SVM学习机的使用

SVM能实现功能即在给出的正负样本中找到一条分割线(面),将正负样本分割出来。而这条分割线(面)即我们所说的分类器,其记录的正样本的特征,以及和负样本的区别。当有新的样本过来时,则通过和分类器比较即可分辨出新的样本是否属于正样本行列。

以车辆识别为例,SVM的一般使用步骤如下:

1、获取正负样本。

前面说了SVM能够找到一条存在与正负样本之间的分割线(面),那么何为正负样本呢?

所谓正样本,即你人为的判断出包含所需信息的样本。如下图,在图片中,看到了车子,然后用标记工具将其标记,获得标记信息的记录文件,如下图中的caltechVehicle106640.jpg.StringMark。当然这种信息记录文件有很多种,根据需要生成不同的标记文件。标记文件中一般含有框框的位置信息,大小信息,文件的名称等等。而我们所说的正样本即框住的这部分图片内容,在SVM学习的时候,会根据标记信息记录文件里的位置、大小等特征来获取框框中的内容。

所谓负样本,即在非正样本。例如上面左图中的图片,除了红色框框住的区域不能作为负样本,图片中的其他区域均可以作为负样本。但是负样本不可随意,要尽量符合分类的场景。在车辆识别中,负样本尽量选取公路中的场景。如果负样本过于随意,则会造成训练成本加大,训练结果不准确。

2、获取训练结果

在获得了正负样本后,机器如何得到样本的特征,并进行分辨?

在获取了正样本后,机器本身并不知道正样本中的东西有什么特征。虽然人为的告诉了机器,这个是车子的图片,但是机器怎样记住车子的特征?而且每张样本中的车子肯定长的是有差别的,那么算法在学习样本的过程中是采用什么特征来分辨车子呢?

在实际的运用过程中,这些特征有很多,许多图片的一般性特征都可以做为学习的依据。比如图像的灰度、梯度、直方图、hog特征、haar特征等。只要告诉机器采用哪种特征来学习,那么算法本身会先计算出样本的这种特征,然后学习每幅图片的此类特征,并记录。

因为前面已经人为的给出了正负样本,那么机器在比较了正负样本的特征后,会得到一个分类结果,为一个.xml文件。而这个分类结果就是我们一个能够进行分类的分类器了。

3、进行分类

获取分类结果后,就可以将结果用于给新的图片进行分类。分类的时候也要采取与训练时相同的特征进行。即假如训练时采用的是haar特征,那么在分类时也要先得到新图片的haar特征,将得到的haar特征与分类结果进行比较,从而判断是否是车辆。

下面给出基于opencv的分类代码:

#include "opencv2/objdetect/objdetect.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

/** 函数声明 */
void detectAndDisplay(Mat frame);

/** 全局变量 */
string car_cascade_name = "put.xml";  //训练的结果文件
CascadeClassifier car_cascade;
string window_name = "Capture - car detection";
RNG rng(12345);

/** @主函数 */
int main(int argc, const char** argv)
{
	Mat frame;
	VideoCapture video;
	VideoWriter markVideo;  //用于存储识别车辆后的视频
	// 加载级联分类器文件
	if (!car_cascade.load(car_cascade_name)){ printf("--(!)Error loading\n"); return -1; };
	//获取视频信息
    double  fourcc, fps, width, height;
	video.open("25.avi");
	fourcc = video.get(CV_CAP_PROP_FOURCC);
	fps = video.get(CV_CAP_PROP_FPS);
	width = video.get(CV_CAP_PROP_FRAME_WIDTH);
	height = video.get(CV_CAP_PROP_FRAME_HEIGHT);
	markVideo.open("markVideo25.avi", fourcc, fps, Size(width, height), false);
   //新建一个视频,存储结果
	if (video.isOpened() && markVideo.isOpened() )
	{
		while(true)
		{
			video >> frame;
			resize(frame, frame, Size(280, 240)); //将图片缩小,加快检测速度
			//对当前帧使用分类器进行检测
			if (!frame.empty()){
				detectAndDisplay(frame);
				markVideo << frame;
			}
			else{printf(" --(!) No captured frame -- Break!"); break;}
			if ((char)waitKey(1) == 'c') {
				video.release();
markVideo.release();
				break;
			}
		}
	}
	return 0;
}

/** @函数 detectAndDisplay */
void detectAndDisplay(Mat frame)
{
	std::vector<Rect> faces;
	Mat frame_gray;

	cvtColor(frame, frame_gray, CV_BGR2GRAY);
	equalizeHist(frame_gray, frame_gray);  //直方图均衡化

	//-- 多尺寸检测人脸
	car_cascade.detectMultiScale(frame_gray, faces, 1.1, 3, 0 , Size(10,12),Size(100,120));
	for (int i = 0; i < faces.size(); i++)
	{
		rectangle(frame, Point(faces[i].x, faces[i].y), Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height), 0xff, 3);   //画出识别后的框框
	}
	//-- 显示结果图像
	imshow(window_name, frame);
}
时间: 2024-11-12 01:35:17

SVM学习机的使用的相关文章

全唐诗数据库分享

之前由于论文等相关原因,需要一个诗词文字对仗库,苦于手头没有,网上也没有找到较好的定义好的格式.因此,琢磨着自己想办法做一个出来.很显然,做词库的数据源很重要,选来选去,最后决定使用全唐诗作为数据库.至于原因,首先是因为其数据量比较大,诗词覆盖面比较广:其次,由于<全唐诗>中大都是唐宋时期的诗词名篇,结构相对严谨,平仄相对,对仗清晰.更重要的是..我不知道还有啥别的数据库可用. 收录<全唐诗>的网站很多,但这些网站在数据完整性和数据结构简单性上来说都有一定缺陷.本数据库中的数据是从

ELM 极限学习机与SVM支持向量机

在上一篇<DeepLearning 的挑战: Extreme Learning Machine(超限学习机)?> 中介绍了一些ELM与DL 的一些比较,这篇主要介绍ELM的原理. 首先,ELM的核心就是将复杂的迭代过程转变为隐层参数随机产生. 其次,ELM 是一个神经网络,有输入层.隐藏层,输出层. 最后,ELM 的多分类效果优于SVM,而且速度贼快. 对于训练样本集{xi,ti}  i=1-N, 共有N各样本,其中每个样本xi 是一个d维列向量,ti是输出标签. ELM,的输出为: 其中,w

支持向量机(SVM)算法

支持向量机(support vector machine)是一种分类算法,通过寻求结构化风险最小来提高学习机泛化能力,实现经验风险和置信范围的最小化,从而达到在统计样本量较少的情况下,亦能获得良好统计规律的目的.通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,即支持向量机的学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解. 具体原理: 1. 在n维空间中找到一个分类超平面,将空间上的点分类.如下图是线性分类的例子. 2. 一般而言,一个点距离超平面的

支持向量机通俗导论(理解SVM的三层境界)

作者:July.pluskid :致谢:白石.JerryLead 出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因很简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚,尽管网上已经有朋友写得不错了(见文末参考链接),但在描述数学公式的时候还是显得不够.得益于同学白石的数学证明,我还是想尝试写一下,希望本文在兼顾通俗易懂的基础上,真真正正能足以成为一篇完整概括和介

支持向量机通俗导论(理解SVM的三层境地)

支持向量机通俗导论(理解SVM的三层境地) 作者:July :致谢:pluskid.白石.JerryLead.出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因非常简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚,尽管网上已经有朋友写得不错了(见文末參考链接),但在描写叙述数学公式的时候还是显得不够.得益于同学白石的数学证明,我还是想尝试写一下,希望本文在兼顾通

简介支持向量机热门(认识SVM三位置)

支持向量机通俗导论(理解SVM的三层境地) 作者:July .致谢:pluskid.白石.JerryLead.出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因非常简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚.尽管网上已经有朋友写得不错了(见文末參考链接),但在描写叙述数学公式的时候还是显得不够.得益于同学白石的数学证明,我还是想尝试写一下.希望本文在兼顾通

SVM的点滴

SVM 1. 普通SVM的分类函数可表示为: 其中ai为待优化参数,物理意义即为支持向量样本权重,yi用来表示训练样本属性,正样本或者负样本,为计算内积的核函数,b为待优化参数. 其优化目标函数为: 其中||w||用来描述分界面到支持向量的宽度,越大,则分界面宽度越小.C用来描述惩罚因子,而 则是用来解决不可分问题而引入的松弛项. 在优化该类问题时,引入拉格朗日算子,该类优化问题变为: 其中待优化参数ai在数学意义上即为每个约束条件的拉格朗日系数. 而MKL则可认为是针对SVM的改进版,其分类函

基于局部感受野的极速学习机

说明 基于局部感受野的极速学习机 摘要内容 引言部分 回顾ELMCNN和HTM 极速学习机ELM ELM特征映射feature mapping ELM特征学习Learning 卷积神经网络CNN 卷积 池化 层级实时记忆HTM 基于局部感受野的极速学习机ELM-LRF A 全连接与局部连接Full and Local Connections B 基于局部感受野的ELM C 组合节点 局部感受野的实现 A ELM-LRF的特殊组合节点 B 随机输入权重 C 平方根池化squaresquare-ro

SVM(支持向量机)与统计机器学习 &amp; 也说一下KNN算法

因为SVM和统计机器学习内容很多,所以从 http://www.cnblogs.com/charlesblc/p/6188562.html 这篇文章里面分出来,单独写. 为什么说SVM和统计学关系很大. 看统计学的定义:统计学是通过搜索.整理.分析.描述数据等手段,以达到推断所测对象的本质,甚至预测对象未来的一门综合性科学. 通过有限的样本,来预测更多的泛化空间的效果,本身就是机器学习的奋斗目标. 而SVM又是基于统计学理论的基础: 基于数据的机器学习是现代智能技术中的重要方面, 研究从观测数据