吴恩达深度学习——对象检测

embedded/2025/2/6 9:36:25/

内容来自https://www.bilibili.com/video/BV1FT4y1E74V,仅为本人学习所用。

文章目录

  • 对象定位
  • 特征点检测
  • 基于滑动窗口的目标检测算法
    • 原理
    • 将全连接层转化成卷积层
    • 通过卷积实现滑动窗口检测算法
  • YOLO
    • Bounding Box预测
    • 交并比
    • 非极大值抑制
    • Anchor Box
    • YOLO检测
      • 训练集中
      • 预测时
    • 带区域的卷积网络

对象定位

在这里插入图片描述
之前检测一张图片只是检测是不是车,现在进一步地,不仅仅检测是不是车,而且要标记出其位置,这就是对象定位问题。

在这里插入图片描述
首先对图片进行分类,判断图片的类别,这个过程是之前分享过的一般过程:图片使用CNN后,经过softmax激活函数进行分类。如果需要附加定位功能,那么CNN的输出不仅要输出分类,而且还要输出定位框的坐标信息。因此,训练集的数据不仅仅要包含要预测的对象分类标签,还需要包含表示边界框的四个坐标数字。

定义图片左上角位置为(0,0),右下角位置为(1,1),定位框的中心点坐标为(bx,by),定位框宽bw,高bh。

定义目标标签 Y Y Y

  • pc:是否包含对象,若包含行人、车、摩托车,则值为1;若是背景,则值为0。
  • bx、by、bw、bz:若检测到对象,输出边界框的参数。
  • c1、c2、c3:若pc=1,则输出,表示该对象属于行人、车,摩托车中的哪一类。
    在这里插入图片描述
  • 第一张图中有车,对应的目标标签 y y y中, p c p_c pc(表示是否存在目标)为1说明存在目标, b x b_x bx b y b_y by b h b_h bh b w b_w bw为汽车边界框的相关参数,类别标签 c 1 c_1 c1为0(行人)、 c 2 c_2 c2为1(汽车)、 c 3 c_3 c3为0(摩托车)说明该对象被分类为车。
  • 第二张图中没有对象,对应的目标标签 y y y中, p c p_c pc为0, b x b_x bx b y b_y by b h b_h bh b w b_w bw以及 c 1 c_1 c1 c 2 c_2 c2 c 3 c_3 c3都可以设为“?”表示无参数。

特征点检测

在这里插入图片描述
如果要检测特征,比如人脸检测,标记了64处特征。输出包括是否为人脸的判断,以及人脸64个关键点的坐标,即 l 1 x l_{1x} l1x l 1 y l_{1y} l1y l 2 x l_{2x} l2x l 2 y l_{2y} l2y,… , l 64 x l_{64x} l64x l 64 y l_{64y} l64y ,共计129(64个标签,x和y两个坐标和一个是不是人脸的判断64*2+1)个输出值。

基于滑动窗口的目标检测算法

原理

在这里插入图片描述
要检测和定位车。准备训练集时,可以先重点关注图片是否包含车和不包含车,经过CNN输出预测值。然后实现滑动窗口目标检测。具体步骤如下:
在这里插入图片描述
首先选定一个特定大小的窗口(红色小方块)输入卷积网络,然后窗口按照一定的步长滑动来遍历图片上的像素。然后选定更大的窗口继续遍历。这个遍历过程需要重复多次。在上述的遍历过程中,总有一个窗口能够对应上车的位置,输出标签为1。
在这里插入图片描述
由于需要在大量不同位置和尺寸上滑动窗口,计算量较大。

将全连接层转化成卷积层

将全连接层转化为卷积层,可以减少参数数量,降低计算量,减轻内存负担。
在这里插入图片描述
上部分图:输入一个 14 × 14 × 3 14×14×3 14×14×3的特征图,使用了 16 16 16个大小为 5 × 5 5×5 5×5的卷积核进行卷积操作。 H w = ⌊ H i n − f + 2 p s ⌋ + 1 H_{w}=\lfloor\frac{H_{in}-f + 2p}{s}\rfloor + 1 Hw=sHinf+2p+1 H h = ⌊ H i n − f + 2 p s ⌋ + 1 H_{h}=\lfloor\frac{H_{in}-f + 2p}{s}\rfloor + 1 Hh=sHinf+2p+1,则输出特征图的高度和宽度为 ⌊ 14 − 5 1 ⌋ + 1 = 10 \lfloor\frac{14 - 5}{1}\rfloor + 1 = 10 1145+1=10,输出特征图的通道数等于卷积核的数量,即 16 16 16。所以卷积层输出特征图的尺寸为 10 × 10 × 16 10×10×16 10×10×16

