【深度学习笔记】计算机视觉——R-CNN

区域卷积神经网络(R-CNN)系列

sec_rcnn

除了 sec_ssd中描述的单发多框检测之外,
区域卷积神经网络(region-based CNN或regions with CNN features,R-CNN) Girshick.Donahue.Darrell.ea.2014也是将深度模型应用于目标检测的开创性工作之一。
本节将介绍R-CNN及其一系列改进方法:快速的R-CNN(Fast R-CNN) Girshick.2015、更快的R-CNN(Faster R-CNN) Ren.He.Girshick.ea.2015和掩码R-CNN(Mask R-CNN) He.Gkioxari.Dollar.ea.2017
限于篇幅,我们只着重介绍这些模型的设计思路。

R-CNN

R-CNN首先从输入图像中选取若干(例如2000个)提议区域(如锚框也是一种选取方法),并标注它们的类别和边界框(如偏移量)。 Girshick.Donahue.Darrell.ea.2014然后,用卷积神经网络对每个提议区域进行前向传播以抽取其特征。
接下来,我们用每个提议区域的特征来预测类别和边界框。

在这里插入图片描述

fig_r-cnn

fig_r-cnn展示了R-CNN模型。具体来说,R-CNN包括以下四个步骤:

  1. 对输入图像使用选择性搜索来选取多个高质量的提议区域 Uijlings.Van-De-Sande.Gevers.ea.2013。这些提议区域通常是在多个尺度下选取的,并具有不同的形状和大小。每个提议区域都将被标注类别和真实边界框;
  2. 选择一个预训练的卷积神经网络,并将其在输出层之前截断。将每个提议区域变形为网络需要的输入尺寸,并通过前向传播输出抽取的提议区域特征;
  3. 将每个提议区域的特征连同其标注的类别作为一个样本。训练多个支持向量机对目标分类,其中每个支持向量机用来判断样本是否属于某一个类别;
  4. 将每个提议区域的特征连同其标注的边界框作为一个样本,训练线性回归模型来预测真实边界框。

尽管R-CNN模型通过预训练的卷积神经网络有效地抽取了图像特征,但它的速度很慢。
想象一下,我们可能从一张图像中选出上千个提议区域,这需要上千次的卷积神经网络的前向传播来执行目标检测。
这种庞大的计算量使得R-CNN在现实世界中难以被广泛应用。

Fast R-CNN

R-CNN的主要性能瓶颈在于,对每个提议区域,卷积神经网络的前向传播是独立的,而没有共享计算。
由于这些区域通常有重叠,独立的特征抽取会导致重复的计算。
Fast R-CNNGirshick.2015对R-CNN的主要改进之一,是仅在整张图象上执行卷积神经网络的前向传播。

在这里插入图片描述

fig_fast_r-cnn

fig_fast_r-cnn中描述了Fast R-CNN模型。它的主要计算如下:

  1. 与R-CNN相比,Fast R-CNN用来提取特征的卷积神经网络的输入是整个图像,而不是各个提议区域。此外,这个网络通常会参与训练。设输入为一张图像,将卷积神经网络的输出的形状记为 1 × c × h 1 × w 1 1 \times c \times h_1 \times w_1 1×c×h1×w1
  2. 假设选择性搜索生成了 n n n个提议区域。这些形状各异的提议区域在卷积神经网络的输出上分别标出了形状各异的兴趣区域。然后,这些感兴趣的区域需要进一步抽取出形状相同的特征(比如指定高度 h 2 h_2 h2和宽度 w 2 w_2 w2),以便于连结后输出。为了实现这一目标,Fast R-CNN引入了兴趣区域汇聚层(RoI pooling):将卷积神经网络的输出和提议区域作为输入,输出连结后的各个提议区域抽取的特征,形状为 n × c × h 2 × w 2 n \times c \times h_2 \times w_2 n×c×h2×w2
  3. 通过全连接层将输出形状变换为 n × d n \times d n×d,其中超参数 d d d取决于模型设计;
  4. 预测 n n n个提议区域中每个区域的类别和边界框。更具体地说,在预测类别和边界框时,将全连接层的输出分别转换为形状为 n × q n \times q n×q q q q是类别的数量)的输出和形状为 n × 4 n \times 4 n×4的输出。其中预测类别时使用softmax回归。

