目标检测——RCNN系列学习(一)

前置知识

包括:非极大值抑制(NMS)、selective search等

RCNN

[1311.2524] Rich feature hierarchies for accurate object detection and semantic segmentation (arxiv.org)icon-default.png?t=N7T8https://arxiv.org/abs/1311.2524

1.网络训练

2.推理流程

3.总结

1.多阶段模型:RCNN框架上看分为三个部分:预测类别的CNN特征提取网络,SVM分类器,BoundingBox回归预测模型,训练起来很麻烦;

2.计算时间长:每个提出的region proposal都需要单独计算一次feature map

3.占用空间大:需要保存所有的region proposal的feature map


SPP-Net

[1406.4729] Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition (arxiv.org)icon-default.png?t=N7T8https://arxiv.org/abs/1406.4729

1.Motivation

RCNN的问题:

  • 速度瓶颈:重复为每个region proposal提取特征是极其费时的,Selective Search对于每幅图片产生2K左右个region proposal,也就是意味着一幅图片需要经过2K次的完整的CNN计算得到最终的结果。
  • 性能瓶颈:对于所有的region proposal放缩到固定的尺寸会导致我们不期望看到的几何形变,而且由于速度瓶颈的存在,不可能采用多尺度或者是大量的数据增强去训练模型。

问题核心:

CNN网络需要固定的输入尺寸?

进一步剖析,CNN为什么需要固定的输入尺寸?

何恺明团队发现,这是由于网络中的全连接层(fc)所导致的,卷积层是不需要的,而全连接层需要指定输入张量的维度。那么有没有办法解决这一问题呢?

2.SPP-Net

SPP-Net的做法就是在CNN网络的卷积层和全连接层中加入一个新的层,叫做Spatial Pyramid Pooling(空间金字塔池化层),将卷积层的输出转化为了固定的尺度。

其实这个名字里面包含了两个要素:空间金字塔、池化:

1.空间金字塔:多尺度信息的利用

2.池化:信息的聚合,同时降低参数量,加速模型计算

具体的做法如下:

简单的描述一下:

对于卷积层的最后一层输出,尺寸为任意的H*W*C(示例图中channel为256),我们将H和W按统一规则切分,分成16份、4份、1份,每个区域(H/4*W/4*C, H/2*W/2*C, H*W*256)都进行池化操作,最后concat在一起,张量维度变成:(16+4+1)* 256 = 5376维。无论H、W为什么值,全连接的输入都是这个维度。

3.一个实现细节:如何从一个region proposal 映射到feature map的位置?

SPPNet通过 corner point将图像像素映射到feature map上,假设每一层的padding都是p/2,p为卷积核大小。对于feature map的一个像素(x',y'),其实际感受野为:(Sx‘,Sy’),其中S为之前所有层strides的乘积。然后对于region proposal的位置,我们获取左上右下两个点对应的feature map的位置,然后取特征就好了。

左上角映射为:x'=[x/S]+1

右下角映射为:x'=[x/S]-1


Fast RCNN

[1504.08083] Fast R-CNN (arxiv.org)icon-default.png?t=N7T8https://arxiv.org/abs/1504.08083

(部分内容参考:目标检测之Fast RCNN - 知乎 (zhihu.com))

1.Motivation

主要是针对RCNN中的问题:

冗余的特征提取 + 需要固定region proposal的尺度 + SVM和fc需要分开训练,无法端到端

2.推理流程

  • 拿到一张图片,使用selective search选取建议框
  • 将原始图片输入卷积神经网络之中,获取特征图(最后一次池化前的卷积计算结果)
  • 对每个建议框,从特征图中找到对应位置(按照比例寻找即可),截取出特征框(深度保持不变)
  • 将每个特征框划分为 H*W个网格(论文中是 7×7 ),在每个网格内进行池化(即每个网格内取最大值),这就是ROI池化。这样每个特征框就被转化为了 7×7×C的矩阵(其中C为深度)
  • 对每个矩阵拉长为一个向量,分别作为之后的全连接层的输入
  • 全连接层的输出有两个,计算分类得分和bounding box回归(bounding box表示预测时要画的框)。前者是sotfmax的21类分类器(假设有20个类别+背景类),输出属于每一类的概率(所有建议框的输出构成得分矩阵);后者是输出一个 20×4 的矩阵,4表示(x, y, w, h),20表示20个类,这里是对20个类分别计算了框的位置和大小
  • 对输出的得分矩阵使用非极大抑制方法选出少数框,对每一个框选择概率最大的类作为标注的类,根据网络结构的第二个输出,选择对应类下的位置和大小对图像进行标注

(1)RoI Pooling

在学习了SPP-Net之后,ROI池化就很好理解了,其实可以看成单一尺度的SPP层。

(2)全连接的思考

