1.背景

物体检测(object detection)是计算机视觉非常重要的一个领域。RCNN作为该领域的开山鼻祖,在深度学习出现之前,传统方法始终无法处理好物体检测问题(会通过非常庞大的计算,来算出结果),在深度学习方法引入之后,物体检测领域就有了改变。最著名的是RCNN系列,另外还有YOLO、SSD系列。

首先总结一下RCNN。

2.步骤

RCNN算法分为4个步骤

  1. 候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
  2. 特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
  3. 类别判断/位置精修: 使用回归器精细修正候选框位置, 而特征送入每一类的SVM 分类器,判别是否属于该类,并且用NMS提出掉相似的框,保留最准确的框。     

     2.1候选区域生成

        Selective Search算法:

          可以认为这是一种非监督的方式,它就是看图像中每个pixel的相似程度,如图像中边缘特征比较明显的地方,像素之间明显的地方,根据这个,它会把图像分成很多区域块,根据这些区域块,会找出很多矩形框,也就是会生成2k候选框。然后Warp To Fixed Size将每个框,resize到相同大小大概2k个。流程如图:

                           

   2.2特征提取

         2000张图片后面紧接着一个卷积神经网络,提取图像特征。

        **问题一:为什么要resize成大小一样的2k张:

          答:Selective Search 后接的是一个卷积神经网络,后面有fc层,最后向量的维度2000*4096是一样的,所以必须要输入图像一样。

            

   2.3类别判断/位置精修(分类与回归,即SVM Classification + NMS + BBox Regression)

        **以现在的眼光看过去,实际上SVM完全没有必要用到,完全可以上一步CNN得到特征后直接做分类与回归,而没有必要再用SVM再多一次。

        **其中弄清楚一个很重要的问题NMS是什么,即非极大值抑制(Non-Maximum Suppression):

            我们知道首先是通过2.1得到了2k个region proposal(候选区域), 经过2.2得到2k个feature vector(向量),经过SVM的到2k个result bbox,这个bbox它有一些属性,比如【id/socre(0-1)/】,首先id的意思就是第几个,score就是判断是不是手的概率,怎么判断呢,即设置一个阈值,比如0.8,小于它就提出掉不要了。通过阈值的筛选,最后2k个变成200个,NMS就是从这200个里面,评分最高的几类。

                          

比如图中的检测手的任务,我们通过阈值剔除掉其余1.8k只手,就要用剩下两百个框通过NMS筛到只留四个框,分别代表四只手。

NMS数学及代码解释:

                

B是每个框(200个),S是B的得分情况,比如0.8,0.92,0.982,0.99......(200个)  ,Nt是阈值

首先遍历一下B, 找到200个中最大的S,将找到的最大分值bm给到M,然后B - bm更新为199个,然后依次循环剩下的199个,分别与最大值bm做IOU计算,设置一个阈值,假如为0.3,大于0.3的我们就认为是在检测同一个物体,就会被剔除掉,实际上NMS更新出现在这里。

假如若检测将本之间重叠,比如:

                  

这种情况剔除掉谁也不合适,都是需要检测的内容。

所以针对NMS的改进,用一个高斯分布:

e-iou(M, bi) ⁄ σ,即它会对相似度高的有抑制作用,相似度越高,会尽可能使之讲到阈值之下。

代码:https://github.com/passional/cv_tool/blob/main/nms.py

3.一些问题缺点

  速度特别慢,主要是因为它把很多的内容拆成很多很多部分,比如必须需要用Selective Search纯手算proposal,然后需要把2000个proposal全部仍到CNN中去,去算feature vector,然后还没完,还要将feature vector扔到传统机器学习SVM去分类。

参考目录:RCNN-将CNN引入目标检测的开山之作-晓雷的文章

     基于深度学习的目标检测技术演进:R-CNN、Fast R-CNN、Faster R-CNN-冠军的试练的博客

     RCNN系列

   

            

        

