深度学习与计算机视觉教程(13) | 目标检测 (SSD,YOLO系列)(CV通关指南·完结)

SSD简述 SSD也是one stage的检测。one stage的特点是:均匀的在图片的不同位置进行密集抽样,抽样采用不同的尺寸和长宽比,然后利用CNN提取特征之后,直接进行回归和分类。整个过程只有一步。它的优势是速度快,但是密集采样会导致正负样本(前景和背景)及其不均衡,使得模型准确度较低。下面来看看two stage和one stage在mAP和speed上的差异。 SSD采用CNN直接进行检测。不像... 阅读详情

ShowMeAI研究中心


Detectionand Segmentation; 深度学习与计算机视觉; Stanford CS231n

本系列为 斯坦福CS231n 《深度学习与计算机视觉(Deep Learning for Computer Vision)》的全套学习笔记,对应的课程视频可以在 这里 查看。更多资料获取方式见文末。


引言

目标检测 ( Object Detection )是计算机视觉领域非常重要的任务,目标检测模型要完成「预测出各个物体的边界框(bounding box)」和「给出每个物体的分类概率」两个子任务。

目标检测; Object detection

通常情况下,在对一张图片进行目标检测后,会得到许多物体的边界框和对应的置信度(代表其包含物体的可能性大小)。

两阶段模型结构; 一阶段模型结构

目标检测算法主要集中在 two-stage 算法和 one-stage 算法两大类:

① two-stage算法

② one-stage算法

  • 直接在网络中提取特征来预测物体分类和位置。

two-stage 算法速度相对较慢但是准确率高,one-stage 算法准确率没有 two-stage 算法高但是速度较快。在本篇我们将聚焦 one-stage 的目标检测方法进行讲解,主要包括 YOLO 系列算法和 SSD 等。

1.YOLO算法(YOLO V1)

关于 YOLO 的详细知识也可以对比阅读ShowMeAI的深度学习教程 | 吴恩达专项课程 · 全套笔记解读中的文章 CNN应用: 目标检测 中对于 YOLO 的讲解。

1.1 算法核心思想

YOLO 算法采用一个单独的 CNN 模型实现 end-to-end 的目标检测。首先将输入图片 resize 到 448 × 448 448 \times 448 448×448,然后送入 CNN 网络,最后处理网络预测结果得到检测的目标。相比 R-CNN 算法,其是一个统一的框架,其速度更快,而且 YOLO 的训练过程也是 端到端 / end-to-end 的。所谓的 YOLO 全名是 You Only Look Once,意思是算法只需要一次的推断运算。

YOLO V1; YOLO V1 算法核心思想

相比上述滑动窗口算法,YOLO 算法不再是窗口滑动,而是直接将原始图片分割成互不重合的小方块,然后通过卷积得到同等 size 的特征图,基于上面的分析,可以认为特征图的每个元素也是对应原始图片的一个小方块,可以用每个元素来可以预测那些中心点在该小方块内的目标。

YOLO算法的CNN网络将输入的图片分割成 N × N N\times N N×N 网格,然后每个单元格负责去检测那些中心点落在该格子内的目标。

YOLO V1; YOLO V1 算法核心思想

如图所示,可以看到,狗这个目标的中心落在左下角一个单元格内,那么该单元格负责预测这个狗。每个单元格会预测 $B $ 个边界框(bounding box)以及边界框的置信度(confidence score)。

所谓置信度其实包含两个方面,一是这个边界框含有目标的可能性大小,二是这个边界框的准确度。

前者记为 P ( o b j e c t ) P(object) P(object),当该边界框是背景时(即不包含目标时), P ( o b j e c t ) = 0 P(object)=0 P(object)=0。而当该边界框包含目标时, P ( o b j e c t ) = 1 P(object)=1 P(object)=1。

边界框的准确度可以用预测框与 ground truth 的 IoU (交并比)来表征,记为 IoU p r e d t r u t h \text{IoU}^{truth}_{pred} IoUpredtruth​。因此置信度可以定义为 P r ( o b j e c t ) ∗ IoU p r e d t r u t h Pr(object) \ast \text{IoU}^{truth}_{pred} Pr(object)∗IoUpredtruth​。

边界框的大小与位置可以用 4 个值来表征: ( x , y , w , h ) (x, y,w,h) (x,y,w,h),其中 ( x , y ) (x,y) (x,y) 是边界框的中心坐标,而 w w w 和 h h h 是边界框的宽与高。

还有一点要注意,中心坐标的预测值 ( x , y ) (x,y) (x,y) 是相对于每个单元格左上角坐标点的偏移值,并且单位是相对于单元格大小的,单元格的坐标定义如上方图所示。

边界框的 w w w 和 h h h 预测值是相对于整个图片的宽与高的比例,因此理论上4个元素的大小应该在 [ 0 , 1 ] [0,1] [0,1] 范围。这样,每个边界框的预测值实际上包含5个元素: ( x , y , w , h , c ) (x,y,w,h,c) (x,y,w,h,c),其中前4个表征边界框的大小与位置,最后一个值是置信度。

除此之外,每一个单元格预测出 C C C 个类别概率值,其表征的是由该单元格负责预测的边界框中的目标属于各个类别的概率。这些概率值其实是在各个边界框置信度下类别的条件概率,即 P r ( c l a s s i ∣ o b j e c t ) Pr(class_{i}|object) Pr(classi​∣object)。

值得注意的是,不管一个单元格预测多少个边界框,其只预测一组类别概率值。同时,我们可以计算出各个边界框的类别置信度 :