池化层采用最大池化,池化窗口大小为 2 × 2 2×2 2×2,步长为 2 2 2,有 H w = ⌊ H i n − f + 2 p s ⌋ + 1 H_{w}=\lfloor\frac{H_{in}-f+2p}{s}\rfloor + 1 Hw=sHinf+2p+1 H h = ⌊ H i n − f + 2 p s ⌋ + 1 H_{h}=\lfloor\frac{H_{in}-f+2p}{s}\rfloor + 1 Hh=sHinf+2p+1,输出特征图的高度和宽度为 ⌊ 10 − 2 2 ⌋ + 1 = 5 \lfloor\frac{10 - 2}{2}\rfloor + 1 = 5 2102+1=5。池化层不改变通道数,输出特征图尺寸为 5 × 5 × 16 5×5×16 5×5×16

在全连接层,第一个全连接层:将池化层输出的三维特征图( 5 × 5 × 16 5×5×16 5×5×16)展平为一维向量,其长度为 5 × 5 × 16 = 400 5×5×16 = 400 5×5×16=400,即第一个全连接层的输入神经元个数为 400 400 400,输出神经元个数也为 400 400 400。第二个全连接层:输入为第一个全连接层的输出,即 400 400 400个神经元,输出同样为 400 400 400个神经元。

使用Softmax函数进行分类,输出 4 4 4个类别的概率分布,最终输出 y y y

下部分图:之前的相同,在全连接层将其转为卷积层:对于第一个全连接层,将池化层输出的 5 × 5 × 16 5×5×16 5×5×16特征图使用400个 5 × 5 × 16 5×5×16 5×5×16的过滤器展平成一维向量,其长度为 5 × 5 × 16 = 400 5×5×16 = 400 5×5×16=400,输出尺寸为 1 × 1 × 400 1×1×400 1×1×400(代入公式计算)。不再将其看作一个有400节点的集合,而是看成一个卷积层。第二个全连接层输入为 1 × 1 × 400 1×1×400 1×1×400,输出同样为 400 400 400个神经元,输出尺寸为 1 × 1 × 400 1×1×400 1×1×400变成卷积层。

通过卷积实现滑动窗口检测算法

在这里插入图片描述
如图,将 14 × 14 × 3 14\times14\times3 14×14×3尺寸的特征图填充成 16 × 16 × 3 16\times16\times3 16×16×3的特征图,使用大小为 5 × 5 5\times5 5×5的卷积核进行卷积…最后得到 2 × 2 × 4 2\times2\times4 2×2×4的输出。将全连接层转为卷积层后,不必将图片分割为4个部分,而是作为一张图片输入给卷积网络计算。比如图中检测了红绿黄紫四个区域,每一个区域经过一层一层的过滤器,在 2 × 2 × 4 2\times2\times4 2×2×4的输出上,左上角表示红色区域的检测结果、右上角表示绿色区域的检测结果、左下角现实黄色区域的检测结果和右下角显示紫色区域的检测结果。

在过程中可以看到有很多区域的计算都是重复的,但是卷积网络在传播过程中可以共享大量的计算,提高计算效率。
在这里插入图片描述
在应用时,不必在图片上连续进行卷积,而是一次性对一张图片得到所有的预测结果,如果足够幸运,神经网络可以直接识别出汽车位置。

YOLO

Bounding Box预测

在这里插入图片描述
使用卷积实现滑动窗口时,滑动步长如果太细腻,会消耗大量的计算资源;如果粗糙,会出现如图的情况,定位框不能完全定位目标位置。YOLO算法可以得到更精准的定位框。
在这里插入图片描述
对于一张100*100的图片,在图像上放个网格,这里取3*3(实际中更大)。对每一个网格使用分类和定位。
在这里插入图片描述
对于训练标签 y y y,第一个网格中无对象,pc=0…绿色框和右边的紫色框中都有对象,类别为汽车,这时候,取两个对象的中点,将该对象分配给包含对象中点的格子(将左边的汽车类别分配给绿色框而不是右边的紫色框,将右边的车分配给黄色框),认为紫色框中无对象…

图像输出为一个 3 × 3 × 8 3×3×8 3×3×8的张量,其中 3 × 3 3×3 3×3对应网格的数量, 8 8 8对应每个网格的标签维度( 1 1 1 p c p_c pc + 4 4 4个边界框参数 + 3 3 3个类别概率)。

交并比

