【学习笔记】计算机视觉与深度学习(6.视觉识别任务)

news/2024/10/21 7:31:17/

学习视频:
鲁鹏-计算机视觉与深度学习

同系列往期笔记:
【学习笔记】计算机视觉与深度学习(1.线性分类器)
【学习笔记】计算机视觉与深度学习(2.全连接神经网络)
【学习笔记】计算机视觉与深度学习(3.卷积与图像去噪/边缘提取/纹理表示)
【学习笔记】计算机视觉与深度学习(4.卷积神经网络)
【学习笔记】计算机视觉与深度学习(5.经典网络分析)

1 视觉识别任务

在这里插入图片描述
分类:前面讲的全都是分类。
语义分割:将不同的语义标记成不同的颜色,判断像素级的类别,即对于一张图片中的某一个像素,判断出其语义。
目标检测:是一个区域级的分类问题,即将目标所在的区域框选出来。
实例分割:将不同的实例标记成不同的颜色。

语义分割和实例分割的不同之处在于,语义分割是将相同的语义标记成同一个颜色,而实例分割是要区分出不同的实例,如图中所示,两只狗具有相同的语义,但我们在实例分割中需要标记成不同的颜色。

2 语义分割

在这里插入图片描述
给每个像素分配类别标签,但不区分实例,只考虑像素类别。

语义分割思路:滑动窗口

在这里插入图片描述
对于一个像素点,我们想要判断他的类别。围绕这个像素点,选取一个窗口,将其作为一个图像,送入神经网络进行分类,那个分类的结果就是这个像素点的结果。

问题 效率太低,重复区域的特征反复被计算。

语义分割思路:全卷积

在这里插入图片描述
解决方案:让整个网络只包含卷积层,一次性输出所有像素的类别预测。

此时不需要考虑图像的尺寸,我们不需要连接全连接神经网络,没有输入向量维数的限制,所以这个全卷积神经网络,我们输入怎么样的图片大小都可以,卷积层中所有参数都与输入图片的大小无关。
只需要控制最后一个卷积层的深度是CCC,其中CCC为类别数。最后我们得到的是一个规模为H×W×CH\times W\times CH×W×C的特征图组,每一个像素点都有CCC个结果,对应这个像素点与第i(i∈[1,C])i(i∈[1,C])i(i[1,C])个类别的相似关系。这样我们取结果最大的那个值所在的类别,就是这个点的分类结果。

学习时不断将结果与标答进行比较计算交叉熵损失,当损失最小时,我们就学好了这个网络。

可以看出,全卷积神经网络有效地降低了计算量,提高了分割效率。

问题:处理过程中一直保持原始分辨率,对于显存的需求会非常庞大。
解决方案:让整个网络只包含卷积层,并在网络中嵌入下采样上采样的过程。
在这里插入图片描述
下采样的方法比较多,有池化、增大卷积核步长等。
我们重点讨论上采样

反池化 Unpooling

在这里插入图片描述
Nearest Neighbor:将对应区域全部填充为与其相同的数值。
Bed of Nails:将对应区域除了原有数值外,全部填充为0。
但上述两种方法由于填充方法可能不够还原原有的图像信息,导致产生很多噪声,所以产生了下面的这种方法:
在这里插入图片描述
在池化时记录被保留的元素的位置,在反池化时将其还原至原来的位置上,而不是固定位置。

可学习的上采样:转置卷积 (Transpose Convolution)

回顾:3×33\times 33×3卷积,步长为1,零填充p=1p=1p=1
在这里插入图片描述
可以发现,红框和蓝框内存在一个共享区域。

回顾:3×33\times 33×3卷积,步长为2,零填充p=1p=1p=1
在这里插入图片描述
转置卷积,步长为2,零填充p=1p=1p=1
在这里插入图片描述
上采样时,输入的红色单元格会给输出的红框内的每一个方格一个值;输入的蓝色单元格会给输出的蓝框内的每一个方格一个值。红框和蓝框有交集单元格,这些位置会被赋予多个值,此时这些值将进行加权求和,而权重,交给机器进行学习。

一个一维的例子:
在这里插入图片描述
上采样中采取滤波器(Filter),学习时学习滤波器中的参数。

转置卷积的下采样和上采样(一维例子)

将卷积写成矩阵乘法的形式
x⃗∗a⃗=Xa⃗\vec{x}*\vec{a}=X\vec{a}xa=Xa
其中x⃗\vec{x}x是我们要学习的参数,a⃗\vec{a}a是我们要处理的一维图像信息。

