卷积神经网络系列学习笔记yolo+R-CNN+GAN等等

提示:本人还在学习当中,所作笔记仅供大家参考,若有问题欢迎大家指出!


卷积神经网络的一些变体

深度可分离卷积(Depthwise Separable Convolution,DWConv):是由一个两部分卷积组成的一个网络。主要是为了降低卷积运算参数量。但会降低精度,但可以提升网络的深度从而提升一些精度
第一部分是depthwise conv 是分通道的一个卷积 就是每个卷积核对应input的每一个通道 如下图:
在这里插入图片描述
第二部分是pointwise conv。它将第一部分各自独立的3个featuremap进行组合生成了一个新的特征图
用一个kernelsize为1,通道数为input通道数的一个卷积完成,具体如图
若要输出通道为n,这里则有N个1*1的卷积,所以相较于普通卷积能减少参数计算
在这里插入图片描述
空洞卷积(膨胀卷积):增大感受野,但会丧失一些连续信息,对小目标有害无益,但合理利用多个不同膨胀系数的空洞卷积可以缓解这个问题
在这里插入图片描述
Sparse Convolution:实现部分有点复杂,需要花时间好好看一下这里
总的来说就是对于稀疏数据,只对可见部分进行卷积操作,减少计算量

卷积神经网络CNN

感受野:卷积核与输入矩阵运算的子矩阵就是感受野(特征图上的某个点能看到的输入图像的区域,即特征图上的点是由输入图像中感受野大小区域的计算得到的)
对比全连接层,大大减少权重参数
卷积通过一个核矩阵学习到一个区域的特征,但卷积无法学习到全局的一些信息,比如眼镜和鼻子他们在人脸上的位置关系?
提问
1,什么叫卷积,卷积层的作用是什么?答:卷积是一种数学操作,数学模型,在生活中可以找到应用场景,在图像处理中其目的是提取特征,从而降低噪声。图像处理中的卷积运算与数学中的卷积运算有些不同
卷积层的作用是将输入和核矩阵进行交叉相关加上偏移后得到输出。这个输出就是一个特征
核矩阵和偏移是可学习的参数,核矩阵的大小是超参数
2,那如何提取特征呢?答:图像特征是一些矩阵,卷积核是一个小矩阵,一般是3乘3,将这两个矩阵通过一些操作获得新矩阵。
3,新矩阵就是提取到的特征?为什么这样做就能提取特征呢?答:新矩阵是提取的特征,对于输入矩阵来说,新矩阵就是其特征向量。新矩阵是通过编码器而得出的,用于解码器
4,新矩阵后面将作什么运算?答:新矩阵我们称为特征图,用于后续的任务
输入矩阵和核矩阵的运算:选输入矩阵的第一个和核矩阵形状一样的子矩阵和核矩阵作运算,然后在输入矩阵再往右移一列取子矩阵和核矩阵作运算,这样从左到右从上到下取矩阵作运算,右移一列则步幅为1
卷积层将输入和核矩阵进行交叉相关,加上偏移后得到输出。交叉相关即对映元素相乘再取和,公式就是y=wx+b,y是输出值
w是输入矩阵中即将和核矩阵x做交叉相关运算的矩阵,w
x就是交叉相关运算。x和b都是可学习参数
卷积层中有三个参数:通道和填充和步幅
通道:一张图片是多通道的叠加,比如rgb是三通道,对每个通道的结果求和。每个通道表示为一种或是一些特征,在rgb三通道中就表示红黄绿三中颜色。对于每一个通道都有对应一个卷积核,所以增加通道数就增加了卷积核的数量,也就是增加了可学习的参数的数量。也就是使得输出的特征更加多
填充就是对输入矩阵进行填充,在输入矩阵附近添加一些全为零的行和列,使得输出矩阵是预想的形状
步幅是每次移动的步幅,也会影响输出矩阵的形状
一个卷积核和一个通道进行计算,三个卷积核和三个通道分别计算,将得到的结果加起来得到一个通道的输出
卷积输出一个通道的总参数量是核size核size输入图片通道数
池化层:池化层分为3类,平均池化(取平均值),最大池化(取最大值)和随机池化(取随机值)。
作用:压缩数据和参数的数量并使模型获得一些平移不变性(将图像边缘区域都设为其中的最大值或平均值这样)
池化层的工作原理类似于卷积操作,计算方法不同,池化层的超参数是核的大小nm和步幅d和填充
池化层在输入矩阵中从第一个位置取n
m大小的子矩阵进行操作,这个操作对于最大池化方法来说就是取其中的最大值,然后从左向右,从上到下按步幅d平移
lenet卷积神经网络:LeNet是早期成功的神经网络,先使用卷积层来学习图片空间信息,然后通过池化层,然后使用全连接层获得输出
全接层 将数据输出为一个1*n的数据,里面每一个数据是表示所属这n个类别的概率,取最大值即为分类结果。n是类别总数
Alexnet:更深更大的 LeNet
主要改进:
•丟弃法
• ReLu
• MaxPooling
计算机视觉方法论的改变
卷积神经网络误差反向传播:
全连接层的参数过多,会出现过拟合问题
vgg,vgg块,一个神经网络主要由多个块组成,块内由各种层组成。如何更好的加深加宽神经网络。现在神经网络的训练成本依然很高,如何减少训练成本
nin,nin块,无全连接层,用多个卷积代替,效果比Alex net好一点
google net,inception块,通过1x1的卷积层降低通道数

