睿智的目标检测25——Keras搭建M2Det目标检测平台

什么是M2det目标检测算法
常见的特征提取方法如图所示有SSD形,FPN形,STDN形:

SSD型:使用了主干网络的最后两层,再加上4个使用stride=2卷积的下采样层构成;
FPN型:也称为U型网络,经过上采样操作,然后对应融合相同的scale;
STDN型:基于DenseNet的最后一个dense block,通过池化和scale-transfer操作来构建;

这三者有一定的缺点:
一是均基于分类网络作为主干提取,对目标检测任务而言特征表示可能不够;二是每个feature map仅由主干网络的single level给出,不够全面

M2det论文新提出MLFPN型,整体思想是Multi-level&Multi-scale。是一种更加有效的适合于检测的特征金字塔结构。

M2det实现思路
一、预测部分
1、主干网络介绍

M2det采用可以采用VGG和ResNet101作为主干特征提取网络,上图的backbone network指的就是VGG和Resnet101,本文以VGG为例介绍。

M2DET采用的主干网络是VGG网络,关于VGG的介绍大家可以看我的另外一篇博客https://blog.csdn.net/weixin_44791964/article/details/102779878。

在m2det中,我们去掉了全部的全连接层,只保留了卷积层和最大池化层,即Conv1到Conv5。

1、一张原始图片被resize到(320,320,3)。
2、conv1两次[3,3]卷积网络,输出的特征层为64,输出为(320,320,64),再2X2最大池化,输出net为(160,160,64)。
3、conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(160,160,128),再2X2最大池化,输出net为(80,80,128)。
4、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(80,80,256),再2X2最大池化,输出net为(40,40,256)。
5、conv4三次[3,3]卷积网络,输出的特征层为512,输出net为(40,40,512),再2X2最大池化,此时不进行池化,输出net为(40,40,512)。conv4-3的结果会进入FFM1进行特征的融合。
6、conv5三次[3,3]卷积网络,输出的特征层为1024,输出net为(40,40,1024),再2X2最大池化,输出net为(20,20,1024)。池化后的结果会进入FFM1进行特征的融合。


2、FFM1特征初步融合

FFM1具体的结构如下:
FFM1会对VGG提取到的特征进行初步融合。

然后将两个卷积后的结果进行堆叠,变成一个(40,40,768)的初步融合特征层

3、细化U型模块TUM

Tum的结构具体如下:

当我们给Tum输入一个(40,40,256)的有效特征层之后,Tum会对输入进来的特征层进行U型的特征提取,这里的结构比较类似特征金字塔的结构,先对特征层进行不断的特征压缩,然后再不断的上采样进行特征融合,利用Tum我们可以获得6个有效特征层,大小分别是(40,40,128)、
4、FFM2特征加强融合
通过TUM,我们可以获得六个有效特征层,为了进一步加强网络的特征提取能力,M2det将6个有效特征层中的(40,40,128)特征层取出,和FFM1提取出来的初步融合特征层进行加强融合,再次输出一个(40,40,256)的加强融合的特征层。

此时FFM2输出的加强融合特征层可以再一次传入到TUM中进行U形特征提取。

如上图所示,我们可以进一步利用多个TUM模块进行特征提取,利用多个TUM模块我们可以获得多次有效特征层。
5、注意力机制模块SFAM
6、从特征获取预测结果
通过第五步,我们获取了6个融合了注意力机制的有效特征层。

对获取到的每一个有效特征层,我们分别对其进行一次num_anchors x 4的卷积、一次num_anchors x num_classes的卷积、并需要计算每一个有效特征层对应的先验框。而num_anchors指的是该特征层所拥有的先验框数量。

其中:
num_anchors x 4的卷积 用于预测 该特征层上 每一个网格点上 每一个先验框的变化情况。(为什么说是变化情况呢,这是因为M2DET的预测结果需要结合先验框获得预测框,预测结果就是先验框的变化情况。)

num_anchors x num_classes的卷积 用于预测 该特征层上 每一个网格点上 每一个预测框对应的种类。

每一个有效特征层对应的先验框对应着该特征层上 每一个网格点上 预先设定好的六个框。