在Fast R-CNN中提出的兴趣区域汇聚层与 sec_pooling中介绍的汇聚层有所不同。在汇聚层中,我们通过设置汇聚窗口、填充和步幅的大小来间接控制输出形状。而兴趣区域汇聚层对每个区域的输出形状是可以直接指定的。

例如,指定每个区域输出的高和宽分别为 h 2 h_2 h2 w 2 w_2 w2
对于任何形状为 h × w h \times w h×w的兴趣区域窗口,该窗口将被划分为 h 2 × w 2 h_2 \times w_2 h2×w2子窗口网格,其中每个子窗口的大小约为 ( h / h 2 ) × ( w / w 2 ) (h/h_2) \times (w/w_2) (h/h2)×(w/w2)
在实践中,任何子窗口的高度和宽度都应向上取整,其中的最大元素作为该子窗口的输出。
因此,兴趣区域汇聚层可从形状各异的兴趣区域中均抽取出形状相同的特征。

作为说明性示例, fig_roi中提到,在 4 × 4 4 \times 4 4×4的输入中,我们选取了左上角 3 × 3 3\times 3 3×3的兴趣区域。
对于该兴趣区域,我们通过 2 × 2 2\times 2 2×2的兴趣区域汇聚层得到一个 2 × 2 2\times 2 2×2的输出。
请注意,四个划分后的子窗口中分别含有元素0、1、4、5(5最大);2、6(6最大);8、9(9最大);以及10。

在这里插入图片描述

fig_roi

下面,我们演示了兴趣区域汇聚层的计算方法。
假设卷积神经网络抽取的特征X的高度和宽度都是4,且只有单通道。

import torch
import torchvisionX = torch.arange(16.).reshape(1, 1, 4, 4)
X
tensor([[[[ 0.,  1.,  2.,  3.],[ 4.,  5.,  6.,  7.],[ 8.,  9., 10., 11.],[12., 13., 14., 15.]]]])

让我们进一步假设输入图像的高度和宽度都是40像素,且选择性搜索在此图像上生成了两个提议区域。
每个区域由5个元素表示:区域目标类别、左上角和右下角的 ( x , y ) (x, y) (x,y)坐标。

rois = torch.Tensor([[0, 0, 0, 20, 20], [0, 0, 10, 30, 30]])

由于X的高和宽是输入图像高和宽的 1 / 10 1/10 1/10,因此,两个提议区域的坐标先按spatial_scale乘以0.1。
然后,在X上分别标出这两个兴趣区域X[:, :, 0:3, 0:3]X[:, :, 1:4, 0:4]
最后,在 2 × 2 2\times 2 2×2的兴趣区域汇聚层中,每个兴趣区域被划分为子窗口网格,并进一步抽取相同形状 2 × 2 2\times 2 2×2的特征。

torchvision.ops.roi_pool(X, rois, output_size=(2, 2), spatial_scale=0.1)
tensor([[[[ 5.,  6.],[ 9., 10.]]],


[[[ 9., 11.],
[13., 15.]]]])

Faster R-CNN

为了较精确地检测目标结果,Fast R-CNN模型通常需要在选择性搜索中生成大量的提议区域。
Faster R-CNN Ren.He.Girshick.ea.2015提出将选择性搜索替换为区域提议网络(region proposal network),从而减少提议区域的生成数量,并保证目标检测的精度。

在这里插入图片描述

fig_faster_r-cnn

fig_faster_r-cnn描述了Faster R-CNN模型。
与Fast R-CNN相比,Faster R-CNN只将生成提议区域的方法从选择性搜索改为了区域提议网络,模型的其余部分保持不变。具体来说,区域提议网络的计算步骤如下:

  1. 使用填充为1的 3 × 3 3\times 3 3×3的卷积层变换卷积神经网络的输出,并将输出通道数记为 c c c。这样,卷积神经网络为图像抽取的特征图中的每个单元均得到一个长度为 c c c的新特征。
  2. 以特征图的每个像素为中心,生成多个不同大小和宽高比的锚框并标注它们。
  3. 使用锚框中心单元长度为 c c c的特征,分别预测该锚框的二元类别(含目标还是背景)和边界框。
  4. 使用非极大值抑制,从预测类别为目标的预测边界框中移除相似的结果。最终输出的预测边界框即是兴趣区域汇聚层所需的提议区域。

