计算机视觉那些事儿(1):基本任务

本文主要介绍深度学习在计算机视觉领域(Computer vision)基本任务中的应用,包括分类、检测、分割(语义与实体)。

目录

引言

分类(Classification)

目标检测(Object Detection)

Two-stage算法

One-stage算法

语义分割(Semantic Segmentation)

实体分割(Instance Segmentation)


引言

大约在5亿年以前,处于寒武纪的地球上的生物开始进化出了眼睛;从此,地球进入了生物大爆炸时代。有学者认为,这是因为眼睛的出现,地球上的生物为了躲避天敌的捕猎,因此必须不断进化。

自从人工智能一词首次在1956年提出以后,就有学者开始研究计算机视觉。他们希望计算机能够像人类一样,通过传感器(那时主要指照相机)来描述所看到的信息。如果把计算机比作人的大脑的话,那么计算机视觉就是计算机的眼睛,计算机通过计算机视觉来感知世界


分类(Classification

分类就是给定一张图片,判断图片所属类别,这里主要指图片中的目标所属类别。作为计算机视觉界的奥林匹克ImageNet包含着超过140万张图片,其所含目标为1000种。


图片分类经典网络

在描述神经网络时,通常用conv代表卷积层bn代表批归一层pool代表池化层。最常见的网络结构顺序是:conv -> bn -> relu -> pool,其中卷积层用于提取特征、池化层用于下采样。随着网络深度的进行,图像的空间大小将越来越小,而通道数会越来越大。这里介绍图片分类中的几种经典网络:

LeNet-5: 由Facebook人工智能研究院院长Yann LeCun所发明。 网络基本架构如图所示。当时,LeNet-5被成功用于ATM以对支票中的手写数字进行识别。

AlexNet:ILSVRC 2012年的冠军,由Hinton和其学生Alex Krizhevsky所发明。网络基本如图所示。AlexNet有着和LeNet-5相似网络结构,但网络深度更深、参数也更多。AlexNet的关键点是:(1). 使用了ReLU激活函数,使之有更好的梯度特性、训练更快。(2). 使用了dropout。(3). 使用数据增强技术,使用GPU加速训练。AlexNet的意义在于它以高出第二名10%的性能取得了当年ILSVRC竞赛的冠军,称为计算机视觉以及人工智能的里程碑。

VGG-16/VGG-19 :VGG网络结构如图所示。VGG网络的关键点是:(1). 结构简单,只有3×3卷积和2×2池化两种网络,并且重复堆叠相同的模块组合。卷积层不改变空间大小,每经过一次池化层,空间大小减半。(2). 参数量大,而且大部分的参数集中在全连接层中。(3). 合适的网络初始化和使用批量归一层

GoogLeNet:GoogLeNet试图回答在设计网络时究竟应该选多大尺寸的卷积、或者应该选多大的池化层。其提出了Inception模块,网络结构如图所示。GoogLeNet的关键点是:(1). 多分支分别处理,并级联结果。(2). 为了降低计算量,用了1×1卷积降维。GoogLeNet使用了全局平均池化替代全连接层,使网络参数大幅减少。

ResNet:ILSVRC 2015年的冠军。ResNet旨在解决网络加深后训练难度增大的现象。其提出了residual模块,包含两个3×3卷积和一个跳跃连接(左图)。跳跃连接可以有效缓解反向传播时由于深度过深导致的梯度消失现象,这使得网络加深之后性能不会变差。跳跃连接是深度学习又一重要思想。ResNet的关键点是:(1). 使用跳跃连接,使训练深层网络更容易,并且重复堆叠相同的模块组合。(2). ResNet大量使用了批量归一层。(3). 对于很深的网络(超过50层),ResNet使用了更高效的瓶颈(bottleneck)结构(右图)。ResNet在ImageNet上取得了超过人类的准确率。


目标检测(Object Detection)

识别出目标所属类别后,如何获取目标在图片中的位置信息呢?这就需要进行目标检测了。目前目标检测算法主要分为两类:one-stage算法和two-stage算法,其区别是two-stage算法是先生成候选区域,然后再进一步选择目标位置。总的来说,two-stage算法精度更高,但速度较慢,而one-stage算法精度相对较低,但速度比two-stage快。

Two-stage算法

RCNN:网络如图所示首先生成2k个候选区域,候选区域生成算法通常基于图像的颜色、纹理、面积、位置等合并相似的像素,最终得到一系列的候选矩阵区域。相比于用滑动窗把图像所有区域都滑动一遍,基于候选区域的方法十分高效。另一方面,这些候选区域生成算法的查准率(precision)一般,但查全率(recall)通常比较高,这使得我们不容易遗漏图像中的目标。

之后,对每个候选区域进行全连接网络连接,进行目标定位,即两分支(分类+回归)输出。其中,我们仍然需要回归分支的原因是,候选区域只是对包含目标区域的一个粗略的估计,我们需要有监督地利用回归分支得到更精确的包围盒预测结果。R-CNN的重要性在于当时目标检测已接近瓶颈期,而R-CNN利于在ImageNet预训练模型微调的方法一举将VOC上mAP由35.1%提升至53.7%,确定了深度学习下目标检测的基本思路。

Fast R-CNN:R-CNN的弊端是R-CNN的运行效率不高,预测一张图像需要47秒。Fast R-CNN同样基于候选区域进行目标检测,网络结构如图所示,但受SPPNet启发,在Fast R-CNN中,不同候选区域的卷积特征提取部分是共享的。也就是说,我们先用卷积网络进行图片的特征提取,并提取conv5卷积特征。之后,基于在原始图像上运行候选区域生成算法的结果在卷积特征上进行采样,这一步称为兴趣区域池化。最后,对每个候选区域,进行目标定位,即两分支(分类+回归)输出。

兴趣区域池化(region of interest pooling, RoI pooling) 兴趣区域池化旨在由任意大小的候选区域对应的局部卷积特征提取得到固定大小的特征,这是因为下一步的两分支网络由于有全连接层,需要其输入大小固定。其做法是,先将候选区域投影到卷积特征上,再把对应的卷积特征区域空间上划分成固定数目的网格(数目根据下一步网络希望的输入大小确定,例如VGGNet需要7×7的网格),最后在每个小的网格区域内进行最大池化,以得到固定大小的汇合池化。和经典最大池化一致,每个通道的兴趣区域池化是独立的。

Faster R-CNN:网络结构如图所示,Faster R-CNN而利用候选区域网络从conv5特征中产生候选区域,并且将候选区域网络集成到整个网络中端到端训练。

候选区域网络(region proposal networks, RPN) 在卷积特征上的通过两层卷积(3×3和1×1卷积),输出两个分支。其中,一个分支用于判断每个锚盒是否包含了目标,另一个分支对每个锚盒输出候选区域的4个坐标。候选区域网络实际上延续了基于滑动窗进行目标定位的思路,不同之处在于候选区域网络在卷积特征而不是在原图上进行滑动。由于卷积特征的空间大小很小而感受野很大,即使使用3×3的滑动窗,也能对应于很大的原图区域。Faster R-CNN实际使用了3组大小(128×128、256×256、512×512)、3组长宽比(1:1、1:2、2:1),共计9个锚盒,这里锚盒的大小已经超过conv5特征感受野的大小。对一张1000×600的图像,可以得到20k个锚盒。

为什么要使用锚盒(anchor box) 锚盒是预先定义形状和大小的包围盒。使用锚盒的原因包括:

  • 图像中的候选区域大小和长宽比不同,直接回归比对锚盒坐标修正训练起来更困难。
  • conv5特征感受野很大,很可能该感受野内包含了不止一个目标,使用多个锚盒可以同时对感受野内出现的多个目标进行预测。
  • 使用锚盒也可以认为这是向神经网络引入先验知识的一种方式。我们可以根据数据中包围盒通常出现的形状和大小设定一组锚盒。锚盒之间是独立的,不同的锚盒对应不同的目标。

基于候选区域的目标检测算法通常需要两步:第一步是从图像中提取深度特征,第二步是对每个候选区域进行定位(包括分类和回归)。其中,第一步是图像级别计算,而第二步是区域级别计算。R-CNN, Fast R-CNN, Faster R-CNN, 这些算法的演进思路是逐渐提高网络中图像级别计算的比例,同时降低区域级别计算的比例。


One-stage算法

基于候选区域的方法由于有两步操作,虽然检测性能比较好,但速度较慢。基于直接回归的方法不需要候选区域,直接输出分类/回归结果。这类方法速度通常更快,可以满足实时性使用。

YOLO :网络结构如图所示,将图像划分成7×7的网格,其中图像中的真实目标被其划分到目标中心所在的网格及其最接近的锚盒。对每个网格区域,网络需要预测:每个锚盒包含目标的概率(不包含目标时应为0,否则为锚盒和真实包围盒的IoU)、每个锚盒的4个坐标、该网格的类别概率分布。每个锚盒的类别概率分布等于每个锚盒包含目标的概率乘以该网格的类别概率分布。相比基于候选区域的方法,YOLO需要预测包含目标的概率的原因是,图像中大部分的区域不包含目标,而训练时只有目标存在时才对坐标和类别概率分布进行更新。

YOLO的优点在于:

  • 基于候选区域的方法的感受野是图像中的局部区域,而YOLO可以利用整张图像的信息。
  • 有更好的泛化能力。

YOLO的局限在于:

  • 不能很好处理网格中目标数超过预设固定值,或网格中有多个目标同时属于一个锚盒的情况。
  • 对小目标的检测能力不够好。
  • 对不常见长宽比的包围盒的检测能力不强。
  • 计算损失时没有考虑包围盒大小。大的包围盒中的小偏移和小的包围盒中的小偏移应有不同的影响。

SSD :相比YOLO,SSD在卷积特征后加了若干卷积层以减小特征空间大小,并通过综合多层卷积层的检测结果以检测不同大小的目标。此外,类似于Faster R-CNN的RPN,SSD使用3×3卷积取代了YOLO中的全连接层,以对不同大小和长宽比的锚盒来进行分类/回归。

非最大抑制(non-max suppression, NMS) :目标检测可能会出现的一个问题是,模型会对同一目标做出多次预测,得到多个包围盒。NMS旨在保留最接近真实包围盒的那一个预测结果,而抑制其他的预测结果。NMS的做法是,首先,对每个类别,NMS先统计每个预测结果输出的属于该类别概率,并将预测结果按该概率由高至低排序。其次,NMS认为对应概率很小的预测结果并没有找到目标,所以将其抑制。然后,NMS在剩余的预测结果中,找到对应概率最大的预测结果,将其输出,并抑制和该包围盒有很大重叠(如IoU大于0.3)的其他包围盒。重复上一步,直到所有的预测结果均被处理。


语义分割(Semantic Segmentation)

语义分割是目标检测更进阶的任务,是像素识别,即需要识别图片中的像素所属目标。

基本思路 逐像素进行图像分类。我们将整张图像输入网络,使输出的空间大小和输入一致,通道数等于类别数,分别代表了各空间位置属于各类别的概率,即可以逐像素地进行分类。

全卷积网络+反卷积网络 为使得输出具有三维结构,全卷积网络中没有全连接层,只有卷积层和汇合层。但是随着卷积和汇合的进行,图像通道数越来越大,而空间大小越来越小。要想使输出和输入有相同的空间大小,全卷积网络需要使用反卷积和反汇合来增大空间大小。

反卷积(deconvolution)/转置卷积(transpose convolution) 标准卷积的滤波器在输入图像中进行滑动,每次和输入图像局部区域点乘得到一个输出,而反卷积的滤波器在输出图像中进行滑动,每个由一个输入神经元乘以滤波器得到一个输出局部区域。反卷积的前向过程和卷积的反向过程完成的是相同的数学运算。和标准卷积的滤波器一样,反卷积的滤波器也是从数据中学到的。

反最大池化(max-unpooling) 通常全卷积网络是对称的结构,在最大池化时需要记下最大值所处局部区域位置,在对应反最大池化时将对应位置输出置为输入,其余位置补零。反最大池化可以弥补最大池化时丢失的空间信息。反最大池化的前向过程和最大池化的反向过程完成的是相同的数学运算。


实体分割(Instance Segmentation)

实体分割也是像素识别,且当图片中有多个相同类别的目标后,网络需要对同类别目标的像素进行划分。

基本思路 目标检测+语义分割。先用目标检测方法将图像中的不同实例框出,再用语义分割方法在不同包围盒内进行逐像素标记。

Mask R-CNN 用FPN进行目标检测,并通过添加额外分支进行语义分割(额外分割分支和原检测分支不共享参数),即Mask R-CNN有三个输出分支(分类、坐标回归、和分割)。此外,Mask R-CNN的其他改进有:(1). 改进了RoI池化,通过双线性差值使候选区域和卷积特征的对齐不因量化而损失信息。(2). 在分割时,Mask R-CNN将判断类别和输出模板(mask)这两个任务解耦合,用sigmoid配合对率(logistic)损失函数对每个类别的模板单独处理,取得了比经典分割方法用softmax让所有类别一起竞争更好的效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439724.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一步步编写操作系统 38 一级页表与虚拟地址3

接上,页是地址空间的计量单位,并不是专属物理地址或线性地址,只要是4KB的地址空间都可以称为一页,所以线性地址的一页也要对应物理地址的一页。一页大小为4KB,这样一来,4GB地址空间被划分成4GB/4KB1M个页&a…

《Python编程:从入门到实践》速查表

本文是Python畅销书《Python:从入门到实践》速查表。 随书配套视频观看地址:https://www.bilibili.com/video/av35698354 目录 1.Overview 2.Lists 3.Dictionaries 4.If and While Loops 5.Functions 6.Classes 7.Files and Exceptions 8.Testin…

一步步编写操作系统 39 二级页表1

前面讲述了页表的原理,并以一级页表做为原型讲述了地址转换过程。既然有了一级页表,为什么还要搞个二级页表呢?理由如下: 一级页表中最多可容纳1M(1048576)个页表项,每个页表项是4字节&#xf…

PointNet++详解与代码

在之前的一篇文章《PointNet:3D点集分类与分割深度学习模型》中分析了PointNet网络是如何进行3D点云数据分类与分割的。但是PointNet存在的一个缺点是无法获得局部特征,这使得它很难对复杂场景进行分析。在PointNet中,作者通过两个主要的方法…

一步步编写操作系统 40 内存分页下用户程序与操作系统的关系

分页的第一步要准备好一个页表,我们的页表是什么样子呢?现在我们要设计一个页表啦。 设计页表其实就是设计内存布局,不过在规划内存布局之前,我们需要了解用户进程与操作系统之间的关系。 前面讲保护模式时,我们知道…

一步步编写操作系统 41 快表tlb 简介

分页机制虽然很灵活,但您也看到了,为了实现虚拟地址到物理地址的映射,过程还是有些麻烦的。先要从CR3寄存器中获取页目录表物理地址,然后用虚拟地址的高10位乘以4的积做为在页目录表中的偏移量去寻址目录项pde,从pde中…

50个最有用的Matplotlib数据分析与可视化图

本文介绍了数据分析与可视化中最有用的50个数据分析图,共分为7大类:Correlation、Deviation、RankIng、Distribution、Composition、Change、Groups 原文链接:https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-t…

视觉SLAM十四讲(1):预备知识

最近在学习高翔博士的《视觉SLAM十四讲》(第二版),算是初学本书,配套资源还算蛮丰富的,有代码(第一版和第二版都有),B站上也有高翔博士对第一版录制的讲解视频,真的是很贴…

一步步编写操作系统 43 汇编语言和c语言的理解

也许有的同学喜欢用汇编语言来实现操作系统,觉得用汇编来写程序似乎更简单直接,可控性比较强,有种“一切尽在掌握”的赶脚。而用c语言实现操作系统这件事,虽然轻松很多,但似乎隐约感觉到有些慌张。因为虽然c语言相对来…

视觉SLAM十四讲(2):初识SLAM

这一讲主要介绍视觉SLAM的结构,并完成第一个SLAM程序:HelloSLAM。 目录 2.1 小萝卜的例子 单目相机 双目相机 深度相机 2.2 经典视觉SLAM框架 2.3 SLAM问题的数学表述 2.4 编程实践 Hello SLAM 使用cmake 使用库 【高翔】视觉SLAM十四讲2.1 小…

一步步编写操作系统 44 用c语言编写内核1

先来个简单的,欢迎我们神秘嘉宾——main.c。这是我们第一个c语言代码。 1 int main(void) { 2 while(1); 3 return 0; 4 }它没法再简单啦,简单的程序似乎能帮助咱们更容易的理解所学的知识,哈哈,我说的是似乎,其实&…

从零实现一个3D目标检测算法(1):3D目标检测概述

本文是根据github上的开源项目:https://github.com/open-mmlab/OpenPCDet整理而来,在此表示感谢,强烈推荐大家去关注。使用的预训练模型也为此项目中提供的模型,不过此项目已更新为v0.2版,与本文中代码略有不同。 本文…

一步步编写操作系统 45 用c语言编写内核2

在linux下用于链接的程序是ld,链接有一个好处,可以指定最终生成的可执行文件的起始虚拟地址。它是用-Ttext参数来指定的,所以咱们可以执行以下命令完成链接: ld kernel/main.o -Ttext 0xc0001500 -e main -o kernel/kernel.bin …

使用OpenCV库快速求解相机内参

本文主要介绍如何使用OpenCV库函数求解相机内参。具体可查阅官网:https://docs.opencv.org/master/dc/dbb/tutorial_py_calibration.html。 关于相机内参的求解还有很多其它的工具,如使用MATLAB求解会更方便,直接调用MATLAB中的APP即可。 1.背…

一步步编写操作系统 46 用c语言编写内核3

再把上节代码贴出来, 1 //int main(void) { 2 int _start(void) { 3 while(1); 4 return 0; 5 }有没有同学想过,这里写一个_start函数,让其调用main函数如何?其实这是可以的,main函数并不是第一个函数,它实…

一步步编写操作系统 47 48 二进制程序运行方式

操作系统并不是在功能上给予用户的支持,这种支持是体现在机制上。也就是说,单纯的操作系统,用户拿它什么都做不了,用户需要的是某种功能。而操作系统仅仅是个提供支持的平台。 虽然我们是模仿linux来写一个黑屏白字的系统&#x…

百度顶会论文复现(1):课程概述

最近百度推出了一款重磅课程《全球顶会论文作者,28天免费手把手带你复现顶会论文》。这个课程真的是很硬核的课程,这里简单记录下自己的学习过程。 文章目录1. 课程设计思路和安排2. 课程大纲1. 课程设计思路和安排 课程设计思路如下,共分为…

百度顶会论文复现(2):GAN综述

本节课主要是对GAN的发展进行了介绍,包括基本原理,训练方法,存在问题,改进以及应用场景等。实践作业则为手写数字生成。课程地址为:https://aistudio.baidu.com/aistudio/education/preview/493290。 文章目录1.什么是…

一步步编写操作系统 48 二进制程序的加载方式

接上节,程序头可以自定义,只要我们按照自己定义的格式去解析就行。也许我光这么一说,很多同学还是不能彻底明白如何自定义文件头,因为大多数同学都是用高级语言来写程序,即使用了偏底层的c语言,不同平台的c…

百度顶会论文复现(3):视频分类综述

本节课主要是对视频分类的发展进行了介绍,包括任务与背景,分类方法,前沿进展等。课程地址为:https://aistudio.baidu.com/aistudio/course/introduce/1340?directly1&shared1。 文章目录1. 任务与背景2. 视频分类方法2.1 双流…