精华内容
参与话题
问答
  • 在目标检测时,为了定位到目标的具体位置,通常会把图像分成许多子块,然后把子块作为输入,送到目标识别的模型中。分子块的最直接方法叫滑动窗口法。滑动窗口的方法就是按照子块的大小在整幅图像上穷举所有子图像块...

    在目标检测时,为了定位到目标的具体位置,通常会把图像分成许多子块,然后把子块作为输入,送到目标识别的模型中。分子块的最直接方法叫滑动窗口法。滑动窗口的方法就是按照子块的大小在整幅图像上穷举所有子图像块。
    和滑动窗口法相对的是另外一类基于区域(region proposal)的方法。selective search就是其中之一!
    候选区域算法用分割不同区域的办法来识别潜在的物体。在分割的时候,我们要合并那些在某些方面(如颜色、纹理)类似的小区域。相比滑窗法在不同位置和大小的穷举,候选区域算法将像素分配到少数的分割区域中。所以最终候选区域算法产生的数量比滑窗法少的多,从而大大减少运行物体识别算法的次数。同时候选区域算法所选定的范围天然兼顾了不同的大小和长宽比。
    选择性搜索算法使用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域作为输入,通过下面的步骤进行合并:

    1. 首先将所有分割区域的外框加到候选区域列表中
    2. 基于相似度合并一些区域
    3. 将合并后的分割区域作为一个整体,跳到步骤1

    通过不停的迭代,候选区域列表中的区域越来越大。可以说,我们通过自底向下的方法创建了越来越大的候选区域。表示效果如下:在这里插入图片描述
    从最底层的图像特征,逐渐合并相似区域,最终生成候选区域。
    相似度
    选择性搜索算法如何计算两个区域的相似度的呢?
    主要是通过以下四个方面:颜色、纹理、大小和形状交叠
    最终的相似度是这四个值取不同的权重相加。
    笔记学习地址

    展开全文
  • 物体检测之选择性搜索Selective Search0 概述1 物体检测和物体识别1.1 滑窗法1.2 候选区域(Region Proposal)算法1.2.1 物体检测之选择性搜索(Selective Search)1.2.1.1 相似度1.2.1.2 效果2 参考资料 0 概述 本文...

    0 概述

    本文牵涉的概念是候选区域(Region Proposal ),用于物体检测算法的输入。无论是机器学习算法还是深度学习算法,候选区域都有用武之地。

    本文的来源是翻译参考资料里的《Selective Search for Object Detection (C++ / Python)》,这是国外一个大神的博客,讲的是择性搜索(Selective Search)这一种产生候选区域的算法。这个算法并不是那个博主的原创,原创是2013年的一篇论文,我发现国内很多博客都做了介绍。

    由于本人想系统的把从机器学习到深度学习的物体检测算法捋一遍,所以在此把国外大神的博客翻译一下,另外加一些自己的理解。

    1 物体检测和物体识别

    物体识别是要分辨出图片中有什么物体,输入是图片,输出是类别标签和概率。物体检测算法不仅要检测图片中有什么物体,还要输出物体的外框(x, y, width, height)来定位物体的位置。

    物体检测的核心就是物体识别。

    为了定位物体,我们需要选择一些子区域并在子区域上运行物体识别算法。物体的位置就是物体识别算法返回最高概率的子区域内。

    在这里插入图片描述
    产生候选子区域的最直接的方法就是滑窗法,但是这种办法效率比较低,一般使用‘候选区域’算法,而择性搜索(Selective Search)就是最流行的候选区域产生算法之一(个人理解:这个最流行可能是针对论文那两年说的,现在深度学习都是使用网络产生候选区域,不用算法生成了)。

    1.1 滑窗法

    在滑窗方案中,我们要使用一个小窗口遍历搜索整张图片,在每个位置上对滑窗内的图片做物体识别算法。不仅要搜索不同的位置,还要遍历不同的大小,工作量可想而知。

    问题还没完,对于人脸和人体这种长宽比基本固定的物体还好,对于长宽不固定的物体,搜索起来简直就是噩梦,计算量直接飙升。

    1.2 候选区域(Region Proposal)算法

    滑窗法的问题可以使用候选区域产生算法解决。这些算法输入整张图片,然后输出可能有物体的候选区域位置,这些候选区域可以有噪声或者重叠,或者和物体的重合度不是很好,这都不要紧,只要这些区域里有一个和实际物体的位置足够接近就行。因为不好的候选区域会被物体识别算法过滤掉。

    候选区域算法用分割不同区域的办法来识别潜在的物体。在分割的时候,我们要合并那些在某些方面(如颜色、纹理)类似的小区域。相比滑窗法在不同位置和大小的穷举,候选区域算法将像素分配到少数的分割区域中。所以最终候选区域算法产生的数量比滑窗法少的多,从而大大减少运行物体识别算法的次数。同时候选区域算法所选定的范围天然兼顾了不同的大小和长宽比。

    候选区域算法比较重要的特征就是要有较高的召回率。我们要通过这种方法保证拥有物体的区域就在候选区域列表里。所以我们不介意有很多区域什么都有,这都没关系,物体检测算法会过滤掉他们,虽然会浪费一点时间。

    目前已有不少成熟的后续区域产生算法:

    • Objectness
    • Constrained Parametric Min-Cuts for Automatic Object Segmentation
    • Category Independent Object Proposals
    • Randomized Prim
    • Selective Search

    由于Selective Search又快召回率又高,这个方法是最常用的。说了这么多,终于牵出本文的主角了。

    1.2.1 物体检测之选择性搜索(Selective Search)

    选择性搜索算法用于为物体检测算法提供候选区域,它速度快,召回率高。

    选择性搜索算法需要先使用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域,然后使用相似度计算方法合并一些小的区域。

    下列两张图分别是原图和原始分割图:

    在这里插入图片描述
    在这里插入图片描述
    我们不能使用原始分割图的区域作为候选区域,原因如下:

    1. 大部分物体在原始分割图里都被分为多个区域
    2. 原始分割图无法体现物体之间的遮挡和包含。

    如果我们试图通过进一步合并相邻的区域来解决第一个问题,我们最终会得到一个包含两个对象的分段区域。

    我们不要需要完美的的分割区域,我们只想要和实际物体高度重合的区域就行了。

    选择性搜索算法使用《Efficient Graph-Based Image Segmentation》论文里的方法产生初始的分割区域作为输入,通过下面的步骤进行合并:

    1. 首先将所有分割区域的外框加到候选区域列表中
    2. 基于相似度合并一些区域
    3. 将合并后的分割区域作为一个整体,跳到步骤1

    通过不停的迭代,候选区域列表中的区域越来越大。可以说,我们通过自底向下的方法创建了越来越大的候选区域。表示效果如下:

    在这里插入图片描述

    1.2.1.1 相似度

    选择性搜索算法如何计算两个区域的像素度的呢?

    主要是通过以下四个方面:颜色、纹理、大小和形状交叠

    最终的相似度是这四个值取不同的权重相加

    1.2.1.2 效果

    opencv实现了选择性搜索算法,可以给出上千个根据有物体的可能性降序排列的候选区域。

    下图是画出了前面200250个候选区域的效果。一般来说。10001200个候选区域基本能胜任物体检测的任务了。

    在这里插入图片描述

    2 参考资料

    Selective Search作者网站

    国外的博客:Selective Search for Object Detection (C++ / Python)

    国内翻译的上面的博客:选择性搜索(selective search)

    国内的博客:Selective Search for Object Recognition

    国内博客2:目标检测–Selective Search for Object Recognition(IJCV, 2013)

    图像分割:Efficient Graph-Based Image Segmentation

    展开全文
  • 选择性搜索(selective search)

    万次阅读 多人点赞 2017-12-06 15:37:40
    该文翻译整理自:selective search for object detection(c++ / python) 一、目标检测 VS 目标识别 目标识别(objec recognition)就是要指出一幅输入图像中包含那类目标。输入时一幅图像,输出是目标属于某个...

    该文翻译整理自:selective search for object detection(c++ / python)


    一、目标检测 VS 目标识别

    目标识别(objec recognition)是指明一幅输入图像中包含那类目标。其输入为一幅图像,输出是该图像中的目标属于哪个类别(class probability)。而目标检测(object detection)除了要告诉输入图像中包含了哪类目前外,还要框出该目标的具体位置(bounding boxes)。

    在目标检测时,为了定位到目标的具体位置,通常会把图像分成许多子块(sub-regions / patches),然后把子块作为输入,送到目标识别的模型中。分子块的最直接方法叫滑动窗口法(sliding window approach)。滑动窗口的方法就是按照子块的大小在整幅图像上穷举所有子图像块。这种方法产生的数据量想想都头大。和滑动窗口法相对的是另外一类基于区域(region proposal)的方法。selective search就是其中之一!

    二、selective search算法流程


    step0:生成区域集R,具体参见论文《Efficient Graph-Based Image Segmentation》

    step1:计算区域集R里每个相邻区域的相似度S={s1,s2,…}
    step2:找出相似度最高的两个区域,将其合并为新集,添加进R
    step3:从S中移除所有与step2中有关的子集
    step4:计算新集与所有子集的相似度
    step5:跳至step2,直至S为空


    三、相似度计算

    论文考虑了颜色、纹理、尺寸和空间交叠这4个参数。

    3.1、颜色相似度(color similarity)
    将色彩空间转为HSV,每个通道下以bins=25计算直方图,这样每个区域的颜色直方图有25*3=75个区间。 对直方图除以区域尺寸做归一化后使用下式计算相似度:


    3.2、纹理相似度(texture similarity)

    论文采用方差为1的高斯分布在8个方向做梯度统计,然后将统计结果(尺寸与区域大小一致)以bins=10计算直方图。直方图区间数为8*3*10=240(使用RGB色彩空间)。


    其中,是直方图中第个bin的值。

    3.3、尺寸相似度(size similarity)


    保证合并操作的尺度较为均匀,避免一个大区域陆续“吃掉”其他小区域。

    例:设有区域a-b-c-d-e-f-g-h。较好的合并方式是:ab-cd-ef-gh -> abcd-efgh -> abcdefgh。 不好的合并方法是:ab-c-d-e-f-g-h ->abcd-e-f-g-h ->abcdef-gh -> abcdefgh。

    3.4、交叠相似度(shape compatibility measure)



    3.5、最终的相似度



    四、OpenCV 3.3 实现了selective search

    在OpenCV的contrib模块中实现了selective search算法。类定义为:

    cv::ximgproc::segmentation::SelectiveSearchSegmentation


    举例:

    #include "opencv2/ximgproc/segmentation.hpp"
    #include "opencv2/highgui.hpp"
    #include "opencv2/core.hpp"
    #include "opencv2/imgproc.hpp"
    #include <iostream>
    #include <ctime>
     
    using namespace cv;
    using namespace cv::ximgproc::segmentation;
     
    static void help() {
        std::cout << std::endl <<
        "Usage:" << std::endl <<
        "./ssearch input_image (f|q)" << std::endl <<
        "f=fast, q=quality" << std::endl <<
        "Use l to display less rects, m to display more rects, q to quit" << std::endl;
    }
     
     
    int main(int argc, char** argv) {
        // If image path and f/q is not passed as command
        // line arguments, quit and display help message
        if (argc < 3) {
            help();
            return -1;
        }
     
        // speed-up using multithreads
        // void cv::setUseOptimized(bool onoff), Enables or disables the optimized code.
        setUseOptimized(true);
        setNumThreads(4);
     
        // read image
        Mat im = imread(argv[1]);
        // resize image
        int newHeight = 200;
        int newWidth = im.cols*newHeight/im.rows;
        resize(im, im, Size(newWidth, newHeight));
     
        // create Selective Search Segmentation Object using default parameters
        Ptr<SelectiveSearchSegmentation> ss = createSelectiveSearchSegmentation();
        // set input image on which we will run segmentation
        ss->setBaseImage(im);
     
        // Switch to fast but low recall Selective Search method
        if (argv[2][0] == 'f') {
            ss->switchToSelectiveSearchFast();
        }
        // Switch to high recall but slow Selective Search method
        else if (argv[2][0] == 'q') {
            ss->switchToSelectiveSearchQuality();
        } 
        // if argument is neither f nor q print help message
        else {
            help();
            return -2;
        }
     
        // run selective search segmentation on input image
        std::vector<Rect> rects;
        ss->process(rects);
        std::cout << "Total Number of Region Proposals: " << rects.size() << std::endl;
     
        // number of region proposals to show
        int numShowRects = 100;
        // increment to increase/decrease total number of reason proposals to be shown
        int increment = 50;
     
        while(1) {
            // create a copy of original image
            Mat imOut = im.clone();
     
            // itereate over all the region proposals
            for(int i = 0; i < rects.size(); i++) {
                if (i < numShowRects) {
                    rectangle(imOut, rects[i], Scalar(0, 255, 0));
                }
                else {
                    break;
                }
            }
     
            // show output
            imshow("Output", imOut);
     
            // record key press
            int k = waitKey();
     
            // m is pressed
            if (k == 109) {
                // increase total number of rectangles to show by increment
                numShowRects += increment;
            }
            // l is pressed
            else if (k == 108 && numShowRects > increment) {
                // decrease total number of rectangles to show by increment
                numShowRects -= increment;
            }
            // q is pressed
            else if (k == 113) {
                break;
            }
        }
        return 0;
    }
    上边代码git地址:https://code.csdn.net/guoyunfei20/selective_search_opencv_demo.git(运行需要安装OpenCV3.0以上 + contrib)


    展开全文
  • 1. 滑动窗口检测器 滑动窗口检测器是一种暴力检测方法,从左到右,从上到下滑动窗口,然后利用分类识别目标。这里使用不同大小的窗口,因为一张图片可能展示从不同距离观测检测出不同的目标类型。...

    1. 滑动窗口检测器

    滑动窗口检测器是一种暴力检测方法,从左到右,从上到下滑动窗口,然后利用分类识别目标。这里使用不同大小的窗口,因为一张图片可能展示从不同距离观测检测出不同的目标类型。
    这里写图片描述
    滑动窗口从图像中可能剪切出不同大小的图像块,但是很多分类器只取固定大小的图像,所以这些图像是经过变形转换的。但是这样做并不影响准确率,因为分类器可以处理变形后的图像。
    变形图像被输入到CNN中,提取4096个特征,然后使用SVM和一个线性分类器来识别分类和边界框。
    这里写图片描述

    2. 选择性搜索(selective search SS)

    为了在滑动窗口检测器的基础上提高搜索速度,可以采用候选区域方法(region proposal method)创建目标检测的感兴趣区域(ROI)。在选择性搜索中,首先将每个像素作为一组,然后计算每一组的纹理,将两个最接近的组结合起来,我们通常对较小的组先分组,合并区域知道所有区域都合并在一起。下图展示了区域合并:
    这里写图片描述
    下面展示了区域合并过程中所有可能的ROI:
    这里写图片描述

    3. R-CNN

    R-CNN利用候选区域方法创建的2000多个ROI,并将这些ROI转换为固定大小的图像并送到CNN中。该网络架构后面一般会跟几个全连接层,以实现目标分类并提炼边界框
    这里写图片描述
    下面是R-CNN系统的流程图:
    这里写图片描述
    通过使用更少更高质量的ROI,R-CNN通常比滑动窗口方法更加快速准确

    4. 边界框回归器

    虽然相对于滑动窗口检测器来说,候选区域方法有很大的性能提升,但是整个算法仍然具有较大的计算复杂度。为了加速这个进程,我们通常会选用计算量较小的候选区域选择方法构建ROI,并在后面使用线性回归器(全连接层)进一步提炼边界框。
    这里写图片描述

    展开全文
  • 目标检测-选择性搜索算法总结及代码实现(selective search)
  • 候选区域(Region Proposal)算法 滑窗法的问题可以使用候选区域产生算法解决。这些算法输入整张图片,然后输出可能有物体的候选区域位置,这些候选区域可以有噪声或者重叠,或者和物体的重合度不是很好,这都不...
  • 1 概述  本文牵涉的概念是候选区域(Region Proposal ),用于物体检测算法的输入。无论是机器学习算法还是深度学习算法,候选区域都有用武之地。 2 物体检测和物体识别  物体识别是要分辨出图片中有什么物体,...
  • Selective Search for Object Detection  OpenCV实现目标检测方法,具体参考论文及官方说明: ... 论文参考:Efficient Graph-Based Image Segmentation #!/u...
  • 选择性搜索算法

    2019-04-07 21:54:35
    该文翻译整理自:selective search for object detection(c++ / python) 一、目标检测 VS 目标识别 目标识别(objec recognition)是指明一幅输入图像中包含那类目标。其输入为一幅图像,输出是该图像中的目标...
  • Selective Search(选择性搜索)算法 在目标检测中,这个算法,可以启发式地搜索出可能包含物体的区域,而不用随机盲目地找很多个方框。 最简单的目标检测 我们的思路是先搞出一些小的方框(不一定是方块,但一定...
  • 这一切的一切都是因为博主大奥特曼打小怪兽的博客第三十三节,目标检测之选择性搜索-Selective Search。这篇博客写得很好,于是乎转载记录一下。 SS简介 传统的目标检测算法大多数以图像识别为基础。...
  • 2选择性搜索算法 2.1 什么是选择性搜索? 2.2 选择性搜索相似性度量 2.3 结果 3 代码 4 参考 本教程中,我们将了解目标检测中称为“选择性搜索”的重要概念。我们还将在OpenCV 中使用C ++和Python实现该算法。...
  • SS选择性搜索算法

    千次阅读 2017-11-14 18:48:37
    物体识别(ObjectRecognition),在图像中找到确定一个物体,并找出其为具体位置,之前的做法主要是基于穷举搜索(ExhaustiveSearch),选择一个窗口(window)扫描整张图像(image),改变窗口的大小,继续扫描整张...
  • 2、https://github.com/opencv/选择性搜索对象检测(C ++ / Python)在本教程中,我们将了解在对象检测中称为“选择性搜索”的重要概念。 我们还将分享C ++和Python中的OpenCV代码。对象检测与对象识别物体识别算法...
  • 目标检测物体的候选框是如何产生的? ...那么候选框是如何产生,又是如何进行筛选的呢?...区域生长(合并)主要由于检测图像中存在的物体具有局部区域相似(颜色、纹理等)。目标识别与图像分割技术的发展进一步推动...
  • 1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理。上文我们对物体识别领域的技术方案,也就是CNN进行了详细的分析,对LeNet-5 AlexNet VGG Inception ResNet ...
  • 特征选择-常见的搜索算法

    千次阅读 2013-06-17 10:18:08
    2.2.1完全搜索  完全搜索分为穷举搜索(Exhaustive)与非穷举搜索(Non-Exhaustive)两类。... 算法评价:枚举了所有的特征组合,属于穷举搜索,时间复杂度是O(2n),实用不高。  (2)分支限界搜索( Br
  • 常用搜索算法—盲目搜索和启发式搜索

    万次阅读 多人点赞 2019-05-25 00:51:39
    搜索算法 本文主要以一些概念对较为常见的搜索作简单介绍: 一、盲目搜索 对一个图进行搜索意味着按照某种特定的顺序依次访问其顶点。在所有搜索方式中,广度优先算法和深度优先搜索算法都十分重要,因为它们提供了...
  • 一文读懂目标检测:R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD   前言 之前我所在的公司七月在线开设的深度学习等一系列课程经常会讲目标检测,包括R-CNN、Fast R-CNN、Faster R-CNN,但一直没有比较好的...
  • 这些优化算法都是为针对一个目标值的最大或最小的寻找,前三种算法都属于概率原理的算法(区别于工程优化里面的梯度下降,牛顿算法等连续直接的搜索算法,可以参考我这篇文章,求多元函数极值的情况分类与对应的...

空空如也

1 2 3 4 5 ... 20
收藏数 580,070
精华内容 232,028
关键字:

选择性搜索