首页 > 编程语言 >【目标检测】RCNN算法实现

【目标检测】RCNN算法实现

时间:2023-09-11 11:26:13浏览次数:42  
标签:候选 ss 检测 模型 算法 区域 图像 RCNN

一、前言

RCNN(Regions with CNN features)算法由Ross Girshick在2014年的论文“Rich feature hierarchies for accurate object detection and semantic segmentation”提出,是深度学习目标检测的开山之作。RCNN将CNN应用到目标检测问题上,它使用选择性搜索从图像中提取候选区域,利用卷积层提取后去区域的特征,最后对这些候选区域进行分类和回归 。RCNN的出现大大提高了目标检测的效果,同时也改变了目标检测领域的主要研究思路。它的出现使得人们开始意识到深度学习在计算机视觉领域中的广泛应用前景。虽然RCNN难以满足实时检测需求,但能帮助我们较好的理解并入门目标检测算法。

二、RCNN算法实现

RCNN算法实现主要包括以下步骤:候选区域生成→特征提取→图像分类→候选框位置修正→预测。和论文中实现方式不同的是,本文不采用SVM训练分类器,而是直接使用CNN分类模型完成图像分类和特征提取任务。

本文算法基于python3.7 + pytorch框架 + 17flowers数据集实现。

1. 候选区域生成

RCNN采用选择性搜索(selective search,后面简称为ss)的办法产生候选区域,参考论文:J. Uijlings, K. van de Sande, T. Gevers, and A. Smeulders. Selective search for object recognition. IJCV, 2013.

1.1 ss方法实现思路

  1.1.1 采用某种手段(如Felzenszwalb方法)将图像分割成许多小区域 R = {r1, ... , rn}

  1.1.2 初始化一个集合 S = Ø,用于存放临近区域的相似度结果

  1.1.3 遍历R中的相邻区域对 (rm, rn),计算他们之间的相似度 s( rmrn),将相似度结果放入集合 中:

  1.1.4 如果S不为空集:

    a. 根据 s(ri, rj)=max(S) 寻找 中相似度最高的区域对 (ri, rj)

    b. 将区域 ri 和 rj 合并,得到新的区域 rt = ri U rj

    c. 移除S中区域 ri 和 rj 相关的所有相似度结果 S = S \ s(rp, r*),p = {ij}

    d. 计算新区域 rt 与周围区域的相似度集合 St,并将 St 放入集合 中,将新区域 rt 放入集合 中,即 = S U St, = R U rt 

  1.1.5 提取 中所有区域的边界框,即为可能存在物体的区域

1.2 ss方法的特点

  1.2.1 速度快:利用分割算法而非暴力穷举的方式生成候选区域,同时采用自底向上合并重叠区域的方法,减少区域冗余

  1.2.2 多样化:并非从单一特征定位物体,而是从颜色、纹理、大小等多个方向对分割区域进行合并定位

1.3 ss方法的python实现

ss方法的python代码如下:

View Code

1.4 ss方法生成的推荐区域示例

2. 特征提取和分类

RCNN采用CNN作为特征提取器,本文使用Alexnet作为特征提取backbone。

2.1 特征提取和分类流程

  2.1.1 数据集准备:

    a. 基于2flowers数据(带真实边界框标记信息)数据,利用ss方法生成候选区域proposals

    b. 根据候选区域与真实边界框的IoU结果,将候选区域分为3类(0为背景label,1和2为物体label)

    c. 保存3类候选区图像,并记录label为1和2的物体的边界框信息便于后续回归模型使用

  2.1.2 预训练:在17-flowers数据集上对Alexnet模型进行分类训练,获得pretrain模型,使之适应当前的任务

  2.1.3 分类模型训练:基于3类候选区域图像,对pretrain模型进行微调,生成微调后的classify模型

  2.1.4 特征提取:上面生成的classify模型也是Alexnet结构,去除所有全连接层,classify.features(img)的输出结果即所需特征

2.2 模型结果

  2.2.1 预训练模型结果示例:

  

 

  2.2.2 分类模型结果示例:

  

3. 候选框位置修正

使用线性回归模型对候选框位置进行修正,流程如下:

  a.  将2.1.1中生成的label为1和2的图像输入classify模型,获得对应的图像特征作为回归模型输入

  b. 将上述图像对应的边界框与真实边界框的偏移值作为回归模型的label

  c. 基于特征和偏移值训练regress模型

4. 预测

如上我们获得了classify模型用于提取图像特征和分类,regress模型用于计算边界框偏移值,接下来可以进行目标预测。

