用boosting构建简单的目标分类器

原文

boosting提供了一个简单的框架,用来构建鲁棒性的目标检测算法。这里提供了必要的函数来实现它:100% MATLAB实现,作为教学工具希望让它简单易得。当然,用作实时应用还远远不够。

配置

下载数据集

下载LabelMe工具箱

解压并修改initpath.m中的路径

修改parameters.m中images和annotations的路径

函数说明

初始化

initpath.m - 添加必要的path。运行前务必调用它。

paameters.m - 包含众多用于配置分类器和数据集的参数。

Boosting工具

demoGentleBoost.m - GentleBoost的一个简单的例子,在二维空间使用stumps(决策桩)作为弱分类器

脚本

createDatabases.m - 从LabelMe数据集创建训练和测试数据

createDictinary.m - 从目标对象中创建一个滤波模版字典(??不理解,源码看不懂)

computeFeatures.m - 预先计算所有图像的特征并存储。正样本是目标外界矩形框crop出来的,负样本是从背景中稀疏取得的

trainDetector.m - 从LabelMe数据集创建训练和测试数据

runDetector.m - 在测试图像上运行检测器

特征和弱分类器

convCrossConv.m - 弱分类器:用一个局部的模版。。。(不懂。。。不理解作者原文的英文都是什么确切含义)

检测器

singleScaleBoostedDetector.m - 在测试图的单尺度上运行强分类器,算出bboxes和scores

LabelMe工具箱

LabelMe - 包含了用于操作数据集的工具函数

例子

配置

首先运行initpath.m并修改parameters.m中的文件夹路径

Boosting

先运行demoGentleBoost.m

此Demo会先让你手动创建二维样本散点(鼠标左键:正样本;鼠标右键:负样本)。由于弱分类器是决策桩,它只能区分平行于坐标轴的数据。如果你把弱分类器设定为带方向的直线,那么结果中两个类别的边界将会很有趣。

然而,决策桩(stumps)在目标检测中很常用,因为它们能被用来有效地做特征选择。此Demo也会显示决策桩的缺陷(限制)。在目标检测中通过使用非常多的特征,能够补偿其中的一些缺陷。



数据库的大概模样

下面是从LabelMe数据库中随机选取的一些图像。包含car(侧视)和scene(前视),它们都经过了尺度归一化处理。createDatabases.m展示了这些数据是如何被创建的。

如果你下载了整个数据集,那么第一件事就是修改parameters.m中的路径。然后运行createDatabase.m来读取annotation文件并创建一个结构体(后续用于查询工具)。关于这个查询工具是如何工作的,详情请看LabelMe Toolbox

运行检测器

训练自己的分类器之前,尝试运行runDetector.m。如果一切顺利,输出类似下图:



例如,训练出来的分类器在汽车侧视图上的检测结果:

训练自己的分类器

要训练自己的分类器,需要准备自己的训练和测试数据。如果你想从LabelMe数据集里选取图像用作训练和测试,那你只需要修改parameters.m中的object的名字。同时,在parameters.m中你还可以修改训练参数,比如训练图像数量,模版(patch)尺寸,目标尺寸(scale of object),负样本数量等。

createDictinary.m会创建“模版词汇表”(??vocabulary of patches),用于特征计算

computeFeatures.m会预先为所有训练图像计算特征

trainDetector.m会使用Gentle Boosting[1]创建分类器

这里面每一个程序都会增加信息到data这个结构体变量,比如预计算的特征,用于训练的图像列表,特征字典,分类器参数

最后,使用runDetector.m,你可以运行新训练的分类器。

多尺度分类器

为了构造多尺度分类器,你需要逐尺度处理,比如:

scalingStep = 0.8;
for scale = 1:Nscales
img = imresize(img, scalingStep, 'bilinear');
[Score{scale}, boundingBox{scale}, boxScores{scale}] = singleScaleBoostedDetector(img, data);
end

参考文献

[1] Friedman, J. H., Hastie, T. and Tibshirani, R., "Additive Logistic Regression: a Statistical View of Boosting." (Aug. 1998)

[2] A. Torralba, K. P. Murphy and W. T. Freeman. (2004). "Sharing features: efficient boosting procedures for multiclass object detection". Proceedings of the 2004 IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR). pp 762- 769.