resnet残差网络:残差块
解决问题:无脑的增加模型的参数,反而会降低模型的精读,loss越算越大,即偏离了梯度下降路线
解决方法:当网络退化时,浅层网络能够达到比深层网络更好的训练效果,这时如果我们把低层的特征传到高层,那么效果应该至少不比浅层的网络效果差,或者说如果一个VGG-100网络在第98层使用的是和VGG-16第14层一模一样的特征,那么VGG-100的效果应该会和VGG-16的效果相同。所以,我们可以在VGG-100的98层和14层之问添加一条直接映射 (Identity Mapping) 来达到此效果。
在这里插入图片描述
残差网络,浅层模型的输出是x,则再加模型,她不是继续从x开始学习,即输入不是x,而是h-x,h是真实值,若最后的输出是y,则整个模型的输出为y+x
梯度消失在更深模型中出现的原理是因为这样计算梯度是一个复合函数求导,是由多个乘法组成,导致梯度计算越来越小
残差网络则优化了梯度下降方法,使得梯度下降慢了一些

ConvNeXt

ConvNeXt:使用swin transformer的训练方法和网络结构加上DWconv使卷积神经网络达到和transformer差不多的效果
在这里插入图片描述
ConvNeXt V2:1.提出了。全局响应归一化 (Global Response Normalization, GRN),其目的是提高信道的对比度和选择性。2.mae架构,掩码和不对称的encoder-decoder 3.稀疏卷积
作者使用 masking ratio 为0.6的随机掩码策略。由于卷积模型具有分层设计,其中特征在不同阶段进行下采样,掩码在最后阶段生成,并递归上采样直至最佳分辨率。作者从原始输入图像中随机去除 60% 的 32×32 Patches,数据增强只使用 Random resized cropping。
在预训练期间,将卷积替换为 submanifold sparse convolution,这使得模型只能在可见数据点上操作;在微调阶段,稀疏卷积层可以转换回标准卷积,而不需要额外的处理。
在这里插入图片描述

分割检测R-CNN系列

图像分割有一下四种:
目标检测:旨在图像中定位和识别特定对象的位置,给出图像中特定对象的类别及锚框 区分一个类别的不同对象
语义分割(semantic segmentation):将图像按像素分类,不区分一个类别的不同对象
实例分割(Instance segmentation):将图像按像素分类,区分一个类别的不同对象
全景分割(Panoramic segmentation):将图像按像素分类,对图中的所有物体包括背景都要进行检测和分割(实例+语义分割)
r-cnn
卷积层的输入是选择搜索的结果然后resize成同样大小,大概有2000个框,卷积层输出2000个特征。分类器就是图片里的svms 将卷积网络的输出(特征)进行分类,看里面是否有我们所需要的物体
回归器就是图片里的bboxreg,输入框的两个坐标(左下,又上),用一个损失函数判断离目标框还有多远,目标框是一个准确的框(人工标注)
在这里插入图片描述

