【目标检测】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( rm, rn),将相似度结果放入集合 S 中:
1.1.4 如果S不为空集:
a. 根据 s(ri, rj)=max(S) 寻找 S 中相似度最高的区域对 (ri, rj)
b. 将区域 ri 和 rj 合并,得到新的区域 rt = ri U rj
c. 移除S中区域 ri 和 rj 相关的所有相似度结果 S = S \ s(rp, r*),p = {i, j}
d. 计算新区域 rt 与周围区域的相似度集合 St,并将 St 放入集合 S 中,将新区域 rt 放入集合 R 中,即 S = S U St, R = R U rt
1.1.5 提取 R 中所有区域的边界框,即为可能存在物体的区域
1.2 ss方法的特点
1.2.1 速度快:利用分割算法而非暴力穷举的方式生成候选区域,同时采用自底向上合并重叠区域的方法,减少区域冗余
1.2.2 多样化:并非从单一特征定位物体,而是从颜色、纹理、大小等多个方向对分割区域进行合并定位
1.3 ss方法的python实现
ss方法的python代码如下:
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:
- https://blog.csdn.net/zhangyoufei9999/article/details/80406423
- [pytorch] RCNN物体检测的简化实现(d2l-香蕉数据集)_pytorch实现rcnn_故你,的博客-CSDN博客
本文至此结束,祝君好运。
【目标检测】RCNN算法实现的更多相关文章
- AI佳作解读系列(二)——目标检测AI算法集杂谈:R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3
1 引言 深度学习目前已经应用到了各个领域,应用场景大体分为三类:物体识别,目标检测,自然语言处理.本文着重与分析目标检测领域的深度学习方法,对其中的经典模型框架进行深入分析. 目标检测可以理解为是物 ...
- CVPR2020论文介绍: 3D 目标检测高效算法
CVPR2020论文介绍: 3D 目标检测高效算法 CVPR 2020: Structure Aware Single-Stage 3D Object Detection from Point Clo ...
- 目标检测 | 经典算法 Cascade R-CNN: Delving into High Quality Object Detection
作者从detector的overfitting at training/quality mismatch at inference问题入手,提出了基于multi-stage的Cascade R-CNN ...
- [目标检测]RCNN系列原理
1 RCNN 1.1 训练过程 (1) 训练时采用fine-tune方式: 先用Imagenet(1000类)训练,再用PASCAL VOC(21)类来fine-tune.使用这种方式训练能够提高8个 ...
- 第三节,目标检测---R-CNN网络系列
1.目标检测 检测图片中所有物体的 类别标签 位置(最小外接矩形/Bounding box) 区域卷积神经网络R-CNN 模块进化史 2.区域卷积神经网络R-CNN Region proposals+ ...
- CNN目标检测系列算法发展脉络——学习笔记(一):AlexNet
在咨询了老师的建议后,最近开始着手深入的学习一下目标检测算法,结合这两天所查到的资料和个人的理解,准备大致将CNN目标检测的发展脉络理一理(暂时只讲CNN系列部分,YOLO和SSD,后面会抽空整理). ...
- 标题 发布状态 评论数 阅读数 操作 操作 CNN目标检测系列算法发展脉络简析——学习笔记(三):Fast R-CNN
最近两周忙着上网课.投简历,博客没什么时间写,姑且把之前做的笔记放上来把... 下面是我之前看论文时记的笔记,之间copy上来了,内容是Fast R-CNN的,以后如果抽不出时间写博客,就放笔记上来( ...
- 目标检测YOLO算法-学习笔记
算法发展及对比: 17年底,mask-R CNN YOLO YOLO最大的优势就是快 原论文中流程,可以检测出20类物体. 红色网格-张量,在这样一个1×30的张量中保存的数据 横纵坐标中心点缩放到0 ...
- 目标检测-SSD算法从零实现
1. 几个工具函数 def box_corner_to_center(boxes): """从(左上,右下)转换到(中间,宽度,高度)""" ...
- AI R-CNN目标检测算法
Region-CNN,简称R-CNN,是首次将深度学习应用于目标检测的算法. bounding box IOU 非极大值抑制 selective search 参考链接: https://blog.c ...
随机推荐
- 文心一言 VS 讯飞星火 VS chatgpt (24)-- 算法导论4.2 6题
六.用Strassen 算法作为子进程来进行一个 knn 矩阵和一个nkn 矩阵相乘,最快需要花费多长时间?对两个输入矩阵规模互换的情况,回答相同的问题. 文心一言: Strassen 算法是一种用于 ...
- kprobe_events shell模式使用教程
kprobe_events shell模式使用教程 kprobe 使用前提 需要内核启用以下配置 CONFIG_KPROBES=y CONFIG_HAVE_KPROBES=y CONFIG_KPROB ...
- wait,notify,notifyAll,sleep,join等线程方法的全方位演练
一.概念解释 1. 进入阻塞: 有时我们想让一个线程或多个线程暂时去休息一下,可以使用 wait(),使线程进入到阻塞状态,等到后面用到它时,再使用notify().notifyAll() 唤醒它,线 ...
- 如何安装旧版本的 R 包
由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. 我们在安装 R 包的时候,经常会发现某个最新的包与当前 R 的版本不兼容. > inst ...
- 网站开发[1] - Spring Boot 快速建立项目
前言 学校的数据库课程要求做出前端页面对数据库进行交互, 可以使用 Python 或者 Java 语言作为后端, Python语言使用起来非常方便, 但出于对自己的挑战以及更加贴合实际企业开发, 我选 ...
- Rust中的变量的声明和定义
变量的声明和定义 Rust中合法的标识符(包括变量名.函数名.triat名等)必须由数字.字母.下划线组成,而且不能以数字开头.这个和很多语言都是一样的.Rust将来也会允许其他Unicode字符作为 ...
- 用声明式宏解析 Rust 语法
在上一篇 Rust 声明式宏中的 Metavariables 有哪些 的基础上, 今天尝试解析一下 Rust 中的几种 item.我们知道一个 crate 是由 item 组成的,每一个 fn str ...
- AWSBackup:备份您的云计算资源及数据
目录 <AWS Backup:备份您的云计算资源及数据> 背景介绍 随着云计算技术的不断普及,越来越多的企业开始将云计算资源视为其关键业务数据的潜在来源.同时,随着数据价值的不断增加,备份 ...
- GPT3的性能评估:比较不同语言、文本和任务的差异
目录 GPT-3 性能评估:比较不同语言.文本和任务的差异 近年来,自然语言处理 (NLP) 和人工智能领域取得了巨大的进展,其中 GPT-3 是目前最为先进的语言模型之一.GPT-3 拥有超过 17 ...
- 3 大数据实战系列-spark shell分析日志
1 准备数据源 文件格式: 访问时间\t用户ID\t[查询词]\t该URL在返回结果中的排名\t用户点击的顺序号\t用户点击URL 数据文件越大越好,至少100万行 2 启动任务 ./spark-sh ...