P r ( c l a s s i ∣ o b j e c t ) P r ( o b j e c t ) IoU p r e d t r u t h = P r ( c l a s s i ) ∗ IoU p r e d t r u t h Pr(class_{i}|object)Pr(object)\text{IoU}^{truth}_{pred}=Pr(class_{i}) \ast \text{IoU}^{truth}_{pred} Pr(classi​∣object)Pr(object)IoUpredtruth​=Pr(classi​)∗IoUpredtruth​

边界框类别置信度表征的是该边界框中目标属于各个类别的可能性大小以及边界框匹配目标的好坏。

1.2 YOLO网络结构

YOLO算法采用CNN来提取特征,使用全连接层来得到预测值。网络结构参考GoogleNet,包含24个卷积层和2个全连接层,如下图所示。

YOLO V1; YOLO 网络结构

对于卷积层,主要使用 1 × 1 1 \times 1 1×1 卷积来做通道数降低,用 3 × 3 3 \times 3 3×3 卷积提取特征。对于卷积层和全连接层,采用 Leaky ReLU 激活函数: m a x ( x , 0.1 x ) max(x, 0.1x) max(x,0.1x),最后一层却采用线性激活函数。

1.3 YOLO训练与预测

在训练之前,先在 ImageNet 上进行预训练,其预训练的分类模型采用上图中前20个卷积层,然后添加一个 average-pool 层和全连接层。

在预训练结束之后之后,在预训练得到的 20 层卷积层之上加上随机初始化的 4 个卷积层和 2 个全连接层进行 fine-tuning。由于检测任务一般需要更高清的图片,所以将网络的输入从 224 × 224 224 \times 224 224×224 增加到了 448 × 448 448 \times 448 448×448。

整个网络的流程如下图所示:

YOLO V1; YOLO 训练与预测

YOLO 算法将目标检测问题看作回归问题,所以采用的是 MSE loss,对不同的部分采用了不同的权重值。首先区分定位误差和分类误差。

  • 对于定位误差,即边界框坐标预测误差,采用较大的权重 λ = 5 \lambda=5 λ=5。
  • 然后其区分不包含目标的边界框与含有目标的边界框的置信度,对于前者,采用较小的权重值 λ = 0.5 \lambda =0.5 λ=0.5。其它权重值均设为 1 1 1。
  • 然后采用均方误差,其同等对待大小不同的边界框,但是实际上较小的边界框的坐标误差应该要比较大的边界框要更敏感。为了保证这一点,将网络的边界框的宽与高预测改为对其平方根的预测,即预测值变为 ( x , y , w , h ) (x,y,\sqrt{w}, \sqrt{h}) (x,y,w ​,h ​)。

由于每个单元格预测多个边界框。但是其对应类别只有一个。

训练时,如果该单元格内确实存在目标,那么只选择与 ground truth 的 IoU 最大的那个边界框来负责预测该目标,而其它边界框认为不存在目标。这样设置的一个结果将会使一个单元格对应的边界框更加专业化,其可以分别适用不同大小,不同高宽比的目标,从而提升模型性能。

YOLO V1; NMS 非极大值抑制

YOLO算法预测时采用非极大值抑制 (NMS) 。NMS 算法主要解决的是一个目标被多次检测的问题,如图中的汽车检测,可以看到汽车被多次检测,但是其实我们希望最后仅仅输出其中一个最好的预测框。

比如对于上图中的汽车,只想要位置最正那个检测结果。那么可以采用 NMS 算法来实现这样的效果:

  • 首先从所有的检测框中找到置信度最大的那个框,然后挨个计算其与剩余框的 IoU,如果 IoU 大于一定阈值(重合度过高),那么就将该框(剩余框)剔除;
  • 然后对剩余的检测框重复上述过程,直到处理完所有的检测框。

1.4 YOLO算法细节

1) bbox生成步骤

① 输入图像分成 S × S S \times S S×S 的网格。现在是划分成了 7 × 7 7 \times 7 7×7 的,如果物品的中点落在某一个网格单元,这个网格单元将负责识别出这个物体。

YOLO V1; bbox 生成步骤

注意只是看该目标的中心点,而不是整体。比如 A ( 2 , 3 ) A(2, 3) A(2,3) 是狗的中心点,那么 A A A 就负责来负责预测狗

② 每个网格自身也要预测 n n n 个边界框 bounding box 和边界框的置信度 confidence。论文中 b = 2 b=2 b=2

边界框包含四个数据 x x x, y y y, w w w, h h h: ( x , y ) (x,y) (x,y) 框中心是相对于网格单元的坐标, w w w 和 h h h 是框相当于整幅图的宽和高。

置信度有两部分构成:含有物体的概率和边界框覆盖的准确性。

Pr ⁡ ( Object ) ∗ I o U pred  truth  \operatorname{Pr}(\text {Object}) \ast \mathrm{IoU}_{\text {pred }}^{\text {truth }} Pr(Object)∗IoUpred truth ​

  • $ IoU$ 交并比
  • P r Pr Pr 就是概率 p p p

如果有 object 落在一个 grid cell 里,第一项取 1 1 1,否则取 0 0 0。 第二项是预测的 bounding box 和实际的 ground truth 之间的 IoU 值。

每个边界框又要预测五个数值: x x x, y y y, w w w, h h h, c o n f i d e n c e confidence confidence。 ( x , y ) (x,y) (x,y) 框中心是相对于网格单元的坐标, w w w 和 h h h 是框相当于整幅图的宽和高,confidence 代表该框与 ground truth 之间的 IoU (框里没有物体分数直接为 0 0 0)。

YOLO V1; bbox 生成步骤

每个网格都要预测 b = 2 b= 2 b=2 个框,49 个网格就会输出 98 个边界框,每个框还有它的分数。每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是 YOLO 方法的一个缺陷。

最后每个单元格再预测他的 n n n 个边界框中的物体分类概率,有 c c c 个类别就要计算 c c c 个概率,和全连接层类似。