值得一提的是,区域提议网络作为Faster R-CNN模型的一部分,是和整个模型一起训练得到的。
换句话说,Faster R-CNN的目标函数不仅包括目标检测中的类别和边界框预测,还包括区域提议网络中锚框的二元类别和边界框预测。
作为端到端训练的结果,区域提议网络能够学习到如何生成高质量的提议区域,从而在减少了从数据中学习的提议区域的数量的情况下,仍保持目标检测的精度。

Mask R-CNN

如果在训练集中还标注了每个目标在图像上的像素级位置,那么Mask R-CNN He.Gkioxari.Dollar.ea.2017能够有效地利用这些详尽的标注信息进一步提升目标检测的精度。

在这里插入图片描述

fig_mask_r-cnn

fig_mask_r-cnn所示,Mask R-CNN是基于Faster R-CNN修改而来的。
具体来说,Mask R-CNN将兴趣区域汇聚层替换为了
兴趣区域对齐层,使用双线性插值(bilinear interpolation)来保留特征图上的空间信息,从而更适于像素级预测。
兴趣区域对齐层的输出包含了所有与兴趣区域的形状相同的特征图。
它们不仅被用于预测每个兴趣区域的类别和边界框,还通过额外的全卷积网络预测目标的像素级位置。
本章的后续章节将更详细地介绍如何使用全卷积网络预测图像中像素级的语义。

小结

  • R-CNN对图像选取若干提议区域,使用卷积神经网络对每个提议区域执行前向传播以抽取其特征,然后再用这些特征来预测提议区域的类别和边界框。
  • Fast R-CNN对R-CNN的一个主要改进:只对整个图像做卷积神经网络的前向传播。它还引入了兴趣区域汇聚层,从而为具有不同形状的兴趣区域抽取相同形状的特征。
  • Faster R-CNN将Fast R-CNN中使用的选择性搜索替换为参与训练的区域提议网络,这样后者可以在减少提议区域数量的情况下仍保证目标检测的精度。
  • Mask R-CNN在Faster R-CNN的基础上引入了一个全卷积网络,从而借助目标的像素级位置进一步提升目标检测的精度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720135.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Bagels系列|python小程序随手记

