目标检测与识别(概述篇)

2023-10-29

            之所以写粗略篇主要是自己以前稍微看了一下,还有一点点印象,接下来会逐篇精读,希望得到更多的收获,纯干做笔记用,有问题大家可以指出来。参考博客:http://blog.csdn.net/linolzhang/article/details/54344350

RCNN

基于Region Proposal的候选区域选择和边界回归(bounding-box regression) 得到精确的目标区域

算法分为三大步:

1)候选区域选择

Region Proposal是一类传统的区域提取方法,可以看作不同宽高的滑动窗口,通过窗口滑动获得潜在的目标图像,关于Proposal大家可以看下SelectiveSearch,一般Candidate选项为2k个即可,这里不再详述;根据Proposal提取的目标图像进行归一化,作为CNN的标准输入。

2)CNN特征提取

标准CNN过程,根据输入进行卷积/池化等操作,得到固定维度的输出;

3)分类与边界回归

实际包含两个子步骤,一是对上一步的输出向量进行分类(需要根据特征训练分类器);二是通过边界回归(bounding-box regression) 得到精确的目标区域,由于实际目标会产生多个子区域,旨在对完成分类的前景目标进行精确的定位与合并,避免多个检出。

 

RCNN存在三个明显的问题:

1)多个候选区域对应的图像需要预先提取,占用较大的磁盘空间;

2)针对传统CNN需要固定尺寸的输入图像,crop/warp(归一化)产生物体截断或拉伸,会导致输入CNN的信息丢失;

3)每一个ProposalRegion都需要进入CNN网络计算,上千个Region存在大量的范围重叠,重复的特征提取带来巨大的计算浪费。

 

SPP-Net

空间金字塔池化(SpatialPyramid Pooling )

 

SPP-Net在RCNN的基础上做了实质性的改进:

1)取消了crop/warp图像归一化过程,解决图像变形导致的信息丢失以及存储问题;

2)采用空间金字塔池化(SpatialPyramid Pooling )替换了 全连接层之前的最后一个池化层(如上图)。

为了适应不同分辨率的特征图,定义一种可伸缩的池化层,不管输入分辨率是多大,都可以划分成m*n个部分。这是SPP-net的第一个显著特征,它的输入是conv5特征图 以及特征图候选框

 

尽管SPP-Net贡献很大,仍然存在很多问题:

和RCNN一样,训练过程仍然是隔离的,提取候选框 | 计算CNN特征| SVM分类 | Bounding Box回归独立训练,大量的中间结果需要转存,无法整体训练参数;

SPP-Net在无法同时Tuning在SPP-Layer两边的卷积层和全连接层,很大程度上限制了深度CNN的效果;

在整个过程中,Proposal Region仍然很耗时。

 

Fast-RCNN

1)亮点1 - 借鉴SPP思路,提出简化版的ROI池化层(注意,没用金字塔),同时加入了候选框映射功能,使得网络能够反向传播,解决了SPP的整体网络训练问题;

2)亮点2 - 多任务Loss层

A)SoftmaxLoss代替了SVM,证明了softmax比SVM更好的效果;

B)SmoothL1Loss取代Bouding box回归。

将分类和边框回归进行合并(又一个开创性的思路),通过多任务Loss层进一步整合深度网络,统一了训练过程,从而提高了算法准确度。

3)全连接层通过SVD加速

这个大家可以自己看,有一定的提升但不是革命性的。

结合上面的改进,模型训练时可对所有层进行更新,除了速度提升外(训练速度是SPP的3倍,测试速度10倍),得到了更好的检测效果(VOC07数据集mAP为70,注:mAP,mean Average Precision)。

 

Faster-RCNN

提取候选框最常用的SelectiveSearch方法,提取一副图像大概需要2s的时间,改进的EdgeBoxes算法将效率提高到了0.2s。

  候选框提取不一定要在原图上做,特征图上同样可以,低分辨率特征图意味着更少的计算量,基于这个假设,MSRA的任少卿等人提出RPN(RegionProposal Network),通过添加额外的RPN分支网络,将候选框提取合并到深度网络中,这正是Faster-RCNN里程碑式的贡献。

 

RPN网络的特点在于通过滑动窗口的方式实现候选框的提取,每个滑动窗口位置生成9个候选窗口(不同尺度、不同宽高),提取对应9个候选窗口(anchor)的特征,用于目标分类和边框回归,与FastRCNN类似。

目标分类只需要区分候选框内特征为前景或者背景。

边框回归确定更精确的目标位置,基本网络结构如下图所示:

 

训练过程中,涉及到的候选框选取,选取依据:

1)丢弃跨越边界的anchor;

2)与样本重叠区域大于0.7的anchor标记为前景,重叠区域小于0.3的标定为背景;

对于每一个位置,通过两个全连接层(目标分类+边框回归)对每个候选框(anchor)进行判断,并且结合概率值进行舍弃(仅保留约300个anchor),没有显式地提取任何候选窗口,完全使用网络自身完成判断和修正。

从模型训练的角度来看,通过使用共享特征交替训练的方式,达到接近实时的性能,交替训练方式描述为:

1)根据现有网络初始化权值w,训练RPN;

2)用RPN提取训练集上的候选区域,用候选区域训练FastRCNN,更新权值w;

3)重复1、2,直到收敛。

 因为Faster-RCNN,这种基于CNN的real-time 的目标检测方法看到了希望,在这个方向上有了进一步的研究思路。至此,我们来看一下RCNN网络的演进,如下图所示:

 

 Faster RCNN的网络结构(基于VGG16):

 

 

YOLO

Region Proposal 过程的优点是能够初步检测有效的 Candidate,缺点是带来效率的降低(Faster构造了两级网络)。YOLO去掉了 Faster的 RPN 过程,直接预测物体的种类和位置。这是一个里程碑似的 Idea!

  YOLO 将目标的分类与定位进行合并,将对应位置的信息 通过网络,对应到最后面的 7*7的格子上,每个格子对应一个30维的向量,分别代表 分类与定位信息。对应图中 30维向量 = (B*5 + C),B是每个Grid对应Bound Box数量,Paper中值为2,C为分类数,值为20。

YOLO 网络图参考如下:

 

 

 

SSD

1)开山绝技 - 多尺度

这是对YOLO最大的改进,也是本算法的核心。YOLO基于最后一张 Feature Map(特征图)进行提取和分类,某些细节特征的丢失导致精度下降和小目标遗漏。SSD 在多个尺度(Feature Map)上进行了回归,低层的 feature map 蕴含更多的信息,有利于细节保留 及 训练误差回传,提高了精度及小目标的适应能力。

 

2)拿来主义 - 宽高比和Anchor

SSD 借鉴了 Faster的锚 ,假定以目标中心作为Location,以该中心以不同宽高比进行 Rect 扩展(1:1  1:2  2:1),再结合三种不同尺度,这样我们就得到了9种不同的Scale(不考虑太特殊的比例)。

 

不同的Aspect Ratio & Scale 对预测目标进行覆盖,对于每一个feature map来讲,每个Grid Cell对应多个 Predict Boxes,我们假设为K(对应上面K=9,3种尺度*3种宽高比),所有中心落在该Grid的目标,都由该Grid进行回归Predict。

So 我们需要预测的结果就是:这K个Box每个对应的 分类(概率,C种)和 相对默认Rect的偏移(Offset,4个):

Fature Map Grid  =>  (C+4)*K

对于一张 m*n 大小的 Feature Map,能够得到 m*n *  (C+4)*K个输出结果(SSD 中默认使用了 6 个 default boxes)。

 

 

YOLOv2

基于V1改进的Trick:

A)Batch Normalization(批量规范化)

先建立这样一个观点: 对数据进行预处理(统一格式、均衡化、去噪等)能够大大提高训练速度,提升训练效果。

批量规范化  正是基于这个假设的实践,对每一层输入的数据进行加工。

 Batch Normalization,简称 BN,由Google提出,是指对数据的 归一化、规范化、正态化。BN 作为近几年最火爆的Trick之一,主流的CNN都已集成。

  该方法的提出基于以下背景:

1)神经网络每层输入的分布总是发生变化,通过标准化上层输出,均衡输入数据分布,加快训练速度;

      可以设置较大的学习率和衰减,而不用去care初始参数,BN总能快速收敛,调参狗的福音。

2)通过规范化输入,降低激活函数在特定输入区间达到饱和状态的概率,避免 gradient vanishing 问题;

      举个例子:0.95^64 ≈ 0.0375    计算累积会产生数据偏离中心,导致误差的放大或缩小。

3)输入规范化对应样本正则化,在一定程度上可以替代 Drop Out;

      Drop Out的比例也可以被无视了,全自动的节奏。

       BN 的做法是 在卷积池化之后,激活函数之前,对每个数据输出进行规范化(均值为 0,方差为 1)。

 

第一部分是 Batch内数据归一化(其中 E为Batch均值,Var为方差),Batch数据近似代表了整体训练数据。

       第二部分是亮点,即引入 附加参数 γ 和 β(Scale & Shift),Why? 因为简单的归一化 相当于只使用了激活函数中近似线性的部分(如下图红色虚线),破坏了原始数据的特征分布,这会降低模型表达能力。

 

B)High Resolution Classifier

      YOLO 对应训练过程分为两步,第一步是通过 ImageNet 训练集 进行高分辨率的预训练,这一步训练的是分类网络;第二步是训练检测网络,是在分类网络的基础上进行 fine tune。

      之前的 YOLO v1以分辨率224*224训练分类网络,YOLO v2 将分类网络的分辨率提高到 448*448,高分辨率样本对于效果有一定的提升(文中mAp提高了约4%)。

 

C)New Network(新网络)

      为保证后续 Anchor Boxes 讲解的连续性,这里将New Network提前。

      作者对网络进行了改进:

      1)不同于SSD的VGG-16网络,作者采用的基础网络是Googlenet,并且加入了自己的订制,来看数据对比:

                            Googlenet       vs       VGG-16

前向传播运算量(次)           85.2亿次                                  306.9亿次

精度(224*224)                     88%                                       90%              

整体来看,VGG-16整体精确度较高,但计算量过于复杂,性价比不高。

2)YOLO v2采用了常用的3 * 3卷积核,在每一次池化操作后把通道数翻倍。借鉴了network in network的思想,网络使用了全局平均池化(global average pooling)做预测,把1 * 1的卷积核置于3 * 3的卷积核之间,用来压缩特征。

YOLO v2包含19个卷积层、5个最大值池化层(max pooling layers )。

 

D)Convolutional With Anchor Boxes

Faster的 Anchor 机制又一次得到印证,与SSD一样,Anchor建立了和原始坐标的对应关系:

定义了不同的Scale和宽高比,一个中心对应K个不同尺度和宽高比的Boxes。

 

YOLO v1:    S*S* (B*5 + C)   =>  7*7(2*5+20)

其中B对应Box数量,5对应 Rect 定位+置信度。

每个Grid只能预测对应两个Box,这两个Box共用一个分类结果(20 classes),

这是很不合理的临时方案,看来作者为第二篇论文预留了改进,没想被 SSD 抢了风头。

YOLO v2:    S*S*K* (5 + C)   =>  13*13*9(5+20)

分辨率改成了13*13,更细的格子划分对小目标适应更好,再加上与Faster一样的K=9,计算量增加了不少。

通过Anchor Box改进,mAP由69.5下降到69.2,Recall由81%提升到了88%。

SSD(-):    S*S*K*(4 + C)  => 7*7*6*( 4+21 )

对应C=21,代表20种分类类别和一种 背景类。

 

生成式对抗网络(Generative adversarial nets)

对抗网络的核心是 对抗式(adversarial),两个网络互相竞争,一个负责生成样本(Generator),另一个负责判别样本(Discriminator)。

 

生成模型 像 “一个造假团伙,试图生产和使用假币”,而 判别模型 像 “检测假币的警察”。生成器(generator)试图欺骗判别器(discriminator),判别器 则努力不被 生成器 欺骗。模型经过交替优化训练,两种模型都能得到提升,直到到达一个“假冒产品和真实产品无法区分”的点。

一. 使用对抗网络

大多数情况下,对抗网络作为非监督学习的代表,将无监督问题转化为有监督问题,两个方面解释:

1. 生成对抗样本

对抗样本跟生成式对抗网络没有直接的关系,所谓 对抗样本,是个很有意思的事情,我们来看看论文里的例子:

 

通过添加噪声,在原样本基础上进行变换,得到的样本发生了微妙的变化,将“panda”错判成 “gibbon”。相信大家一定接触过 Data Augmentation,为什么同样是添加噪声,得到的结果却是迥然不同呢?实际上是我们在梯度方向上做了一点非常小的变化,导致模型就无法正确的分类。

2. 对抗网络

       对抗样本说明了一个问题,我们训练的分类器并没有对模型进行有效描述,或者说没有学习到数据的一些内部表达或者分布,只是 “恰巧” 通过 某些特定的特征 完成了分类而已。

需要做的是更深层次的挖掘,比如:

a)进一步将 真数据和各种各样的 Data Augmentation的样本判别为正样本;

b)进一步将各种 伪造数据 判别为Fake;

c)根据上一步的Fake参数,进一步提高 伪造数据的逼真度;

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

目标检测与识别(概述篇) 的相关文章

  • 使用“api-monitor工具”及应用程序读取smart card 信息

    采用工具 api monitor 下载地址 点击打开链接 使用步骤 1 运行mstsc 2 运行apimonitor x86 exe 如下图所示 定位要监视的应用程序 3 然后点击mstsc的编辑项 4 当mstsc列出所有凭据时 此时可以
  • 软件设计模式之(三) 解释器模式

    欢迎大家提出意见 一起讨论 转载请标明是引用于 http blog csdn net chenyujing1234 例子代码 编译工具 Eclipse http www rayfile com zh cn files 1291b5bd 94
  • linux 如何清除一个目录下的大量小文件(百万级别)

    清空目录或文件 如下 1 先建立一个空目录 mkdir data blank 2 用rsync删除目标目录 rsync delete before d a H v progress stats data blank var edatacac
  • snmp协议与python调用snmp获取数据

    一 snmp协议简介 简单网络管理协议 SNMP 是专门设计用于在 IP 网络管理网络节点 服务器 工作站 路由器 交换机及HUBS等 的一种标准协议 snmp是一种应用层协议 它的传输层协议一般采用UDP SNMP网络架构由三部分组成 N
  • 深度学习与计算机视觉系列(3)_线性SVM与SoftMax分类器

    作者 寒小阳 时间 2015年11月 出处 http blog csdn net han xiaoyang article details 49999299 声明 版权所有 转载请注明出处 谢谢 1 线性分类器 在深度学习与计算机视觉系列
  • webpack5 学习(一) —— 入门学习

    平时总是零零星星地学习一些 webpack 相关知识 需要复习的时候又感觉不够全面 所以就系统性地总结一下 方便随时查看 简介 webpack是一个前端资源加载 打包工具 webpack 根据模块的依赖关系进行静态分析 然后将这些模块按照指
  • 计算机自带游戏在哪里,win10自带游戏,教您Win10纸牌游戏在哪

    纸牌游戏是Windows经典的游戏之一 相信不少用户都曾经在早前的系统中玩过这个游戏 Win10纸牌游戏是Win10系统自带的纸牌游戏 集成在Microsoft Solitaire Collection中 下面 小编就来跟大家讲解Win10
  • CSS3秘笈:第十章

    CSS的transform transition和animation属性 1 transform 倾斜 利用transform属性可以使导航栏稍微倾斜 或者使图片在访问者的鼠标经过它时放大两倍 甚至可以结合更多transform属性设计出其
  • 玩转 IDEA 花式打断点,从此告别 996

    写代码离不开调试 调试离不开断点 IDEA 对于断点的支持非常丰富 掌握这些技巧以后 可以大大的提升开发效率 是帮助程序员保住头发 远离 996 的秘密武器 断点类型 IDEA 支持以下四种断点类型 行断点 Line breakpoints
  • 谷歌gmail注册入口_Google向GMail添加免费电话语音通话

    谷歌gmail注册入口 Do you have a GMail account who doesn t From today you may be lucky enough to notice a new Call Phone option
  • Java 对类中的属性使用set/get方法的意义和用法

    java 中对类中的属性使用set get方法的意义和用法 经常看到有朋友提到类似 对类中的属性使用set get方法的作用 理论的回答当然是封闭性之类的 但是这样对我们有什么作用呢 为什么要这样设计 我直接使用属性名来访问不是更直接 代码
  • 几种自旋锁SpinLock,TicketLock,CLHLock,以及可重入实现要点,非阻塞锁实现要点

    最核心的东西 synchronization state 同步状态 指示当前线程是否可以proceed还是需要wait的状态 1 普通SpinLock 支持可重入的版本 class SpinLock use thread itself as
  • 超级实习生计划打卡—HashMap的实现原理(简要概述)

    HashMap简介 数据无序 底层由数组 链表 红黑树实现 JDK8开始 容量是2的指数幂 初始大小为16 不指定长度 发生冲突时通过拉链法处理 当链表大于阈值时 阈值默认为8 将链表转化为红黑树 时间复杂度 哈希查找O 1 哈希冲突多O
  • MySQL-SQL全部锁详解(上)

    作者 小刘在C站 个人主页 小刘主页 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 学习两年总结出的运维经验 以及思科模拟器全套网络实验教程 专栏 云计算技术专栏 小刘私信可以随便问 只要会绝不吝啬 感谢CSDN让你我相遇
  • date-fns 周助手函数

    date fns 周助手函数 getISOWeek 描述 获取ISO标准的周数 参数说明 接收一个Date对象或者一个表示日期的字符串 date 一个Date对象或者一个表示日期的字符串 表示要获取ISO标准的周数的日期 返回值说明 返回一
  • 神经辐射场 (NeRF) 概念

    神经辐射场 NeRF 概念 理论介绍 NeRF模型以其基本形式将三维场景表示为由神经网络近似的辐射场 辐射场描述了场景中每个点和每个观看方向的颜色和体积密度 这写为 F x
  • IDEA创建Servlet(Web)项目完整教程-2021

    使用2020版IDEA创建Servlet 使用2020版IDEA创建一个完整的Web项目的整个过程分为四步 第一步 创建一个普通的Java项目 1 打开IDEA 选择菜单File gt New gt Project 2 选择Java 以及自
  • 新中国成立以来的历次暴富机会

    之所以想写这个东西 是因为中国正处于一个快速转型的过程 各个社会阶层的变迁动荡很大 在这种动荡的变迁语境下 由于缺乏统一的价值观和文化继承 八仙过海各显神通 有些人抓住了这些机遇 一夜暴富 有些人含辛茹苦 至今尚不得温饱 抚今追昔 希望对未