在这里插入图片描述
对于实际大小的定位框(红色),若网络定位的定位框,想要知道这个结果是好还是坏,计算其交并比即可。

交并比函数IoU是两个边界框交集的面积与并集的面积之比,其值介于0到1之间。IoU值为0时,表示两个边界框没有任何重叠;IoU值为1时,代表两个边界框完全重合。

对于边界框 A A A B B B

  • 首先计算 A A A B B B的交集面积 S i n t e r s e c t i o n S_{intersection} Sintersection。可以通过确定两个边界框在水平和垂直方向上的重叠区域,进而计算重叠部分的面积。比如,设 A A A的左上角坐标为 ( x A 1 , y A 1 ) (x_{A1}, y_{A1}) (xA1,yA1),右下角坐标为 ( x A 2 , y A 2 ) (x_{A2}, y_{A2}) (xA2,yA2) B B B的左上角坐标为 ( x B 1 , y B 1 ) (x_{B1}, y_{B1}) (xB1,yB1),右下角坐标为 ( x B 2 , y B 2 ) (x_{B2}, y_{B2}) (xB2,yB2)。则交集的左上角坐标为 ( m a x ( x A 1 , x B 1 ) , m a x ( y A 1 , y B 1 ) ) (max(x_{A1}, x_{B1}), max(y_{A1}, y_{B1})) (max(xA1,xB1),max(yA1,yB1)),右下角坐标为 ( m i n ( x A 2 , x B 2 ) , m i n ( y A 2 , y B 2 ) ) (min(x_{A2}, x_{B2}), min(y_{A2}, y_{B2})) (min(xA2,xB2),min(yA2,yB2)) ,根据坐标计算出交集面积。
  • 接着计算 A A A B B B的并集面积 S u n i o n S_{union} Sunion。并集面积等于 A A A的面积 S A S_A SA加上 B B B的面积 S B S_B SB减去交集面积 S i n t e r s e c t i o n S_{intersection} Sintersection,即 S u n i o n = S A + S B − S i n t e r s e c t i o n S_{union}=S_A + S_B - S_{intersection} Sunion=SA+SBSintersection
  • 最后,交并比 I o U = S i n t e r s e c t i o n S u n i o n IoU = \frac{S_{intersection}}{S_{union}} IoU=SunionSintersection

约定IOU大于等于0.5说明检测正确。

非极大值抑制

对象检测可能存在一个问题是算法可能对同一个对象做出多次检测,可以使用非极大值抑制来检测对象一次。
在这里插入图片描述
在19*19的网格中,车所在的网格应该是中心点所在的网格。对于左边的车,几个框会认为它的网格中也包含车。

在右图中,对于右边的车,检测出3个概率,分别是0.9,0.6,0.7。非极大值抑制算法会找出这三个中的极大值0.9并保存,然后和这个定位框交并(IOU)程度很高的其他框0.6和0.7的被抑制。接下来继续找其他的框。找到了左边的0.8和0.7,概率最高的0.8处的框被认为是一辆车,同时抑制其他的定位框0.7,最后得到两个预测结果。

Anchor Box

目前,一个格子只能输出一个对象。想要输出多个对象,需要使用Anchor Box
在这里插入图片描述
在左图中,车与人的中心点几乎在同一个位置,依靠单独的 y y y标签不能同时显示二者的存在。因此可以定义两个Anchor box,其中,Anchor box1锚定人,而Anchor box2锚定车,输出标签y由原来的扩展为2倍分别表示Anchor box1和Anchor box2。

之前,训练图像中的每个目标被分配到包含该目标中点的网格单元。这种方式简单直接,仅依据目标中点的位置来确定所属网格。

使用两个Anchor box之后,训练图像中的每个目标被不仅被分配到网格中,还被分配到与该网格单元中具有最高交并比的Anchor box所在的网格单元,对象在目标标签中的编码方式为(grid cell, anchor box)。

YOLO检测

训练集中

在这里插入图片描述
左侧是一张被划分为 3 × 3 3\times3 3×3 网格的图像,有一辆汽车位于右下角的网格中。标注了三种目标类别,分别是 1 - pedestrian(行人)、2 - car(汽车)、3 - motorcycle(摩托车)。

定义两种Anchor box形状分别为Anchor box1(紫色框1)和Anchor box2(紫色框2),定义标签 y y y 3 × 3 × 2 × 8 3\times3\times2\times8 3×3×2×8的张量。 2 2 2 说明每个网格有 2 个Anchors box。上半部分是Anchor box1,下半部分是2。

