Advanced CNN Architectures(R-CNN系列)
分类与定位(Classification and Localization)
一个简单的定位示例:
除了将该图像标记为猫外,还需要定位图中的猫,典型方法是在该猫周围画一个边界框,这个方框可以看做定义该方框的一系列坐标,(x,y) 可以是方框的中心w 和 h 分别表示方框的宽和高。 要计算这些值 我们可以使用典型分类 CNN,用到的很多相同结构。
一种定位方式是首先将给定图像传入一系列卷积层和池化层 并为该图像创建一个特征向量,保留相同的全连接层进行分类,然后在特征向量之后添加另一个全连接层,目的是预测边界框的位置和大小,称其为边界框坐标。 在这个 CNN 中:
- 有一个输出路径 作用是为图像中的对象生成类别
- 另一个输出路径的作用是生成该对象的边界框坐标 在这个示例中,假设输入图像不仅具有相关的真实标签而且具有真实的边界框。这样我们可以通过对比类别和边界框的预测值和真实值训练网络。 我们已经知道如何使用交叉熵损失等衡量分类模型的性能,但交叉熵适合概率值在 0 和 1 之间的模型。但是对于边界框 我们需要其他损失函数,这种函数能够衡量预测边界框和真实边界框之间的误差。
Bounding Boxes and Regression(边界框与回归)
在训练 CNN 对一组图像进行分类时,通过比较输出的预测类别和真实类别标签并查看二者是否匹配来训练 CNN。通常使用交叉熵衡量这些类别之间的误差。因为当具有不确定性的预测类别与真实类别标签越来越接近时,交叉熵损失会逐渐降低。但是当我们比较一组点时例如脸部位置/点或定义图像特定区域的点,我们需要一种衡量这些坐标值之间相似性的损失函数,这不是分类问题而是回归问题。分类是预测类别标签,回归是预测数量。 对于回归问题,例如预测(x,y)坐标,我们需要一个损失函数来比较这些数量并衡量它们之间的近似程度。
- 对于分类问题: 知道准确率是什么,如果预测类别与真实类别匹配 则模型是准确的
- 但对于回归问题
无法说一个点是否准确,只能通过衡量点之间的均方误差评估数量。我们经常讨论的是模型的误差是否很小 而不是模型是否准确
可以使用几种不同的损失函数:
- 最简单的是 L1 损失 它衡量的是预测输出(称为 p)和目标 (t)之间元素级别的差异 假设我们仅预测一个点 p 坐标 (x,y) 表示图像中对象的中心。在此示例中 损失函数将查看 CNN 生成的预测点 p和对象的真实中心目标位置 t,L1 损失将返回一个表示预测点和真实点之间距离的值.
- MSE 损失 它衡量的是预测 p 中的元素和目标 t 中的元素之间的均方误差
前两种方法都适合衡量点之间的距离,但是所有损失函数都具有优势和弊端。L1 损失可能会忽略小的误差值而 MSE 损失对大的误差值最敏感,导致可能会放大很大但是不常见的误差-离群值。
- Smooth L1 对于预测值和真实值之间很小的差异,它会使用均方误差函数,而对于很大的误差 则使用 L1 损失,Smooth L1 损失尝试利用 MSE 和 L1 损失的优势。
为了预测边界框,我们训练模型将图像作为输入和输出坐标值:(x,y,w,h)。这种模型可以扩展到任何具有坐标值作为输出的问题!一个这样的例子是 人体姿势估计 。
可以通过跟踪身体关节的14个点来估计人体的姿势
加权损失函数(Weighted Loss Functions)
如何训练具有两个不同输出(一个类和一个边界框)的网络以及这些输出的不同损失?
在这种情况下,我们使用分类交叉熵来计算我们的预测类和真实类的损失,并使用回归损失(类似Smooth L1损失)来比较预测和真实边界框。
但是,我们必须使用一次损失训练整个网络,那么我们如何将它们结合起来呢?
有几种方法可以训练多种损失函数,实际上,我们经常使用加权分类和回归损失(例如0.5*cross_entropy_loss + 0.5*L1_loss
),结果是一个单一的值,我们误差,可以使用它来进行反向传播。这引入了一个超参数:损失权重。我们希望对每次损失进行加权,以便有效地平衡和组合这些损失,并且在研究中经常引入另一个正则项来帮助确定最佳组合这些损失权重值。
候选区域(Region Proposals)
考虑上面的图像,认为如何选择最佳建议区域? 我们要分析的区域是那些包含完整对象的区域。我们希望摆脱包含图像背景或仅包含对象的一部分的区域。因此,提出了两种常见方法:
- 使用特征提取识别相似区域或使用聚类算法比如k-means
- 在我们的模型中添加另一个图层,对这些区域执行二进制分类并标记它们: object or not-object。这使我们能够丢弃任何非对象区域
R-CNN
要定位并分类图像中的多个对象,希望能够识别有限数量的裁剪区域供 CNN 查看.在理想情况下,我们将为图像中的三个不同对象生成三个完美裁剪的区域。为了实现这一目标并生成数量合理的裁剪区域,诞生了候选区域的概念。候选区域使我们能够快速查看图像,并仅为认为可能存在对象的部分生成区域。 R-CNN架构: 使用候选区域算法生成一组有限的裁剪区域,通常称之为感兴趣区域(Regions of interstets,ROIs),然后将这些区域挨个地传入分类 CNN 中,看网络对每个裁剪区域预测出什么样的分类标签. R-CNN 为每个感兴趣区域生成一个类别,因此可以识别图像中有狗的区域和有猫的区域.
在此示例中我们还包含了一个类别叫做背景,用于捕获任何有噪区域。 因为这些区域通常具有不同的大小 因此首先需要被转换成标准大小 ,CNN 能够接受为输入图像。 R-CNN方法的主要缺点是依然很耗时,因为需要将每个裁剪区传入整个CNN中,然后才能生成一个类别标签。 与其他模型不同,R-CNN没有明确地产生表示对象是否在区域中的置信度得分,而是巧妙地产生一组类别得分,其中一个类是“背景”。 这最终起到了类似的作用,例如,如果一个区域的类得分是Pbackground = 0.10,它可能包含一个对象,但如果它的Pbackground = 0.90,那么该区域可能不包含一个对象。
Fast R-CNN
R-CNN的下一个发展架构是Fast R-CNN。 这种架构使整个图像仅传入分类CNN一次,而不是通过分类CNN单独处理每个感兴趣区域(ROIs). 图像经过一系列卷积和池化层,在这些层级之后是一个特征图堆栈。我们依然需要识别感兴趣区域,但是我们将这些候选区域投射到更小的特征图层级上,而不是裁剪原始区域,特征图中的每个区域对应于原始图像中更大的区域。从特征途中获取候选区域,并依次将他们送到一个全连接层,为每个不同区域生成一个类别。 在这种模式下 我们可以仅执行最耗时的步骤一次,即通过一系列卷积层处理图像,然后选择性地使用该特征图获得期望的输出。
同样,我们需要处理这些投射中不同大小的区域,因为网络中的更深的层级要求输入时固定大小。因此,需要执行感兴趣区域(ROIs)池化,将这些区域调整为固定大小,然后再送到全连接层中。
这个网络比 R-CNN 要快,但是依旧需要生成候选区域所以速度依然很慢,并且它依然会查看根本不包含对象的区域
ROL POOLing
为了将感兴趣的区域转化为一致的大小以供进一步分析,对此使用ROL池化层。ROL池化层是网络中的一个附加层,它接收任意大小的矩形区域,对该区域执行maxpooling操作,使输出为固定形状。下面是一个将一些像素值分割成若干块的区域的示例,将对该区域应用池化。
[[0.85,0.34,0.76],
[0.32,0.74,0.21]]
在池化之后单个最大值:0.85。把这些应用到这些图片之后,可以看到任何一个矩形区域是如何被压缩成一个更小的正方形的。 可以在下面看到从输入图像到区域到缩小,最大化池化区域的完整过程:
FAST R-CNN是R-CNN的10倍,因为它只为给定的图像创建卷积层一次。Fast R-CNN也需要更短的时间来测试一个新图。测试时间主要由创建候选区域时间决定。
Faster R-CNN
Faster R-CNN 学会生成自己的候选区域
- 它接受一个输入图像,将图像传入 CNN 直到特定的卷积层 就像 Fast R-CNN 一样。
- 它将生成的特征图,作为输入传入单独的区域建议网络
- 使用在网络中生成的特征预测自己的区域,边缘或其他特征。如果特征图中的某个区域检测到了大量边缘或其他特征则被识别为感兴趣区域
- 然后 这个网络部分会快速进行二元分类,对于每个感兴趣区域 它都会检测该区域是否包含对象。如果包含 则该区域将继续经过分类步骤,如果不包含,则丢弃该建议。
- 获得最终候选区域后,网络的剩余部分和 Fast R-CNN 看起来一样。即接受特征图中的裁剪区域并学习分类这些区域。
通过消除非对象区域分析步骤,Faster R-CNN是所有区域CNN中最快速的模型。
候选区域网络(Region Proposal Network)
你可能想知道在Faster R-CNN架构中,ROIs 是怎么在候选区域网络生成。 候选区域网络以类似于YOLO目标检测的方式在Faster R-CNN中工作。RPN查看最后一个卷积层的输出,即生成的特征图,并采用滑动窗口方法来检测可能的对象。它在特征映射上滑动一个小的(典型的3x3)窗口,然后对于每个窗口RPN:
- 用一组定义的锚盒(anchor boxes),它们是定义的纵横比的方框已生成多个可能的ROI,每个都被认为是候选区域。
- 对于每个候选区域,该网络产生一个概率Pc,该概率将把候选区域分为物体(不是物体),以及该该物体的一组边界框的坐标。
- 其中作为物体的概率太低的候选区域,比如Pc < 0.5 将被丢弃。
训练候选区域网络: 在这种情况下,由于没有基本真实区域,该如何训练候选区域网络? 对于任何区域,都可以检查它是否与任何真实对象重叠。也就是说,对于一个区域,我们将该区域分为对象与非对象。 区域选择 速度瓶颈: 包括Faster R-CNN在内的这些网络结构,是通过减少生成和决定候选区域所需的时间来提高对象检测模型速度。 Faster R-CNN实现
- 设计原则
- Entity Framework——配置文件设置
- 如何安装SAS并配置连接Hive/Impala
- Entity Framework——记录执行的命令信息
- 【BlackHat 2017 议题剖析】连接的力量:GitHub 企业版漏洞攻击链构造之旅
- CVE-2015-1641 Word 利用样本分析
- Cloudera Navigator介绍与安装
- [LeetCode]String主题系列{第5,6题}
- CDH内存调拨过度警告分析
- Ztorg:从 root 到 SMS
- [LeetCode]Math主题系列{第7,9,13,273题}
- 被忽视的攻击面:Python package 钓鱼
- [LeetCode]LinkedList主题系列{第2题}
- [LeetCode]HashTable主题系列{第3题}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- JVM调优,程序员必须掌握的知识
- 5分钟Flink - 侧输出流(SideOutput)
- 数据库技术:MySQL 基础和 SQL 入门,单表、约束和事务
- ConcurrentHashMap的size方法是线程安全的吗?
- 数据科学家极力推荐核心计算工具-Numpy的前世今生(上)
- 数据库技术:MySQL 多表,外键约束,数据库设计,索引,视图,存储过程触发器,数据控制,数据备份与恢复
- WordPress 站点地址被恶意篡改的防护方案讨论
- 握草,你竟然在代码里下毒!
- MySQL 练习题和答案,以及运行结果截图
- 给你一个优秀的Django工程模板
- 纯css实现选项卡功能
- linux每日一练文件专题之常用文件命令(附昨日答案)
- 搞懂JavaScript全局变量与局部变量,看这篇文章就够了
- Day3-linux用户管理
- rbind的坑?