SSD_OneStage

news/2025/1/12 13:35:43/

关于对SSD的个人理解

背景

在此之前,二阶段的目标检测网络Faster-RCNN已经出来,但本文的作者发现Faster之所以慢主要还是因为它将检测这个问题分成了两个步骤,也就是说本文的作者想要设计出一种一阶段的网络就可以预测出目标的边界框。

思想

在这里插入图片描述

利用一阶段网络代替二阶段网络实现目标检测,即不需要再像之前的二阶段网络先由anchor生成候选区域,再由候选区域生成box,而是直接将设定好的anchor得到预测的box,并且作者也发现了Faster对小目标的检测效果十分的不友好,因此还加入了多尺度预测的思想。

模型结构

以下便是本文的模型结构,从图上我们可以知道:输入为整张图像,输出为6个不同尺度的预测特征图,紧接着在不同的预测特征层上设定不同尺寸、数量的anchor来检测相应尺寸大小的目标,核心思想就是:大尺度特征图预测小目标,小尺度特征图预测大目标。
相应的输出特征图的尺寸依次为:38 * 38,19 * 19,10* 10,5 * 5,3 * 3,1 * 1,每一个特征图的每一个grid设定的anchor的尺寸和数量分别为:(21,45)【1,2,0.5】,(45,99)【1,2,0.5,3,0.3】,(99,153)【1,2,0.5,3,0.3】,(153,207)【1,2,0.5,3,0.3】,(207,261)【1,2,0.5】,(261,315)【1,2,0.5】。举(21,45)【1,2,0.5】这个例子来看:首先anchor的面积为 2 1 2 21^2 212,宽高的比例为【】内的比值,因此首先会得到3个anchor,然后再将面积= ( 21 ∗ 45 ) 1 / 2 (21 * 45)^{1/2} (2145)1/2,仅生成宽高1:1比例的anchor,此时总共就会得到4个anchor。同理其他特征图将会得到的anchor的数量依次为:4,6,6,6,4,4(当然这只是针对一个grid)。在设计好anchor之后,将预测特征图分别接上一个k=3,s=1,p=1,c= c l a s s ∗ n i class*n_i classni(class代表所要预测的类别个数,会经过Softmax函数归一化, n i n_i ni代表每一个grid对应的anchor数量)的卷积层预测box的类别概率以及另一个k=3,s=1,p=1,c= 4 ∗ n i 4*n_i 4ni(4代表每一个box相对于anchor的位置参数的个数)的卷积层预测box位置参数。
在这里插入图片描述

训练阶段

那么作者是如何训练模型的呢。与之前介绍的YOLO采用的损失函数类似,不同的是SSD是不会直接预测置信度的,即没有置信度损失,这也就出现了一个与YOLO在损失函数上不同的地方,在YOLO中由于存在所有样本(包含正负样本)的置信度损失,使得在计算类别损失时只计算正样本的类别损失。而在SSD中,因为没有预测置信度,因此在类别损失公式上仍需要计算负样本的类别损失(这是唯一在结构上的不同)。在SSD中包含正负样本的类别损失(多分类交叉熵)以及正样本的box位置参数损失,总损失公式如下图所示,N=正样本的个数。既然提到了正负样本,就需要简单的介绍一下判定方式,我们现在都知道该模型将会产生大量的anchor,那么考虑到正负样本平衡的问题,我们不可能将所有的anchor都参与损失计算。在SSD中总共会产生8732个anchor,先将这8732个anchor与GT计算IOU,与Faster类似,1、首先将IOU大于阈值(默认0.5)的anchor标为正样本,2、如果还有GT没有匹配到正样本,则在剩余的anchor取IOU最大的anchor为正样本,要保证每一个GT都能够匹配到正样本。而对于负样本的判定方式与Faster不一样,将剩余的anchor与所有的GT计算得到置信度(将得到的类别概率 * IOU)按照从大到小的顺序排列,从最顶部开始选取负样本anchor,然后保证负样本:正样本=3:1。
在这里插入图片描述

  1. 类别损失
    以下为类别损失公式:
    在这里插入图片描述
  2. box位置损失
    以下为box位置损失公式:与YOLO的做法是一样的,这里不再赘述。
    在这里插入图片描述

测试阶段

与以往目标检测采用NMS方法一样,不详细讲解。

总结

如理解存在纰漏,敬请指正,谢谢!


http://www.ppmy.cn/news/204516.html

相关文章

ssd2828 Linux driver

以前做的一个项目,用的是imx 6q平台,显示屏用的2 lan的mipi口,也是我煞费苦心调出来的,最近屏幕换代,只支持4 lan,但6q只支持2 lan,所以只好加了个RGB->MIPI的IC SSD2828,网上找了半天资料也没找到写好的linux driver, 有的只是单片机的代码,鉴于自己也是个10多年的…

SSD202 Flash 分区

1 分区说明 本文示例使用SPI NAND flash器件 CIS: SPI-NAND 独有的分区,保存在 flash 的 0 地址的位置,它包含两部分内容: 一部分是 spinand info,保存 spinand 器件的一些基本信息 一部分是 partinifo,保…

SA-SSD复现

SA-SSD复现 环境 Ubuntu 16.04 Python 3.6 pytorch 1.1.0 CUDA 10.0 Cudnn 7.6.4 依赖 python3.6pytorch (tested on 1.1.0)opencvshapelymayavispconv (v1.0) 安装 基础安装: conda create --name SASSD python3.6conda activate SASSDconda install pytorch…

rabbitmq死信队列详解

目录 1 概念 2 成为死信队列的条件 2.1 队列指定长度 2.2 消息ttl时间 2.3 消费者拒收消息 1 概念 死信队列:死信队列其实和普通的队列一样,只不过里面存放的消息都是普通队列过期没有消费的。所以,接收没有及时被消费消息的队列为死信…

高级算法工程师的工作职责(合集)

高级算法工程师的工作职责1 职责: 1、调研跟踪智能穿戴产品相关算法,为公司产品决策提供参考; 2、设计开发智能穿戴产品的计步、睡眠、心率、血氧饱和度、血压、心率变异性等相关参数的提取算法; 3、撰写算法开发文档,包括算法流程、测试方案…

【分苹果】

蒜头君要把一堆苹果分给 nn 个小朋友,要使每个人都能拿到苹果,而且每个人拿到的苹果数都不同的话,这堆苹果至少应该有多少个? 输入格式 一个不大于 10001000 的正整数 nn,代表小朋友人数。 输出格式 一个整数&…

MDSplus

MDSplus 数据读取 数据的读取 TreeNode *node1 myTree->getNode("NUM2"); Data *data1 node1->getData(); int num; int *nums data1->getIntArray(&num);其中将节点node1的数据转换为int类型数组,数组的长度记录在数据num中。通过 co…

苹果游戏机

pdd的低价苹果“游戏机”是越狱来的,好多软件会检测到并做一些限制。银行等支付类的app,甚至有些游戏都会禁止越狱机使用它们的app。在越狱时可以安装Cydia,再通过Cydia安装防越狱检测工具。但有些app,可能检测越狱代码比较高级&a…