前言
本来想着学习一下目标检测领域如何充分利用样本信息的(目标检测不仅仅需要图片的类别,还需要用到某个物理的具体位置。换言之,就是不仅仅要知道物体是什么?还需要知道物体在哪里?),结果一个faster - rcnn就把我难倒了。因为我主要是不明白这几个问题:
- 模型是如何利用位置信息的?
- 模型想要学习出来一个什么呢?学习后的模型相比学习前的模型有什么好处呢?(毕竟anchor是遍历生成的,无论是在训练还是在推理阶段,anchor都是一样的)
- 这个算法是进行了一种智能的模板匹配吗?是否有某个步骤
- rpn算法在训练阶段是不变的,能够对于任意位置的目标进行检测吗?
2 网络结构
2.1 rpn 网络
目标检测网络按照直觉上应该分为两个部分:找到目标,识别目标。由此就有了rpn网络。rpn网络的目的就是找到目标(找到感兴趣的区域/找到目标区域)。那么rpn网络究竟是如运行的呢?2.1 为什么训练之前其无法找到目标区域呢?2.2 它是如何知道应该找几个区域的呢(有几个目标)?
- 生成锚点(人话:生成许多个框,以后就看那几个框,离得近了)
首先,rpn 网络线生成许多框。别管太多,反正就是平均布满全部图 - 生成rpn 的重要参数 rpn_locs(人话:对框进行微调)
因为这些框不一定能够恰好框下物体(可能只框了一半),所以我们对于每个框生成一个微调参数rpn_locs,这个参数的维度是:锚点数*4(或者说“框的数量”*4)。这个参数我们在训练阶段一共会用到两次:第一次是用它来对我们的框(锚点)进行微调,使得框逼近目标,第二次是在损失函数中,毕竟我们需要更新这个参数。(如何更新,还需要分析的。下面记得写)
不过这里似乎有一些问题,在测试阶段,如果我们生成2w个备选框(框对于所有输入都是不变的),然后使用 rpn_locs 参数对于框进行一对一的微调,就得到了微调后的 ’框2 ‘,但是这2w个框2也是固定的,但是物体的位置是可微的,有无限个。所以可能出现你框不住的情况
那么rpn网络具体如何操作呢?
a. 输出参数 rpn_locs (人话:得到每个框的微调参数,这个参数我们总共会用两次)
- 对rpn网络的输入特征图进行某种卷积操作,别管是什么卷积,反正保证输出rpn_locs是(w,h,9,4)维度的特征图就好。这里的(w,h,9,4)就是前面说的
rpn_locs(锚点数量*4)。
b. 输出参数 rpn_scores (就是每个框的输出),这个参数的我们也会用到两次:输出 rpn_fg_scores; 计算损失函数
- 这个 rpn_scores的意义是:每个框的正负样本概率(或者说:每张特征图上所有锚点的输出值)。由于我此时的特征图是62 *19的图,所以rpn_scores的维度为(1,18,62,19),9是锚点数,乘二表示我们需要正负概率(所以代码上还需要一个对于第2个维度的softmax)。
- 然后依据它得到每个框是正样本的概率:rpn_fg_scores,它的维数就是锚点(也就是框)的数量。
- 那么这个 rpn_scores 是怎么计算的呢?其实模型中就是把神经网络的输出设置成了这个维度(1,18,62,19)的张量,然后说,这个张量就是每个框的正负样本概率,也没说为什么可以这样做。
c. ProposalCreator 模块(依据微调参数 rpn_locs 、是否包含物体概率:rpn_fg_scores、框的位置(定值),锁定目标框:roi)
- 第一步:得到感兴趣区域。依据框的位置和微调参数 rpn_locs,很容易确定感兴趣区域roi_1(人话:锁定目标)。
- 第二步:防止roi_1发生越界、过小等情况。(此时会删去一些roi)
- 第三步:依据是否包含物体概率:rpn_fg_scores参数,选前几名roi(大概前200名)
至此,rpn 模型落下了帷幕,输出:rpn_locs (用于loss),rpn_score(用于loss),roi(用于下一个对比模型),
2.2 proposal_target_creator 网络(人话:利用数据样本)
做了这么久我们还没有使用任何数据标签!这里开始用了。为什么不一开始就使用label数据呢?因为label数据(已知目标框,ground truth)“小”,data(img)数据“大”。那就免不了将小数据放在大数据上比较,这就是传统模板匹配的方法。当我们将原图–> 锚点框–> 微调、筛选、修正后、大概率有物体的框,使得图片变小。
proposal_target_creator 网络,一句话描述:Assign ground truth bounding boxes to given RoIs
输入:
- rpn 送来的 roi(感兴趣区域)
- 标签
- 物体标签框
输出:
- 结果1:sample_roi (从 输入的 roi 中提取几个与label重合高的区域)
- 结果2:gt_roi_loc (计算sample_roi 与目标框之间的距离/微调参数,用来计算loss。这里的gt_roi_loc 将和上面的roi_loc进行损失函数的计算)
a. 计算对每个roi,与box标签做比较,得出每个 roi 的 iou 指标的维度:(roi数量*标签数量)。这意味着每个框与目标框的相似度。
b. 对于每个框分配一个 Groudtruth。
c. 按照roi 的 iou 指标的大小,对 2000个roi进行删选选出大概200个正样本(意味着这些框与标签框的重合度较大),200个负样本(框的都是背景)作为结果1。