S × S × ( B ∗ 5 + C ) S \times S \times(B \ast 5+C) S×S×(B∗5+C)

本文中有20个类别:即 7 ∗ 7 ( 2 ∗ 5 + 20 ) 7 \ast 7(2 \ast 5+20) 7∗7(2∗5+20)

总结:每个方格要找到 n n n 个边界框,然后还要计算每个边界框的置信度,最后再计算每个边界框的分类的可能性。

YOLO V1; bbox 生成步骤

生成的 bounding box 的 ( x , y ) (x, y) (x,y) 被限制在 cell 里, 但长宽是没有限制的(即生成的 bounding box 可超出 cell 的边界)

2) 损失函数

YOLO V1 的损失函数就是把三类损失加权求和,用的也都是简单的平方差:

边缘中心点误差:

λ coord  ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj  [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 ] \lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[\left(x_{i}-\hat{x}_{i}\right)^{2}+\left(y_{i}-\hat{y}_{i}\right)^{2}\right] λcoord ​i=0∑S2​j=0∑B​1ijobj ​[(xi​−x^i​)2+(yi​−y^​i​)2]

边框宽度、高度误差:

+ λ coord  ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj  [ ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] +\lambda_{\text {coord }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left[\left(\sqrt{w_{i}}-\sqrt{\hat{w}_{i}}\right)^{2}+\left(\sqrt{h_{i}}-\sqrt{\hat{h}_{i}}\right)^{2}\right] +λcoord ​i=0∑S2​j=0∑B​1ijobj ​[(wi​ ​−w^i​ ​)2+(hi​ ​−h^i​ ​)2]

置信度误差(边框内有对象) :

+ ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj  ( C i − C ^ i ) 2 +\sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {obj }}\left(C_{i}-\hat{C}_{i}\right)^{2} +i=0∑S2​j=0∑B​1ijobj ​(Ci​−C^i​)2

置信度误差(边框内无对象) :

+ λ noobj  ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj  ( C i − C ^ i ) 2 +\lambda_{\text {noobj }} \sum_{i=0}^{S^{2}} \sum_{j=0}^{B} \mathbb{1}_{i j}^{\text {noobj }}\left(C_{i}-\hat{C}_{i}\right)^{2} +λnoobj ​i=0∑S2​j=0∑B​1ijnoobj ​(Ci​−C^i​)2

对象分类误差:

+ ∑ i = 0 S 2 1 i obj  ∑ c ∈  classes  ( p i ( c ) − p ^ i ( c ) ) 2 +\sum_{i=0}^{S^{2}} \mathbb{1}_{i}^{\text {obj }} \sum_{c \in \text { classes }}\left(p_{i}(c)-\hat{p}_{i}(c)\right)^{2} +i=0∑S2​1iobj ​c∈ classes ∑​(pi​(c)−p^​i​(c))2

其中

  • 1 i o b j 1_{i}^{o b j} 1iobj​ 意思是网格 i i i 中存在对象。
  • 1 i j o b j 1_{i j}^{o b j} 1ijobj​ 意思是网格的第 j j j 个 bounding box 中存在对象。
  • 1 i j n o o b j 1_{i j}^{n o o b j} 1ijnoobj​ 意思是网格 i i i 的第 个 bounding box 中不存在对象。

损失函数计算是有条件的,是否存在对象对损失函数的计算有影响。

先要计算位置误差:预测中点和实际中点之间的距离,再计算 bbox 宽度和高度之间的差距,权重为 5 调高位置误差的权重

置信度误差:要考虑两个情况:这个框里实际上有目标;这个框里没有目标,而且要成一个权重降低他的影响,调低不存在对象的 bounding box 的置信度误差的权重,论文中是 0.5 0.5 0.5

对象分类的误差:当该框中有目标时才计算,概率的二范数

YOLO V1; 损失构建

3) YOLO V1 的缺陷

不能解决小目标问题,YOLO 对边界框预测施加了严格的空间约束,因为每个网格单元只能预测两个边界框,并且只能有一个类。这个空间约束限制了我们模型能够预测的临近对象的数量。

YOLO V1 在处理以群体形式出现的小对象时会有困难,比如成群的鸟。

2. SSD 算法

SSD 算法全名是 Single Shot Multibox Detector,Single shot指明了 SSD 算法属于 one-stage 方法,MultiBox 指明了 SSD 是多框预测。

SSD 算法在准确度和速度上都优于最原始的 YOLO 算法。对比 YOLO,SSD 主要改进了三点:多尺度特征图,利用卷积进行检测,设置先验框。

  • SSD 采用CNN来直接进行检测,而不是像 YOLO 那样在全连接层之后做检测。
  • SSD 提取了不同尺度的特征图来做检测,大尺度特征图(较靠前的特征图)可以用来检测小物体,而小尺度特征图(较靠后的特征图)用来检测大物体。
  • SSD 采用了不同尺度和长宽比的先验框(在Faster R-CNN 中叫做 anchor )。

下面展开讲解 SSD 目标检测算法。

2.1 算法核心思想

SSD; SSD 算法核心思想

1) 采用多尺度特征图用于检测

所谓多尺度特征图,就是采用大小不同的特征图进行检测。

CNN 网络一般前面的特征图比较大,后面会逐渐采用 s t r i d e = 2 stride=2 stride=2 的卷积或者 pool 来降低特征图大小,如下图所示,一个比较大的特征图和一个比较小的特征图,它们都用来做检测。

  • 这样做的好处是比较大的特征图来用来检测相对较小的目标,而小的特征图负责检测大目标。
  • 8 × 8 8 \times 8 8×8 的特征图可以划分更多的单元,但是其每个单元的先验框尺度比较小。

SSD; SSD 多尺度特征图

