zoukankan      html  css  js  c++  java
  • 【译】用boosting构建简单的目标分类器

    用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也会显示决策桩的缺陷(限制)。在目标检测中通过使用非常多的特征,能够补偿其中的一些缺陷。
    demoBoosting.jpg
    数据库的大概模样
    下面是从LabelMe数据库中随机选取的一些图像。包含car(侧视)和scene(前视),它们都经过了尺度归一化处理。createDatabases.m展示了这些数据是如何被创建的。
    http://people.csail.mit.edu/torralba/shortCourseRLOC/boosting/examplesDatabase.jpg

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

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

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

    训练自己的分类器
    要训练自己的分类器,需要准备自己的训练和测试数据。如果你想从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.

  • 相关阅读:
    keypress事件
    input输入框(blur,change,focus)
    click点击以后添加新class,删除其余同名class
    强制数组并且匹配Array
    模拟鼠标事件
    简单的form操作
    鼠标滚轮事件(mousewheel、DOMMouseScroll)
    事件委托技术
    从程序员到项目经理:项目经理必须懂一点“章法”
    JavaScript项目优化总结
  • 原文地址:https://www.cnblogs.com/zjutzz/p/5705723.html
Copyright © 2011-2022 走看看