所有的特征层对应的预测结果的shape如下:


7、预测结果的解码

每一个有效特征层对应的先验框对应着该特征层上 每一个网格点上 预先设定好的六个框。

我们利用 num_anchors x 4的卷积 与 每一个有效特征层对应的先验框 获得框的真实位置。

每一个有效特征层对应的先验框就是,如图所示的作用:
每一个有效特征层将整个图片分成与其长宽对应的网格,如conv4-3和fl7组合成的特征层就是将整个图像分成38x38个网格;然后从每个网格中心建立多个先验框,如conv4-3和fl7组合成的有效特征层就是建立了6个先验框;对于conv4-3和fl7组合成的特征层来讲,整个图片被分成38x38个网格,每个网格中心对应6个先验框,一共包含了,38x38x6个,8664个先验框。

先验框虽然可以代表一定的框的位置信息与框的大小信息,但是其是有限的,无法表示任意情况,因此还需要调整,RFBnet利用num_anchors x 4的卷积的结果对先验框进行调整。

RFBnet解码过程就是将每个网格的中心点加上它对应的x_offset和y_offset,加完后的结果就是预测框的中心,然后再利用 先验框和h、w结合 计算出预测框的长和宽。这样就能得到整个预测框的位置了。

当然得到最终的预测结构后还要进行得分排序与非极大抑制筛选这一部分基本上是所有目标检测通用的部分。
1、取出每一类得分大于self.obj_threshold的框和得分。
2、利用框的位置和得分进行非极大抑制。

8、在原图上进行绘制
通过第三步,我们可以获得预测框在原图上的位置,而且这些预测框都是经过筛选的。这些筛选后的框可以直接绘制在图片上,就可以获得结果了。

二、训练部分
1、真实框的处理
从预测部分我们知道,每个特征层的预测结果,num_anchors x 4的卷积 用于预测 该特征层上 每一个网格点上 每一个先验框的变化情况。

也就是说,我们直接利用M2DET网络预测到的结果,并不是预测框在图片上的真实位置,需要解码才能得到真实位置。

而在训练的时候,我们需要计算loss函数,这个loss函数是相对于M2DET网络的预测结果的。我们需要把图片输入到当前的M2DET网络中,得到预测结果;同时还需要把真实框的信息,进行编码,这个编码是把真实框的位置信息格式转化为M2DET预测结果的格式信息。

也就是,我们需要找到 每一张用于训练的图片的每一个真实框对应的先验框,并求出如果想要得到这样一个真实框,我们的预测结果应该是怎么样的。

从预测结果获得真实框的过程被称作解码,而从真实框获得预测结果的过程就是编码的过程。

因此我们只需要将解码过程逆过来就是编码过程了。
利用上述代码我们可以获得,真实框对应的所有的iou较大先验框,并计算了真实框对应的所有iou较大的先验框应该有的预测结果。

在训练的时候我们只需要选择iou最大的先验框就行了,这个iou最大的先验框就是我们用来预测这个真实框所用的先验框。

因此我们还要经过一次筛选,将上述代码获得的真实框对应的所有的iou较大先验框的预测结果中,iou最大的那个筛选出来。

通过assign_boxes我们就获得了,输入进来的这张图片,应该有的预测结果是什么样子的。
2、利用处理完的真实框与对应图片的预测结果计算loss
loss的计算分为三个部分:
1、获取所有正标签的框的预测结果的回归loss。
2、获取所有正标签的种类的预测结果的交叉熵loss。
3、获取一定负标签的种类的预测结果的交叉熵loss。

由于在M2DET的训练过程中,正负样本极其不平衡,即 存在对应真实框的先验框可能只有十来个,但是不存在对应真实框的负样本却有几千个,这就会导致负样本的loss值极大,因此我们可以考虑减少负样本的选取,对于M2DET的训练来讲,常见的情况是取三倍正样本数量的负样本用于训练。这个三倍呢,也可以修改,调整成自己喜欢的数字。
————————————————
版权声明:本文为CSDN博主「Bubbliiiing」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44791964/article/details/105197722

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值