精华内容
下载资源
问答
  • 2选择性搜索算法 2.1 什么是选择性搜索? 2.2 选择性搜索相似性度量 2.3 结果 3 代码 4 参考 本教程中,我们将了解目标检测中称为“选择性搜索”的重要概念。我们还将在OpenCV 中使用C ++和Python实现该算法。...

    目录

    1 背景

    1.1 目标检测与目标识别

    1.2 滑动窗口算法

    1.3 候选区域选择算法

    2 选择性搜索算法

    2.1 什么是选择性搜索?

    2.2 选择性搜索相似性度量

    2.3 结果

    3 代码

    4 参考


    本教程中,我们将了解目标检测中称为“选择性搜索”的重要概念。我们还将在OpenCV 中使用C ++和Python实现该算法。

    1 背景

    1.1 目标检测与目标识别

    目标识别算法Target Recognition识别图像中存在哪些对象。它将整个图像作为输入,并输出该图像中存在的对象的类标签和类概率。例如,类标签可以是“狗”,相关的类概率可以是97%。另一方面,目标检测算法Target Detection不仅告诉您图像中存在哪些对象,还输出边界框(x,y,width,height)以表示图像内对象的位置。

    所有目标检测算法的核心是物体识别算法。假设我们训练了一个目标识别模型,该模型识别图像中的狗。该模型将判断图像中是否有狗。它不会告诉对象的位置。

    为了定位物体,我们必须要选择图片的次区域(子块)然后对这些图片子块应用目标识别算法。目标的位置由目标识别算法返回的类概率较高的图像块的位置给出。

    最直接的生成较小的次区域的方法为滑动窗口方法。然而,滑动窗口方法有许多限制。这些限制叫做候选区域算法克服了。选择性搜索就是候选区域算法中最流行的一种。

    1.2 滑动窗口算法

    在滑动窗口方法中,我们在图像上滑动框或窗口以选择子块,并使用目标识别模型对窗口覆盖的每个图像子块进行分类。它是对整个图像上的对象的详尽搜索。我们不仅需要搜索图像中的所有可能位置,还必须搜索不同的比例。这是因为目标识别模型通常以特定尺度(或尺度范围)进行训练。这导致对数万个图像块进行分类。问题还不仅仅如此。滑动窗口方法对于固定的纵横比对象,如人脸或行人表现是好的。图像是三维物体的二维投影。根据图像拍摄的角度,诸如纵横比和形状等物体特征有很大的不同。因此当我们搜索多个纵横比时,滑动窗口方法的计算非常昂贵。

    1.3 候选区域选择算法

    到目前为止我们讨论的问题可以使用候选区域选择算法来解决。这种方法将图像作为输入,输出可能是包含目标对象子块的选择框。这些候选区域可能是嘈杂的、重叠的,并且可能不能完美地包含这个对象,但是在这些候选区域中,将会有一个非常接近于图像中的实际对象的候选区域。然后我们可以使用目标识别模型对这些候选区域进行分类。有分数最高的候选区域就是该物体的位置。

    如下图所示,生成了多个候选区域,其中以绿色表示最后物体的位置框。

    候选区域选择算法使用分割来识别图像中的目标。在分割中,我们根据颜色、纹理等标准对相邻的相似区域进行分组。。与我们在所有像素位置和所有尺度上寻找对象的滑动窗口方法不同,候选区域选择算法通过在更细分的像素组下进行分割。因此,生成的最终候选区域数量比滑动窗口方法少很多倍。这减少了我们必须分类的图像子块的数量。这些生成的区域具有不同的比例和宽高比。

    候选区域选择算法的一个重要特性是具有非常高的召回率。这只是一种花哨的说法,即包含我们所寻找的对象的区域必须出现在我们的候选区域清单中。为了实现这一点,我们的区域候选区域列表最终可能会包含许多不包含任何对象的区域。换句话说,候选区域算法可以产生大量的误报,只要它能够捕获所有真正的对象。多数这些误报将被目标识别算法否定。当我们有更多的误报并且精度受到轻微影响时,检测所需的时间就会增加。但是,召回率高仍然是一个好主意,因为会丢失包含实际对象的区域的其他方法会严重影响检测率。

    已经提出了几种候选区域选择方法,例如

    1) Objectness

    http://groups.inf.ed.ac.uk/calvin/objectness/

    2) Constrained Parametric Min-Cuts for Automaticobject Segmentation

    http://www.maths.lth.se/matematiklth/personal/sminchis/code/cpmc/index.html

    3) Category Independent Object Proposals

    http://vision.cs.uiuc.edu/proposals/

    4) Randomized Prim

    http://www.vision.ee.ethz.ch/~smanenfr/rp/index.html

    5) Selective Search

    http://koen.me/research/selectivesearch/

    在所有这些区域提议方法中,选择性搜索是最常用的,因为它速度快且召回率很高。

    选择性搜索算法

    2.1 什么是选择性搜索?

    选择性搜索是用于目标检测的候选区域选择算法。它快速并具有很高的召回率。它基于根据颜色,纹理,大小和形状兼容性计算相似区域的分层分组。它基于根据颜色,纹理,大小和形状等对相似区域进行分组。

    选择性搜索首先使用Felzenszwalb和Huttenlocher 基于图形的分割方法,根据像素的强度对图像进行过度分割。算法的输出如下所示,图像分别为原图和包含了用纯色表示的分割区域。论文见http://cs.brown.edu/~pff/segment/

    我们可以在这个图像中使用分割的部分作为候选区域吗?答案是否定的,我们不能这样做有两个原因:

    1)原始图像中的大多数实际对象包含两个或多个分割区域;

    2)对于被遮挡的物体,如杯子所覆盖的盘子或装满咖啡的杯子的候选区域不能用这种方法生成。

    如果我们试图通过进一步合并相邻的区域来解决第一个问题,我们最终会得到一个包含两个对象的分割区域。完美的分割不是我们的目标。我们只是想获得许多候选区域,比如其中一些应该与实际的对象有非常高的重叠。选择性搜索使用 Felzenszwalb 和 huttenlocher 的方法中的过分割作为初始种子。一个过分割的图像是这样的。

    选择性搜索算法将这些过分割作为初始输入,并执行以下步骤

    1)将与分割部分对应的所有边界框添加到候选区域列表中

    2)基于相似度合并相邻分割区域

    3)回到第一步

    在每次迭代中,形成更大的部分并添加到区域候选区域列表中。因此,我们通过自下而上的方法从较小的部分到更大的部分获得候选区域。:这就是我们所说的使用 Felzenszwalb 和 huttenlocher 的过分割来计算“分层”分割的意思。下图显示了分层分割过程的初始,中间和最后一步。

    详细见:https://www.koen.me/research/selectivesearch/

    2.2 选择性搜索相似性度量

    让我们深入探讨如何计算两个区域之间的相似性。选择性搜索使用基于颜色,纹理,大小和形状兼容性的4种相似性度量方法。具体见:

    https://www.cnblogs.com/zyly/p/9259392.html#_label3_0

    (1)颜色相似性

    针对图像的每个通道计算25个区间的颜色直方图,并且连接所有通道的直方图以获得颜色描述符,得到25×3=75维颜色描述符。

    两个区域的颜色相似性基于直方图交集,可以计算为:

    是在颜色描述符直方图中组的值

    (2)纹理相似性

    纹理特征是通过在每个通道的8个方向提取高斯导数来计算的。对于每一个方向和每个颜色通道,计算一个10组直方图,形成一个10× 8×3=240维的特征描述符。

    利用直方图相交法计算两个区域的纹理相似度。

    是在纹理描述符直方图中组的值

    (3)大小相似度

    大小相似促使较小的区域尽早合并。它确保了在所有尺度上的区域建议都是在图像的所有部分形成的。如果没有考虑到这种相似性度量,单个区域将会一个接一个地吞噬所有较小的相邻区域,因此在这个位置只会产生多个尺度的候选区域。大小相似性被定义为:

    其中是图像的大小,以像素为单位。

    (4)形状兼容性

    形状兼容性测量两个区域()之间的匹配程度。如果形状匹配,我们会合并它们以填补空白,否则,它们就不应该合并。
    形状兼容性定义如下:

     

    这里是在周围的边界框。

    (5)最终相似度

    两个区域之间的最终相似性被定义为前述4个相似性的线性组合。

    其中是图像中的两个区域或区段,并表示是否使用该相似性度量。

    2.3 结果

    OpenCV中的选择性搜索实现提供了数千个按对象有效程度递减顺序排列的区域方案。为了清晰起见,我们将与图像上绘制的前200-250个框共享结果。一般来说,1000-1200个候选区域足以获得所有正确的目标区域。下图为250个候选框结果和200候选框结果图。

    https://www.learnopencv.com/wp-content/uploads/2017/09/dogs-golden-retriever-top-250-proposals.jpg

    3 代码

    OpenCV有自带的SelectiveSearchSegmentation类,使用起来很容易。需要包含ximgproc.hpp和其命名空间。但是速度很慢。所有代码见:

    https://github.com/luohenyueji/OpenCV-Practical-Exercise、

    C++:

    #include "pch.h"
    #include <opencv2/opencv.hpp>
    #include <opencv2/ximgproc.hpp>
    #include <iostream>
    #include <ctime>
    
    using namespace cv;
    using namespace cv::ximgproc::segmentation;
    
    int main()
    {
    	// speed-up using multithreads 使用多线程
    	//开启CPU的硬件指令优化功能
    	setUseOptimized(true);
    	setNumThreads(4);
    
    	// read image 读图
    	Mat im = imread("./image/dogs.jpg");
    	if (im.empty())
    	{
    		return 0;
    	}
    	// 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 快速搜索(速度快,召回率低)
    	//ss->switchToSelectiveSearchFast();
    	//精准搜索(速度慢,召回率高)
    	ss->switchToSelectiveSearchQuality();
    
    	// 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;
    
    	while (1)
    	{
    		// create a copy of original image 做一份图像图像拷贝
    		Mat imOut = im.clone();
    
    		// itereate over all the region proposals 画框前numShowRects个
    		for (int i = 0; i < numShowRects; i++)
    		{
    			rectangle(imOut, rects[i], Scalar(0, 255, 0));
    		}
    
    		// show output
    		imshow("Output", imOut);
    
    		waitKey(0);
    	}
    	return 0;
    }

    Python:

    
    import sys
    import cv2
    
    if __name__ == '__main__':
    
        # speed-up using multithreads
        cv2.setUseOptimized(True)
        cv2.setNumThreads(4);
    
        # read image
        im = cv2.imread('image/dogs.jpg')
        # resize image
        newHeight = 200
        newWidth = int(im.shape[1]*200/im.shape[0])
        im = cv2.resize(im, (newWidth, newHeight))    
    
        # create Selective Search Segmentation Object using default parameters
        ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()
    
        # set input image on which we will run segmentation
        ss.setBaseImage(im)
    
    
        #ss.switchToSelectiveSearchFast()
    
        ss.switchToSelectiveSearchQuality()
    
    
        # run selective search segmentation on input image
        rects = ss.process()
        print('Total Number of Region Proposals: {}'.format(len(rects)))
        
        # number of region proposals to show
        numShowRects = 100
        # increment to increase/decrease total number
        # of reason proposals to be shown
        increment = 50
    
        while True:
            # create a copy of original image
            imOut = im.copy()
    
            # itereate over all the region proposals
            for i, rect in enumerate(rects):
                # draw rectangle for region proposal till numShowRects
                if (i < numShowRects):
                    x, y, w, h = rect
                    cv2.rectangle(imOut, (x, y), (x+w, y+h), (0, 255, 0), 1, cv2.LINE_AA)
                else:
                    break
    
            # show output
            cv2.imshow("Output", imOut);
    
            # record key press
            k = cv2.waitKey(0) & 0xFF
    
            # m is pressed
            if k == 109:
                # increase total number of rectangles to show by increment
                numShowRects += increment
            # l is pressed
            elif k == 108 and numShowRects > increment:
                # decrease total number of rectangles to show by increment
                numShowRects -= increment
            # q is pressed
            elif k == 113:
                break
        # close image show window
        cv2.destroyAllWindows()

    4 参考

    https://www.learnopencv.com/selective-search-for-object-detection-cpp-python/

    展开全文
  • 目标检测 选择性搜索-Selective Search

    千次阅读 2020-01-26 23:57:08
  • 2、https://github.com/opencv/选择性搜索对象检测(C ++ / Python)在本教程中,我们将了解在对象检测中称为“选择性搜索”的重要概念。 我们还将分享C ++和Python中的OpenCV代码。对象检测与对象识别物体识别算法...

    参考:
    1、https://github.com/spmallick/learnopencv
    2、https://github.com/opencv/


    选择性搜索对象检测(C ++ / Python)

    在本教程中,我们将了解在对象检测中称为“选择性搜索”的重要概念。 我们还将分享C ++和Python中的OpenCV代码。


    对象检测与对象识别

    物体识别算法识别图像中存在哪些物体。 它将整个图像作为输入并输出该图像中存在的对象的类标签和类概率。 例如,一个类标签可能是“狗”,相关的类概率可能是97%。

    另一方面,物体检测算法不仅告诉您图像中存在哪些物体,还会输出边界框(x,y,宽度,高度)来指示图像内物体的位置。

    所有对象检测算法的核心是一个对象识别算法。 假设我们训练了一个识别图像块中的狗的对象识别模型。 这个模型会告诉一个图像是否有一只狗在里面。 它不会告诉对象所在的位置。

    为了本地化对象,我们必须选择图像的子区域(补丁),然后将对象识别算法应用于这些图像补丁。 物体的位置由物体识别算法返回的类概率高的图像块的位置给出。
    这里写图片描述

    生成较小子区域(补丁)的最直接的方法是滑动窗口方法。 但是,滑动窗口方法有几个限制。 这些限制被称为“区域提议”算法的一类算法所克服。 选择性搜索是最受欢迎的地区提议算法之一。


    滑动窗口算法

    在滑动窗口方法中,我们在图像上滑动一个方框或窗口来选择一个补丁,并使用对象识别模型对窗口覆盖的每个图像补丁进行分类。 这是一个彻底的搜索整个图像的对象。 我们不仅需要搜索图像中所有可能的位置,还必须以不同的比例搜索。 这是因为对象识别模型通常是以特定的尺度(或尺度范围)进行训练的。 这导致对成千上万的图像块进行分类。

    问题并没有在这里结束。 滑动窗口方法适用于固定宽高比的物体,如人脸或行人。 图像是3D对象的2D投影。 诸如纵横比和形状的对象特征根据拍摄图像的角度而显着变化。 滑动窗口的方法,因为当我们搜索多个纵横比时,计算上非常昂贵。


    区域建议算法

    到目前为止我们讨论的问题可以通过使用区域提议算法来解决。 这些方法将图像作为与图像中最可能是对象的所有补丁对应的输入和输出边界框。 这些地区的建议可以是嘈杂的,重叠的,可能不完全包含对象,但在这些地区的建议中,会有一个与图像中的实际对象非常接近的建议。 然后,我们可以使用对象识别模型对这些建议进行分类。 具有高概率分数的区域提议是对象的位置。

    Blue Boxes: False Positives; Green Boxes: True Positives
    Blue Boxes: False Positives; Green Boxes: True Positives

    区域提议算法使用分割来识别图像中的预期对象。 在分割中,我们根据一些标准(如颜色,纹理等)将相邻的区域进行分组。不同于滑动窗口方法,我们在所有像素位置和所有尺度上查找对象,区域提议算法通过 将像素分组为较少的片段。 所以生成的提案的最终数量比滑动窗口方法少很多倍。 这减少了我们必须分类的图像补丁的数量。 这些生成的区域提案具有不同的比例和长宽比。

    区域建议方法的一个重要特性是具有很高的召回率。 这只是一个奇特的说法,即包含我们所看到的对象的区域必须位于我们的区域提案列表中。 为了实现这个目标,我们的区域提案列表可能最终会包含很多不包含任何对象的区域。 换句话说,区域提议算法可以产生大量的误报,只要它能够捕捉到所有的真实的肯定。 这些误报大部分将被对象识别算法拒绝。 当我们有更多的误报,准确性受到一些影响时,检测所花费的时间就会增加。 但是高回忆率仍然是一个好主意,因为缺少包含实际对象的区域的选择会严重影响检测率。

    已经提出了几种区域建议方法,例如
    1、对象性
    2、用于自动对象分割的约束参数Min-Cuts
    3、类别独立对象建议
    4、随机Prim
    5、选择性搜索

    在所有这些区域建议方法中,选择性搜索是最常用的,因为它是快速的并具有很高的召回率。


    对象识别的选择性搜索


    什么是选择性搜索?

    选择性搜索是用于对象检测的区域提议算法。 它被设计成具有非常高的召回速度。 它基于计算基于颜色,纹理,尺寸和形状兼容性的相似区域的分层分组。

    选择性搜索通过使用Felzenszwalb和Huttenlocher的基于图的分割方法,基于像素的强度对图像进行过分割开始。 算法的输出如下所示。 右侧的图像包含使用纯色表示的分段区域。
    这里写图片描述

    这个图像中的部分分段作为区域建议? 答案是否定的,为什么我们不能这样做有两个原因:
    1、原始图像中的大多数实际对象都包含2个或多个分段部分
    2、用这种方法不能产生封闭物体的区域建议,例如被杯子覆盖的板或充满咖啡的杯子

    如果我们试图通过进一步合并相邻区域来解决第一个问题,我们将最终得到一个覆盖两个物体的分割区域。

    完美的细分不是我们的目标。 我们只是想预测很多地区的建议,其中一些建议应该与实际的对象有很高的重叠。

    选择性搜索使用Felzenszwalb和Huttenlocher的方法作为最初的种子。 一个外向的图像看起来像这样。

    选择性搜索算法将这些外生作为初始输入并执行以下步骤

    1、将所有与分割部分对应的边界框添加到区域投标列表中
    2、根据相似性对相邻的段进行分组
    3、转到第1步

    在每次迭代中,形成更大的片段并将其添加到区域提案列表中。 因此,我们使用自下而上的方法从较小的部分向较大的部分创建区域提案。 这就是我们所说的使用Felzenszwalb和Huttenlocher的规则来计算“等级”的分割。
    这里写图片描述

    该图显示了分层分割过程的初始,中间和最后一步。


    相似

    让我们深入了解如何计算两个区域之间的相似度。

    选择性搜索使用基于颜色,纹理,尺寸和形状兼容性的4种相似性度量。

    颜色相似性

    为图像的每个通道计算25个区域的颜色直方图,并且连接所有通道的直方图以获得颜色描述符,得到25×3 = 75维颜色描述符。

    两个区域的颜色相似度基于直方图交点,可以计算为:
    这里写图片描述

    cki 是颜色描述符中 kth bin的直方图值

    纹理相似性

    纹理特征是通过提取每个通道8个方向的高斯导数来计算的。 对于每个方向和每个颜色通道,计算10个直方图,得到10×8×3 = 240维特征描述符。

    两个区域的纹理相似性也使用直方图交点来计算。
    这里写图片描述

    tki 是纹理描述符中的第k个{bin}的直方图值

    尺寸相似

    尺寸相似性鼓励较小的地区早期合并。 它确保了所有地区的地区建议都形成在图像的各个部分。 如果不考虑这种相似性度量,单个区域会一个接一个地吞噬所有较小的相邻区域,因此只能在这个位置生成多个尺度的区域提案。 大小相似性定义为:

    这里写图片描述

    size(im) 是图像的大小(以像素为单位)

    形状兼容性

    形状兼容性测量两个区域( ri rj )彼此适合的程度。 如果 ri 适合于 rj ,我们希望合并它们以弥补差距,如果它们甚至不相互接触,则不应该合并。

    形状兼容性定义为:
    这里写图片描述

    size(BBij) 是围绕 ri rj 的边界框

    最后的相似性

    两个区域之间的最终相似性被定义为上述4个相似性的线性组合。

    这里写图片描述

    其中 ri rj 是图像中的两个区域或片段, ai0,1 表示是否使用相似性度量。


    结果

    OpenCV中的选择性搜索实现使成千上万个区域提案按照对象的顺序排列。 为了清楚起见,我们正在共享结果,在图像上绘制200-250个框。 一般而言,1000-1200个建议足以获得所有正确的地区建议。

    这里写图片描述


    选择性搜索代码

    我们来看看如何使用在OpenCV中实现的基于选择性搜索的分割。


    选择性搜索:C ++

    下面的代码是使用OpenCV进行选择性搜索的C ++教程。 请通读注释以了解代码。

    #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;
    
    //程序执行命令:./ssearch input_image (f|q)
    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
        // 加速使用多线程
        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
        // 如果最后一个参数既不是f也不是q打印帮助信息
        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
            // m被按下
            if (k == 109) {
                // increase total number of rectangles to show by increment
                // 增加矩形的总数以增量显示
                numShowRects += increment;
            }
            // l is pressed
            // l被按下
            else if (k == 108 && numShowRects > increment) {
                // decrease total number of rectangles to show by increment
                // 减少总数的矩形显示增量
                numShowRects -= increment;
            }
            // q is pressed
            // 按下q 退出
            else if (k == 113) {
                break;
            }
        }
        return 0;
    }

    注:
    缺失的模块ximgproc可以去
    https://github.com/opencv/opencv_contrib下载安装

    编译参考:http://blog.csdn.net/wc781708249/article/details/78273241


    选择性搜索:Python

    下面的代码是使用OpenCV 3.3进行选择性搜索的Python教程。 注意在代码块之后提到的OpenCV 3.2的错误警报。 请通读注释以了解代码。

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    '''
    Usage:
        ./ssearch.py input_image (f|q)
        f=fast, q=quality
    Use "l" to display less rects, 'm' to display more rects, "q" to quit.
    '''
    
    import sys
    import cv2
    
    if __name__ == '__main__':
        # If image path and f/q is not passed as command
        # line arguments, quit and display help message
        if len(sys.argv) < 3:
            print(__doc__)
            sys.exit(1)
    
        # speed-up using multithreads
        # 使用多线程加速
        cv2.setUseOptimized(True);
        cv2.setNumThreads(4);
    
        # read image
        im = cv2.imread(sys.argv[1])
        # resize image
        newHeight = 200
        newWidth = int(im.shape[1]*200/im.shape[0])
        im = cv2.resize(im, (newWidth, newHeight))    
    
        # create Selective Search Segmentation Object using default parameters
        # 使用默认参数创建选择性搜索分段对象
        ss = cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()
    
        # set input image on which we will run segmentation
        # 设置我们将运行分割的输入图像
        ss.setBaseImage(im)
    
        # Switch to fast but low recall Selective Search method
        # 切换到快速但低回调选择性搜索方法
        if (sys.argv[2] == 'f'):
            ss.switchToSelectiveSearchFast()
    
        # Switch to high recall but slow Selective Search method
        # 切换到高回调,但慢选择性搜索方法
        elif (sys.argv[2] == 'q'):
            ss.switchToSelectiveSearchQuality()
        # if argument is neither f nor q print help message
        # 如果参数既不是f也不是q打印帮助信息
        else:
            print(__doc__)
            sys.exit(1)
    
        # run selective search segmentation on input image
        # 在输入图像上运行选择性搜索分割
        rects = ss.process()
        print('Total Number of Region Proposals: {}'.format(len(rects)))
    
        # number of region proposals to show
        # 显示区域建议的数量
        numShowRects = 100
        # increment to increase/decrease total number
        # of reason proposals to be shown
        # 增加/减少要显示的理由建议的总数
        increment = 50
    
        while True:
            # create a copy of original image
            # 创建一个原始图像的副本
            imOut = im.copy()
    
            # itereate over all the region proposals
            # 遍历所有地区的建议
            for i, rect in enumerate(rects):
                # draw rectangle for region proposal till numShowRects
                # 为区域提议绘制矩形,直到numShowRects
                if (i < numShowRects):
                    x, y, w, h = rect
                    cv2.rectangle(imOut, (x, y), (x+w, y+h), (0, 255, 0), 1, cv2.LINE_AA)
                else:
                    break
    
            # show output
            cv2.imshow("Output", imOut)
    
            # record key press
            k = cv2.waitKey(0) & 0xFF
    
            # m is pressed
            if k == 109:
                # increase total number of rectangles to show by increment
                # 增加矩形的总数以增量显示
                numShowRects += increment
            # l is pressed
            elif k == 108 and numShowRects > increment:
                # decrease total number of rectangles to show by increment
                # 减少总数的矩形显示增量
                numShowRects -= increment
            # q is pressed
            elif k == 113:
                break
        # close image show window
        cv2.destroyAllWindows()

    Bug警告:在此提交中修复了选择性搜索的Python绑定中的一个错误。 所以Python代码可以用于OpenCV 3.3.0,但不适用于OpenCV 3.2.0。

    如果你不想编译OpenCV 3.3.0,并且拥有之前编译的OpenCV 3.2.0的build文件夹,你也可以修复这个bug。
    如果你看看Github提交,这只是一个小小的改变。 您必须更改文件中的第239行

    opencv_contrib-3.2.0/modules/ximgproc/include/opencv2/ximgproc/segmentation.hpp

    // from
    CV_WRAP virtual void process(std::vector<Rect>& rects) = 0;
    // to
    CV_WRAP virtual void process(CV_OUT std::vector<Rect>& rects) = 0;

    现在再次重新编译你的OpenCV 3.2.0。 如果你有一个早期编译OpenCV的生成文件夹,运行make命令将会编译这个模块。

    展开全文
  • 选择性搜索(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)


    展开全文
  • 物体检测之选择性搜索(Selective Search)

    万次阅读 多人点赞 2018-08-29 01:55:50
    概述 ...本文的来源是翻译参考资料里的《Selective Search for Object Detection (C++ / Python)》,这是国外一个大神的博客,讲的是择性搜索(Selective Search)这一种产生候选区域的算法。这个算...
  • 选择性搜索中,首先将每个像素作为一组,然后计算每一组的纹理,将两个最接近的组结合起来,我们通常对较小的组先分组,合并区域知道所有区域都合并在一起。下图展示了区域合并: 下面展示了区域合并过程中...
  • 目标检测物体的候选框是如何产生的? ...那么候选框是如何产生,又是如何进行筛选的呢?...区域生长(合并)主要由于检测图像中存在的物体具有局部区域相似(颜色、纹理等)。目标识别与图像分割技术的发展进一步推动...
  • 选择搜索(selective search)python实现

    千次阅读 2018-10-28 21:25:31
    选择搜索selsctive search前言简介 前言 最近在学习区域卷积神经网络(RCNN)时,候选框产生使用了选择搜索(selective search),为了更透彻地理解RCNN的工作原理,所以决定基于python代码,实现选择搜索(selective ...
  • go语言控制android.bp选择性编译

    千次阅读 2019-01-10 13:17:42
    为了降低工作量以及考虑到产品的可维护性,大部分手机厂商采用了同一套android代码对应多个产品,编译时根据配置参数选择性编译不同模块的代码。 最初android的编译脚本为Android.mk,采用了Makefile的语言 为了...
  • 如何禁用电脑usb选择性暂停设置

    千次阅读 2014-12-27 11:00:42
    今天小编就教大家如何禁用usb选择性暂停设置。 一、点击打开“开始→控制面板”然后点击“硬件和声音”,如下图所示:  二、接着点击“选项电源计划”,然后点击“更改计划设置”选项,如下图所示:  三、然后...
  • 特征选择-常见的搜索算法

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

    千次阅读 2016-06-12 19:53:30
    搜索引擎选择: Elasticsearch与Solr 搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。 它可以用于全文搜索...
  • 搜索引擎选择: Elasticsearch与Solr 搜索引擎选型调研文档 Elasticsearch简介* Elasticsearch是一个实时的分布式搜索和分析引擎。它可以帮助你用前所未有的速度去处理大规模数据。 它可以用于全文搜索,结构化...
  • 需要搜索多次来确定安装的是哪个版本,然后再来读取之前的安装路径为现在的路径)来实现安装路径自动选择的问题,这里就这个问题来更新一篇关于搜索注册表和设置安装路径的办法,话不多说,开整。1、确定安装路径所...
  • 其它环节与通过Anaconda环境配置方式一样,就是在安装TensorFlow时不直接使用pip install --upgrade --ignore-installed tensorflow-gpu命令,而是根据需求选择TensorFlow版本安装。
  • 在本教程中,我们将了解对象检测中称为“选择性搜索”的重要概念。我们还将用C ++和Python共享OpenCV代码。 物体检测与物体识别 对象识别算法识别图像中存在哪些对象。它将整个图像作为输入,并输出该图像中存在...
  • (2)基于科研人员导师/学生分类实例应用特征选择方法,参数选择使用的是网格搜索。 注: 很多内容是网上学习而得,感谢大佬们的分享~ 参考文献: [1] ...
  • 常用搜索算法—盲目搜索和启发式搜索

    万次阅读 多人点赞 2019-05-25 00:51:39
    搜索算法 本文主要以一些概念对较为常见的搜索作简单介绍: 一、盲目搜索 对一个图进行搜索意味着按照某种特定的顺序依次访问其顶点。在所有搜索方式中,广度优先算法和深度优先搜索算法都十分重要,因为它们提供了...
  • 超参数搜索之网格搜索与并行搜索

    万次阅读 2017-09-06 11:40:18
    多数情况下,超参数等选择是无限的。在有限的时间内,除了可以验证人工预设几种超参数组合以外,也可以通过启发式的搜索方法对超参数组合进行调优。称这种启发式的超参数搜索方法为网格搜索。 网格搜索 由于超参数...
  • 对于整形行业来说,整形项目的关键词选取是重中之重,其他行业来说关键词对网络营销和seo的重要不言而喻,《孙子·谋攻篇》中说:“知己知彼,百战不殆,是强调”知己“和”知彼“,要求决策者在进行战争之前,要进行...
  • 目标检测(Object Detection)

    万次阅读 多人点赞 2020-11-20 19:38:58
    候选区域产生1)滑动窗口2)选择性搜索① 什么是选择性搜索② 选择搜索流程③ 选择搜索优点2. 数据表示3. 效果评估4. 非极大值抑制三、目标检测模型1. R-CNN系列1)R-CNN① 定义② 流程③ 效果④ 缺点2)Fast R-CNN...
  • 神经网络架构搜索(Neural Architecture Search)杂谈

    万次阅读 多人点赞 2018-12-02 13:24:26
    超参数的自动搜索优化是一个古老的话题了。深度学习前它主要针对传统机器学习算法的参数,比较经典的方法有random search, grid search,Bayesian optimization,Reinforcement learning, Evolutionar...
  • 开源搜索引擎 种子搜索 很久以前,互联网很小,只有几个人可以将它们编入索引,这些人收集了所有网站的名称和位置,并按页面或印刷书籍中的主题列出了它们。 随着万维网网络的发展,“网络响动”惯例得到了发展,在...
  • 在7.10中,我们很高兴地发布了可搜索快照的beta版,这个功能改变了你使用你所选择的对象存储(如AWS S3、Microsoft Azure Storage、Google Cloud Storage或同等产品)的方式,让你可以在: 大幅降低存储成本 在...
  • ML之FE:数据处理—特征工程之特征选择常用方法之基于搜索策略的三种分类、基于评价准则划分的三种分类(Filter/Wrapper/Embedded)及其代码实现 目录 Wrapper包裹式/封装式——基于搜索策略的三类 T1、全局...
  • Google 学术搜索(Google Scholar)使用技巧

    万次阅读 多人点赞 2017-11-07 14:13:53
    Google 学术搜索是一项免费服务, 可以帮助快速寻找学术资料, 如专家评审文献、论文、书籍、预印本、摘要以及技术报告。作为此次扩展的一部分,Google 学术搜索在索引中涵盖了来自多方的信息,信息来源包括万方数据...
  • 搜索引擎solr和elasticsearch

    万次阅读 2016-04-23 10:19:22
    刚开始接触搜索引擎,网上收集了一些资料,在这里整理了一下分享给大家...搜索引擎包括全文索引、目录索引、元搜索引擎、垂直搜索引擎、集合式搜索引擎、门户搜索引擎与免费链接列表等。一个搜索引擎由搜索器 、索引器
  • 说明:搜索方便,可选择资源类型 3.云盘精灵 网址:https://www.yunpanjingling.com/ 点击进入网站 说明:搜索资源后可按照最新时间显示资源 4.大力盘搜索 网址:https://www.dalipan.com/ 点击进入网站 说明:页面...
  • 浅谈搜索引擎——SEO

    万次阅读 2017-08-13 21:58:45
    浅谈搜索引擎——SEO浅谈SEO 如何快速提高网站的权值及浏览量 有效方式,专业检测网站的流量 SEO 与SEM的区别 SEO(Search Eneginee Optimization) 搜索引擎优化 免费 SEM (Search Eneginee Market) 搜索引擎市场 ...
  • 搜索引擎技术之概要预览

    万次阅读 多人点赞 2011-09-27 20:04:45
    搜索引擎技术之概要预览前言 近些天在学校静心复习功课与梳理思路(找工作的事情暂缓),趁闲暇之际,常看有关搜索引擎相关技术类的文章,接触到不少此前未曾触碰到的诸多概念与技术,如爬虫,网页抓取,分词,索引...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 658,724
精华内容 263,489
关键字:

选择性搜索