4.1 预测流程

  a. 利用ss方法生成候选区域proposals,记录对应的边界框信息

  b. 将proposals输入classify模型获取分类标签,分类标签为0则该区域为背景,否则为物体

  c. 提取标签不为0的区域的图像特征,并将其送入regress模型,获取预测的边界框偏移值

  d. 选取L1范数最小的偏移值,将最小偏移值与其对应的边界框位置相加,作为最终的预测结果

4.2 预测结果

  

3. 数据和代码

本文中数据和详细代码实现请移步:https://github.com/jchsun1/RCNN

Reference


 本文至此结束,祝君好运。 

标签:候选,ss,检测,模型,算法,区域,图像,RCNN
From: https://www.cnblogs.com/Haitangr/p/17690028.html

相关文章

  • 例2.7 算法实现带头结点单链表的就地逆置问题。
    1.题目例2.7算法实现带头结点单链表的就地逆置问题。2.算法思想3.代码//就地逆置voidReverseList(LinkListL){Node*p,*q;p=L->next;L->next=NULL;while(p){q=p->next;p->next=L->next;L->next=p;......
  • 例2.6 设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂
    1.题目例2.6设计一个高效的算法,从顺序表L中删除所有值为x的元素,要求时间复杂度为0(n)空间复杂度为0(1)。2.算法思想3.代码voidDeleteX(SeqListLA,SeqList*LC,intx){inti=0,j=0;while(i<=LA.last){if(LA.element[i]==x)i++;else......
  • 机器学习算法原理实现——神经网络反向传播,链式求导核心
    记得先看之前的梯度下降文章!   链式求导的核心来了,就高中数学知识: 代码实现:importnumpyasnpimportmatplotlib.pyplotasplt#Sigmoid激活函数及其导数defsigmoid(z):return1/(1+np.exp(-z))defsigmoid_derivative(z):returnsigmoid(......
  • ClickHouse的Join算法
    ClickHouse的Join算法ClickHouse是一款开源的列式分析型数据库(OLAP),专为需要超低延迟分析查询大量数据的场景而生。为了实现分析应用可能达到的最佳性能,分析型数据库(OLAP)通常将表组合在一起形成一个大宽表,这个过程称为数据反规范化(datadenormalization)。大宽表通过避免JOIN连接来......
  • 基于RCNN深度学习网络的交通标志检测算法matlab仿真
    1.算法理论概述      基于RCNN(Region-basedConvolutionalNeuralNetwork)深度学习网络的交通标志检测算法的MATLAB仿真。该算法通过使用深度学习网络进行目标检测,针对交通标志的特点和挑战,设计了相应的实现步骤,并分析了实现中的难点。通过本文的研究,可以进一步理解和应用......
  • C++ 算法竞赛、03 周赛篇 | AcWing 第4场周赛
    AcWing第4场周赛竞赛-AcWing3694A还是B3694.A还是B-AcWing题库简单题#include<algorithm>#include<cstring>#include<iostream>usingnamespacestd;intn;inta,b;intmain(){cin.tie(0);charc;cin>>n;for(int......
  • 练习:分治算法--有序数组寻找中位数
    题:给定两个长度为m和n有序组数array1和array2,请找出这个有序数组的中位数。'''eg.[1,3]和[5,6],中位数是4[1,2,5,8,9]和[2,3,4,5],中位数是4'''###直接方法,使用内置排序函数sort#时间复杂度最高:O((n+m)log(n+m)),空间复杂度:O(n+m)1classSolution(object):2deff......
  • 机器学习算法原理实现——cart决策树
      cart决策树示例: 本文目标,仿照sklearn写一个cart树,但是仅仅使用max_depth作为剪枝依据。   我们本次实现cart分类,因此用到gini指数: 为了帮助理解:  好了,理解了基尼指数。我们看下cart树的构建步骤:注意还有几个细节: cart树每个treenode存储......
  • 粒子群优化算法
    写在前面在大大的花园里面挖呀挖呀挖,挖大大的坑呀寻大大的WA。官方解释利用群体中的个体对信息的共享使整个群体的运动在问题求解空间中产生从无序到有序的演化过程。(这个解释不美丽.......)诡异的故事法解释那是一个暴风雨之夜,伴随着一声巨响,空气开始震动,狂风忽然吹向东方,比......
  • 2023“钉耙编程”中国大学生算法设计超级联赛(5)
    1001Typhoon题意:给你台风的轨迹坐标以及避难所的坐标,台风的半径不可预测,求让每个避难所不安全的最小台风半径是多少。分析:枚举每个点到所有“线段”的距离取个min。代码:附上队友的代码(懒):#include<bits/stdc++.h>#include<math.h>#definerep(i,a,b)for(inti=a;i<......