fast rcnn
先对原始图片进行一次卷积,然后选择性搜索是对卷积后输出的图片进行的
rcnn的resize方法会使图像失真,fastrcnn使用roipooling来将选择搜索的框统一大小,其原理就是:
假如要输出的大小为2,2。则roipooling将选择搜索框分为四个部分,每个部分取最大值(最大池化)
在这里插入图片描述

fasterrcnn就是在fastrcnn基础上优化了选择搜索部分,使用rpn代替选择搜索
rpn就是说对于每个像素,生成大小长宽比不一样的一些瞄框,然后对这些框进行回归和分类操作,分类是二分类,看这些框内是否有我们感兴趣的物体,没有就舍弃,有就进入roipooling
最后的分类则判断这些物体具体是什么
在这里插入图片描述

yolo系列

yolo系列或者说目标检测领域的模型框架
1.backbone 2.neck 3.detection head
neck网络的核心作用就是处理backbone的输出,整合其中的信息,如SPP模块、RFB模块,或者FPN网络等
空间金字塔池化:
对特征图进行多次不同尺寸池化生成特征图,然后再拼接起来,以获得不同尺度的特征
在这里插入图片描述

YOLOv1
流程:1.输入一张图片,将图片放入backbone后获得特征图输出NCSS N是batchsize,C是通道数,SS是将图像划分成SS个区域
2.detection head 这一层不太清楚有什么用,输入依然是NCSS

3.进入预测层,输出N 30 S S 这一层就是学习到一些参数使得最后能得到一个我们想要的预测结果,
通道数30的含义是:
特征图的每个位置预测两个bounding box (bbox),而每个bbox包含五个输出参数:置信度C,矩形框参数(x, y , w, h),共10个参数,再加上20个类别,一共就是30了。置信度C的作用是判断此处是否有目标的中心点。
如何得到一个合适的框呢?用NMS和置信度
4.:计算这B个bbox与此处的真实bbox(也就是标签)之间的交并比(Intersection over Union,IoU),得到B个IoU值;
5.:选择IoU值最大的预测框作为正样本,分别去计算置信度损失、类别损失和边界框回归损失,其中置信度损失的标签就是该IoU值。B个预测框选择置信度最大的那个作为正样本
6.:对于剩下的没被选中的B-1个预测框,它们都被标记为负样本,即只计算置信度损失,且置信度标签都为0,这是显然的。这些负样本不计算类别损失和边界框回归损失。同时,对于那些处在正样本候选区域之外的预测,都标记为该标签的负样本,也只计算置信度损失。
最后每个网格只会输出置信度最高的那个框(倘若一个网格包含了两个以上的物体,那必然会出现漏检问题)
最后还是会获得多个框,然后用NMS
NMS(非极大值抑制)。2个框重合度很高,大概率是一个目标,那就只取一个框。重合度的计算方法:交并比IoU=两个框的交集面积/两个框的并集面积。

框的置信度=object置信度*class置信度 框的置信度用于区分前景和背景,object置信度用于区分有无物体,class置信度用于区分属于哪一个类别

