SSD目标检测原理学习笔记及其在NWPU-10数据集上的应用

1.参考

我是从这份代码学习SSD原理的,尤其是readme的部分,仔细看完,对理解SSD的原理和细节非常有帮助。链接在这。里面图片比较多,如果github打开比较慢,建议把项目克隆到“码云”上看,这样方便多次查阅,图片加载更快,里面的图片非常有助于理解。

2. SSD300模型结构

组成:包括基本卷积、辅助卷积、预测卷积
基本卷积的作用:提取图像特征,得到宽度(高度)较大,通道数较多的特征图,卷积过程中宽度逐渐减小,通道数逐渐增加。
辅助卷积:进一步提取更深层次的特征,得到宽度更小的特征图,卷积过程中宽度。
预测卷积:根据基本卷积和预测卷积的输出,预测物体的位置和类别信息。
思想:SSD是一阶段的目标检测模型。它对不同尺寸的特征图的信息进行预测,在不同尺寸不同维度进行目标检测,并将不同尺寸的预测信息进行融合。

2.1 基本卷积——选择预训练好的改进VGG16

基本卷积(忽略其他文字,看图中长方体,长方体表示特征图,下面的数字表示维度“h,w,c",“一”表示第一组卷积运算)

VGG16的基本构成:原VGG16的输入是一张图片,经过5组(每组2-3个)卷积相关运算后,再经过一组(三层)全连接运算,输出对图像分类的结果。

基本卷积的构成:基本卷积共有七组卷积,生成七组特征图(图中长方体)其中前5组用预训练的VGG16,后两组将VGG16对应的后续两层全连接层重塑为卷积层。在基本卷积过程中,顺便取第四组和第七组卷积的输出“conv4_3"和"conv7”

为什么需要用改进的VGG16:由于目标检测不是直接对整个图像进行分类,而是要在特征图中进一步获取信息,因此,要把VGG16的全连接层变成普通的卷积。

怎么改进VGG16

  1. 只保留原来前5组卷积相关运算
  2. 将原第1、2层全连接层参数转化为普通卷积的参数
  3. 舍弃原第3层全连接层

为什么全连接层和普通卷积可以转换:全连接层本质上是一个参数矩阵,它与上一层神经元运算结果相乘得到下一层神经元的输入。普通卷积用卷积核与上一个特征图滑动相乘得到下一个特征图,参数保存在卷积核中。全连接层的参数本质上与卷积核的作用相同。两者的辩证统一关系:卷积神经网络的特征图按顺序铺开就可得到全连接形式的神经网络,全连接形式的神经网络按顺序排列就可得到卷积神经网络形式的特征图。因此全连接层参数可以转化为等价(但参数规模不相同)的卷积核。

如何将全连接层参数转化为卷积神经网络参数:重塑形状再作通道和高度宽度的取样(因为卷积神经网络参数规模更小)它们等价而不相同。

对第四组卷积顺便取样时要进行L2 norm。原因:第四组卷积的输出相比后面要取样的特征图,是低维度、大尺寸的特征图,因此要进行L2 norm。

L2 norm:即L2 归一化,即用L2范数来归一化,L2范数的定义为
在这里插入图片描述
L2归一化的过程

  1. 对特征图每一个元素求平方,再在每个位置将所有通道的元素(已求平方)相加,最后开方,得到一个通道数为1的矩阵
  2. 让第四组卷积输出的特征图除以这个矩阵得到归一化的特征图
  3. 归一化特征图再乘以一个常数得到用于预测的特征图,代码中说这个常数初始化为20,但在训练时是可学习的参数

2.2 辅助卷积——产生更小的特征图

辅助卷积(辅助卷积是第 八、九、十、十一层,具体标号可能稍有错误,以代码为准,但意思是这样,逐步减小特征图尺寸并取样)

辅助卷积以基本卷积的输出为输入,得到不同尺寸的更小的特征图,并分别取样(这里的取样不是采样的意思,说取样只是形象地表明把他取出来后面要用),用于后续预测卷积。要取conv8_2_feat、conv9_2_feat、conv10_2_feat、conv11_2_feat这几个特征图。

2.3 预测卷积——预测目标的位置和类型

预测卷积(看连线部分)

将基本卷积和辅助卷积所取的几个特征图,每个特征图分别进行两次卷积,分别生成位置信息和类别信息。

位置卷积:如,对取出的conv4_3特征图,将它通过位置卷积(其实就是一个普通卷积),生成维度为(38×38×4×4)的特征图,这个新的特征图蕴含位置信息(第一个×4代表每个位置有4个先验框,第二个×4代表预先定义的先验框与预测出的框之间4个方面的信息: x方向偏移量 ,y方向偏移量,宽度差距,高度差距)。而每个像素点处都有好几个先验框,每张取出的特征图每个像素点处先验框的个数相同。每个先验框有4个信息,4个先验框就有16个信息,因此位置卷积生成16通道的特征图。

类别卷积:如,对取出的conv4_3特征图,将它通过类别卷积(其实就是一个普通卷积),生成维度为(38×38×4×类别数)的特征图。这个新的特征图蕴含类别信息(×4表示每个位置有4个先验框,如果是NWPU-10数据集,则类别数是10,就×10)。因此类别卷积生成(4×类别数)通道的特征图。

什么是先验框:是预先计算好的,固定的方框(长方形框),每个特征图的每个像素点处都有预置的方框。
每个卷积层的先验框在每个像素点处有多个不同尺寸的方框,具体位置的方框数量及尺寸如作者在表中所述。其中,Prior scale指的是等效正方形框宽度所占特征图宽度的比。等效正方形框是什么——每个长方形框面积相等,他们的面积就是等效正方形框的面积。大特征图能有更小的方框。其中,Aspect Ratios指的是在面积相同的条件下,每个方框的宽高比。其中,an extra prior指的是一个额外的方框,它是正方形的,宽度为已经定义好的所有方框宽度的平均值。对于每一个方框,有以下宽度(w)、高度(h)、宽高比(a)、尺度(s)关系:
在这里插入图片描述
在这里插入图片描述
方框的第一种表示方法:最值坐标,从数据集中读取的坐标为(xmin,ymin,xmax,ymax),是用x和y坐标的最小最大值表示的。
方框的第二种表示方法:中心坐标,(cx,cy,w,h)分别表示x、y坐标的中点、宽度、高度
方框的第三种表示方法:编码坐标,将中心形式的先验框坐标与中心形式真实方框的坐标联系起来,因此这种坐标体现了先验框和真实方框在四个方面的差距(gcx,gcy,gw,wh),其中,
在这里插入图片描述
为什么要这么编码:因为所研究的特征图不同,先验框与真实框之间的差距需要用归一化的距离来衡量,其次,设置先验框的目的就是要衡量先验框和真实框的差距,先验框是预先在每个像素点的位置设置的,和真实框之间本没有关系,正是这种编码方式赋予了先验框与真实框关系。每个先验框和每个真实框之间都有关系,那么哪些先验框和哪些真实框关系较为紧密,这些联系紧密的先验框和真实框就是我们需要的研究对象。

这种编码体现了什么:体现了先验框与真实框之间的差距,体现了先验框需要经过多少调整才能与真实框重合。在训练时是作为ground truth的,而训练时输出的是预测框与先验框之间的差距。

交并比:先验框与真实框相交的面积与两者并集的面积之比
交并比如何从预测卷积中得到位置信息

  1. 它通过卷积预测得到设置好的所有先验框的信息
  2. 对于每个所取的特征图,操作都是一样的
  3. 对所取的特征图进行卷积,得到的特征图尺寸为(h,w, prior个数×偏移量个数(4))
  4. 每个像素点的每个prior的每个坐标信息就包含在卷积得到的特征图中,如每个像素点有4个prior,每个prior有四个坐标(这时采用的是中心坐标,先验框和真实框还没建立联系)
  5. 所取的特征图一共可得到8732个位置信息。

如何从预测卷积中得到类别信息:对每个特征图进行卷积,得到的特征图尺寸为(h,w,prior个数×类别数),里面包含者每个先验框的类别的每个类别的信息。后续计算损失时判别在这么多类信息中属于哪一类。

如何计算位置损失

  1. 计算每个先验框和每个真实框的交并比(边界坐标)
  2. 找到与每个先验框最相关的真实框
  3. 找到与每个真实框最相关的先验框,并赋值1
  4. 为每个真实框分配最相关的先验框
  5. 将小于人为规定的阈值的先验框(负类)赋值0,大于阈值但都没被赋值1的先验框保持原来的交并比不变,视为正类。
  6. 有的先验框和背景匹配,有的先验框和物体匹配。总的来说,和物体匹配的先验框才是正类。
  7. 对于每个正类样本(先验框),将它与对应物体的真实框编码为编码坐标,这个坐标体现了它们两者之间的关系。
  8. 计算正类样本与真实框之间的平滑L1损失
  9. 计算损失的两个对象:(预测的正类先验框信息)和(用正类先验框编码的真实框)。真实框和先验框的偏移是这么多,是真实的;通过卷积输出的偏移信息是预测的;训练的目的就是要减小预测偏移量和真实偏移量之间的差距;迫使模型对于输入的数据,能预测出最准确的框。

如何计算类别损失(置信损失)

  1. 从预测卷积中得到类别信息
  2. 计算类别信息与真实类别(来自标签)的交叉熵损失
  3. 提取正类样本的损失。
  4. 提取负类样本的损失,并排序,取最大的几个,这才是我们需要的负类样本(hard negative mining)
  5. 将正类样本和负类样本的损失加起来,再除以正类样本的个数
    在这里插入图片描述

为什么在计算置信损失时要hard negative mining:负类样本远多于正类样本,我们在训练时必须保证正负类样本的均衡,代码中负类样本数设为正类样本数的3倍。因此要选择优质负类样本,也就是训练时,损失大的那些负类样本。

3. 程序运行的过程

训练的过程:加载数据、构建模型、计算损失、更新损失、打印状态的过程。
验证的过程:用验证集做与训练同样操作的过程。每验证一次,就保存一次权值。
测试的过程:加载数据、构建模型、检测物体计算mAP的过程

如何检测物体

  1. 从模型的输出中获取位置和分类信息
  2. 对分类信息计算交叉熵损失
  3. 将位置信息转为最值坐标形式
  4. 分别寻找每个类别的物体
  5. 返回所有预测得到的框、标签、类别

如何寻找每个类别的物体

  1. 在输出的分类信息中找到所有被判定为第i类的物体
  2. 但不是所有被判为第i类的物体都要,判定的分数足够高才要
  3. 同时找到这些高分物体对应的预测框
  4. 预测框之间有相交,如果两个预测框交并比太大,那么它们所框住的可能就是同一个物体
  5. 一个物体只能保留一个最佳的预测框,其他框去掉。(非极大值抑制)

计算mAP
(参考这篇博客
AP:一个类别均匀精度
mAP:所有类别平均均匀精度
TP:True Positive, 正样本被分为正类
FP:False Positive,负样本被分为正类
TN: True Negative,负样本被分为负类
FN:False Negative,正样本被分为负类
精度:表示被视为正的样本中真正的正样本的概率
在这里插入图片描述
召回率:正样本被分为正类的概率

在这里插入图片描述
交并比在计算mAP时的作用:预测框和真实框之间的交并比用于判别这个预测框(样本)属于FP还是TP。FN不用算,TP+FN=真实框的个数。比如取三个不同的交并比阈值,可得到三组不同的P和R,以R为横坐标,以P为纵坐标,找出这三组结果对应的三个点,并连成折线,找极大值点,并向左作横线,向下作竖线。所有横竖线围成的面积之和就是AP值。因此AP值是在对预测框和真实框的交并比结果取多组不同阈值时,在图中计算出的面积。
在这里插入图片描述
mAP的计算方法:mAP是对所有类别计算AP值后取算数平均数的结果。

4.将SSD用于NWPU-10航空遥感图像目标检测

4.1删除错误的图片

检查是否都是三通道都是图像,如DOTA等数据集就有部分图像不是三通道的,运行程序会报错。

from PIL import Image
import os
path = 'D:/重要数据集/part3/images/'
filelist = os.listdir(path)
print("Image total:",len(filelist))

for file in filelist:
    img = Image.open(path+file)
    try:
        r,g,b=img.split()
    except Exception:
        print(file,"It will be removed")
        os.remove(path+file)

filelist = os.listdir(path)
print("Image total:",len(filelist))

4.2 将NWPU-10做成VOC格式的数据集

可用别人的代码:链接
注意设置好输入的.txt标注文件路径,设置好输出的.xml路径。除将VOC的标注文件做成.xml外,还要将图片、做好的标注放在和VOC结构一样的文件夹下,包括JPEGImages、Annotaions、ImageSets/Main等。做一个.txt文件里面写入训练集的图片名,一行一个(不含后缀),注意开头末尾不要留空行。

修改原代码中类别名称部分代码,NWPU-10包含的类别有’airplane’, ‘ship’, ‘storage tank’, ‘baseball diamond’, ‘tennis court’, ‘basketball court’, ‘ground track field’,‘harbor’, ‘bridge’, 'vehicle’共10类。

可添加训练可视化的代码,可参考链接的方法。

4.3 结果展示

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

发布了6 篇原创文章 · 获赞 1 · 访问量 333

猜你喜欢

转载自blog.csdn.net/m0_37820219/article/details/105661483
今日推荐