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.

  • 相关阅读:
    Linux下sed,awk,grep,cut,find学习笔记
    Python文件处理(1)
    KMP详解
    Java引用详解
    解决安卓中页脚被输入法顶起的问题
    解决swfupload上传控件文件名中文乱码问题 三种方法 flash及最新版本11.8.800.168
    null id in entry (don't flush the Session after an exception occurs)
    HQL中的Like查询需要注意的地方
    spring mvc controller间跳转 重定向 传参
    node to traverse cannot be null!
  • 原文地址:https://www.cnblogs.com/zjutzz/p/5705723.html
Copyright © 2011-2022 走看看