目标检测算法SSD与FasterRCNN

2024-06-16 21:36

本文主要是介绍目标检测算法SSD与FasterRCNN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标检测算法SSD与FasterRCNN

SSD:( Single Shot MultiBox Detector)特点是在不同特征尺度上预测不同尺度的目标。

SSD网络结构

在这里插入图片描述
首先对网络的特征进行说明:输入的图像是300x300的三通道彩色图像。

网络的第一个部分贯穿到Vgg16模型 Conv5的第三层上

在这里插入图片描述
整个SSD网络的第一个预测特征层就是conv4的第三层,得到的是38x38的512通道的特征图。

采用vgg网络通常是将大小进行减半,通道数进行翻倍的操作。300 150 75 38即为ssd网络的第一个预测特征层。

之后我们对maxpooling进行一个更改操作。变为3x3步幅为1是特征层的大小保持不变。

之后FC6和FC7替代的是vgg网络中的两个全连接层:首先是通过3x3的卷积核步距为2对其进行一个缩放处理得到的是19x19的一个特征输出,之后连接一个1x1的卷积核进行通道的融合,从而得到了第二个预测的特征。

后面的分析过程基本相同:按照图示来进行分析即可,最后会得到6个预测特征层4
即为1x1的256通道的预测特征层。

不同特征尺度上预测不同尺度的目标:在较小的特征层上检测较大的目标,在较大的特征层上检测较小的目标。

在这里插入图片描述

Default Box的scale以及aspect设定

在这里插入图片描述
论文中的原文提到了conv4_3 conv10_2和conv11_2我们只使用4个default box而其他的层使用的是默认的6个default box并且这4个default box会忽略掉1:3和3:1的两个比例。

不使用论文中的计算公式而采用:下面提供的比例和尺度信息。

在这里插入图片描述

下面的图表从总体上说明了各个特征图的Default Box的scale以及aspect

在这里插入图片描述
总共会生成:38x38x4 + 19x19x6 + 10x10x6 + 5x5x6 + 3x3x4 + 1x1x4 = 8732个Default Box

与ssd论文网络结构图中的8732个特征层相同。
也体现了之前学习的动手学深度学习中的多尺度锚框的思想,在特征图的每一个像素位置生成锚框。

在这里插入图片描述

图示即为在feature map1 feature map4中生成的锚框。

在这里插入图片描述

Predictor的实现

预测器的实现步骤

首先我们会采用(C+4)×k =cxk+4xk个卷积核来进行预测其中ck个是用来预测我们的类别分数。4k即为边界框回归参数。x y w h

注意是:c是包含背景类别的

在这里插入图片描述

损失函数计算

