选择性搜索(selective search)

2023-10-29

该文翻译整理自: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)


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

选择性搜索(selective search) 的相关文章

  • Android screencap截屏指令

    查看帮助 注意 有的网友错误使用 screencap v 结果差不多 因为系统不能识别 v 就自动打印出帮助信息 screencap hscreencap husage screencap hp d display id FILENAME
  • 如何在uniapp中优雅地使用WebView

    这里给大家分享我在网上总结出来的一些知识 希望对大家有所帮助 从webview页面传值到uniapp中 官方文档已经很详细了 这里给大家上我的实战代码 首先在webview页面中引入相关依赖

随机推荐

  • 机器学习——深度学习(Deep Learning)

    Deep Learning是机器学习中一个非常接近AI的领域 其动机在于建立 模拟人脑进行分析学习的神经网络 最近研究了机器学习中一些深度学习的相关知识 本文给出一些很有用的资料和心得 Key Words 有监督学习与无监督学习 分类 回归
  • Cesium 简介

    Cesium 简介 一 Cesium 是什么 Cesium 是一个开源 JavaScript 库 用于 3D 2D 2 5D 地图可视化 Cesium 由 AGI 公司计算机图形开发小组与 2011 年研发的 Cesium 一词来源于化学元
  • 基于照片扫描技术的游戏网格贴图制作的相关(上篇)

    参考来源 Agisoft PhototScna User Manual http www agisoft com pdf photoscan pro 1 4 en pdf Unite 2018 基于照片建模的游戏制作流程 http foru
  • MongoDB批量操作及与MySQL效率对比

    本文主要通过批量与非批量对比操作的方式介绍MongoDB的bulkWrite 方法的使用 顺带与关系型数据库MySQL进行对比 比较这两种不同类型数据库的效率 如果只是想学习bulkWrite 的使用的看第一部分就行 测试环境 win7旗舰
  • firefox 地址栏二维码扩展(官方)

    度娘搜索及扩展搜索总找不到这个官方插件 这里记录一下 别的二维码插件真不用 1 设置方式 2 安装地址 附加组件管理器 Firefox 火狐浏览器 火狐社区 附加组件管理器 火狐社区http mozilla com cn thread 34
  • 程序员如何辞职?

    在很长的一段时间里我都梦想着有一天能够辞掉我的工作 为自己工作 我感到自己被困在公司里工作 我知道 如果我能自己离开会做得更好 问题是 怎么离开 那时 我并不认识任何一位成功逃出牢笼的人 所以我不知道自己需要做什么 我只知道 为别人工作我完
  • 【深度学习实验】前馈神经网络(四):自定义逻辑回归模型:前向传播、反向传播算法

    目录 一 实验介绍 二 实验环境 1 配置虚拟环境 2 库版本介绍 三 实验内容 0 导入必要的工具包 1 逻辑回归Logistic类 a 构造函数 init b call self x 方法 c 前向传播forward d 反向传播bac
  • 2020第十一届蓝桥杯C++省赛B组真题和题解 (10月第二场)

    目录 试题A 门牌制作 题目 题解 试题B 既约分数 题目 题解 试题C 蛇形填数 题目 题解 试题D 跑步锻炼 题目 题解 试题F 成绩统计 题目 题解 试题G 回文日期 题目 题解 试题H 子串分值和 题目 题解 试题I 平面切分 题目
  • Python练习题:第11题 兔子繁衍问题

    题目 有一对兔子 从岀生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不部死 问每个月的兔子总数为多少 分析 把兔子分成刚出生的 1个月大的以及2个月及以上大的分别计数即可 coding utf 8 By
  • Xrm.WebApi 多对多关系处理

    primaryId 主实体id childIds 多对多中子实体的ids parentTable 主实体logicalName childTable 子实体logicalName relationShip 主实体和子实体关系字段 priva
  • kubernetes一步一步搭建(一)安装与http访问

    众所周知 kubernetes 简称k8s 是用于管理docker集群的 最近一段时间一直在折腾环境问题 在此写一篇博客 来帮助像我一样的小白 避免走弯路 一 环境 集群环境 角色 IP地址 版本号 Docker版本 系统版本 master
  • QANET: COMBINING LOCAL CONVOLUTION WITH GLOBAL SELF-ATTENTION FOR READING COMPREHENSION

    论文地址 https openreview net pdf id B14TlG RW 摘要 目前的端到端机器阅读和问答模型主要基于包含注意力的循环神经网络 抛开优点 这些模型的主要缺点 在训练和推理方面效率较低 因此我们提出了一种名为QAN
  • 接口 interface

    接口 interface 语法 所有的属性都是静态常量 public static final 通过接口管理常量 没有构造函数 不能实例化 当成一种数据类型来用 所有的方法都是抽象方法 public abstract 罗列一些能力 并没有实
  • 编码体系与规范

    编码体系与规范 网页编码是指网页中字符的编码方式 目前国内常见的网页字符编码主要有utf 8 gbk gb2312 其中 utf 8为国际化编码 在各国各地区的网站中都很常见 可以说是最通用的字符编码 此外 有些日本网页会使用EUC JP
  • 矩阵奇异值分解

    转自 http www madio net forum redirect goto nextnewset tid 47409 html 奇异值分解是线性代数中一种重要的矩阵分解 在信号处理 统计学等领域有重要应用 定义 设A为m n阶矩阵
  • 计算各个数字出现的次数

    目录 解决策略 在C语言中 数字字符只有0 1 2 3 4 5 6 7 8 9 所以我们想要统计数字字符的个数的话可以用一个switch case语句来解决统计的问题 说以代码如下 2 代码优化 解决策略 在C语言中 数字字符只有0 1 2
  • Use case

    详述用例 Use case 2 发布任务者发布任务 范围 赚闲钱应用 级别 用户目标 主要参与者 发布任务者 涉众及关注点 发布任务者 希望便捷 准确地发布任务 希望准确收到接受任务者的任务完成情况 希望确保记录了支付授权服务的支付票据 希
  • 基于Java的网络编程实践

    网络编程 2 网络通信的两要素 如何实现网络的通信 地址 IP 端口号 规则 网络通信协议 TCP UTP 3 IP IP地址 InetAddress 唯一定位一台网络上的计算机 127 0 0 1 本机localhost IP地址的分类
  • 如何在linux命令行(终端)不依赖jupyter执行ipynb 文件

    安装 runipy pip install runipy 终端执行ipynb runipy
  • 选择性搜索(selective search)

    该文翻译整理自 selective search for object detection c python 一 目标检测 VS 目标识别 目标识别 objec recognition 是指明一幅输入图像中包含那类目标 其输入为一幅图像 输