来自《The Big Book of Small Python Projects》 import randomNUM_DIGITS 3 MAX_GUESSES 10 def main():print(Bagels, a deductive logic game. I am thinking of a {}-digit number with no repeated digits. Try to guess what it is. Here are some clues: When I sa…

知识图谱辅助的个性化推荐系统

知识图谱辅助的个性化推荐系统 将从下面4个方面展开: 推荐系统的基础知识知识图谱辅助的推荐方法介绍基于embedding的知识图谱推荐方法混合型知识图谱推荐方法 推荐系统的基础知识 1、什么是推荐系统 在当前互联网时代,推荐系统是所有面向用户的互联…

【深度学习笔记】计算机视觉——多尺度目标检测

多尺度目标检测 在 sec_anchor中,我们以输入图像的每个像素为中心,生成了多个锚框。 基本而言,这些锚框代表了图像不同区域的样本。 然而,如果为每个像素都生成的锚框,我们最终可能会得到太多需要计算的锚框。 想象一…

速盾cdn:快速高防cdn加速

速盾CDN(Sudun CDN)是一种快速高防CDN加速服务,CDN(内容分发网络)是一种通过在全球各地部署服务器节点来加速网站内容传输的技术,可以提高网站的访问速度和稳定性。 传统的网络架构通常会面临一些问题&…

SQL教学: MySQL高级数据操作--深入理解DML语句的技巧与策略

欢迎回到我们的SQL-DML语句教学系列。在之前的文章中,我们已经介绍了DDL语句的基础知识,以及DML语句的基本操作和进阶用法。今天,我们将进一步深入探讨DML语句的高级用法,包括合并查询、索引使用、锁机制以及性能优化等方面的内容…

【PHP】PHP实现与硬件串口交互,向硬件设备发送指令数据(下)

目录 一、前言 二、 效果图 三、安装PHP扩展 四、添加模拟串口 五、PHP发送数据给硬件 PHP代码 前端代码 一、前言 上篇文章写到PHP怎么与硬件串口交互之实时接收硬件发送的数据,这里同样是以天平为例,介绍怎么向硬件设备发送数据, 需…

python常见面试题汇总

在Python面试中,常见的面试问题可以覆盖基础语法、面向对象编程、数据处理和分析,以及特定库的掌握。以下是你可能在面试中遇到的一些典型问题和相应的答案。 基础语法问题: 解释Python中的列表和元组之间的主要区别是什么? 列表是…

深度学习500问——Chapter02:机器学习基础(3)

文章目录 2.10 主成分分析(PCA) 2.10.1 主成分分析(PCA)思想总结 2.10.2 图解PCA核心思想 2.10.3 PCA算法推理 2.10.4 PCA算法流程总结 2.10.5 PCA算法主要优缺点 2.10.6 降维的必要性及目的 2.10.7 KPCA与PCA的区别 2.11 模型评估…

修改uboot连接的主机的ip地址

前言 这一节是因为最近改变了一下连接主机的ip,然后就需要修改一下uboot中一些变量的值。平台是i.mx6ull。 嵌入式驱动学习专栏将详细记录博主学习驱动的详细过程,未来预计四个月将高强度更新本专栏,喜欢的可以关注本博主并订阅本专栏&#x…

记录ssh root@43.136.175.100连接服务器失败

问题描述: 云服务器重装系统之后, 使用ssh root43.136.175.100连接服务器失败 报错 PS C:\Users\yangjin> ssh root43.136.175.100WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! …

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致

利用excel文件增量同步一个库的数据并自动校正两端数据库条数不一致 现在有sqlserver和mysql两个库上的表在进行同步,sqlserver上的是源表,mysql上是目标表。 我们就把sqlserver上的数据同步到mysql上 mysql 是没有数据的。 sqlserver的三个表只是创建了…

利用Python自动化日常任务

在快节奏的现代生活中,时间就是一切。幸运的是,Python提供了一系列强大的库和工具,可以帮助我们自动化那些乏味且重复的任务,从而释放我们的时间,让我们可以专注于更有创造性和有意义的工作。下面,我们将探…

【十】【SQL】合并查询和内连接

在实际应用中,为了合并多个select的执行结果,可以使用集合操作符 union ,union all Union 该操作符用于取得两个结果集的并集。当使用该操作符时,会自动去掉结果集中的重复行。 Union all 该操作符用于取得两个结果集的并集。…

【C++】 6-2 用动态分配空间的方法计算Fibonacci数列的前n项 分数 10

6-2 用动态分配空间的方法计算Fibonacci数列的前n项 分数 10 全屏浏览 切换布局 作者 刘利 单位 惠州学院 用动态分配空间的方法计算Fibonacci数列的前n项并存储到动态分配的存储空间中,然后按每行5个数列的格式输出结果 函数接口定义: void Fib ( …

6、Linux-服务管理、权限管理和授权(sudo权限)

一、服务管理 systemctl list-unit-files:查看服务systemctl start 服务名:启动服务systemctl stop 服务名:关闭服务systemctl restart 服务名:重启服务systemctl status 服务名:查看服务状态systemctl enable 服务名…

phpspreadsheet 读取excel 获取日期时间变成浮点数

Excel存储日期和时间作为小数值。 日期是从 1900 年开始的天数,时间是一天的部分,右边的小数部分。 为了将这种形式的日期和时间转换为 PHP 日期和时间,我们可以使用 PhpSpreadsheet 提供的一个工具方法:PhpOffice\PhpSpreadshee…

BioTech - 药物晶型预测与剂型设计 概述

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/136441046 药物晶型预测与剂型设计是指利用计算机模拟和优化药物分子在固态形式下的结构、性质和稳定性,以及与制剂工艺和质…

Python实现微信电脑版微信支付收款监听及支付回调通知

摘要 为什么要监听收款?那是因为现在还有人在使用微信的收款码、商业码、赞赏码实现免签支付,这类实现方法的最终方案还是监听收款结果。 技术原理 通过Python实时解析微信电脑版控件的文本内容来获取信息。不需要Hook和抓包,也不是走任何…

[DevOps云实践] 跨AWS账户及Region调用Lambda

[DevOps云实践] 跨AWS账户及Region调用Lambda 本文將幫大家理清一下幾個問題: 如何跨不同AWS賬戶,不同Region來調用Lambda? 不同Lambda之間如何互相調用?有時我們希望我們的Lambda脚本能夠運行在多個AWS賬戶中的不同Region下,但是,我們還不希望每個下面都去建立一個運行…

[python] dataclass 快速创建数据类

在Python中,dataclass是一种用于快速创建数据类的装饰器和工具。自Python 3.7起,通过标准库中的dataclasses模块引入。它的主要目的是简化定义类来仅存储数据的代码量。通常,这样的类包含多个初始化属性,但没有复杂的方法&#xf…