以卷积核尺寸为333,步长为111,零填充为111,展开来写:
[xyz0000xyz0000xyz0000xyz][0abcd0]=[ay+bzax+by+czbx+cy+dzcx+dy]\begin{bmatrix} x & y & z & 0 & 0 & 0 \\ 0 & x & y & z & 0 & 0 \\ 0 & 0 & x & y & z & 0 \\ 0 & 0 & 0 & x & y & z \\ \end{bmatrix} \begin{bmatrix} 0 \\ a \\ b \\ c \\ d \\ 0 \end{bmatrix}= \begin{bmatrix} ay+bz \\ ax+by+cz \\ bx+cy+dz \\ cx+dy \\ \end{bmatrix} x000yx00zyx00zyx00zy000z0abcd0=ay+bzax+by+czbx+cy+dzcx+dy

上采样时:
x⃗∗Ta⃗=XTa⃗\vec{x}*^T\vec{a}=X^T\vec{a}xTa=XTa
展开则为:
[x000yx00zyx00zyx00zy000z][abcd]=[axay+bxaz+by+cxbz+cy+dxcz+dydz]\begin{bmatrix} x & 0 & 0 & 0 \\ y & x & 0 & 0\\ z & y & x & 0 \\ 0 & z & y & x\\ 0 & 0 & z & y\\ 0 & 0 & 0 & z \\ \end{bmatrix} \begin{bmatrix} a \\ b \\ c \\ d \end{bmatrix}= \begin{bmatrix} ax \\ ay+bx \\ az+by+cx \\ bz+cy+dx \\ cz+dy \\ dz \end{bmatrix} xyz0000xyz0000xyz0000xyzabcd=axay+bxaz+by+cxbz+cy+dxcz+dydz

(上下两个矩阵乘法中的x,y,zx,y,zx,y,z不是同一个参数,上采样中的a,b,c,da,b,c,da,b,c,d为下采样后卷积结束后得到的结果,也不是第一个矩阵算式中的a,b,c,da,b,c,da,b,c,d)

如果步长为2?
下采样:
[xyz00000xyz0][0abcd0]=[ay+bzbx+cy+dz]\begin{bmatrix} x & y & z & 0 & 0 & 0 \\ 0 & 0 & x & y & z & 0 \\ \end{bmatrix} \begin{bmatrix} 0 \\ a \\ b \\ c \\ d \\ 0 \end{bmatrix}= \begin{bmatrix} ay+bz \\ bx+cy+dz \\ \end{bmatrix} [x0y0zx0y0z00]0abcd0=[ay+bzbx+cy+dz]
上采样:
[x0y0zx0y0z00][abcd]=[axayaz+bxbybz0]\begin{bmatrix} x & 0 \\ y & 0\\ z & x\\ 0 & y\\ 0 & z\\ 0 & 0\\ \end{bmatrix} \begin{bmatrix} a \\ b \\ c \\ d \end{bmatrix}= \begin{bmatrix} ax \\ ay \\ az+bx \\ by \\ bz \\ 0 \end{bmatrix} xyz00000xyz0abcd=axayaz+bxbybz0

语义分割后记

现在在做语义分割时有一种更好的网络UNet,为了降低信息损失,传统UNet将左右镜像对称的部分连起来,让后面的卷积层也包含原始的数据,或将左侧部分进行卷积与右侧部分进行相加操作。这样镜像的信息流可以传递。

3 目标检测

深度学习带来的飞跃

在这里插入图片描述

单目标(分类+定位)

在这里插入图片描述
Class Scores是指分类的概率结果,Box Coordinates是指目标位置的坐标与长宽。
前面的模型通常使用在ImageNet上预训练的模型(迁移学习)。
第一阶段,我们训练分类任务部分的参数。
第二阶段,我们锁定第一阶段训练的参数,训练目标定位相关的参数。
第三阶段,我们打开第一阶段的参数,同时训练分类与定位的参数,将多任务的总损失降低至最小。

多目标

在这里插入图片描述
多目标的任务中如果使用单目标的方法则存在问题:
多目标时,我们不能预先知道图片中目标的个数,而目标的个数决定了我们网络输出结果的维数,这个维数是我们开始学习前就要预设好的,此时变成了一个不定量,变得无法实现。