对于包含汽车的网格,由于该网格内有汽车目标,且汽车的中心点就在该网格,故算法认为该网格中确实包含汽车。同时计算汽车形状与两个Anchor box的交并比,锚定到交并比高的对应的Anchor box2中,所以下半部分有值。最后输出标签 y y y

预测时

在这里插入图片描述
不使用非极大值抑制时,假设一张图片被YOLO划分9个网格,这9个网格经过神经网络,每一个成为 3 × 3 × 2 × 8 3\times3\times2\times8 3×3×2×8的网络,只有在绿色框中有相关的值。

在这里插入图片描述

运行非极大值抑制时:
首先,对于每个网格单元,得到 2 个预测的边界框。这是基于模型在每个网格中设置多个Anchor box(这里是 2 个)来预测目标边界框的结果。

其次,去除那些预测为目标的概率较低的边界框。通过设定一个概率阈值,低于该阈值的预测被认为是不可靠的,从而被剔除,以减少后续处理的冗余和错误预测。

最后,对于每个目标类别(行人、汽车、摩托车),分别使用非极大值抑制算法生成最终的预测结果。在多个重叠的预测边界框中,只保留具有最高置信度(概率)的边界框,抑制其他重叠且置信度较低的边界框。

带区域的卷积网络

在这里插入图片描述
使用滑动窗口实现卷积网络分类检测时,可以在中间的图看到,滑动窗口滑动到某些区域的时候,是没有检测目标的。为了减少计算量,只在少数的网格上运行卷积网络分类。可以对图像进行图像分割算法。不同颜色代表不同的分割区域。

分割算法在图中得到一些色块(右图中蓝色、绿色等色块),在这些色块上跑分类器,看看有无对象,如果没有,继续换下一个色块。


http://www.ppmy.cn/embedded/159988.html

相关文章

unordered_map/set的哈希封装

【C笔记】unordered_map/set的哈希封装 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】unordered_map/set的哈希封装前言一. 源码及框架分析二.迭代器三.operator[]四.使用哈希表封装unordered_map/set后言 前言 哈…

mybatis plus 持久化使用技巧及场景

mybatis plus提供了很多强大的持久化工具,新手容易对这些工具使用困难,下面我总结了一下mybatis plus持久化的使用技巧及使用场景。 一、持久化 官方文档:https://baomidou.com/guides/data-interface/ (一)通过ser…

Hive:窗口函数(1)

窗口函数 窗口函数OVER()用于定义一个窗口,该窗口指定了函数应用的数据范围 对窗口数据进行分区 partition by 必须和over () 一起使用, distribute by经常和sort by 一起使用,可以不和over() 一起使用.DISTRIBUTE BY决定了数据如何分布到不同的Reducer上&#xf…

小程序插画共享平台ssm+论文源码调试讲解

第4章 系统设计 一个成功设计的系统在内容上必定是丰富的,在系统外观或系统功能上必定是对用户友好的。所以为了提升系统的价值,吸引更多的访问者访问系统,以及让来访用户可以花费更多时间停留在系统上,则表明该系统设计得比较专…

JavaScript(简称:js)

js-引入方式 内部脚本:将js代码定义在HTML页面内 JavaScript代码必须位于<script></script>标签之间 在HTML文档中&#xff0c;可以在任意地方&#xff0c;放置任意数量的<script> 一般会把脚本置于<body>元素的底部&#xff0c;可改善显示速度 外部…

导入了fastjson2的依赖,但却无法使用相关API的解决方案

今天遇到了一个特别奇怪的问题&#xff0c;跟着视频敲代码&#xff0c;视频中用到了一个将JSON字符串转为对象的 API&#xff0c;需要引入alibaba的fastjson2相关依赖&#xff0c;我引入的依赖跟视频一样。 <!--视频中给的相关依赖 --> <dependency><groupId&g…

【入门】如何使用DeepSeek批量创作短视频

在短视频内容创作日益火爆的今天&#xff0c;如何高效地批量生产优质内容成为许多创作者关注的焦点。本文将介绍如何结合DeepSeek和剪映app来实现短视频的批量创作。 一、前期准备 注册DeepSeek账号下载并安装剪映app准备你的内容选题框架 二、使用DeepSeek生成文案 2.1 设…

Python有关列表的递归练习

寒假打卡第二十天&#xff0c;当前mit6.100L进度(16/26) 今天依然是补一下递归作业。 递归&#xff0c;递归&#xff01;胡不归&#xff1f; 无基例之故&#xff0c;何以层层自缠&#xff1f; 递归&#xff0c;递归&#xff01;胡不止&#xff1f; 栈溢连连作祟&#xff0c;终…