括号里都是弹幕大佬的高赞发言
1 前言
Two Stage检测过程分两步走
前景:需要检测的目标
背景:不感兴趣的
生成候选框:将感兴趣目标框选出来,但是没有进行分类
具体使用哪一种,根据项目需求
自定义数据集
自己写一个dataset,而不是使用pytorch提供的一些方法读取图像文件
R-CNN
即在输入神经网络之前对图像进行resize处理
输入网络后得到对应的特征向量
输出一个展平向量(没有经过全连接层)。每一行对应一个候选区域的特征向量
SVM二分类器
1:通过SS算法,生成候选框
2:卷积神经网络,候选框 --> 一系列特征向量
3:通过SVM进行目标分类
4:通过回归器调整候选框坐标
(通过SS得到候选框,但是有很多重叠
计算候选框对应的特征向量时,每一个候选框都会对重叠部分进行卷积操作,所以有很多冗余 —> 在faster RCNN中优化的部分)
Fast R-CNN
从第二步开始不同:
RCNN将每个候选区域分别输入网络,得到特征向量;
而Fast R-CNN是把整幅图像输入网络得到特征图(特征图就是feature map 卷积提取出来的特征),
然后通过SS算法(ss=selective search,第一步提取候选框的算法)在原图生成一个候选区域,映射到特征图上,得到特征矩阵。
(只要卷一次,卷了再切)
第三步:
每个特征矩阵
预测结果:目标所属的类别、边界框的回归参数。
而R-CNN中,专门训练SVM分类器,对候选区进行分类。又专门训练回归器,对候选区域的边界框进行调整。
而在Fast R_CNN中,讲这些结合在一个网络中。不需要单独训练分类器以及边界框回归器。
左:RCNN:
对每一个候选区域进行缩放,输入到网络之中,生成对应的特征。
会生成大量冗余,一些重叠的区域其实只要计算一次就行,而RCNN在不反复计算。
Fast R-CNN 如何** 生成候选框特征:**
将整张图片输入网络中,生成特征图。
通过候选区域原图与特征图的映射关系,直接在特征图中获取特征矩阵,这样可避免候选区域特征的重复计算。
Fast R-CNN 数据采样:
在训练过程当中,并不是使用SS算法提供的所有的候选区域,随机采样,而且对采样区分正样本、负样本。
正样本:候选框中确实存在所检测的目标的样本。
负样本:……没有要检测的目标。
若全部都是正样本,则网络有很大概率以为候选区域中就是要检测的目标。(类似于overfit 你都不知道错误的是什么样的,自然认为所有的都是对的)
(这里面阈值下界设置为0.1很有意思,其目的是为了获取和真实bounding box交并比至少为0.1的ROI作为负样本,即和真实目标有一定重叠,可以让模型学习较难的负样本。)
将用于训练样本的候选框通过ROI pooling层缩放到统一尺寸
ROI pooling层:(对其中一个channel举例:)
假设上图左边的图是一个候选区域在特征图上对应的特征矩阵。(真正的特征矩阵展示的是看不懂的抽象信息)
将这个特征矩阵划分为7*7=49份。划分之后对每个区域执行最大池化下采样
(这一个区域有很多像素,不要先入为主,以为一个一个区域是一个像素块)
Fast R-CNN网络框架
将整张图片输入网络中,生成特征图。
通过候选区域原图与特征图的映射关系,直接在特征图中获取特征矩阵。
将特征矩阵通过ROI Pooling层统一缩放成指定的尺寸。
进行展平处理。
通过两个全连接层,得到ROI Feature vector。
在此基础上并联两个全连接层:其中一个用于目标概率的预测,另一个用于边界框回归参数的预测。
- 目标概率预测–分类器:
图上这个概率经过softmax处理,所以是满足概率分布的(和为1)。
- 边界框回归器:
所以这里的全连接层节点个数应该为(N+1)*4
Faster RCNN如何利用预测参数得到最后的预测边界框
P:候选框坐标参数。
G:最终预测框坐标参数
d:通过全连接层输出的边界框回归参数
通过公式看出,dx、dy是调整候选边界框中心坐标的回归参数。
橙色框 --> 红色框
绿色框:ground-truth框,(用来计算损失?)
橙色框:通过SS算法得到的候选边界框
(真实标签的位置是自己标定的,但是回归参数是计算出来的)
Faster RCNN损失计算
需要预测候选框的类别,概率,边界框的回归参数,所以涉及两个损失:分类损失、边界框回归损失
k:k个目标种类
p0:候选区域为背景的概率
- 计算分类损失:
pu:分类器预测当前候选区域为类别u的概率 - 计算边界框回归损失:
(两个公式的数学本质是似然函数的负对数,上面的公式适用于只能属于一类,各个分类构成一个完备事件组;下面的公式适用于可以属于多类,各个分类是相互独立的随机事件。模型训练的本质是寻找极大似然估计)
(没听懂,以后再说吧……)
(Lloc(tu,v) 就是四个坐标与真实值差值的加和)
x:(tui-vi)这个的差值
v的计算↓
vx:(Gx-Px)/Pw
vy:(Gy-Py)/Ph
vw:(Gw-Pw),再对两边取ln
vh:(Gh-Ph),再对两边取ln
(
Vw=log(Gw/Pw)
)
右下角链接点进去这样↓:
(这个损失最大的好处就是结合了l1和l2的优点,对x求导,导数是在-1到1变化的,当x>1,导数都是1)
λ:平衡分类损失与边界框回归损失
艾弗森括号:计算公式:当u>=1时,这一项等于1,否则等于0
u:目标真实标签
u>=1:候选区域确实属于要检测的某一类别(正样本),此时才有边界框回归损失;否则为背景,对应负样本
总损失L()等于平衡分类损失+边界框回归损失
对总损失进行反向传播,即可训练整个Fast R-CNN网络
Fast R-CNN步骤回顾