R-CNN小结
1.背景
物体检测(object detection)是计算机视觉非常重要的一个领域。RCNN作为该领域的开山鼻祖,在深度学习出现之前,传统方法始终无法处理好物体检测问题(会通过非常庞大的计算,来算出结果),在深度学习方法引入之后,物体检测领域就有了改变。最著名的是RCNN系列,另外还有YOLO、SSD系列。
首先总结一下RCNN。
2.步骤
RCNN算法分为4个步骤
- 候选区域生成: 一张图像生成1K~2K个候选区域 (采用Selective Search 方法)
- 特征提取: 对每个候选区域,使用深度卷积网络提取特征 (CNN)
- 类别判断/位置精修: 使用回归器精细修正候选框位置, 而特征送入每一类的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-冠军的试练的博客
R-CNN小结的更多相关文章
- CNN 小结
CNN 小结 目录 CNN特征提取过程(卷积核描述的是特征信息, 此特征可能就是原图像中的某些像素, 但是卷积核并不找相似的地方在原始图像的哪里, 所以需要将卷积核不断地滑动, 得到的feature ...
- python 字符串前缀u, r, b小结
http://note.youdao.com/noteshare?id=a0da9c2d044d270fa8cb162b932c47e8
- 一些Asp.Net面试题答案
工作时间长了总是用同样的一些东西 其他的有些生疏 闲来看看面试题练习一下: 题目出处嘛...aspnet-tests-for-juniors 转载请注明来源:http://www.cnblogs ...
- RCNN--对象检测的又一伟大跨越 2(包括SPPnet、Fast RCNN)(持续更新)
继续上次的学习笔记,在RCNN之后是Fast RCNN,但是在Fast RCNN之前,我们先来看一个叫做SPP-net的网络架构. 一,SPP(空间金字塔池化,Spatial Pyramid Pool ...
- 行为识别(action recognition)相关资料
转自:http://blog.csdn.net/kezunhai/article/details/50176209 ================华丽分割线=================这部分来 ...
- LeetCode算法题-Invert Binary Tree
这是悦乐书的第194次更新,第199篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第55题(顺位题号是226).反转二叉树.例如: 输入: 4 / \ 2 7 / \ / ...
- SQL Server进阶(十一)临时表、表变量
临时表 本地临时表 适合开销昂贵 结果集是个非常小的集合 -- Local Temporary Tables IF OBJECT_ID('tempdb.dbo.#MyOrderTotalsByYe ...
- 【做题】CF1045(ABH)
原文链接https://www.cnblogs.com/cly-none/p/9697662.html 题目当然不会做完了,这里只讲有做&会做的. A. Last chance 题意:有\(n ...
- Controller如何写的更简化
Controller层相当于MVC中的C,也是安卓或者前端请求的接口. 首先说Controller为什么需要写的更加简化? 第一.Controller是不能复用的: 第二.即便是将Controller ...
- javase(10)_多线程基础
一.排队等待 1.下面的这个简单的 Java 程序完成四项不相关的任务.这样的程序有单个控制线程,控制在这四个任务之间线性地移动.此外,因为所需的资源 ― 打印机.磁盘.数据库和显示屏 -- 由于硬件 ...
随机推荐
- JAVA变量初始化赋值问题
感谢大佬:https://www.cnblogs.com/znsongshu/p/6282672.html 在Java中,null值表示引用不指向任何对象.运行过程中系统发现使用了这样一个引用时·可以 ...
- 项目架构(结构)搭建:主流结构(UITabBarController + 导航控制器)
/* 项目架构(结构)搭建:主流结构(UITabBarController + 导航控制器) -> 项目开发方式 1.storyboard 2.纯代码 */ @interface AppDele ...
- Linux常用命令精华讲解 上部 (下部下回分解)不要催很忙的
Linux常用命令讲解 1.Linux命令基础 2.Linux命令帮助 3.目录与文件的基操 1.Shell是系统中运行的一种特殊程序在用户和内核之间充当"翻译官"的角色,登录li ...
- MyBatis加强(1)~缓存机制(一级缓存、二级缓存、第三方缓存技术redis、ehcache)
一.缓存机制 使用缓存可以使应用更快地获取数据,避免频繁的数据库交互操作,尤其是在查询越多,缓存命中率越高 的情况下,缓存的作用就越明显. 1.缓存原理:Map ■ 查询时,先从缓存区查询:找到,返回 ...
- 在Excel VBA中使用SQL到底优势在哪儿
小爬在之前的博文中多次提到,可以在VBA中写SQL来操作Excel文件,实现各类数据处理和分析需求.那么,你可能有这样的疑问:Excel原生的VBA,数据透视表,数据分析功能不够吗,为啥一定要用SQL ...
- Feign实现动态URL
需求描述 动态URL的需求场景: 有一个异步服务S,它为其他业务(业务A,业务B...)提供异步服务接口,在这些异步接口中执行完指定逻辑之后需要回调相应业务方的接口. 这在诸如风控审核,支付回调等场景 ...
- MyBatis功能点二应用:第三方分页插件使用
pageHelper分⻚插件使用 在前面文章MyBatis功能点二:plugins插件使用 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中介绍了自定义插件的使用,本文介绍第三方插件pa ...
- Android SugarORM(3)
Android Sugar ORM (3) Android Sugar ORM 查询 我们在此之前介绍了一些关于Sugar ORM的简单操作, 现在我们就查询来具体说一下 Sugar ORM中的fin ...
- ctf linux 基本命令
从网站上下载一个tar.gz的安装包,在linux下解压缩. 获得一个flag的二进制文件. 通过linux的grep命令搜索到key. grep命令参数中文说明
- [杂记]BrainFuck语言及编译器(c++实现)
BrainFuck语言 极简的一种图灵完备的语言,由Urban Müller在1993年创造,由八个指令组成(如下表).工作机制与图灵机非常相似,有一条足够长的纸带,初始时纸带上的每一格都是0,有一个 ...