文档章节

[机器学习]基于级联分类器的多目标检测

moki_oschina
 moki_oschina
发布于 2017/03/15 16:02
字数 2097
阅读 25
收藏 1
点赞 0
评论 0

物体检测方法大体可分为两类,基于知识的方法和基于统计的方法。前者如template matching, surf/sift detector等等。这些方法都基于我们对于识别目标已有比较清晰的刻画。虽然有些特征能抗一定的形变,但总体泛化性不够强。如果检测目标比较固定且对时间要求不高,可以考虑用这类方法。但有些应用是没法提供模板的,或者说模板太多(一一匹配的话检测时间无法接受),又或者说我们需要容忍更大程度或更多样的形变(如人脸,行人等)。这时候就要考虑用基于统计的方法了。既然是基于统计,就得有大量的样本,分类器对这些样本进行学习来获得参数。得到目标分类器后,要进行检测时就很快了。OpenCV中带的Haar特征级联分类器就是这样一种方法,它位于app目录下,该目录下有两个实现,一个是老的实现haartraining,只支持Haar特征。另一个是新的traincascade,支持更多特征(LBP,HOG)和boosted分类器,更易于扩展。除此之外OpenCV的data目录下有很多训练好的级联分类器(如人脸,眼睛检测等),load进来就可以用,无需训练。官方例程中的objectdetection,facedetect等例子就是直接用了这些训练好的分类器,如自带的face detection程序:

当然了,作为有理想有抱负的码农,用现成的分类器是不会满足的。现实使用中我们经常需要训练针对各种应用的分类器。下面介绍如何训练一个自己的级联分类器。整个过程大致可分为以下几步(基于OpenCV 2.4.4):

 

1. 收集数据

数据可分为正样本和负样本。正样本即要检测的目标,负样本则不包含目标。

首先我们要生成正负样本的索引(或称描述文件)。正样本描述文件官方文档中给了例子:

img/img1.jpg 1 140 100 45 45
img/img2.jpg 2 100 200 50 50 50 30 25 25