Q: 为什么第2个fc层要输出一个 20×4 的矩阵,而不是一个4维的向量就行呢?

A: 注意这里的两个全连接层是并行训练的,也就是第一个fc层学习到的类别信息,第二个fc层是无法共享的。因此,如果只学习4维的bounding box框,相当于需要第二个fc隐含的学习类别信息,在没有label作为gt的情况下,训练难度极大,所以学习20*4个框,对类别信息解耦,相当于告诉网络,指定类别去预测框的位置。

3.网络训练

(1)网络结构

初始化为一个预训练的VGG-16网络,改动网络结构:

  • 将最后一个最大池化层换成ROI池化层
  • 将最后一个全连接层和后面的softmax1000分类器换成两个并行层,一个是全连接层1+21分类器,另一个是全连接层2+表示每个类预测框位置的输出
  • 输入的不再只是图片,还有提取到的建议框位置信息

(2)网络训练

训练输入:图像、GT、Region proposal的坐标

为了提高训练速度,采取了小批量梯度下降的方式,每次使用2张图片的128张建议框(每张图片取64个建议框)更新参数。

每次更新参数的训练步骤如下

  • 2张图像直接经过前面的卷积层获得特征图
  • 根据ground truth标注所有建议框的类别。具体步骤为,对每一个类别的ground truth,与它的iou大于0.5的建议框标记为groud truth的类别,对于与ground truth的iou介于0.1到0.5之间的建议框,标注为背景类别
  • 每张图片随机选取64个建议框(要控制背景类的建议框占75%),提取出特征框
  • 特征框继续向下计算,进入两个并行层计算损失函数(损失函数具体计算见下面)
  • 反向传播更新参数

(3)池化层的反向传播

这里有一个之前一直忽略的操作,这里看到就一起总结了:

常见的池化层如何求反向传播?

池化分为平均池化和最大池化,这两种池化在反向传播的时候会有不同。

  1. 平均池化:在反向传播的时候将某个元素平均分成n份分配给前一层,保证池化前后的梯度之和保持不变。
  2. 最大池化:前向传播的时候记录下最大值的位置,反向传播的时候把梯度传给这个位置,其他位置为0。

ROI又如何求反向传播?

这里偷个懒,参考:Fast R-CNN论文详解-CSDN博客

(4)损失函数

简化的版本参考:Object Detection for Dummies Part 3: R-CNN Family | Lil'Log (lilianweng.github.io)

简单一点理解:

分类损失+预测框的回归损失

(1)分类损失预测21个类,1个背景类+20个物体类;而预测框只计算物体类的回归损失(为了避免大量的背景框导致的过拟合)

(2)平滑的L1损失:相比于L2损失函数,其对离群点、异常值不敏感,可控制梯度的量级使训练时不容易跑飞

(5)SVD加速

在全连接层使用SVD分解来减少计算时间,参考:Fast R-CNN论文详解-CSDN博客

4.总结

1.继承了SPP的思想,使用ROI池化,解决了RCNN的一大痛点;

2.并行训练两个fc的输出,实现了端到端的目标检测模型(个人认为相较于SPP-Net最大的提升)

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

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

相关文章