此时我们转换思路。
利用CNN对图像中的区域进行多分类,以确定当前区域是背景还是哪个类别的目标。
在这里插入图片描述
在这里插入图片描述
狗:不是;猫:不是;背景:是。
在这里插入图片描述
狗:是;猫:不是;背景:不是。
在这里插入图片描述
狗:是;猫:不是;背景:不是。
在这里插入图片描述
狗:不是;猫:是;背景:不是。
在这里插入图片描述
困境 CNN需要对图像中所有可能的区域(不同位置、尺寸、长宽比)进行分类,计算量巨大!

神经网络方法通过穷举所有的可能区域是不现实的,因为一次神经网络的运算花费的时间很长,而穷举区域会穷举出数以百万计的图片数量,运算时间不能接受。
事实上,人脸识别技术使用的Adaboost正是穷举所有可能区域,但不同于神经网络,在人脸识别中,Adaboost非常高效。

区域建议:Selective Search

找出所有潜在可能包含目标的区域;
运行速度需要相对较快,比如Selective Search在CPU上仅需要运行几秒钟就可以产生2000个候选区域。
在这里插入图片描述

R-CNN

在这里插入图片描述
Bbox reg:边框回归,Bounding Box Regression,用于修正Selective Search选择的不佳的边框

R-CNN证明:卷积神经网络用在图像检测上是非常优秀的。

问题:计算效率低下,每一张图像大约有2k个区域需要卷积网络进行特征提取,重复区域反复计算。

想法:在特征图上进行区域扣取。

Fast R-CNN

在这里插入图片描述
和原先的慢速R-CNN不同的是,Fast R-CNN先进行卷积神经网络的特征提取,然后再进行Selective Search。同时,Fast R-CNN有一步对特征采取裁剪、缩放。整体实现了**端对端(End-to-End)**的网络(中间不需要复杂的流程,一个神经网络全部可以完成),目标分类与边界框偏差是一起通过学习优化的。

该算法的核心就是区域裁剪区域缩放

区域裁剪 ROI Pool

在这里插入图片描述
在这里插入图片描述
问题:处理后的区域特征会有轻微的对不齐,会影响计算效率和准度。(因为有一步将区域顶点规整到网格交点上

区域裁剪 ROI Align

在这里插入图片描述
Rol Align不再进行归整操作,而是直接将候选区域平均分为四份,然后在每一份里均匀设计四个点,然后通过双线性插值法计算每个点的值(毕竟不在整数坐标点,通过双线性插值法搞一个近似值)。双线性插值公式如下:

fxy=∑i,j=12fi,jmax⁡(0,1−∣x−xi∣)max⁡(0,1−∣y−yi∣)f_{xy}=\displaystyle\sum\limits_{i,j=1}^2 f_{i,j} \max(0,1-|x-x_i|)\max(0,1-|y-y_i|)fxy=i,j=12fi,jmax(0,1xxi)max(0,1yyi)
在这里插入图片描述
最后依旧是对每一个子区域进行最大池化。
(分4个区域、分4个点都只是例子,这两个也算是一种超参数)

相比于ROI Pooling,不会产生偏移,但是需要进行一步双线性插值才能进行Pooling操作。

R-CNN vs Fast R-CNN

在这里插入图片描述
可以看出,Fast R-CNN仍然需要2.3秒才能处理一张图片,在现实生活中还是不太能够接受。
问题:候选区域产生过程耗时过高,几乎等于单张图片的检测时间。(2.3秒里,近2秒钟都在进行Selective Search)

Faster R-CNN

在这里插入图片描述
在中间特征层后加入区域建议网络RPN(Region Proposal Network)产生候选区域,其他部分与Fast R-CNN保持一致,然后对其进行分类。
在这里插入图片描述
不在原图上进行区域扫描,而是在特征图上进行扫描。通过卷积神经网络变换后,我们会得到尺寸小于原图的特征图组(令步长大于1即可实现),如图所示,特征图上只有300个点,那么我们对300个点进行分类即可。
在这里插入图片描述
(Anchor为锚点,即图中的框图中心点)
在这里插入图片描述
选出边框后,通过边界框回归学习出更优的边框,将这个边框加类别发送至下一层。

问题 框怎么设计?
实际使用中,对于每个特征图上的每个位置,我们通常采用k个不同尺寸和分辨率的锚点区域(anchor boxes)。枚举多种框图(长的、宽的、大的、小的),记录他们的预测结果。
在这里插入图片描述
如图所示,特征图尺寸为20×1520\times 1520×15,一共会产生K×20×15K\times 20\times 15K×20×15个框图,对每一个框图进行分类,这样每一个框图都会有所有类别的得分,我们会认为框图内的内容是得分最高的类,这个分数暂且称为“最高分”。我们将这K×20×15K\times 20\times 15K×20×15个框图按照其“最高分”进行从大到小排序,选取前300300300个作为建议区域送至下一层。

获得类别得分这件事,是由一个全连接神经网络来做的,而具体的分类方法则和前面所学相同。

可以看出,Faster R-CNN是利用卷积神经网络产生候选区域。其包含4种联合训练:

  1. RPN分类目标(目标/非目标)
  2. RPN边界框坐标回归损失
  3. 候选区域分类损失
  4. 最终边界框坐标回归损失
    在这里插入图片描述
    总结:
    第一阶段:每张图运行一次(主干网络+区域建议网络)
    第二阶段:每个区域运行一次(ROI Pooling或ROI Align+预测目标类别+预测边界框偏移量)

是否必须采取两个阶段的范式完成目标检测?

一阶段目标检测:YOLO/SSD/RetinaNet

在这里插入图片描述
YOLO对图像直接均分成7×77\times 77×7的网格,对于每一个网格的中心,框出BBB个边界框,每个边界框有555个参数:横坐标、纵坐标、长、宽、置信度。

目标检测:影响精度的因素

在这里插入图片描述
主干网络中,MobileNet属于速度较快的网络,在考虑速度时可以选择。

4 实例分割

在这里插入图片描述
上图为目标检测时所用到的Faster R-CNN。对于实例分割多了一个Mask预测,于是变成了Mask R-CNN
在这里插入图片描述
在这里插入图片描述
Mask R-CNN训练阶段使用的Mask样例:
在这里插入图片描述
Mask R-CNN实例分割结果
在这里插入图片描述
Mask R-CNN检测姿态
在这里插入图片描述


http://www.ppmy.cn/news/35983.html

相关文章

Java设计模式-10 、模板方法模式

模板方法模式 (定义一个操作中的算法的框 架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义 该算法的某些特定步骤。) 个人理解:即把公共的东西提取出来封装成一个方法,不同的部分封装成一…

记录一下,win11,单击zip文件后文件管理器闪退

新买的笔记本电脑,正版win11家庭版,压缩软件安装的是winrar,安装了其他一堆软件后,发现文件管理器经常莫名闪退。多次尝试之后,发现是只要是单击zip文件后就会文件管理器闪退,然后恢复桌面。 1. 百度了“w…

走进小程序【二】微信小程序环境搭建并初始化第一个小程序项目

文章目录🌟前言🌟开始🌟微信开发者开发工具🌟安装微信开发者工具🌟你的第一个小程序🌟目录结构🌟写在最后🌟前言 哈喽小伙伴们,上一期带大家简单了解一下微信小程序&…

3月份读文+学习思考记录

基于GPT3.5搭建定制化知识库 https://mp.weixin.qq.com/s?__bizMzIyNDAzMzYxNQ&mid2652028778&idx1&sn985a386f915dea0d4dc97186af7c50b6&srcid0316LqkslRQXM1UyluqQFTxe 当然,还有一个问题:程序员怎么办?程序员会被替代吗…

nginx-面试篇-11

nginx性能优化 当我需要进行性能优化时,说明我们服务器无法满足日益增长的业务。性能优化是一个比较大的课题,需要从以下几个方面进行探讨 当前系统结构瓶颈 了解业务模式 性能与安全 当前系统结构瓶颈 首先需要了解的是当前系统瓶颈,用…

线程池的讲解和实现

🚀🚀🚀🚀🚀🚀🚀大家好,今天为大家带来线程池相关知识的讲解,并且实现一个线程池 🌸🌸🌸🌸🌸🌸🌸🌸…

2023字节、腾讯、阿里等6家大厂Java开发面试真题+高频面试题总结

又是一年求职面试旺季,不管你是新进职场小白还是职场老鸟,这些关于java程序员面试应准备的东西你都应该知道。 面试前需要准备 1. Java 八股文:了解常考的题型和回答思路; 2. 算法:刷100-200 道题,记住刷…

Camel Quartz Component创建QuartzScheduler的过程

Camel Quartz Component创建QuartzScheduler的过程QuartzScheduler的创建通过Spring配置文件调整Quartz配置参考QuartzScheduler的创建 在QuartzComponent启动时会对QuartzScheduler进行初始化。 org.apache.camel.component.quartz.QuartzComponent#doStart 在创建QuartzSc…