物体检测(一)---selective search

一、大格局上方法可分为两种
1、“先有鸡,后有蛋”,即是物体识别-------物体检测

物体识别的方法很多,可以自己训练model,如基于深度学习的CNN,基于机器学习的svm,通常来讲都是基于DL,这样不会丢失图像的结构信息。
对于物体检测,我们这种情况会采用滑动窗口 的方法,遍历不同尺度下的整副图像,看那个图像块是目标图像。

训练物体识别模型
滑动窗口判断是不是目标物体
记录窗口的x,y,w,h,score
非极大值抑制得到最终的结果

这种方法是最常见的,但是它存在缺陷

遍历整副图像的pixel
遍历不同尺度的图像

所以计算量是非常的大

2、“先有蛋,后有鸡”,即是物体检测----物体识别

这种方法看起来像因果导致,其实不然,这种算法称为“Region Proposal Algorithms",区域规划算法通过分割来识别图像中的潜在目标。对于分割,我们通过领域相似性准则来调整区域,如颜色、纹理等。不像滑动窗口方法,要搜索所有图像的像素位置和不同尺度情况下,因此区域规划算法产生的图像块数量要远远少于滑动窗口算法的,也就是要分类的图像块远远减少。同时,滑动窗口是固定长宽比,而区域规划算法产生的图像块(ROI区域)是不同尺度和不同长宽比的。

区域规划算法有一个很重要的特性是有很高的recall,什么意思尼?就是说产生的图像块包含真正的目标(recall,目标被检测出来的概率)
区域规划算法有以下方法:
1、Objectness
code下载链接:http://groups.inf.ed.ac.uk/calvin/objectness/
2、Constrained Parametric Min-Cuts for Automatic Object Segmentation
code下载链接:http://www.maths.lth.se/matematiklth/personal/sminchis/code/cpmc/index.html
3、Category Independent Object Proposals
code下载链接:http://vision.cs.uiuc.edu/proposals/
4、Randomized Prim
5、Selective Search
以上方法中,selective search 是最常用的,因为它快和很高的recall,于是下面着重讲5方法

二、什么是Selective Search?

选择性搜索是区域规划算法的方法,被用于目标检测。它具有fast 和 high recall 的特性。算法原理:基于颜色、纹理、大小和形状等,将image分层划分为诸多相似区域。
论文参考链接:https://www.koen.me/research/selectivesearch/

1、如何计算两个region 的相似度

1)颜色相似
每个区域计算每个通道25-bin个直方图,即是253=75维的特征描述子
在这里插入图片描述
2)纹理相似
每个区域每个通道计算8个方向高斯导数,取10bins 直方图×8
3=240维的特征描述子
在这里插入图片描述
3)大小相似度
在这里插入图片描述
4)形状兼容性
在这里插入图片描述
最后将以上特征连接起来,a表示的是是否相似,取值为0或1
在这里插入图片描述
选择性搜索代码如下:

# coding=utf-8
import cv2
import sys
from cmath import rect
if __name__=="__main__":
#     if len(sys.argv)<3:
#         print(__doc__)
#         sys.exit(1)
    #线程加速
    cv2.setUseOptimized(True)
    cv2.setNumThreads(3)
    im=cv2.imread(r"person.jpg")
    w,h=int(im.shape[1]*200/im.shape[0]),200
    im=cv2.resize(im,(w,h))
    ss=cv2.ximgproc.segmentation.createSelectiveSearchSegmentation()
    ss.setBaseImage(im)
#     if sys.argv[2]=="f":
#         ss.switchToSelectiveSearchFast()
#     elif sys.argv[2]=="q":
#         ss.switchToSelectiveSearchQuality()
#     else:
#         print(__doc__)
#         sys.exit(1)
    ss.switchToSelectiveSearchFast()
    rects=ss.process()
    print("区域总数{}".format(len(rects)))
    n=40
    cv2.createLineSegmentDetector()
    while 1:
        imout=im.copy()
        for i,rect in enumerate(rects):
            if i<n:
                x,y,w,h=rect
                cv2.rectangle(imout,(x,y),(x+w,y+h),(255,0,0),1)
            else:
                break
        cv2.namedWindow("result",cv2.WINDOW_NORMAL)
        cv2.imshow("result",imout)
        k=cv2.waitKey(0)
        if k==27:
            break
    cv2.destroyAllWindows()
                
        
    

效果图:
在这里插入图片描述

#include <iostream>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc.hpp>
#include<opencv2/core.hpp>
#include<opencv2/ximgproc/segmentation.hpp>
#include<ctime>
using namespace std;
//using namespace cv;
using namespace cv::ximgproc::segmentation;
int main(int argc,char** argv)
{
//    cout << "Hello World!" << endl;
    clock_t t1=clock();
    if(argc<3){
        throw runtime_error("参数个数少于3");
    }
    setUseOptimized(true);
    setNumThreads(4);
    Mat img=imread(argv[1]);
    int hight=500;
//    int width=img.cols*hight/img.rows;
    int width=500;
    resize(img,img,Size(width,hight));
    Mat imgout=img.clone();
    Ptr<SelectiveSearchSegmentation> ss=createSelectiveSearchSegmentation();
    ss->setBaseImage(img);
    if(argv[2]=="f"){
        ss->switchToSelectiveSearchFast();
    }
    else {
        ss->switchToSelectiveSearchQuality();
    }
    std::vector<Rect>rects;
    ss->process(rects);
    cout<<"总的roi个数是:"<<rects.size()<<endl;
    int validrects=100;//有效的roi
    cout<<"roi 区域的大小x,y,w,h"<<endl;
    while(1)
    {
        for(int i=0;i<rects.size();++i)
        {
            if(i<validrects)
            {
                rectangle(imgout,rects[i],Scalar(0,255,0),2);
                cout<<rects[i].x<<" "<<rects[i].y<<" "<<rects[i].width<<" "<<rects[i].height<<endl;
            }
        }
        imshow("result",imgout);
        int k=waitKey(0);
        if(k==27){
            break;
        }

    }
    destroyAllWindows();
    cout<<"运行时间是"<<1000*(clock()-t1)/(double)CLOCKS_PER_SEC<<endl;
    return 0;
}


在这里插入图片描述在这里插入图片描述
对于上述selective search 方法检测出来的roi,我们再用训练好的model对其进行分类即可,这样我们就避免了滑动窗口generate 数以千计的image patches.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值