2) 利用卷积进行检测

与 YOLO 最后采用全连接层不同,SSD 直接采用卷积对不同的特征图来进行提取检测结果。

对于形状为 m × n × p m\times n \times p m×n×p 的特征图,只需要采用 3 × 3 × p 3\times 3 \times p 3×3×p 这样比较小的卷积核得到检测值。

SSD 采用卷积特征图; 提取检测结果

3) 设置先验框

在 YOLO 中,每个单元预测多个边界框,但是其都是相对这个单元本身(正方块),但是真实目标的形状是多变的,YOLO 需要在训练过程中自适应目标的形状。

SSD 借鉴了Faster R-CNN 中 anchor 的理念,每个单元设置尺度或者长宽比不同的先验框,预测的bbox是以这些先验框为基准的,在一定程度上减少训练难度。

SSD; SSD 设置先验框

一般情况下,每个单元会设置多个先验框,其尺度和长宽比存在差异,如图所示,可以看到每个单元使用了 4 个不同的先验框,图片中猫和狗分别采用最适合它们形状的先验框来进行训练,后面会详细讲解训练过程中的先验框匹配原则。

SSD 的检测值也与 YOLO 不太一样。对于每个单元的每个先验框,其都输出一套独立的检测值,对应一个边界框,主要分为两个部分。

  • 第1部分是各个类别的置信度,值得注意的是 SSD 将背景也当做了一个特殊的类别,如果检测目标共有 c c c 个类别,SSD 其实需要预测 c + 1 c+1 c+1 个置信度值,第一个置信度指的是不含目标或者属于背景的评分。在预测过程中,置信度最高的那个类别就是边界框所属的类别,特别地,当第一个置信度值最高时,表示边界框中并不包含目标。
  • 第2部分就是边界框的location,包含4个值 ( c x , c y , w , h ) (cx, cy, w, h) (cx,cy,w,h),分别表示边界框的中心坐标以及宽和高。然而,真实预测值其实只是边界框相对于先验框的转换值。先验框位置用 d = ( d c x , d c y , d w , d h ) d=(d^{cx}, d^{cy}, d^w, d^h) d=(dcx,dcy,dw,dh) 表示,其对应边界框用 b = ( b c x , b c y , b w , b h ) b=(b^{cx}, b^{cy}, b^w, b^h) b=(bcx,bcy,bw,bh) 表示,那么边界框的预测值 l l l 其实是 b b b 相对于 d d d 的转换值:

l c x = ( b c x − d c x ) / d w ,   l c y = ( b c y − d c y ) / d h l^{cx} = (b^{cx} - d^{cx})/d^w, \space l^{cy} = (b^{cy} - d^{cy})/d^h lcx=(bcx−dcx)/dw, lcy=(bcy−dcy)/dh

l w = log ⁡ ( b w / d w ) ,   l h = log ⁡ ( b h / d h ) l^{w} = \log(b^{w}/d^w), \space l^{h} = \log(b^{h}/d^h) lw=log(bw/dw), lh=log(bh/dh)

习惯上,我们称上面这个过程为边界框的编码(encode),预测时,你需要反向这个过程,即进行解码(decode),从预测值 l l l 中得到边界框的真实位置 b b b :

b c x = d w l c x + d c x ,   b c y = d y l c y + d c y b^{cx}=d^w l^{cx} + d^{cx}, \space b^{cy}=d^y l^{cy} + d^{cy} bcx=dwlcx+dcx, bcy=dylcy+dcy

b w = d w exp ⁡ ( l w ) ,   b h = d h exp ⁡ ( l h ) b^{w}=d^w \exp(l^{w}), \space b^{h}=d^h \exp(l^{h}) bw=dwexp(lw), bh=dhexp(lh)

2.2 SSD 网络结构

SSD 采用 VGG16 作为基础模型,然后在 VGG16 的基础上新增了卷积层来获得更多的特征图以用于检测。SSD 的网络结构如下图所示。

SSD 利用了多尺度的特征图做检测。模型的输入图片大小是 300 × 300 300 \times 300 300×300。

SSD; SSD 网络结构

采用 VGG16 做基础模型,首先VGG16是在 ILSVRC CLS-LOC 数据集上做预训练。

然后,分别将 VGG16 的全连接层 fc6 和 fc7 转换成 3 × 3 3 \times 3 3×3 卷积层 conv6 和 1 × 1 1 \times 1 1×1 卷积层 conv7,同时将池化层 pool5 由原来的 s t r i d e = 2 stride=2 stride=2 的 $2\times 2 $ 变成 s t r i d e = 1 stride=1 stride=1 的 3 × 3 3\times 3 3×3,为了配合这种变化,采用了一种 Atrous Algorithm,就是 conv6 采用扩张卷积(空洞卷积),在不增加参数与模型复杂度的条件下指数级扩大了卷积的视野,其使用扩张率(dilation rate)参数,来表示扩张的大小。

如下图所示:

  • (a)是普通的 3 × 3 3\times3 3×3 卷积,其视野就是 3 × 3 3\times3 3×3
  • (b)是扩张率为2,此时视野变成 7 × 7 7\times7 7×7
  • ©扩张率为4时,视野扩大为 15 × 15 15\times15 15×15,但是视野的特征更稀疏了。

Conv6 采用 3 × 3 3\times3 3×3 大小但 d i l a t i o n r a t e = 6 dilation rate=6 dilationrate=6 的扩展卷积。然后移除 Dropout 层和 fc8 层,并新增一系列卷积层,在检测数据集上做 fine-tuning。

SSD; SSD 扩张卷积/空洞卷积

2.3 SSD 训练与预测

在训练过程中,首先要确定训练图片中的 ground truth (真实目标)与哪个先验框来进行匹配,与之匹配的先验框所对应的边界框将负责预测它。