R-CNN小结的更多相关文章

  1. CNN 小结

    CNN 小结 目录 CNN特征提取过程(卷积核描述的是特征信息, 此特征可能就是原图像中的某些像素, 但是卷积核并不找相似的地方在原始图像的哪里, 所以需要将卷积核不断地滑动, 得到的feature ...

  2. python 字符串前缀u, r, b小结

    http://note.youdao.com/noteshare?id=a0da9c2d044d270fa8cb162b932c47e8

  3. 一些Asp.Net面试题答案

    工作时间长了总是用同样的一些东西  其他的有些生疏  闲来看看面试题练习一下:  题目出处嘛...aspnet-tests-for-juniors 转载请注明来源:http://www.cnblogs ...

  4. RCNN--对象检测的又一伟大跨越 2(包括SPPnet、Fast RCNN)(持续更新)

    继续上次的学习笔记,在RCNN之后是Fast RCNN,但是在Fast RCNN之前,我们先来看一个叫做SPP-net的网络架构. 一,SPP(空间金字塔池化,Spatial Pyramid Pool ...

  5. 行为识别(action recognition)相关资料

    转自:http://blog.csdn.net/kezunhai/article/details/50176209 ================华丽分割线=================这部分来 ...

  6. LeetCode算法题-Invert Binary Tree

    这是悦乐书的第194次更新,第199篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第55题(顺位题号是226).反转二叉树.例如: 输入: 4 / \ 2 7 / \ / ...

  7. SQL Server进阶(十一)临时表、表变量

    临时表 本地临时表 适合开销昂贵   结果集是个非常小的集合 -- Local Temporary Tables IF OBJECT_ID('tempdb.dbo.#MyOrderTotalsByYe ...

  8. 【做题】CF1045(ABH)

    原文链接https://www.cnblogs.com/cly-none/p/9697662.html 题目当然不会做完了,这里只讲有做&会做的. A. Last chance 题意:有\(n ...

  9. Controller如何写的更简化

    Controller层相当于MVC中的C,也是安卓或者前端请求的接口. 首先说Controller为什么需要写的更加简化? 第一.Controller是不能复用的: 第二.即便是将Controller ...

  10. javase(10)_多线程基础

    一.排队等待 1.下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬件 ...

随机推荐

  1. UIKit绘图演练

    一般使用UIKit给我们提供的绘图来绘制一些文字,图片这些东西.     UIKit给我们提供画图的方法底层也是分为四步.所以也必须在drawRect方法当中去写.     1.如何画文字?      ...

  2. storyboard文件的认识

    - 作用:描述软件界面 - 程序启动的简单过程     - 程序一启动,就会加载`Main.storyboard`文件     - 会创建箭头所指的控制器,并且显示控制器所管理的软件界面 - 配置程序 ...

  3. Java内存分析简单介绍

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11904422.html Java内存分析简单介绍: 1. # 设置内存溢出时自动生成堆内存快照 ...

  4. vue/cli的目录结构说明

    node_modules:npm 加载的项目所需要的各种依赖模块. src:这里是我们开发的主要目录(源码),基本上要做的事情都在这个目录里面,里面包含了几个目录及文件: 1.assets:放置一些图 ...

  5. linux_17

    nginx负载均衡中常见的算法及原理有哪些? 用rewrite规则实现将所有到a域名的访问rewrite到b域名 实现反向代理客户端IP透传 利用LNMP实现wordpress站点搭建

  6. 垃圾陷阱 && [NOIP2014 提高组] 飞扬的小鸟

    #include<bits/stdc++.h> using namespace std; int d,n,dp[1010]; struct node{int t,f,h;} a[1010] ...

  7. CentOS 7 编译部署LAMP环境

    文章目录 1.需求以及环境准备 1.1.版本需求 1.2.环境准备 1.3.安装包准备 2.编译升级Openssl 2.1.查看当前Openssl版本 2.2.备份当前版本Openssl文件 2.3. ...

  8. Thread.currentThread().getName() 和 this.getName()区别详解

    currentThread的详解 currentThread方法是Thread类的一个静态方法,用来获取当前运行的代码段,正在被哪个线程调用.我们先来看一眼源码. 是一个native方法.直接与系统层 ...

  9. transient关键字有何作用

    使用对象流保存对象时,将对象的全部信息都保存了,但是有些信息是不希望保存,如密码,该如何避免该信息的保存? 使用transient关键字修饰的属性,在保存对象时,该属性并不会被保存. transien ...

  10. 创建jsp页面出现The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path错误

    原因未添加tomcat服务器 第一步: 第二步: