深度学习:经典卷积神经网络和目标检测网络

2023-10-30

最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来,欢迎大家关注我的 个人博客,以及我的github

本文主要讲解关于有关物体检测的相关网络,具体包括R-CNN,Fast R-CNN,Faster R-CNN和Mask R-CNN等。在此之前会先将常见的几个比较有效的CNN网络也作简单的介绍。

一、经典的CNN

1.LeNet

LeNet是最早提出的几个卷积神经网络之一,现在看起其结构比较简单,只有简单的卷积、池化和全连接层,没什么特别的Tricks(技巧)。其示意图如下:

LeNet

2. AlexNet

AlexNet使用了较多的Tricks,比如用ReLU作为激活函数、使用最大池化代替平均池化、Dropout、数据增强等方法。在该网络中还提出了一个名为Local Response Norm的层,但是后来证实该层的加入并没有什么明显的效果。其示意图如下:

AlexNet

3. GoogLeNet

Inception

GoogLeNet设计了一个名为Inception的网络结构(如上图所示),该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。其中1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。GoogLeNet就是多个 Inception 结构串联而形成的。它的参数相对于同时期其他网络来说要少很多,这也保证了其训练速度比较快。

有趣的是GoogLeNet中的L是大写的,这是为了致敬LeNet。其示意图如下:

GoogLeNet

4. VGG Net

VGG Net是一种比较勤奋的网络,它试验了多种不同的卷积核大小的组合,最终挑出来了一个效果最好的版本——VGG 19。VGG 19放弃了较大的卷积核,而使用较小的卷积核,同时也增加了网络的深度,这导致网络的参数过多。不同的VGG版本所采用的结构如下:

VGG

5.ResNet

ResNet全称Residual Networks,可译作残差网络。所谓残差是指观察值与预测值之间的差。当一个神经网络的深度不断增加时,其训练误差会先减少后增大。为了克服该问题,残差网络引入了残差块的概念(如下图所示),残差网络就是由多个残差块组成的。

在下图中,x 是神经网络浅层的输出,x 会先经一个 3 × 3 3\times3 3×3的卷积,再经 ReLU函数激活,再经一个 3 × 3 3\times3 3×3的卷积,得到 F ( x ) F(x) F(x),然后将深层的输出 F(x) 加上浅层的输出 x,将 F ( x ) + x F(x)+x F(x)+x 作为训练的目标。当浅层网络的输出 x 训练的足够好时,只需要另 F(x) = 0 即可保留已经训练好的结果。也就是说浅层网络可以看作是深层网络的子网络,深层网络至少不会比浅层网络有更差的效果。

residual

二、目标检测网络

目标检测就是把图像中的物体用bounding box标注其所在的位置;语义分割是在像素级别上把前景和后景分割出来,同一类别的不同个前景为同一标注;实例分割会把同一类别的不同个前景标注为不同的标记。如上图所示,语义分割会把三只羊打上相同的标注,而实例分割会把三只羊打上不同的标注。

1. Overfeat

Overfeat把网络的1~5看作是特征提取层,不同的任务共享该特征提取层,这种做法减少了特征提取层参数的重复训练。

2. R-CNN

R-CNN(regions with CNN features)的算法流程如下:

(1) 输入图片;

(2) 使用selective search(选择性搜索)生成多个region proposal(建议区域/候选区域),并wrap到固定的尺寸;

(3) 将每个候选区域输入到 CNN 中,提取每个候选区域的特征;

(4) 使用SVM对特征进行分类,对每个特征都建立一个SVM分类器。并对每一个类别进行NMS(非极大值抑制),得到最终的 bounding box。

R-CNN算法最大的缺点就是对于每个 region proposal 都需要重新对其提取特征,而这些 region proposal 之间可能存在重叠,这就导致了大量重复的计算。


selective search

在 selective search 算法提出之前,对于候选框的搜索是用的是一种暴力搜索算法——滑动窗口算法。在该算法中,要使用一个小窗口遍历搜索整张图片,在每个位置上对滑窗内的图片做物体识别。不仅要搜索不同的位置,还要遍历不同的大小,所以非常耗时间。

而在选择性搜索算法中,由于不知道物体的尺寸如何,所以会先设法得到若干个小尺度的候选框,然后再根据小尺度候选框之间的相似性将其合并为尺寸较大的候选框。


非极大值抑制

顾名思义,所谓的非极大值抑制就是抑制不是极大值的元素。在进行目标检测时,对同一个物体可能存在多个候选框,当候选框互不重叠时会全部保留,而当候选框的重叠程度(IOU)超过某个阈值时就会只保留置信度最大的候选框。

NMS

3. Fast R-CNN

Fast R-CNN在R-CNN的基础上做了一定的改进,它会先对整个图片提取特征,然后再选取 region proposal,这就避免了重复的运算。其算法流程如下:

(1) 提前整张图片的特征,得到 feature map(特征图);

(2) 用 selective search 选取若干个 ROI(region of interet,感兴趣的区域),并找到每个 ROI 在特征图上的映射 path(一小块图像);

(3) 用 ROI pooling layer 将path统一到相同的尺寸(因全连接的输入大小是固定的);

(4) 经过两个全连接层,然后对特征分别进行分类和 bounding box 回归,分类就是确定每个bounding box中是什么物体,而 bounding box回归就是对 bounding box 的位置进行调整。分类时使用 softmax 代替SVM,回归时使用了 smooth 的 L1损失。

Fast R-CNN采用了联合训练的方式,即总损失函数=分类损失+回归损失。在测试时还加入了NMS处理,以提高目标检测的质量。

ROI pooling是 SPP-Net的一个精简版,其流程为:

(1) 将ROI映射到特征图的对应区域;

(2) 将映射后的区域根据输出的大小平均分为同等大小的区域。比如,如果输出大小是2$\times$3的,则应将映射后的区域平均分为2行3列个小格。如果不能平均分,则对小格的大小取整;

(3) 对每个小格进行最大池化。

ROI Pooling

4. Faster R-CNN

Faster R-CNN将Fast R-CNN中的 selective search 方法替换为了 Region Proposal Networks(RPN)。RPN用来生成 region proposal,它通过softmax 分类判断 anchors 属于前景还是背景,再利用 bounding box 回归来修正 anchors ,以获得更精确的候选区域。

所谓的 anchors(锚点)就是三组大小不同的矩形框,每组矩形框又包含3个长宽比分别为 1:1,1:2,2:1的矩形框。因为如果对特征图的每个像素点都配备一组 anchors,则候选框会很多,所以实际中会在合适的 anchors 中随机选取 128个 postive anchors 和 128 个 negtive anchors来进行训练。

anchors

5. Mask R-CNN

Mask R-CNN使用 ResNet + 特征金字塔(Feature pyramid network, FPN)获取对应的特征图,并用 ROI Align 代替 ROI Pooling 来保证输出特征图大小固定。此外该网络还可以在标记出 bounding box的基础上,为前景增加 mask。

特征金字塔

特征金字塔是一种多尺度的检测方法,它先讲图片不断的做 2$\times$2 的pooling(下采样),形成多个尺寸由大到小的特征图,再对每一层特征图做 1 × 1 × n 1\times1\times n 1×1×n (n为通道数)的卷积,形成多层只有一个通道的特征图。因为多层特征图呈现出金字塔的形状,所以称作特征金字塔。

FPN

ROI Align

ROI 映射到特征图后的区域的坐标往往是小数,ROI Pooling 所采取的办法是区域的大小直接取整,这样才能在特征图上截取对应的区域。

ROI Align

ROI Align 会在 ROI 的每个小格子中取 n 个采样点,并用双线性插值计算采样点的值,小格子的值就是采样点取最大值/平均值的结果。然后再对映射后的区域进行相应的池化操作。

Mask R-CNN由于使用了 ROI Align算法,所以在一定程度上提高了对小物体的检测精度。

以下是以上几个网络的对比图:

6. YOLO

YOLO(You Only Look Once)是一种 one-stage(单步)的端到端的目标检测算法,基本实现了对视频数据的实时处理。该算法一共有三个版本。

YOLO v1

YOLO v1

YOLO v1将图片平均划分为 7 × 7 = 49 7\times7=49 7×7=49 个网格(grid),每个网格只允许预测出 2 个边框(bounding box),它们很粗糙的覆盖了图片的整个区域。 49 × 2 = 98 49\times2=98 49×2=98 个边框再去除置信度较低的目标窗口,并由NMS去除冗余窗口,得到最终的结果。这种做法虽然降低了 mAP(平均精度均值),但是大幅提升了效率。