在 YOLO 中:ground truth 的中心落在哪个单元格,该单元格中与其 IoU 最大的边界框负责预测它。

在 SSD 中:处理方式不一样,SSD 的先验框与 ground truth 有2个匹配原则。

  • 第1原则:对于图片中每个 ground truth,找到与其 IoU 最大的先验框,该先验框与其匹配,这样,可以保证每个 ground truth 一定与某个先验框匹配。通常称与 ground truth 匹配的先验框为正样本,反之,若一个先验框没有与任何 ground truth 进行匹配,那么该先验框只能与背景匹配,就是负样本。
    • 然而,由于一个图片中 ground truth 是非常少的,而先验框却很多,如果仅按上述原则匹配,很多先验框会是负样本,正负样本极其不平衡,所以有下述第2原则。
  • 第2原则:对于剩余的未匹配先验框,若某个 ground truth 的 IoU \text{IoU} IoU 大于某个阈值(一般是0.5),那么该先验框也与这个 ground truth 进行匹配。这意味着某个 ground truth 可能与多个先验框匹配,这是可以的。但是反过来却不可以,因为一个先验框只能匹配一个 ground truth,如果多个 ground truth 与某个先验框 IoU \text{IoU} IoU 大于阈值,那么先验框只与 IoU 最大的那个 ground truth 进行匹配。

第2原则一定在第1原则之后进行。

仔细考虑一下这种情况,如果某个 ground truth 所对应最大 IoU \text{IoU} IoU 小于阈值,并且所匹配的先验框却与另外一个 ground truth 的 IoU \text{IoU} IoU 大于阈值,那么该先验框应该匹配谁,答案应该是前者,首先要确保每个 ground truth 一定有一个先验框与之匹配。

但是,这种情况存在的概率很小。由于先验框很多,某个 ground truth 的最大 IoU \text{IoU} IoU 肯定大于阈值,所以可能只实施第二个原则既可以了。

SSD; SSD 训练与预测

上图为一个匹配示意图,其中绿色的GT是 ground truth,红色为先验框,FP表示负样本,TP表示正样本。

尽管一个 ground truth 可以与多个先验框匹配,但是 ground truth 相对先验框还是太少了,所以负样本相对正样本会很多。

为了保证正负样本尽量平衡,SSD 采用了hard negative mining算法,就是对负样本进行抽样,抽样时按照置信度误差(预测背景的置信度越小,误差越大)进行降序排列,选取误差的较大(置信度小)的 t o p − k top-k top−k 作为训练的负样本,以保证正负样本比例接近 1 : 3 1:3 1:3。

3.YOLO V2

论文链接:https://openaccess.thecvf.com/content_cvpr_2017/papers/Redmon_YOLO9000_Better_Faster_CVPR_2017_paper.pdf
代码链接:https://github.com/longcw/YOLO2-pytorch

YOLO V2; YOLO V2 算法简介

1) 算法简介

相比于 YOLO V1,YOLO V2 在精度、速度和分类数量上都有了很大的改进。YOLO V2使用DarkNet19作为特征提取网络,该网络比 YOLO V2 所使用的 VGG-16 要更快。YOLO V2使用目标分类和检测的联合训练技巧,结合Word Tree等方法,使得 YOLO V2的检测种类扩充到了上千种,分类效果更好。

下图展示了 YOLO V2 相比于 YOLO V1 在提高检测精度上的改进策略。

YOLO V2; YOLO V2 改进策略

2) 性能效果

YOLO V2 算法在VOC 2007 数据集上的表现为 67 FPS 时,mAP 为 76.8,在 40FPS时,mAP 为 78.6。

3) 缺点不足

YOLO V2 算法只有一条检测分支,且该网络缺乏对多尺度上下文信息的捕获,所以对于不同尺寸的目标检测效果依然较差,尤其是对于小目标检测问题。

4. RetinaNet

论文链接:https://openaccess.thecvf.com/content_ICCV_2017/papers/Lin_Focal_Loss_for_ICCV_2017_paper.pdf
代码链接:https://github.com/yhenon/pytorch-retinanet

RetinaNet; RetinaNet 算法简介

1) 算法简介

尽管一阶段检测算推理速度快,但精度上与二阶段检测算法相比还是不足。RetinaNet论文分析了一阶段网络训练存在的类别不平衡问题,提出能根据 Loss 大小自动调节权重的 Focal loss,代替了标准的交叉熵损失函数,使得模型的训练更专注于困难样本。同时,基于 FPN 设计了 RetinaNet,在精度和速度上都有不俗的表现。

2) 性能效果

RetinaNet在保持高速推理的同时,拥有与二阶段检测算法相媲美的精度( COCO m A P @ . 5 = 59.1 % mAP@.5=59.1\% mAP@.5=59.1%, m A P @ [ . 5 , . 95 ] = 39.1 % mAP@[.5, .95]=39.1\% mAP@[.5,.95]=39.1%)。

5.YOLO V3

论文链接:https://arxiv.org/pdf/1804.02767.pdf
代码链接:https://github.com/ultralytics/YOLOv3

YOLO V3; YOLO V3 算法简介

1) 算法简介

相比于 YOLO V2,YOLO V3 将特征提取网络换成了 DarkNet53,对象分类用 Logistic 取代了 Softmax,并借鉴了 FPN 思想采用三条分支(三个不同尺度/不同感受野的特征图)去检测具有不同尺寸的对象。

2) 性能效果