【译】用boosting构建简单的目标分类器的更多相关文章

  1. 构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介

    构建简单的 C++ 服务组件,第 1 部分: 服务组件体系结构 C++ API 简介 熟悉将用于 Apache Tuscany SCA for C++ 的 API.您将通过本文了解该 API 的主要组 ...

  2. webpack工具学习 构建简单vue项目(不依赖vue-cli) webpack4.0

    目的用webpack构建简单前端项目 1.npm init   (npm init -y)  形成package.json 2.npm install --save-dev webpack  形成 n ...

  3. 使用webstorm+webpack构建简单入门级“HelloWorld”的应用&&引用jquery来实现alert

    使用webstorm+webpack构建简单入门级"HelloWorld"的应用&&构建使用jquery来实现 1.首先你自己把webstorm安装完成. 请参考这 ...

  4. 构建简单的Maven工程,使用测试驱动的方式开发项目

    构建简单的Maven工程很简单,这里写这篇随笔的原因是希望自己能记住几个小点. 一.安装Maven 1.下载maven:https://maven.apache.org/download.cgi 2. ...

  5. 三、使用Maven构建简单的java项目

    前边,我刚搭建了Maven环境,还有给大家推荐了学习资源,这个小节,我们来就来,,简单的玩玩maven. 1.所需工具: 1.Eclipse     2.apache-maven-3.3.9   3. ...

  6. Android 第三课 构建简单的用户界面

    构建简单的用户界面 上一课下一课 该课程教你 创建线性布局 添加文本框 添加字符串资源 添加按钮 使输入框宽度充满整个屏幕 你也应该阅读 布局 Android的图形用户界面通过 View 和 View ...

  7. Ant—使用Ant构建简单Java项目(三)

    博客<Ant-使用Ant构建简单Java项目(二)>我们简化了运行Test类中main方法须要运行的命令,本博客来介绍一下如何使build.xml文件和当中使用property标签定义的属 ...

  8. 学习笔记:Vue+Node+Mongodb 构建简单商城系统(二)

    前面几个月工作有点忙,导致构建简单商城系统的计划搁置近三个月.现在终于有时间重新回过头来继续本计划.本篇主要记录自己在阿里云服务器上搭建node运行环境的整个过程,以及对其中遇到的一些问题的思考. 一 ...

  9. 利用AdaBoost方法构建多个弱分类器进行分类

    1.AdaBoost 思想 补充:这里的若分类器之间有比较强的依赖关系;对于若依赖关系的分类器一般使用Bagging的方法 弱分类器是指分类效果要比随机猜测效果略好的分类器,我们可以通过构建多个弱分类 ...

随机推荐

  1. python设计模式1:创建型模式

    1.原型模式 如果想根据现有的对象复制出新的对象并进行修改,可以考虑“原型模式”,而无需知道任何创建细节.(有点像写轮眼...你不需要知道它) import copy class Point: __s ...

  2. js 事件冒泡是什么如何用jquery阻止事件冒泡

    什么是事件起泡:一个事件不能凭空产生,这就是事件的发生等等,接下来为大家介绍下jquery阻止事件起泡以及关于js事件起泡的验证,感兴趣的朋友可以参考下哈       (1)什么是事件起泡 首先你要明 ...

  3. 【C#】【MySQL】C#获取存储过程的Output输出参数值

    创建存储过程 Create PROCEDURE MYSQL @a int, @b int, @c int output AS Set @c = @a + @b GO 通过以下方法可以获得储存过程的输出 ...

  4. eval的对于验证数学公式的用处

    var a=10,b=20; var s=a+b+((a/b)+(a+(a-b)))+(11)/a; var r=eval(s); console.log(r); 只要不报错,说明公式正确, 报错公式 ...

  5. codevs3145 汉诺塔问题

    难度等级:白银 3145 汉诺塔问题 题目描述 Description 汉诺塔问题(又称为河内塔问题),是一个大家熟知的问题.在A,B,C三根柱子上,有n个不同大小的圆盘(假设半径分别为1-n吧),一 ...

  6. 向jboss写入服务器日志

    实际开发中,记录日志是常用的功能,jboss默认情况下已经记录了很多运行日志,如果开发人员要手动在server.log中写入日志,可以参考下面的方法: package utils; import ja ...

  7. QTableView 一列添加两个按钮

    在QTableView的一列里添加两个按钮,之前添加一个按钮的思路是一样的,只是计算了一下按钮的宽,放两个按钮而已. 添加一个按钮的例子:QTableView 添加按钮 本例源代码:QtTowButt ...

  8. 【MVVMLight小记】二.开发一个简单图表生成程序附源码

    上一篇文章介绍了怎样快速搭建一个基于MVVMLight的程序http://www.cnblogs.com/whosedream/p/mvvmlight1.html算是简单入门了下,今天我们来做一个稍许 ...

  9. PHP 页面跳转方法

    1.php header()函数跳转 PHP的header()函数非常强大,其中在页面url跳转方面也调用简单,使用header()直接跳转到指定url页面,这时页面跳转是302重定向: $url = ...

  10. 基于Html5缓存的页面P2P技术可行性探讨

    P2P技术,在分享大文件(你懂的)是现在必不可缺的技术,现在的人,已经很难想象在没有这玩意的互联网早期,人们是怎样的艰难求生.想当年,不要说电影,下一个稍大点的文件,都是很吃力的事情. 后来牛人科恩, ...