【项目实践】从零开始学习SSD目标检测算法训练自己的数据集(附注释项目代码)(一)

简介: 【项目实践】从零开始学习SSD目标检测算法训练自己的数据集(附注释项目代码)(一)

1、SSD的知识思维脑图



2、简介


2.1、SSD出现的背景

针对YOLO V1对于小目标检测的缺陷一个死板的边框定制,导致如果出现过于密集检测物体时,效果就会比较差,而对于多阶段检测的方法,诸如,RCNN,Fast RCNN,Faster RCNN虽然对于小目标有比较好的检测效果,但是由于其自身会产生很多的冗余边界框导致基于分类的检测方法的检测时间比较久,很难满足实时性的要求。

SSD是一个端到端的模型,所有的检测过程和识别过程都是在同一个网络中进行的;同时SSD借鉴了Faster R-CNN的Anchor机制的想法,这样就像相当于在基于回归的的检测过程中结合了区域的思想,可以使得检测效果较定制化边界框的YOLO v1有比较好的提升。

2.2、SSD的模型思想

2.2.1、多尺度特征图预测(Multi-Scale Feature Maps Prediction)

SSD较传统的检测方法使用顶层特征图的方法选择了使用多尺度特征图,因为在比较浅的特征图中可以对于小目标有比较好的表达,随着特征图的深入,网络对于比较大特征也有了比较好表达能力,故SSD选择使用多尺度特征图可以很好的兼顾大目标和小目标。

0f54a5a6eb20f33f8fefe2e0f950836e.png

对于对尺度特征图的实验如下,全部使用是可以达到最好的效果:

73f1e076e27b8520f7dfc6e0bce79d8e.png

2.2.2、根据不同尺度的特征图进行定制不同尺度的默认边界框

如下图和表所示,针对不同的特征图,SSD定制了不同数量的默认边界框的数量(借鉴了YOLO V1的定制边界框的思想)

但是默认框的数量是动手选择的,SSD为每个特征图定义一个尺度值,从左侧开始,conv4_3的最小尺度值为0.2,然后以0.14的线性增加到最右边的层的0.9(即0.20、0.34、0.48、0.62、0.76、0.90),然后将尺度值(Scale)与目标的宽高比结合,计算默认框的宽度和高度。

8fcb482e802d015a984f243d9626c5d8.png

对于进行预测6次的层,SSD以5个目标高宽比开始{1,2,3,1/2,1/3},具体的计算如下:

定义的宽高比为:

1faa5b4802869aa2e5c63ba1765f21d6.png

边界框的宽高为:

99bdf7d2f05d415580686d0af74a2b27.png

m表示特征图的数量,s_min=0.2,s_max=0.9。

1bf8d5c786351eba88d6611aa70786d3.png

68c040592029d3917059ea4042403b06.png

由上面的表和图可以看出,最终总共产生了8732个边界框,最后使用非最大值抑制的方法进行筛选。

2.2.3、使用3x3的小卷积核进行预测分类结果和边界框的信息

SSD不使用特定的区域建议网络。它采用一个非常简单的方法,即使用小卷积滤波器计算位置和类别得分。

在提取特征图之后,SSD对每个单元应用3×3卷积滤波器以进行预测(这些滤波器像常规CNN滤波器一样计算结果)。每个滤波器输出25个通道:21个类别分数+1个边界框的信息

e1eaa06932a5fa341fa3597453c71cb5.png

2.2.4、多任务损失函数

  • 匹配策略

SSD预测分为正匹配或负匹配。如果相应的默认边界框(不是预测的边界框)与GT的IoU大于0.5, 则匹配为正。否则,是负的。

SSD仅使用正匹配来计算边界框不匹配的代价。

0ced3670791d6086e242277ad4e9aa9b.png

只有默认框1和2(但不是3)的IoU大于0.5。因此, 只有第1和第2个框是正匹配。一旦识别出正匹配,就使用相应的预测边界框来计算代价。这种匹配策略很好地划分了预测所负责的GT框的形状。

该匹配策略鼓励每个预测更接近相应默认框的形状。因此,预测在训练中更加多样化和稳定。

损失函数

总体目标损失函数是**定位误差(loc)置信度损失或者叫分类误差(conf)**的加权和:

定位损失:是GT框与预测边界框之间的不匹配。是预测框(?)和GT框(?)参数之间的Smooth L1损失

d9d9baa45def3fd5dd1112f6b4b9769f.png

a5135f31eac481bf67091564305c65d3.png

SSD仅对正匹配的预测进行惩罚。希望正匹配的预测能够更接近GT。负匹配可以忽略。

置信度损失或者叫分类误差:是多类置信度(c)下的softmax损失。

3ed7701abfadbb568e5fcfbfb31b4edd.png

2.2.5、空洞卷积

由于SSD借鉴了DeepLab-LargeFOV,分别将VGG16的全连接层fc6和fc7转换成3×3卷积层Conv6和1×1卷积层Conv7,同时将池化层pool5由原来的2×2−s2变成3×3−s1。为了配合这种变化,采用了一种Atrous Algorithm,其实就是Conv6采用带孔卷积(Atrous/Dilation Convolution),带孔卷积在不增加参数与模型复杂度的条件下指数级扩大卷积的感受野。

Atrous/Dilation Convolution的思想:紧密相邻的像素几乎相同,全部纳入的话会存在很多的冗余关系,于是选择跳跃H(hole)个像素取一个有效值,这样可以在较少的参数下增大感受野,也节省了内存的使用。

如下图所示,(a)是普通的3×3卷积,其感受野就是3×3,(b)是扩张率为2,此时感受野变成7×7,(c)扩张 率为4时,感受野扩大为15×15,但是感受野的特征更稀疏了。

e423d8ccd4cbec9328b49f93101fa8c9.png

2.2.6、困难负样本挖掘(Hard negative mining)

由于做出的预测远远超过目标存在的数量,所以负匹配比正匹配要多得多。这造成了一种训 练的类别不平衡:更多地学习背景空间而不是检测目标。

然而,SSD仍然需要负采样,因此它可以了解什么构成不良的预测。因此,我们不是使用所 有的样本,而是通过计算的置信度损失对这些负样本进行排序。SSD选择最高损失的负样本并 确保所选负样本与正样本之间的比率最多为3:1。这导致更快和更稳定的训练。

相关文章
|
17天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
6天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
14天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
17天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
17天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之顺序表【无论是王道考研人还真爱粉都能包会的;不然别给我家鸽鸽丢脸好嘛?】
顺序表的定义和基本操作之插入;删除;按值查找;按位查找等具体详解步骤以及举例说明
|
18天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
19 3
|
16天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
17天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
17天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
17天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!