YOLO V3 在 VOC 数据集,Titan X 上处理 608 × 608 608 \times 608 608×608 图像速度达到 20FPS,在 COCO 的测试数据集上 m A P @ 0.5 mAP@0.5 mAP@0.5 达到 57.9 % 57.9\% 57.9%。其精度比 SSD 高一些,比 Faster RCNN 相比略有逊色(几乎持平),比 RetinaNet 差,但速度是 SSD 、RetinaNet 和 Faster RCNN 至少 2 倍以上,而简化后的 YOLO V3 tiny 可以更快。

3) 缺点不足

YOLO V3采用MSE作为边框回归损失函数,这使得 YOLO V3对目标的定位并不精准,之后出现的IOU,GIOU,DIOU和CIOU等一系列边框回归损失大大改善了 YOLO V3对目标的定位精度。

6.YOLO V4

论文链接:https://arxiv.org/pdf/2004.10934
代码链接:https://github.com/Tianxiaomo/pytorch-YOLOv4

YOLO V4; YOLO V4 算法简介

1) 算法简介

相比于 YOLO V4,YOLO V4 在输入端,引入了 Mosaic 数据增强、cmBN、SAT 自对抗训练;在特征提取网络上,YOLO V4 将各种新的方式结合起来,包括 CSPDarknet53,Mish激活函数,Dropblock;在检测头中,引入了 SPP 模块,借鉴了 FPN+PAN 结构;在预测阶段,采用了CIOU作为网络的边界框损失函数,同时将 NMS 换成了DIOU_NMS 等等。总体来说,YOLO V4具有极大的工程意义,将近年来深度学习领域最新研究的tricks都引入到了 YOLO V4做验证测试,在 YOLO V3的基础上更进一大步。

2) 性能效果

YOLO V4在 COCO 数据集上达到了 43.5 % A P 43.5\%AP 43.5%AP( 65.7 % A P 50 65.7\% AP50 65.7%AP50),在 Tesla V100 显卡上实现了 65 fps 的实时性能,下图展示了在 COCO 检测数据集上 YOLO V4 和其它 SOTA 检测算法的性能对比。

YOLO V4; YOLO V4 性能效果

7.YOLO V5

代码链接:https://github.com/ultralytics/YOLOv5

YOLO V5; YOLO V5 算法简介

1) 算法简介

YOLO V5 与 YOLO V4 有点相似,都大量整合了计算机视觉领域的前沿技巧,从而显著改善了 YOLO 对目标的检测性能。相比于 YOLO V4,YOLO V5 在性能上稍微逊色,但其灵活性与速度上远强于 YOLO V4,而且在模型的快速部署上也具有极强优势。

2) 性能效果

如下图展示了在 COCO 检测数据集上 YOLO V5 和其它 SOTA 检测算法的性能对比。

YOLO V5; YOLO V5 性能效果

8.推荐学习

可以点击 B站 查看视频的【双语字幕】版本

【字幕+资料下载】斯坦福CS231n | 面向视觉识别的卷积神经网络 (2017·全16讲)

ShowMeAI 斯坦福 CS231n 全套解读

ShowMeAI 系列教程推荐

showmeai用知识加速每一次技术成长

深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记 本篇内容是组织的系列教程入口,本教程依托于斯坦福Stanford出品的【】方向专业课程,根据课程视频内容与课程笔记,结合补充资料,针对深度学习与计算机视觉方向的主题做了全面梳理与制作,希望给大家提供专业细致而直观易懂的学习教程。等主题。 阅读详情

相关推荐

【CV论文精读】Pedestrian Detection Based on YOLO Network Model 基于YOLO的行人检测

摘要——经过深度网络后,会有一些行人信息的丢失,会造成梯度的消失,造成行人检测不准确。本文改进了YOLO算法的网络结构,提出了一种新的网络结构YOLO-R。首先,在原有YOLO网络的基础上增加了三个直通层。直通层由路由层和重组层组成。其作用是将浅层行人特征连接到深层行人特征,并链接高分辨率和低分辨率行人特征。路线层的作用是将指定层的行人特征信息传递到当前层,然后使用重组层对特征图进行重组,使当前引入的路线层特征与下一层的特征图相匹配。

weixin_44184852的博客 1670

实战深度学习目标检测:RCNN (5)

深度学习目标检测:SSD SSD: Single Shot MultiBox Detector 目标检测近年来已经取得了很重要的进展,主流的算法主要分为两个类型(参考RefineDet): (1)two-stage方法,如R-CNN系算法,其主要思路是先通过启发式方法(selective search)或者 CNN网络(RPN)产生一系列稀疏的候选框,然后对这些候选框进行分类与回归,two-stage方法的优势是准确度高; (2)one-stage方法,如Yolo和SSD,其主要思路是均匀地在图片的不同位置

leva的博客 489

cv君独家视角 | AI内幕系列二十五:精选目标检测3——yolo1、yolo2、yolo3和SSD的网络结构汇总对比

学习前言 各个网络的结构图与其实现代码 1、yolo1 2、yolo2 3、yolo3 4、SSD 总结 学习前言 ……最近在学习yolo1、yolo2和yolo3,事实上它们和SSD网络有一定的相似性,我准备汇总一下,看看有什么差别。 各个网络的结构图与其实现代码 1、yolo1 在这里插入图片描述 由图可见,其进行了二十多次卷积还有四次最大池化,其中3x3卷积用于提取特征,1x1卷积用于压缩特征,最后将图像压缩到7x7xfilter的大小,相当于将整个图像划分为7x7

cv君的博客 3万+

基于图像的目标检测算法YOLO 和 SSD 的区别是什么?

YOLO:YOLO将输入图像划分为SxS个网格,并为每个网格预测B个边界框,以及每个边界框的物体类别和置信度。在每个特征图单元上,SSD预测边界框的相对偏移量和尺寸,并结合先验框的坐标和尺寸计算真实的边界框。然而,由于其使用多尺度特征图和较多的默认框,SSD在计算上可能比YOLO更昂贵。- SSD:SSD可以更好地检测各种大小的物体,因为它利用多尺度特征图来预测边界框。- YOLO:YOLO对小物体的检测性能较差,因为使用单一尺度的特征图限制了其捕捉不同大小物体的能力。