在该算法中总损失函数=bounding box 的位置误差 + bounding box 置信度误差 + 对象分类误差。该算法的缺点是容易产生定位错误,并且对小物体的检测效果不好。

YOLO v2

YOLO v2在前一版本的基础上主要做了以下改进:

(1) Batch Normalization

(2) High Resolution Classifier(高分辨率分类器): 先用小图训练,后用大图微调;

(3) Convolutional with Anchor Boxes: 不逐像素扫描,而是每个网格有给定个数个 anchor 来预测 bounding box;

(4) Dimension Cluster(维度聚类): 使用 K-means 算法训练 bounding box,以找到更好的边框宽高维度;

(5) Multi-Scale Training(多尺度训练): 每经过10次训练(10个epoch)就随机选择新的图片尺寸。

YOLO v3

YOLO v3 将输入图像平均分为 13 × 13 13\times13 13×13 个网格,如果 ground truth 中某个物体的中心坐标落在某个网格中,则用该网格来预测该物体(因为每个网格所预测的 bounding box 的个数是有限的),所预测的 bounding box 中只有和 ground truth 的 IOU(交并比)最大的 bounding box 才用来预测该物体。

YOLO v3 还做了以下主要几点改进:

(1) 分类预测:用二元交叉熵损失来代替softmax损失进行类别预测;

(2) 跨尺度预测:提供了3种尺寸不一的边框,用相似的FPN提取这些尺寸的特征,以形成金字塔形网络;

(3) 特征提取器:用 DarkNet-53 来提取特征。

以下是YOLO不同版本的对比图:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习:经典卷积神经网络和目标检测网络 的相关文章