L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L(x, c, l, g)=\frac{1}{N}\left(L_{c o n f}(x, c)+\alpha\right. L(x,c,l,g)=N1(Lconf(x,c)+α

损失的计算也主要包括两个部分组成,分别是类别损失定位损失两个部分。

其中N为匹配到的正样本个数,α为1

类别损失的概率为:(相当于是一个softmax的损失)

L conf  ( x , c ) = − ∑ i ∈ Pos  N x i j p log ⁡ ( c ^ i p ) − ∑ i ∈ N e g log ⁡ ( c ^ i 0 ) where  c ^ i p = exp ⁡ ( c i p ) ∑ p exp ⁡ ( c i p ) L_{\text {conf }}(x, c)=-\sum_{i \in \text { Pos }}^{N} x_{i j}^{p} \log \left(\hat{c}_{i}^{p}\right)-\sum_{i \in N e g} \log \left(\hat{c}_{i}^{0}\right) \quad \text { where } \quad \hat{c}_{i}^{p}=\frac{\exp \left(c_{i}^{p}\right)}{\sum_{p} \exp \left(c_{i}^{p}\right)} Lconf (x,c)=i Pos Nxijplog(c^ip)iNeglog(c^i0) where c^ip=pexp(cip)exp(cip)

在这里插入图片描述
定位损失与FastRcnn相同,具体参考fastRcnn的部分进行补充学习。

L l o c ( x , l , g ) = ∑ i ∈ P o s N ∑ m ∈ { c x , c y , w , h } x i j k smooth ⁡ L 1 ( l i m − g ^ j m ) g ^ j c x = ( g j c x − d i c x ) / d i w g ^ j c y = ( g j c y − d i c y ) / d i h g ^ j w = log ⁡ ( g j w d i w ) g ^ j h = log ⁡ ( g j h d i h ) \begin{aligned} L_{l o c}(x, l, g) & =\sum_{i \in P o s}^{N} \sum_{m \in\{c x, c y, w, h\}} x_{i j}^{k} \operatorname{smooth}_{\mathrm{L} 1}\left(l_{i}^{m}-\hat{g}_{j}^{m}\right) \\ \hat{g}_{j}^{c x}=\left(g_{j}^{c x}-d_{i}^{c x}\right) / d_{i}^{w} & \hat{g}_{j}^{c y}=\left(g_{j}^{c y}-d_{i}^{c y}\right) / d_{i}^{h} \\ \hat{g}_{j}^{w}=\log \left(\frac{g_{j}^{w}}{d_{i}^{w}}\right) & \hat{g}_{j}^{h}=\log \left(\frac{g_{j}^{h}}{d_{i}^{h}}\right) \end{aligned} Lloc(x,l,g)g^jcx=(gjcxdicx)/diwg^jw=log(diwgjw)=iPosNm{cx,cy,w,h}xijksmoothL1(limg^jm)g^jcy=(gjcydicy)/dihg^jh=log(dihgjh)

Faster R-CNN

FastR-CNN算法流程可分为3个步骤

  • 一张图像生成1K~2K个候选区域(使用SelectiveSearch方法)
  • 将图像输入网络得到相应的特征图,将SS算法生成的候选框投影到
    特征图上获得相应的特征矩阵
  • 将每个特征矩阵通过R0Ipooling层缩放到7x7大小的特征图,接着将
    特征图展平通过一系列全连接层得到预测结果。

在这里插入图片描述

FasterR-CNN算法流程可分为3个步骤

  • 将图像输入网络得到相应的特征图
  • 使用RPN结构生成候选框,将RPN生成的候选框投影到特征图上获得相应的特征矩阵
  • 将每个特征矩阵通过R0I pooling层缩放到7x7大小的特征图,接着将特征图展平通过一系列全连接层得到预测结果

RPN + Fast R-CNN

RPN替代SS算法分析

在这里插入图片描述

对于特征图上的每个3x3的滑动,窗口,计算出滑动窗口中心点对应
原始图像上的中心点,并计算出K个anchor boxes(注意和proposal的差异)。

4k:即为边界框的回归坐标参数。
2k: 即为k个锚框是背景和其他类别的概率信息。

根据原图和特征图的比例关系,确定特征图中的每个像素在原图中所对对应的位置信息。在以该点为中心计算出k个锚框。

在这里插入图片描述

尺度与比例的计算

三种尺度(面积){128x128,256x256,512x512}
三种比例{1:1, 1:2。2:1}

将尺度与比例进行融合:每个位置(每个滑动窗口)在原图上都对应有3x3=9anchor

在这里插入图片描述
对于一张1000x600x3的图像,大约有60x40x9(20k)个anchor,忽略跨越边界的anchor以后,剩下约6k个anchor。对于RPN生成的候选框之间存在大量重叠,基于候选框的cls得分,采用非极大值抑制,IoU设为0.7,这样每张图片只剩2k个候选框。

损失函数计算

损失函数的计算同样包括了边界框回归损失与分类损失。

L ( { p i } , { t i } ) = 1 N c l s ∑ i L c l s ( p i , p i ∗ ) + λ 1 N reg  ∑ i p i ∗ L reg  ( t i , t j ∗ ) L\left(\left\{p_{i}\right\},\left\{t_{i}\right\}\right)=\frac{1}{N_{c l s}} \sum_{i} L_{c l s}\left(p_{i}, p_{i}^{*}\right)+\lambda \frac{1}{N_{\text {reg }}} \sum_{i} p_{i}^{*} L_{\text {reg }}\left(t_{i}, t_{j}^{*}\right) L({pi},{ti})=Ncls1iLcls(pi,pi)+λNreg 1ipiLreg (ti,tj)

  • Ncls表示一个mini-batch中的所有样本数量256
  • Nreg表示anchor位置的个数(不是anchor个数)约2400

其中的回归损失的计算如下:

L reg  ( t i , t i ∗ ) = ∑ i smooth ⁡ L 1 ( t i − t i ∗ ) t i = [ t x , t y , t w , t h ] t i ∗ = [ t x ∗ , t y ∗ , t w ∗ , t h ∗ ] \begin{array}{l} L_{\text {reg }}\left(t_{i}, t_{i}^{*}\right)=\sum_{i} \operatorname{smooth}_{L_{1}}\left(t_{i}-t_{i}^{*}\right) \\ t_{i}=\left[t_{x}, t_{y}, t_{w}, t_{h}\right] \quad t_{i}^{*}=\left[t_{x}^{*}, t_{y}^{*}, t_{w}^{*}, t_{h}^{*}\right] \end{array} Lreg (ti,ti)=ismoothL1(titi)ti=[tx,ty,tw,th]ti=[tx,ty,tw,th]

  • ti表示预测第i个anchor的边界框回归参数
  • ti*表示第i个anchor对应的GTBox的回归参数

下面给出回归参数的计算公式:
t x = ( x − x a ) / w a , t y = ( y − y a ) / h a , t w = log ⁡ ( w / w a ) , t w = log ⁡ ( h / h a ) , t x ∗ = ( x ∗ − x a ) / w a , t y ∗ = ( y ∗ − y a ) / h a , t w ∗ = log ⁡ ( w ∗ / w a ) , t h ∗ = log ⁡ ( h ∗ / h a ) \begin{array}{l} t_{x}=\left(x-x_{a}\right) / w_{a}, t_{y}=\left(y-y_{a}\right) / h_{a}, \\ t_{w}=\log \left(w / w_{a}\right), t_{w}=\log \left(h / h_{a}\right), \\ t_{x}^{*}=\left(x^{*}-x_{a}\right) / w_{a}, t_{y}^{*}=\left(y^{*}-y_{a}\right) / h_{a}, \\ t_{w}^{*}=\log \left(w^{*} / w_{a}\right), t_{h}^{*}=\log \left(h^{*} / h_{a}\right) \end{array} tx=(xxa)/wa,ty=(yya)/ha,tw=log(w/wa),tw=log(h/ha),tx=(xxa)/wa,ty=(yya)/ha,tw=log(w/wa),th=log(h/ha)
带入smoothl1函数中得到最后的结果

smoothl1函数的表达形式为:

smooth  L 1 ( x ) = { 0.5 x 2 if  ∣ x ∣ < 1 ∣ x ∣ − 0.5 otherwise  \text { smooth }_{L_{1}}(x)=\left\{\begin{array}{ll} 0.5 x^{2} & \text { if }|x|<1 \\ |x|-0.5 & \text { otherwise } \end{array}\right.  smooth L1(x)={0.5x2x0.5 if x<1 otherwise 

下面介绍分类损失的计算信息。

  • p,表示第i个anchor预测为真实标签的概率
  • p*当为正样本时为1,当为负样本时为0

第一种计算的损失为:多分类损失的计算

L c l s = − ln ⁡ ( p i ) L_{c l s}=-\ln \left(p_{i}\right) Lcls=ln(pi)

正样本时为1,当为负样本时为0将负样本的情况进行省略。得到上面的计算公式。

另外一种的计算方式是使用二值交叉熵损失来进行计算。

在这里插入图片描述
L c l s = − [ p i ∗ log ⁡ ( p i ) + ( 1 − p i ∗ ) log ⁡ ( 1 − p i ) ] L_{c l s}=-\left[p_{i}^{*} \log \left(p_{i}\right)+\left(1-p_{i}^{*}\right) \log \left(1-p_{i}\right)\right] Lcls=[pilog(pi)+(1pi)log(1pi)]

Faster R-CNN训练

在这里插入图片描述

现在Faster R-CNN的训练直接采用RPNLoss+FastR-CNNLoss的联合训练方法。

原论文中采用分别训练RPN以及FastR-CNN的方法。

(1)利用imageNet预训练分类模型初始化前置卷积网络层参数,并
开始单独训练RPN网络参数;

(2)固定RPN网络独有的卷积层以及全连接层参数,再利用ImageNet预训练分类模型初始化前置卷积网络参数,并利用RPN网络生成的目标建议框去训练FastRCNN网络参数。

(3)固定利用FastRCNN训练好的前置卷积网络层参数,去微调RPN网络独有的卷积层以及全连接层参数。

(4)同样保持固定前置卷积网络层参数,去微调FastRCNN网络的全连接层参数。最后RPN网络与FaStRCNN网络共享前置卷积网络层.

这篇关于目标检测算法SSD与FasterRCNN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1067612

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

springboot+dubbo实现时间轮算法

《springboot+dubbo实现时间轮算法》时间轮是一种高效利用线程资源进行批量化调度的算法,本文主要介绍了springboot+dubbo实现时间轮算法,文中通过示例代码介绍的非常详细,对大家... 目录前言一、参数说明二、具体实现1、HashedwheelTimer2、createWheel3、n