leetcode/2024.4.8/双指针简单题(1)

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。 请注意 ,必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums [0] 输出: […

Vant使用自定义图标(阿里图标)

前言 阿里图标官网 备用地址: https://www.iconfont.cn/ 添加图标 1、进入官网添加图标,如箭头所示 2、复制如图选中的文件,粘贴项目中的src/assets/icon_font/目录下 3、在main.js引入图标css //引入自定义图标 import /assets/icon_fon…

基于springboot教师人事档案管理系统,2024年最新基于web的毕业设计题目代码

管理员 教师端 目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 研究现状 2 1.3 研究意义 3 第2章 相关技术 4 2.1 系统开发平台 5 2.2 平台开发相关技术 6 第3章 系统分析 7 3.1 系统目标 8 3.2系统流程和逻辑 9 第4章系统概要设计 10 4…

Vue常见简写 “:“ , “@“ , “#“

一、 : 是什么? 1. : 是什么意思? 示例::data"tableData" 其中这个 : 其实是v-bind的简写形式,实际开发中非常常见,所以首先先来说一下这个 : 的意义和使用. 首先需要了解一下v-bind,v-bind指令指示Vue将元素的id属性与组件的tabalData属…

Linux虚拟主机中如何进行扫描检查恶意软件

看到论坛中有网友留言想要知道Linux虚拟主机上是否有扫描检测工具可以检测病毒文件或者恶意软件的。因为想要知道是否有此功能,以便他后去购买产品是可以更清晰的去咨询以及了解。正如这边是有使用Hostease提供商的Linux 虚拟主机,而cPanel中如何进行扫描…

012——LED模块驱动开发(基于I.MX6uLL)

目录 一、 硬件原理图 二、 驱动程序 三、 应用程序 四、 Makefile 五、操作 一、 硬件原理图 又是非常经典的点灯环节 ,每次学新语言第一步都是hello world,拿到新板子或者学习新的操作系统,第一步就是点灯。 LED 的驱动方式&#xff0…

2024年阿里云优惠券(代金券)在哪里领取?

阿里云作为国内领先的云计算服务提供商,不仅提供了稳定、高效的云服务,还时常推出各种优惠活动,以此来吸引用户上云。其中,阿里云优惠券就是一种常见的优惠方式。那么,在2024年,我们该如何领取阿里云优惠券…

[开源] 基于GRU的时间序列预测模型python代码

基于GRU的时间序列预测模型python代码分享给大家,记得点赞哦 #!/usr/bin/env python # coding: utf-8import time time_start time.time() import numpy as np import matplotlib.pyplot as plt import pandas as pd import math from keras.models import Sequent…

Python第四次作业

周六: 1. 找出10000以内能被5或6整除,但不能被两者同时整除的数(函数) def find_number():for number in range(0,10000):if number % 5 0 or number % 6 0:if number % 5 ! number % 6:ls.append(number)print(ls)ls [] fin…

Git Flow困境逃脱指南

本来来自极狐GitLab 资源中心,原文链接:https://resources.gitlab.cn/articles/020183ba-cfc0-4917-b901-248acdcfc92f。 GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff…

面板数据回归模型(二)房价的影响因素分析

1.数据来源 本文选择我国出一线城市房价均值、新一线城市房价均值、二线城市房价均值、货币供应量和利率。选取2002-2018年的数据,共17组数据,由于数据的自然对数变换不改变原有的协整关系,并能使其趋势线性化,消除时间序列中存在的异方差现象,所以对所有数据取其自然对数…

Java多线程+分治求和,太牛了

shigen坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen 最近的一个面试,shigen简直被吊打,简历上写了熟悉高并发…

大模型实践:如何选择适合自己场景的Prompt框架?

1. 选择适合自己场景的Prompt框架需要考虑哪些因素? 以下是一些关键的步骤和考虑点: 理解任务需求:首先,明确你的任务类型(如文本生成、问答、文本分类、机器翻译等)和具体需求。不同的任务可能需要不同类…

蓝桥杯DFS-最大数字

解题思路 我们从最高位开始要利用自己的1号操作和2号操作保证当前这个数位的数一定要尽可能最大。 然后分别考虑两种操作,首先两种操作不可能混用,因为它们是抵消的效果,所以要么对这个数全使用1操作,要么2操作。假设某个数位的…

[论文精读]Spatio-Temporal Graph Convolution for Resting-State fMRI Analysis

论文网址:Spatio-Temporal Graph Convolution for Resting-State fMRI Analysis | SpringerLink 论文代码:GitHub - sgadgil6/cnslab_fmri: CNS (Computational Neuroscience) Lab project for age/sex classification of fMRI scans 英文是纯手打的&a…

键值数据库Redis——Windows环境下载安装+命令行基本操作+Java操纵Redis

文章目录 前言一、下载与安装(Windows环境)** 检查数据库连接状态 **** 查看Redis数据库信息 ** 二、Redis五种数据结构与基本操作获取所有的key——keys *清空所有的key——flushall2.1 字符串操作2.2 散列操作2.3 列表操作2.4 集合操作2.5 位图操作 三…

小核引导RTOS---RISC-V C906

文章目录 参考日志编译框架目标fip 启动流程fip文件组成BL2程序 总结思考备注 参考 参考1. How does FSBL load the FreeRTOS on the small core and execute it?参考2. Duo now supports big and little cores?Come and play!Milk-V Duo, start!参考3. 使用uboo…

【Mybatis】Mybatis 二级缓存全详解教程

【Mybatis-Plus】Mybatis-Plus 二级缓存全详解 一,Mybatis-Plus介绍 MyBatis-Plus(简称MP)是一个基于 MyBatis 的增强工具,它简化了 MyBatis 的开发,并且提供了许多便利的功能,帮助开发者更高效地进行持久…

数字电路基础(Digital Circuit Basis )

目录 一、什么是数字电路? (Digital Circuit ) 1.概念 2.分类 3.优点 4.数电与模电的区别 二、数制 (十进制:Decimal) 1.概述 2.进位制 3.基数 4.位权 5.二进制的算术运算 三、编码 (二进制:Binary ) 1.什…

Windows下Oracle表死锁处理过程

Windows下Oracle表死锁处理过程 1.问题现象 Oracle 12c数据库安装在Windows下,在一个大数据量表批量更新操作时,异常中断。表锁死,查询访问长时间无反应。 2.处理过程 (1)锁表对象 select object_name as 对象名称…