随机推荐

  • 如何保证代码质量

    代码质量的评估维度很多 我自己的理解有这几个层次 能用 gt 能读 gt 能改 gt 能适应业务的变更 高质量的代码不是一蹰而就的的 是从特别小的细节例如变量命名规则到高大上的架构设计 一点点积累而成的 关于架构设计的部分 正在阅读 重构
  • 13、不同存储引擎的数据表在文件系统里是如何表示的?

    MySQL 支持 InnoDB MyISAM Memory Merge Archive CSV BLACKHOLE 几种存储引擎 不同存储引擎的数据表在文件系统中的表示也各不相同 MySQL 中的每一个数据表在磁盘上至少被表示为一个文件 即
  • 融云出海:社交泛娱乐出海,「从 0 到 1」最全攻略

    9 月 21 日 融云直播课社交泛娱乐出海最短变现路径如何快速实现一款 1V1 视频社交应用 欢迎点击上方小程序报名 本期我们翻到 地图 的实践篇 从赛道 品类选择 目标地区适配 用户增长 变现模式 本地化运营 跨国团队管理等方面完整描绘
  • 用matlab使用灰狼算法规划15个城市的最短路径

    在Matlab中使用灰狼算法规划15个城市的最短路径需要以下步骤 建立矩阵 首先 您需要建立一个矩阵来存储15个城市之间的距离 定义灰狼算法参数 然后 您需要定义灰狼算法的各种参数 例如种群数量 迭代次数 学习因子等 运行灰狼算法 接下来
  • "当B发生时,是A发生的概率降低了,可以由此推出,当B不发生时A发生的可能性增大了"的直观解释

    一 当B发生时 是A发生的概率降低了 可以由此推出 当B不发生时A发生的可能性增大了 数学上的推导是容易的 即 二 接下来找一种直观上的解释 设有一个矩形的面积为1 设其为事件 发生的概率 A发生的概率即为A的面积 A B同时发生的概率即为
  • 【数据结构】线性表的链式存储结构简单实现及应用

    链表是指用一组任意的存储单元来依次存放线性表的结点 这组存储单元即可以是连续的 也可以是不连续的 甚至是零散分布在内存中的任意位置上的 因此 链表中结点的逻辑次序和物理次序不一定相同 为了能正确表示结点间的逻辑关系 在存储每个结点值的同时
  • android 启动过程分析

    Servicemanager需要先启动 zygote后面的service需要用到servicemanager的服务
  • 使用R语言生成新的数据列

    使用R语言生成新的数据列 在R语言中 我们可以使用各种方法来生成新的数据列 这些方法可以帮助我们处理和分析数据 为我们提供更多的洞察力 本文将介绍几种在R语言中生成新数据列的常用方法 并提供相应的源代码示例 使用算术运算符生成新列 我们可以
  • 小程序整改获取用户隐私

    整改要求如下 请开发者自查并去除频繁跳出来的手机号登录界面 手机号授权弹窗 去除小程序内非必要页面的手机号登录界面 手机号授权弹窗 正常的内容浏览是不支持获取用户手机号或其他隐私信息 在必要场景下才告知用户需授权手机号 且页面需要有 用户协
  • Android初级教程 - 四大存储之SP存储

    1 SharedPreFerences是什么 是安卓的一种最轻量的储存类 储存为xml文件储存到 data data 包名 shared prefs下 一般用来存储一些比较简单的数据 比如用户名姓名 密码等等 2 如何储存数据 Shared
  • 软件测试大型网站如何进行压力测试及性能调优优化方案

    性能测试在大型网站系统的设计和开发中非常重要 通常会和容量预估等工作结合在一起 穿插在系统开发的不同方案 性能测试可以帮助我们及时发现系统的性能短板 评估系统的能 性能测试在大型网站系统的设计和开发中非常重要 通常会和容量预估等工作结合在一
  • CMake简介,打包so文件,编译实际项目

    CMake简介和使用示例 CMake是常用的跨平台编译器 图像这块在给服务端做开发时 常有两个需求 1 代码打成 so包 供别人调用 2 编译 测试 用valgrind测内存情况 工程较大时 借助CMake完成很方便 下面分别给出两种情况下
  • 含Java岗988道题分享 备战金九银十,你准备好了吗?,阿里,腾讯秋招面试题解析。

    在前段时间里公司的项目基本都很闲 很多人觉得工作起来没意思相继走了 而我考虑到自己的发展 并没有裸辞 而是一边上班 另一边在面试 从3月底开始面试 面到5月底 三十家公司 因为疫情原因有些面试是远程面试 我从不打没准备的仗 我是一个喜欢总结
  • chown 命令

    NAME chown change file owner and group SYNOPSIS chown OPTION OWNER GROUP FILE chown OPTION reference RFILE FILE 当使用 refe
  • 数据库-面试题(持续更新)

    来自牛客网的汇总 1 MySQL查询时 只有满足联接条件的记录才包含在查询结果 这种联接是 内联接 内联接 典型的联接运算 使用像 或 lt gt 之类的比较运算符 包括相等联接和自然联接 内联接使用比较运算符根据每一表共有的列的值匹配两个
  • 在simulink中查看bode图

    打开simulink 在library里面找到inport和outport 然后在inport和outport之间使用传递函数 想要查看bode图的传函 连接 按如下路径点击Analysis Control Design Linear An
  • 【2.学习__签名证书和加密证书】

    实习期学习一些签名和加密的知识 暂时先这样 有时间了再整理 学习的方法 先学习证书文件内容 结构 再针对问题进行学习 证书相关的知识 1 证书的结构大致是什么样的 证书的机构分为三部分 tbsCertificate 包含 主题 和 发行者的
  • 【C语言学习笔记】再次深入理解递归——总结设计易错点

    写在前面 其实我也说不太清楚到底递归算不算算法 因为我一开始从0基础接触递归是从 算法图解 这本书中得知的 也很推荐刚学算法的朋友可以先看看这本书 写的挺不错的 也就把它当成算法了 但写了那么多题目 渐渐的感觉递归这个东西把 它更像是一种工
  • sqli-labs第十三和十四关(post请求-报错盲注)

    一上来 先加个单引号探探路 有sql报错回显 在单引号后继续加上and 1 试图让sql报错显示更多信息 从near and password 1 LIMIT 0 1 at line 1可以判断 这关就用单引号加括号了 没什么意思 注入 却
  • 深度学习:经典卷积神经网络和目标检测网络

    最近自己会把自己个人博客中的文章陆陆续续的复制到CSDN上来 欢迎大家关注我的 个人博客 以及我的github 本文主要讲解关于有关物体检测的相关网络 具体包括R CNN Fast R CNN Faster R CNN和Mask R CNN