随机推荐

  • Vue+elementUI<el-input> 输入框手机号校验

    1 手机号是否正确校验
  • python 机器视觉测量_用Opencv python实现精密测量

    实际上 我正在使用OpenCV和Python开发一个机器视觉项目 目标 项目的目标是以高精度测量组件的尺寸 主要硬件 巴斯勒5MP照相机 aca 2500 14gm 一个红色背光灯 100毫米x 100毫米 我的组件大小约为60毫米 实验
  • 173. 矩阵距离(多源点的最短路径问题)

    给定一个N行M列的01矩阵A A i j 与 A k l 之间的曼哈顿距离定义为 dist A i j A k l i k j l 输出一个N行M列的整数矩阵B 其中 B i j min1 x N 1 y M A x y 1dist A i
  • Windows系统解压zip文件之后乱码的问题的原因和解决方法

    我昨天用7zip压缩了一个压缩包给我同事 他那边显示的是乱码 像下面这样 具体的原因是 7zip压缩zip格式的文件的时候 对文件名默认使用的是Windows系统的默认编码 我的系统的默认编码是936 可以使用chcp命令查看 而我同事的系
  • 关于java中对象的循环引用问题

    在C 中使用过智能指针的同学们应该都清楚智能指针对C 中内存管理带来的极大便利 但是也会引入一些头疼的问题 比如智能指针带来的循环引用的问题 这个问题在之前的项目中一直没有很好的解决 最近参与到android的项目开发 对java的内存的管
  • 【Flink】Flink 启动报错 DirectoryNotEmptyException Could not close resource

    美图 1 背景 windows下开发Flink程序 启动的时候报错如下 下次再次启动的时候就不报错了 org apache flink util FlinkException Could not close resource at org
  • docker-compose部署微服务

    服务器中安装docker compose 首先就是将要部署的服务打成jar包 然后传到服务器上 并在其同级目录下创建一个Dockerfile文件 内容主体 FROM anapsix alpine java 8 server jre unli
  • 驱动程序如何支持非阻塞读写操作

    1 应用层指定非阻塞模式 fd open dev xxx O RDONLY O NONBLOCK 在open打开设备节点时 指定打开方式为非阻塞打开 O NONBLOCK 2 驱动代码感知当前操作方式 struct file unsigne
  • css3transform rotate,CSS3详解:transform [旋转rotate、扭曲skew、缩放scale和移动translate以及矩阵变形matrix]...

    CSS3详解 transform 旋转rotate 扭曲skew 缩放scale和移动translate以及矩阵变形matrix transform的属性包括 rotate skew scale translate x y 分别还有x y之
  • Vue懒加载使用全教程(收藏加关注)简单易学

    Lazyload 是 Vue 指令 使用前需要对指令进行注册 import createApp from vue import App from App vue import router from router import store
  • npm发包中一些操作备忘

    1 npm发布相关命令 发布 npm publish 发布beta版 npm publish tag beta 取消发布 npm unpublish force 2 lerna发布相关命令 发布 lerna publish 其他的的官方文档
  • centos7 L2TP/ipsec 搭建

    背景 公司需要通内网 故此部署vpn 流程 1 安装所需要的包 这次部署使用的是腾讯云机器centos7 3 centos7 使用libreswan代替了以往的openswan yum install y make gcc gmp deve
  • 使用Postman如何在接口测试前将请求的参数进行自定义处理

    1 前言 当我们使用 Postman 进行接口测试时 对于简单的不需要处理的接口 直接请求即可 但是对于需要处理的接口 如需要转码 替换值等 则就麻烦一些 一般我们都是先手动把修改好的值拷贝到请求里再进行请求接口 这也是大多数测试人员进行接
  • 传播智客J2EE学习线路图

    第一步 JavaSE部分 第1阶段 Java基础知识 gt gt 计算机基础知识 gt gt Java开发环境的搭建和应用 gt gt 进制转换 gt gt 有符号数据表示法 原码 反码 补码 gt gt Java语法基础 关键字 标识符
  • SmartIDE v0.1.16 已经发布 - 支持阿里&蚂蚁开源的国产 IDE OpenSumi

    SmartIDE v0 1 16 Build 3137 已经在2022年4月19日发布到稳定版通道 我们在这个版本中增加了阿里和蚂蚁发布的国产IDE OpenSumi的支持 以及其他一些改进 SmartIDE 从 Sprint 11 v0
  • 【MQTT学习】ESP8266 AT指令连接阿里云

    前段时间使用Mqtt fx工具测试了一下基于mqtt的阿里云连接测试 学习的目的就是将整个流程转移到都硬件设备上 为了更深度的学习 这里使用ESP8266模块和USB串口工具进行测试 在开始前需要用到几个软件工具 一个是mqttfx 一个是
  • k8s笔记15--配置共享内存

    k8s笔记15 配置共享内存 介绍 案例 docker 环境 k8s 环境 说明 介绍 容器启动后默认会有 64M 的共享内存挂载在 dev shm 目录 用户可以向访问本地文件系统一样访问该共享内存 如果需要配置更大的内存 那么在dock
  • 基于Web的质量和测试度量指标

    直观了解软件质量和测试的完整性 VectorCAST Analytics可提供便于用户理解的web仪表盘视图来显示软件代码质量和测试完整性指标 让用户能够掌握单个代码库的趋势 或对比多个代码库的度量指标 为什么选用VectorCAST An
  • 2.3 InnoDB 体系架构

    下图简单显示了InnoDB的存储引擎的体系架构 从图可见 InnoDB储存引擎有多个内存块 可以认为这些内存块组成了一个大的内存池 负责如下工作 维护所有进程 线程需要访问的多个内部数据结构 缓存磁盘上的数据 方便快速地读取 同时在对磁盘文
  • 目标检测与识别(概述篇)

    之所以写粗略篇主要是自己以前稍微看了一下 还有一点点印象 接下来会逐篇精读 希望得到更多的收获 纯干做笔记用 有问题大家可以指出来 参考博客 http blog csdn net linolzhang article details 543