依次为文件名,目标个数,目标坐标。既然是基于统计的方法,样本自然要求很多(一般以千为单位),因此很多时候这一步是劳力活。当然,勤劳勇敢的码农们写了各种工具来解放生产力。这些描述文件可以人肉生成,也可用object marker(http://inflomatik.com/)来圈,然后自动生成。除此之外还有些其它工具:

http://code.google.com/p/opencv-haar-cascade-positive-image-builder/

http://code.google.com/p/imageclipper/

http://code.google.com/p/ml-object-marker/source/checkout

ffmpeg -i 可以将视频分解为图片

另外后面会讲到的createsamples工具还可以自动生成正样本。

 

负样本没这么麻烦了,描述文件只要包含文件路径即可,Windows中可以用dir /s /b生成,Linux下用find命令。

 

2. 创建vec文件

createsamples 工具可用于从正负样本描述文件生成训练程序需要的vec文件。如根据样本描述文件samples.txt生成samples.vec:

opencv_createsamples.exe -info samples.txt -vec samples.vec -w 20 -h 20

它还包含一个功能,通过distortion自动生成样本。如根据template.png和负样本描述文件negative.txt生成3000个样本。

opencv_createsamples.exe  -img template.png -vec -num 3000 -bg negative.txt -vec samples.vec -w 20 -h 20

 

还有种很尴尬的情况,就是既没空圈那么多的正样本,又想检测多种目标,咋办?因为上面提到的通过distortion来自动生成样本的方法不支持多个目标。一种方法是先根据多个目标生成多个vec文件,再用mergevec(http://note.sonots.com/SciSoftware/haartraining/mergevec.cpp.html)这个工具合并vec文件。mergevec用最新的OpenCV编译不了,如果你和我一样懒不想移植的话就下个OpenCV 1.0(就下可执行文件包,3M多那个),把那坨dll放到PATH里,然后下mergevec.exe就可以跑了。如根据template1.png ~ template3.png分别生成三个vec文件:

opencv_createsamples.exe -img template1.png -num 1000 -bg negative -vec sample1.vec -w 20 -h 20

opencv_createsamples.exe -img template2.png -num 1000 -bg negative -vec sample2.vec -w 20 -h 20

opencv_createsamples.exe -img template3.png -num 1000 -bg negative -vec sample3.vec -w 20 -h 20

接着写vec的索引文件sample.txt:

sample1.vec

sample2.vec

sample3.vec

然后就可以生成最终的samples.vec文件了:

mergevec.exe sample.txt samples.vec -w 20 -h 20

 

另外,如果你的应用比较general,如从自然背景中找特定目标,网上有现成的负样本数据集:
svn checkout http://tutorial-haartraining.googlecode.com/svn/trunk/ tutorial-haartraining-read-only

 

3. 训练分类器

很多地方还是用haartraining,官方手册中建议用新的traincascade。用法上参数什么的都差不多,不过还是有差别。

根据刚才生成的样本描述文件进行训练,结果放在classifier目录里:

opencv_traincascade.exe -data classifier -vec samples.vec -bg negative.txt -numStages 25 -w 20 -h 20

其余有一坨参数,诸如maxFalseAlarmRate,minHitRate等想设就设下,不过默认的值大多数情况都是挺好的选择。

-featureType指定特征类型,默认为类Haar特征,还可以指定为LBP或HOG。基于Haar的级联分类器训练时间一般很长(以天为单位)。LBP,HOG则快得多。

注意这毕竟不是产品,很多时候参数一给不好就挂掉了。当然直接挂掉是最好的情况,最惨的是跑到中间hung住了,都不知道是因为hung住了还是因为训练时间长。。。

 

注:无论是haartraining还是traincascade,最终都会生成表示成xml文件的分类器。但如果你用的是haartraining并且想用中间Stage生成的分类器,可以用convert_cascade将中间结果整成xml文件。

 

4. 测试&验证

performance.exe可以对于给定的测试用例给出检测率报告。注意只对opencv_haartraining的结果适用。如果要写报告给数据这个很有用。不过这里先不整这么抽象的东西,先写个程序直观地看看检测效果如何。官方例程中的objectdetection是从摄像头抓帧进行检测。这里我们略微修改下从文件读取图片然后检测目标。其中关键函数为:

void CascadeClassifier::detectMultiScale(const Mat& image, vector<Rect>& objects, double scaleFactor=1.1, int minNeighbors=3, int flags=0, Size minSize=Size(), Size maxSize=Size())

其中的参数对于检测结果会有较大影响,如:

minNeighbors:其实分类器给出的结果是很多个矩形,那些被多个矩阵覆盖的区域被保留,而那些个孤立的矩阵被抛弃。这个参数决定了保留还是抛弃的阈值。(http://www.cognotics.com/opencv/servo_2007_series/part_2/page_2.html)。

minSize :检测目标size的阀值,小于它的不会被检测出来。

 

这里拿”愤怒的小鸟“作个简单的例子,因为每个关卡中笼子里的鸟虽不完全相同,但都类似。这里以一关中笼子中的鸟为训练正样本,让其学习并检测其它关卡中哪些是笼中鸟。

在一些case中还是有不少false alarm的。直观上可能会觉得这种动画图片的检测会更容易,但动画图片由于背景形状规则,色块均匀,作为负样本并不好,所以负样本尽可能还是要取得变化丰富些。

 

一些案例和参考资料:

 

Tutorial: OpenCV haartraining (Rapid Object Detection With A Cascade of Boosted Classifiers Based on Haar-like Features) http://note.sonots.com/SciSoftware/haartraining.html
Haar-feature Object Detection in C#  http://www.codeproject.com/Articles/441226/Haar-feature-Object-Detection-in-Csharp
Ivan Laptev | INRIA Paris - Rocquencourt, France http://www.di.ens.fr/~laptev/download.html#objectdetection
OBJECT DETECTION IN OPENCV USING HAARTRAINING http://achuwilson.wordpress.com/2011/02/13/object-detection-using-opencv-using-haartraining/
Ultra Rapid Object Detection in Computer Vision Applications with Haar-like Wavelet Features http://www.codeproject.com/Articles/27125/Ultra-Rapid-Object-Detection-in-Computer-Vision-Ap
HaarTraining for Pedestrian Detection http://se.cs.ait.ac.th/cvwiki/opencv:tutorial:haartraining#step_1dataset
A simple object detector with boosting http://people.csail.mit.edu/torralba/shortCourseRLOC/boosting/boosting.html
OpenCV Object Detection Howto http://opencv.willowgarage.com/wiki/ObjectDetection
How to use HaarTraining in OpenCV http://kang.blog.com/2009/08/12/how-to-use-haartraining-in-opencv/
Create Your Own Haar Classifier for Detecting objects in OpenCV http://achuwilson.wordpress.com/2011/07/01/create-your-own-haar-classifier-for-detecting-objects-in-opencv/
How-to build a cascade of boosted classifiers based on Haar-like features http://opencv.willowgarage.com/wiki/ObjectDetection
Face Detection using OpenCV http://opencv.willowgarage.com/wiki/FaceDetection
Seeing With OpenCV http://www.cognotics.com/opencv/servo_2007_series/part_1/index.html
FAQ for OpenCV haartraining http://www.computer-vision-software.com/blog/2009/11/faq-opencv-haartraining/
Simple Qt interface to try OpenCV implementations of SIFT, SURF, FAST, BRIEF and other feature detectors and descriptors http://code.google.com/p/find-object/
《The OpenCV User Guide》 Chapter 4 Cascade classifier training
《Learning.OpenCV.Computer.Vision.with.the.OpenCV.Library》Chapter 13 Machine learning

本文转载自:http://blog.csdn.net/topgun_chenlingyun/article/details/11159123

共有 人打赏支持
moki_oschina
粉丝 24
博文 169
码字总数 22482
作品 0
成都
程序员
OpenCV利用Haar Cascades进行人脸检测

目标 在这届会议上, 我们将使用基于Haar特征的级联分类器来了解人脸检测的基础知识 我们将延长相同的眼睛检测等。 基础 使用基于Haar特征的级联分类器的对象检测是Paul Viola和Michael Jon...

漫步当下 ⋅ 05/19 ⋅ 0

一文综述人脸检测算法(附资源)

人脸检测是目前所有目标检测子方向中被研究的最充分的问题之一,它在安防监控,人证比对,人机交互,社交和娱乐等方面有很强的应用价值,也是整个人脸识别算法的第一步。 问题描述 人脸检测的...

技术小能手 ⋅ 05/09 ⋅ 0

人脸检测原理及示例(OpenCV+Python)

前言 关于opencv OpenCV 是 Intel 开源计算机视觉库 (Computer Version) 。它由一系列 C 函数和少量 C++类构成,实现了图像处理和计算机视觉方面的很多通用算法。 OpenCV 拥有包括 300 多个 ...

张卫泉 ⋅ 2012/09/12 ⋅ 2

主题:人脸检测原理及示例(OpenCV+Python)

发表时间:2009-09-06 < > 猎头职位: 北京: ITeye网站诚聘社区编辑 OpenCV库的简介 OpenCV+Ruby构建图像处理研究平台 python django opencv 脸部识别的小游戏 更多相关推荐 Python 前言 关于...

晨曦之光 ⋅ 2012/05/28 ⋅ 0

对象跟踪小白?本文带你玩转OpenCV(C ++ / Python)

作者介绍:Satya Mallick,擅长领域为计算机视觉,机器学习,人工智能。 Linkdin:https://www.linkedin.com/in/satyamallick/zh-cn 在本教程中,我们将了解OpenCV 3.0中引入的OpenCV跟踪API...

【方向】 ⋅ 2017/02/24 ⋅ 0

论文|一种针对非线性数据的局部在线学习方法

小蚂蚁说: 亚太知识发现和数据挖掘会议(PAKDD,Pacific-Asia Conference on Knowledge Discovery and Data Mining)是知识发现和数据挖掘(KDD)领域的国际领先会议。它为研究人员和行业从...

兔子酱 ⋅ 06/14 ⋅ 0

OpenCV 2.4+ C++ 人脸识别

机器学习 机器学习的目的是把数据转换成信息。 机器学习通过从数据里提取规则或模式来把数据转成信息。 人脸识别 人脸识别通过级联分类器对特征的分级筛选来确定是否是人脸。 每个节点的正确...

j_m ⋅ 2012/11/26 ⋅ 0

【OpenCV】目标检测

  OpenCV支持的目标检测的方法是利用样本的Haar特征进行的分类器训练,得到的级联boosted分类器(Cascade Classification)。haar支持的目标有人脸、眼、嘴、鼻、身体,这里给出的是脸部和...

u013165921 ⋅ 2017/11/21 ⋅ 0

有关机器学习Malware分类器的那些事

0x00、前言 从2015年开始,机器学习预测方法在很多行业都得到了应用,特别是2017年一年,信息安全领域特别是杀毒软件领域,已经出来完全取缔特征码的方式判断恶意软件,进入2018年,Top静态代码杀毒...

技术小能手 ⋅ 05/22 ⋅ 0

13- OpenCV+TensorFlow 入门人工智能图像处理-opencv中的机器学习

我们已经学习了图像的特效,几何变换,图形绘制。 机器学习是什么? 机器学习的方式来达成某种功能 使用场景: 人脸检测,车辆识别,安防监控 深度学习: 机器学习 = 训练样本 + 特征 + 分类器...

天涯明月笙 ⋅ 05/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MySQL 数据库设计总结

规则1:一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎。 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所有字段的长度之和不能超过1000字节...

OSC_cnhwTY ⋅ 今天 ⋅ 0

多线程(四)

线程池和Exector框架 什么是线程池? 降低资源的消耗 提高响应速度,任务:T1创建线程时间,T2任务执行时间,T3线程销毁时间,线程池没有或者减少T1和T3 提高线程的可管理性。 线程池要做些什...

这很耳东先生 ⋅ 今天 ⋅ 0

使用SpringMVC的@Validated注解验证

1、SpringMVC验证@Validated的使用 第一步:编写国际化消息资源文件 编写国际化消息资源ValidatedMessage.properties文件主要是用来显示错误的消息定制 [java] view plain copy edit.userna...

瑟青豆 ⋅ 今天 ⋅ 0

19.压缩工具gzip bzip2 xz

6月22日任务 6.1 压缩打包介绍 6.2 gzip压缩工具 6.3 bzip2压缩工具 6.4 xz压缩工具 6.1 压缩打包介绍: linux中常见的一些压缩文件 .zip .gz .bz2 .xz .tar .gz .tar .bz2 .tar.xz 建立一些文...

王鑫linux ⋅ 今天 ⋅ 0

6. Shell 函数 和 定向输出

Shell 常用函数 简洁:目前没怎么在Shell 脚本中使用过函数,哈哈,不过,以后可能会用。就像java8的函数式编程,以后获取会用吧,行吧,那咱们简单的看一下具体的使用 Shell函数格式 linux ...

AHUSKY ⋅ 今天 ⋅ 0

单片机软件定时器

之前写了一个软件定时器,发现不够优化,和友好,现在重写了 soft_timer.h #ifndef _SOFT_TIMER_H_#define _SOFT_TIMER_H_#include "sys.h"typedef void (*timer_callback_function)(vo...

猎人嘻嘻哈哈的 ⋅ 今天 ⋅ 0

好的资料搜说引擎

鸠摩搜书 简介:鸠摩搜书是一个电子书搜索引擎。它汇集了多个网盘和电子书平台的资源,真所谓大而全。而且它还支持筛选txt,pdf,mobi,epub、azw3格式文件。还显示来自不同网站的资源。对了,...

乔三爷 ⋅ 今天 ⋅ 0

Debian下安装PostgreSQL的表分区插件pg_pathman

先安装基础的编译环境 apt-get install build-essential libssl1.0-dev libkrb5-dev 将pg的bin目录加入环境变量,主要是要使用 pg_config export PATH=$PATH:/usr/lib/postgresql/10/bin 进......

玛雅牛 ⋅ 今天 ⋅ 0

inno安装

#define MyAppName "HoldChipEngin" #define MyAppVersion "1.0" #define MyAppPublisher "Hold Chip, Inc." #define MyAppURL "http://www.holdchip.com/" #define MyAppExeName "HoldChipE......

backtrackx ⋅ 今天 ⋅ 0

Linux(CentOS)下配置php运行环境及nginx解析php

【part1:搭建php环境】 1.选在自己需要安装的安装包版本,wget命令下载到服务器响应目录 http://php.net/releases/ 2.解压安装包 tar zxf php-x.x.x 3.cd到解压目录执行如下操作 cd ../php-...

硅谷课堂 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部