changjuanfang的专栏 5935

OpenCV-Python实战(18)——深度学习简介与入门示例

深度学习已经成为机器学习中最受欢迎和发展最快的领域。自 2012 年深度学习性能超越机器学习等传统方法以来,深度学习架构开始快速应用于包括计算机视觉在内的众多领域。深度学习的常见应用包括语音识别、图像识别、自然语言处理、推荐系统等等。在本文中,首先介绍传统机器学习方法与深度学习间的差异,然后将介绍图像分类和对象检测中常见的深度学习架构,最后,将介绍深度学习 Python 库 Keras,并通过实战来推开深度学习的大门。

盼小辉丶的博客 2万+

OpenCV-Python实战(19)——OpenCV与深度学习的碰撞

OpenCV 中包含深度神经网络 (deep neural networks, DNN) 模块,可以使用深度神经网络实现前向计算(推理阶段),使用一些流行的深度学习框架进行预训练的网络(例如 Caffe、TensorFlow、Pytorch、Darknet等)就可以轻松用在 OpenCV 项目中了。在本文中,我们将通过实战学习将流行的深度学习模型架构应用于目标检测和图像分类中,构建 OpenCV 计算机视觉项目。

盼小辉丶的博客 2万+

【计算机视觉】目标检测中Faster R-CNN、R-FCN、YOLO、SSD等算法的讲解(图文解释 超详细必看)

【计算机视觉】目标检测中Faster R-CNN、R-FCN、YOLO、SSD等算法的讲解(图文解释 超详细必看)

showswoller的博客 3734

HH.rar_1515HH.com_1515hh_WWW_1516HH_COM_www. 394hh.com

一个简单的关于 加减乘除的运算的 小程序的源代码

经典目标检测神经网络 - RCNN、SSD、YOLO

One-Stage:YOLO系列(v1-v8),SSD系列(R-SSD、DSSD、FSSD等),Retina-Net,DetectNet,SqueezeDet。Two-Stage:RCNN系列(Fast-RCNN、Faster-RCNN、Mask-RCNN),SPPNet,R-FCN。

Life And Code 5677

用VINS-Fusion跑通EuRoC数据集:Ubuntu22.04+ROS2环境下的保姆级评测指南

本文详细介绍了在Ubuntu22.04和ROS2 Humble环境下使用VINS-Fusion处理EuRoC数据集的完整流程。从环境配置、数据集转换到参数调优和性能评估,提供了一套全面的多传感器融合分析方案,帮助开发者在无人机精准定位场景中实现高效部署与优化。

weixin_29212867的博客 518

基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制与龙伯格观测器设计​

本文介绍了基于Simulink的永磁同步电机(PMSM)无位置传感器矢量控制方法,重点讲解了龙伯格观测器的设计与实现。主要内容包括:1)系统架构与数学推导,通过静止坐标系状态方程和极点配置构建观测器;2)Simulink建模步骤,从电机模型搭建到观测器核心代码实现;3)仿真结果对比分析,显示龙伯格观测器相比滑模观测器具有更好的平滑性和抗噪能力;4)工程部署建议,包括参数在线辨识、低速补偿策略和代码生成优化。该方法实现了全速域无感运行,稳态转速误差小于1%,为低成本高可靠性电机控制提供了有效解决方案。

amy_mhd的博客 163

深度学习与计算机视觉教程:斯坦福CS231n · 全套笔记解读

本教程依托于 Stanford 斯坦福大学的《CS231n:深度学习与计算机视觉》,对深度学习与计算机视觉方向的图像分类、CNN、RNN、目标检测、图像分割、生成模型等各个主题做了体系化的梳理

ShowMeAI研究中心 1万+

灰度重心法实战:从原理到MATLAB代码实现激光条纹中心线提取

本文详细介绍了激光条纹中心线提取的核心方法——灰度重心法。通过物理类比阐释其原理,并提供从图像预处理到MATLAB代码实现的完整实战教程。文章重点解析了算法流程、关键参数调整及常见问题避坑指南,帮助读者快速掌握这一机器视觉与三维测量中的基础且高效的技术。

cake8的博客 464

动手深度学习13:计算机视觉——目标检测:锚框算法原理与实现、SSD、R-CNN

一、区域卷积神经网络系列(R-CNN) 参考《区域卷积神经网络系列(R-CNN)》 1.1 R-CNN 使用启发式算法选择锚框 使用预训练模型对每个锚框进行特征提取(每个锚框当做一张图片) 将每个锚框的提取特征及其标注的类别作为一个样本,训练多SVM对每个锚框进行分类,每个支持向量机用来判断样本是否属于某一个类别。(计算机视觉在神经网络之前主流分类器是SVM) 将每个锚框的提取特征及其标注的标注的边界框作为一个样本,训练线性回归模型来预测真实边界框 RoI 池化层 这里有一个问题:锚框的大小是不一

qq_56591814的博客 6839

NOR Flash WP引脚写保护详解:原理、误区与实战排查

在嵌入式系统中,数据存储的可靠性直接关系到设备稳定性,而NOR Flash因其可随机读取、启动执行等特性,广泛应用于固件存储与参数保存。然而,不少开发者在设计写保护策略时,对硬件写保护引脚WP#的理解存在偏差,导致固件被意外擦除、升级失败甚至设备变砖。要真正实现可靠的写保护,必须理解软件层面的块保护寄存器(BP位)与硬件引脚WP#的协同关系:BP位负责划定保护区域,WP#则负责锁定保护配置,二者缺一不可。这种分层机制在Bootloader防篡改、量产参数防覆盖、QSPI高速模式等场景中尤为关键。本文从NOR