YOLOv2:更好,更块,更强 基于yolov1的更多改进看这里
YOLOv2对YOLO进行一些地方的改进,其主要包括:加入BN,预设框,全卷积网络,new backbone:DarkNet19,聚类先验框,使用更高分辨率的特征,多尺度训练
预设框=先验框=锚框:设计先验框的一个难点在于设计多少个先验框,且每个先验框的尺寸(宽高比和面积)又是多少。这些参数都是超参数,人工设计,根据经验得到的结果
网络只需要学习将先验框映射到真实框的尺寸的偏移量
作者采用kmeans方法在VOC数据集上进行聚类,一共聚类出k个先验框,通过实验,作者最终设定 。聚类的目标是数据集中所有检测框的宽和高,与类别无关。
多尺度训练:每训练10次改变下10次训练的输入图片的尺寸
使用更高分辨率的特征:之前的改进中,YOLOv1都是在最后一张大小为13×13×1024的特征图A上进行检测,为了引入更多的细节信息,作者将backbone的第17层卷积输出的26×26×512特征图拿出来,做一次特殊的降采样操作,得到一个13×13×2048特征图B,然后将AB二者在通道的维度上进行拼接,最后在这张融合了更多信息的特征图上去做检测。
全卷积网络:将v1最后的全连接层换成全卷积网络

  1. 使用更大输入图片448 × 448使得输出特征图大小增大到13× 13
  2. 不再使用均匀切来的锚框,而是对训练数据里的真实锚框做聚类,然后使用聚类中心作为锚框。
    相对于SSD和Faster R-CNN来说可以大幅降低锚框的个数。
  3. 不再使用YOLO的全连接层来预测,而是同SSD一样使用卷积。例如假设使用5个锚框(聚类为5
    类),那么物体分类使用通道数是5*(1+num_ classes )的1× 1卷积,边框回归使用通
    输出张量大小是S×S×k×(1+4+C),每个边界框的预测都包含1个置信度、4个边界框的位置参数和个类别预测。k表示每个网格的预设框数量,SS表示有SS个网格

yoloV3:YOLOv3的关键改进便是使用了FPN结构与多级检测方法。
多级检测方法。:由FPN衍生而来“分而治之”,即不同尺度的物体由不同尺度的特征图去做检测
FPN:融合不同尺度的特征图

ssd和fasterrcnn不一样的地方在与这里的分类是判断有没有对物体和是什么物体,还有改变就是对于第一次卷积后的图像再做一次卷积并且再回归和分类
在这里插入图片描述
region proposal(候选区域):也就是候选框
Bounding-Box regression:边界框回归,即对最后确定的框再进行微调
金字塔网络:解决小目标检测的问题,小目标的特征会在经过逐层的下采样后受损,目的就是分类或预测
FPN是一个结合了SSD的多分辨率尺度预测和U-Net的多分辨率特征融合的网络结构,如图2所示。FPN可以分成3部分:
图左侧的自底向上的卷积;图右侧的自顶向下的上采样;图中间的横向的特征融合。
其中P5是由C5计算得到,P4是由P5和C4计算得到,以此类推。FPN的这种计算方式便是自顶向下的路径
那么是如何从p5c4得到p4呢?

MASK-RCNN

roipooling中使用了差值方法=roialign,roipooling则是取整。
是实例分割,前面都是目标检测,加入fcn
在这里插入图片描述

全连接卷积层:转置卷积。其实也是卷积,但和普通卷积不一样的是转置卷积的步幅是将输入放大,转置卷积的步幅等于原卷积步幅分之一
fcn(全连接卷积网络下图右),图左是正常的卷积网络,就是将dense换成转置卷积,将卷积后的输出用转置卷积还原成原始图像大小
在这里插入图片描述
mask rcnn流程:
首先,输入一幅你想处理的图片,然后进行对应的预处理操作,或者预处理后的图片;
然后,将其输入到一个预训练好的神经网络中(ResNeXt等)获得对应的feature map;
接着(RPN),对于每个像素,生成大小长宽比不一样的一些瞄框,然后对这些框进行回归和分类操作,分类是二分类,看这些框内是否有我们感兴趣的物体,没有就舍弃,有就作为候选框进入roiAlign
接着,对这些候选框进行ROIAlign操作(用插值方法讲这些框统一到一样大小(7*7))
最后(FCN),对这些ROI进行分类(N类别分类)、BB回归和MASK生成(在每一个ROI里面进行FCN操作)。

评估指标

MAP:AP是PR曲线下的面积,MAP是所有类的AP的平均值
在这里插入图片描述
(2)TP:被正确地划分为正例的个数,即实际为正例且被分类器划分为正例的实例数;
(3)FP:被错误地划分为正例的个数,即实际为负例但被分类器划分为正例的实例数;
(4)FN:被错误地划分为负例的个数,即实际为正例但被分类器划分为负例的实例数;
(5)TN:被正确地划分为负例的个数,即实际为负例且被分类器划分为负例的实例数。

生成模型GAN

GAN思想:
判别模型:最简单的情况下也是一个mlp,通过训练,使得判别模型对y处理后输出的结果尽量靠近0,0表示说这个y不是原数据中的值,是一个假的值
DCGAN对抗过程:第1代生成器输入随机噪声z,输出一张生成的图片g,把g和真给辨别器,计算loss,生成器更新参数;真和真实图片,假和g分别输入鉴别器生成两个loss,对两个loss求均值后,反向传播更新鉴别器。直到鉴别器无法判断这个样本是来自生成器还是真实图片
生成器是反卷积:反卷积是在 整个输入矩阵周围添 0,微步幅度卷积把输入矩阵拆开,在每一个像素点的周围添 0。
生成器的损失函数:Lg=loss(D(G(img)),1) #img是样本,是真实图片 loss是bceloss
辨别器的损失函数:Ld=[ loss(D(img) , 0)+loss(D(img) , 1) ] / 2
Lg是越来越大,Ld是越来越小
Lg就是说让辨别器

所谓的交叉熵的交叉就是指这两个分布之间的交叉,让两个分布越接近则交叉熵损失越小。(ylog§表示交叉熵)
在这里插入图片描述

详解交叉熵损失:Pi是事件发生的概率,下面这个就是熵的函数
我们可以看到,当概率为100时,函数值为0,所以我们可以通过最小化函数来使某件事发生的概率最大
如果输入多个样本,我们只需要取和的平均值即可
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
所以上面的公式就是熵的期望
在这里插入图片描述
上面其实是两个熵的相加,一个是另一个的交叉熵,y是标签,在二分类只取0或1,也表示属于某一类的概率为0或者1,那么y的对立面就是1-y,而我们将两个熵相加得到bce的损失函数,这里两个熵只有一个会生效,因为在实际计算时y和1-y肯定有一个为0。y和1-y分别对应正负样本,所以后面的log内的概率分别对应正负样本的概率
在这里插入图片描述
对于多个样本我们就得到了我们最终的bceloss,这里的N是指样本数量(可以理解为batchsize?或是正负样本对的数量)

VQGAN:
Vector Quantization:矢量量化是一种极其重要的信号压缩方法,
将若干个标量数据组构成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失多少信息。
这张图划分为16个区域;任意的坐标都会落到上面这张图中的某一特定区域。然后它就会被该区域的红星的点近似表示。
也就是这16个红星点可以描述这一整张图。
在这里插入图片描述
VQGAN 模型会优化两个损失函数:一个用于量化误差(即离散化向量和连续值之间的误差),另一个用于生成器和判别器之间的对抗损失。
嵌入空间(又称codebook)来完成整数序号到向量的转换。
在这里插入图片描述
WGAN-GP:
解决原生gan训练不稳定的问题
解决方法:1.加噪,2.使用W距离衡量正负样本的距离(损失函数)3.使用梯度惩罚和正则化使得梯度,损失,参数都在一定范围
在这里插入图片描述
上面是辨别器的损失函数,左边部分是W距离,右边部分是梯度处罚
上面损失函数用代码表示就是d_loss_fake - d_loss_real + c
d_loss_fake就是将生成器生成的图片放入辨别器得到的值取平均
辨别器的输出是一个一维向量(将辨别器得到的特征图拉平view)
d_loss_real同上,将真实图片放入辨别器的到得值取平均
C是梯度惩罚值
d_loss_fake - d_loss_real就是W距离,C的作用是使得训练更加稳定
d_loss_fake下降,d_loss_real上升,gradient_penalty下降,所以整个loss是越小越好
生成器的loss也是越小越好,因为辨别器是希望这个loss越小越好,那么这里是越大越好,加个负号就是越小越好
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值