weixin_29185493的博客 111

别再只改config了!YOLO/RT-DETR多通道输入实战:数据集结构、多卡训练与参数优先级避坑指南

本文详细解析了YOLO/RT-DETR模型在多通道输入(如8通道多光谱图像)中的实战应用,涵盖数据集结构优化、数据加载器改造、模型参数调优及多卡训练配置。针对常见的多通道输入报错问题,提供了系统的解决方案和性能优化技巧,帮助开发者高效实现非标准数据格式的适配与训练。

weixin_30955617的博客 398

人工智能|计算机视觉|深度学习CV岗面试经典问题总结

马上又到了金三银四的面试季啦。对于人工智能这个非常**卷**的行业来说,想找到一份好的实习或者工作还是很有难度的。下面总结一下**计算机视觉**方向常见的面试题目,赶快收藏,背起来吧!

weixin_63866037的博客 2547

【MDC开发者课程】MDC功能软件-归控算法介绍

规控算法

博客标题不能为空我也没办法 1844

YOLO系列详解 目标检测

yolo v1 前言 相比同年的fast-rcnn和ssd都没有优势 详解 B=2,Pr(Object)为0或者1 在v1中没有anchor的概念,预测的xywh是直接预测的box的位置,不像fast-rcnn和ssd中预测的这四个值都是相对我们anchor的回归参数。 在预测时,输出的结果既包含了该box为某一个目标的概率,又包含了重合程度,与fast-rcnn和ssd直接预测的目标概率不一样。 存在的问题: 对群体小目标效果很差,比如一群鸟。因为对每个cell只预测2个boundi

EMIvv的博客 3386

2025年从零开始:构建你的首个ComfyUI工作流-ComfyUI入门教程

然而,由于它拥有众多的插件节点,以及较为复杂的操作流程,学习起来相对困难。以前面搭建的文生图工作流为例,首先点击功能区的【保存】,然后你的浏览器会出来一个弹窗,你可以进行文件命名,点击确定后浏览器会下载该文件,也就是带“json”后缀的文件,这样我们的工作流就打包成一份文件了。思考一下前面说的,节点是不是需要下载安装才能使用,而我们复用别人的工作流,他用的节点你不一定下载了,因为目前有600多个节点,你不可能全部下载了吧,所以我们日后使用别人的工作流,你会经常出现这样的问题。

weixin_59486588的博客 1457

k3s cpu load 和 cpu 使用率很高处理

在这期间还执行过缩减 sqlite3 数据库操作,不知道是哪个操作起了作用,亦或者两个操作有影响,删除 ns 促进了数据库缩减的执行(没删除之前数据库缩减不成功,db文件大小未减小,但不确定是不是执行完 VACUUM 之后需要时间 db 文件才会减小,或者是因为删除了 ns 才导致其减小),再或者是两个操作都起了作用。kubectl get ns 发现有很多卡在删除状态的 ns。k3s 官网关于这个问题的谈论。执行如下脚本删除掉这些 ns。有人详细说过这个问题。

weixin_40548182的博客 685

从 YOLOv1 到 YOLOv13:十年进化,一文读懂目标检测的「速度与激情」

YOLO系列目标检测算法发展综述 YOLO系列从2015年至今已迭代至v13版本,始终追求速度与精度的平衡。核心创新包括:v1首创单阶段端到端检测;v2引入锚框和多尺度训练;v3采用深度残差网络和三尺度输出;v4系统整合工程优化技巧;v5完善PyTorch生态链;v6-v8逐步实现Anchor-Free和多功能统一;v9改进梯度信息流;v10消除NMS后处理;最新版本开始融合注意力机制和超图建模。该系列通过持续优化网络结构、训练策略和工程部署方案,在保持实时性的同时不断提升检测性能,广泛应用于自动驾驶、视频

2501_93716422的博客 1975

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

一阶目标检测(one-stage object detection)整理归纳

本文不详细介绍各种神经网络的细节和具体流程,主要在于归纳其特点并加以比较,希望让大家对一阶目标检测的发展过程和改进方法有个比较清晰的认知。

SeanCYX_007的博客 6070

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

YOLO目标检测入门:核心概念与实战指南

目标检测是计算机视觉的基础任务,通过深度学习技术实现对图像中物体的定位与分类。YOLO(You Only Look Once)作为单阶段检测算法的代表,采用端到端的回归策略,将输入图像划分为网格单元进行并行预测,显著提升了检测效率。其核心技术包括多尺度特征融合、Anchor Box机制(最新版本已升级为Anchor-free设计)和优化的损失函数。在实际应用中,YOLO系列凭借优异的精度-速度平衡,广泛应用于智能安防、自动驾驶、工业质检等领域。以YOLOv8为例,其创新的CSPDarknet53骨干网络和D

weixin_30266885的博客 403

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

计算机视觉小结

计算机视觉(Computer Vision, CV)是人工智能 (AI) 中最引人注目的领域之一,它让机器能够理解和解释视觉世界。通过捕捉图像和视频,CV 技术可以识别人脸、物体、动作,以及周围的环境。在自动驾驶、安防监控、医疗影像分析等诸多领域,计算机视觉都有着广泛而深入的应用,目前已经成为推动技术进步的重要力量。计算机视觉(CV)是一门研究如何让计算机从数字图像或视频中获得有意义的信息的学科。它从图像处理和信号处理发展而来,结合了计算机科学、数学和工程等多学科知识。

weixin_42329812的博客 1316
上一篇: 人工智能 | ShowMeAI资讯日报 #2022.06.10
下一篇: 人工智能 | ShowMeAI资讯日报 #2022.06.09
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值