计算机视觉知识点集

8 阅读39分钟

回归任务:最终是预测一个值,是由得分值计算一个损失;

分类任务:是有概率值计算一个损失。

语义分割不区分相同类别的不同实例;而实例分割区分相同类别的不同实例,并对不同实例进行分别标识。

半监督模式:利用模型生成的Top-K个类别,作为伪标签,再反过来传递给模型继续训练模型。

————————————————————————————————

人脸支付涉及模块:

人脸多任务(多个人脸检测)、人脸姿态任务(涉及人脸旋转)、人脸识别(一般68点或95点人脸标注)、支付(与数据库人脸信息比对)

人脸识别流程【人脸检测】【人脸矫正】【人脸特征提取】【人脸比对】

人脸检测:

在图像中准确标定出人脸的位置和大小,并把有用的信息选出来(如直方图特征、颜色特征、模版特征、结构特征、Haar特征等),然后利用信息来实现人脸检测等目的。

主流方法:

基于检测出的特征采用Adaboost学习算法挑选出 一些最能代表人脸的 矩形特征(弱分类器),按照 加权投票 的方式将 弱分类器 构造成一个 强分类器, 再将训练得到的若干 强分类器 串联组成 一个 级联结构的 层叠分类器, 有效地提高 分类器的检测速度。

ps:Adaboost算法是一种用来分类的方法,它把一些较弱的分类方法 合在 一起, 组合成 新的很强的 分类方法。

人脸姿态多任务中损失函数:

分类用 torch.nn.CrossEntropyLoss() 交叉熵

回归用:nn.MSELoss()或nn.wingLoss()

——————————————————————————————————————

优先选择使用HDF5文件存储,因为HDF5存储的时候支持压缩,使用的时候是blosc,这个是速度最快的,也是pandas默认支持的。使用压缩可以提高磁盘利用率,节省空间。

HDF5还是跨平台的,可以轻松迁移到hadoop上面。

DeepLab-V3+ 整体网络架构:整体Encoder+Decoder

1,DCNN特征提取到特征图。

2,对特征图进行不同倍率的空洞卷积ASPP和 一个ImagePooling ,然后进行拼接和1*1卷积得到一张特征图;

3,对特征图再进行低层级特征提取,然后与 2步骤的特征(已经过上采样)进行拼接融合,再进行3*3卷积,再次上采样生成预测图。

从图像中提取文本:

检测到文字所在位置: CTPN网络架构。
VGG提取特征、BLSTM融入上下文信息、基于RN完成检测。

识别文本区域内容:CRNN(CNN、RNN)

Text-CNN应用于文本分类:

初始化n个size的卷积核,每个size的卷积核都有2种权重参数矩阵,再进行卷积生成2n个特征图,对每个特征图进行Max-pooling选取一个特征,然后同一size对应的特征图进行concat拼接,再所有特征图顺序拼接成单一维度向量,再进行softmax函数生成2个类别。

对视频进行处理的网络模型:slowfast

1,分别获取 高频 与 低频 图像数据;

高频2-stride获取1帧;低频16-stride获取1帧。

2,分别通过Resnet进行特征提取;

slow的特征图:{ T, S2,C}

fast的特征图:{ αT, S2, βC}

3,特征融合(三种融合方式)

第一种:reshape and transpose { αT, S2, βC}(fast特征图) into { T, S2,αβC}

第二种:时间步采样,相当于对fast再次采样成 { T, S2,βC}

第三种:time- strided convolution卷积。

4,预测

BEV框架-BevFormer。

—————————————————————————————————————————

CNN卷积网络主要有:卷积层、激活层、池化层、全连接层

卷积层:卷积运算的目的是提取输入图像的不同特征,低层卷积层提取的低级特征如边缘、线条等特征,高层卷积层能从 低级特征 中,迭代提取更复杂的特征。

激活层:将卷积层的结果进行 非线性映射,增加网络的 非线性。常用的激活函数:sigmoid、tanh、relu、leakrelu等

池化层:GMP(最大池化层)、GAP(平均池化层)对卷积层学习到的特征图进行下采样处理,能够降低了 后续网络层的输入维度,缩减模型大小,提高计算速度,并且提高特征图的鲁棒性,防止过拟合。

全连接层:卷积网络的最后会将 末端得到的特征图 flatten成 一个长长的向量,并送入 全连接层 进行分类或回归。

input是32323的图像,用10个5*5的filter来进行卷积操作,所需的权重参数有多少个?

因为input是3个channel通道,所以filter卷积核也是3个channel通道,则一个filter卷积核的参数量是553 = 75个参数,此时有10个不同的卷积核,则一共包含75 * 10 个卷积核参数。还需要考虑b偏置参数,因为每个卷积核都有一个对应的偏置参数,则一共需要10个偏置参数。综上所述,一共需要750+10=760个权重参数。

torch.nn.funtional.conv2d(input=x, filter=f,strides=[1,1,1,1],padding='SAME')

strides=[1,1,1,1] 对应着【batch_size维度b,h维度,w维度,颜色通道维度c】默认情况b维度和c维度都是1。

warmup_ratio: 预热系数

原理:

由于模型的权重是随机初始化的,刚开始训练时,若学习率较大,可能带来训练不稳定。选择warmup_ratio预热学习率的方式,使得开始训练的几个epoch或者一些step内学习率较小。

源码演示:

import torch.optim as optim
from torch.optim.lr_scheduler import LambdaLR
from torchvision.models import resnet50
#定义模型和优化器
model = resnet50()
optimizer = optim.SGD(model.parameters(), lr=0.1)

#定义学习率调度器
warmup_steps = 1000 #预热步数
total_steps = 10000 #总步数
scheduler = LambdaLR(optimizer, lr_lambda=lambda step: min((step+1)/warmup_steps, 1))

#训练过程
for step in range(total_steps):
    #在每个步骤前 更新学习率lr
    scheduler.step()
    # 在这里执行模型训练的代码
    # coding
    print(f'Step{step}, learning Rate:{optimizer.param_groups[0]['lr']}')

gradient_accumulation_steps: 梯度累积,每次获取1个batch的数据,计算1次梯度,梯度不清空,累积啊到预设值后,再更新网络参数,然后清空梯度,进行下一轮循环。

per_device_train_batch_size: 每卡的batch_size数量

torch.cuda.amp是PyTorch中用于自动混合精度训练的模块。

torch.cuda.amp.autocast: 

上下文管理器自动选择使用float16或float32进行计算。它常识在不牺牲精度的情况下,尽可能使用float16来加速和减少内存使用

torch.cuda.amp.GradScaler: 

自动缩放梯度,以防止在训练过程中 使用float16时出现梯度下溢问题,梯度缩放是一种技术,通过放大梯度来抵消float16精度导致的数值不稳定性。

————————————————————————————————————————

SIFT角点检测算法实质:在不同的尺度空间上查找关键特征点,并计算关键点方向和对其进行特征描述

1,尺度空间极值检测(高斯金字塔->高斯差分金字塔寻找极值点)

2,关键点精确定位

3,确定关键点主方向

4,对关键点进行特征描述【梯度方向和梯度幅值等】

Faster-RCNN:

1,BackBone特征提取(主要是Resnet特征提取+FPN特征融合)

2,候选区域生成

3,ROIpooling经过两次量化,锁定特征图在原图上的精确位置

4,目标检测:softmax分类和边框回归层

ps:ROIPooling:将候选区域映射到特征图上,进行尺寸的固定,以便与原图位置相对应

anchors技术思想:

将“检测问题”转换为“这个固定参考框中有没有目标,目标框偏离参考框多远”

Faster-RCNN检测小物体效果不好的原因之一:

在进行ROIPooling的时候,需要进行2次量化。假如输入图像是800800,检测到的物体目标size是665665;在第一次量化时,第5层的图像(经过了5次尺寸缩小了2^5=32倍)尺寸大小是800/32 = 25,

那么此时物体目标尺寸=655/32=20.78取整约为20(此时忽略了小数部分的特征);在第二次量化时,要把2020的特征图转化为77的特征图,即第二次量化后的特征图大小是20/7=2.86,再进行取整时约等于2.因此在进行两次量化后,会导致像素位置对应不准,进而导致小目标容易丢失。

而ROIAlign层后,解决了上面的问题:

使用双线性插值方法解决了获得浮点数坐标点的特征值。例如对每个小区域(2.86*2.86)平均分成4份,对这4个小区域分别进行线性插值求每个小区域的中心点特征,再对其4个中心点位置特征值进行Pooling

ROIAlign:先将原图和feature-map的pixel对应起来,然后将feature map和固定大小的feature对应。

FPN:特征金字塔网络,对多个阶段的特征图进行融合,这就相当于既有高层的语义特征,也有低层的轮廓特征;

Anchors坐标可能存在负数,需要进行清洗。

Mask-RCNN:

在Faster-RCNN的基础上,添加了一个Mask分支。在实现目标检测的同时 分割目标像素

mask分支是在ROI-Align之后进行目标分类和定位的mask- classification。

mask分支 是一个 全卷积网络,使用 2*2 的反卷积 进行上采样。

ps: ROIAlign没有使用量化操作,而是使用了 双线性插值 估计非整数点的像素值。

MASK-RCNN和Faster-RCNN的RPN层是一样的,是为了从特征图提取候选框;

MASK-RCNN有33的共享卷积,每个特征图都和同一个33的卷积 相操作。

多任务损失函数:分类、回归、分割三部分组成

NMS的原理:

对于预测框的列表B及其对应的置信度S,选择具有最大score的检测框M,将其从B集合中移除 并加入到最终的检测结果D中,通常将B中剩余 检测框 与 M进行IOU,大于阈值Nt的框从B集合中移除。重复这个过程,直到B为空。

RPN网络主要流程:

生成anchors -> softmax分类判断anchors是否有目标 -> bounding box regression回归分支计算anchors偏移量 -> proposal层根据过滤规则获取候选区域

RPN层的作用:计算得到每一个候选框的3个指标:置信度、概率度、类别

ProposalLayer层:

对20W+候选框进行过滤,先按照前景分排序,取6000个得分高的,此时的候选框会高度重合,把之前的得到的每个框回归值都利用上,再进行NMS过滤。

DetectionTargetLayer层的作用:

去掉pad进来ROI,也即0填充数的ROI;

有的数据集一个框包括多个物体,也需要剔除;

判断正负样本,基于ROI和GT,通过IOU与默认值0.5判断

设置负样本数量是正样本的3倍,总数默认400个。

每一个正样本ROI需要判断其类别,用IOU最大的那个GT(一个候选框,可能与多个类别(例如猫、狗)对应的GT框相交,用IOU最大的那个)

每个正样本们需要得到相对于GT-Box的偏移量

每个正样本需要得到最接近的GT-Box对应的Mask,进行实例分割,将此MASK掩码标注当作正样本的严吗的标注

返回所有结果,其中负样本偏移量和MASK都用0填充

VGG网络:加深版的AlexNet

整个网络由卷积层和全连接层叠加而成,和AlexNet不同的是,VGG使用的都是 3x3的小尺寸的卷积核和2x2的池化核。**

FasterRCNN是采用ResNet或VGGNet作为基础网络,

FasterRCNN主要两个组件:

区域提议网络RPN(生成候选目标区域)+目标分类网络(对候选区域分类和定位)

FasterRCNN主要流程:

特征提取 -> 候选区域生成 -> ROIpooling -> softmax分类和边框回归进行目标检测

VGG16: 

采用了 4层 池化核(2x2)+卷积核(3x3)(图像尺寸每缩减一次的处理过程 称 一层),再全连接层

核心是采用多个3x3的卷积核 替代 大尺寸的卷积核,增加深度而不增加参数量。

SSD检测算法:

采用VGG16作为基础模型,yolo采用DarkNet系列模型

采用CNN来直接进行检测,而Yolo是在全连接层之后做检测。

另外两个重要的改变:

1,SSD提取了不同尺度的特征图做检测。

大尺度特征图(比较靠前的特征图)用来检测小物体,而小尺度特征图(比较靠后的特征图)用来检测大物体。

2,SSD采用了不同尺度和长宽比的先验框(FasterRCNN中叫做锚,Anchors)

SSD检测值:

对每个单元的每个先验框都输出一套独立的检测值,对应一个边界框,主要分为两个部分:第一个部分是各个类别的置信度或评分;第二部分是边界框的location,包含4个值(Cx,Cy,w,h)[极坐标]

损失函数:位置误差+置信度误差

CenterNet:三个输出层,分别得到特征点结果。

物体检测,关键点定位。不需要anchor。不通过IOU选择正负样本。正样本一个,周围都是权重弱化的负样本。利用高斯分布将GT分布到特征图上中各个点上,如果重叠取最大值。

基本原理:

特征图每个点预测3个指标【各类别置信度、中心偏移、长宽】,其实就是相当于每个特征点只预测一个anchor,而不需要候选。

EfficientNet:

Backbone框架,由7个参数的版本【B0、B1、B2、B3、B4、B5、B6、B7】

出发点:网络的特征图个数、层数、输入分辨率都会对结果产生影响。

加入了SE模块【对每个特征图计算其权重】

EfficientDet = EfficientNet + BiFPN(可重复多次进行融合堆叠)

ps:FPN 升级为 PAN 再升级为 BiFPN

FPN:自顶向下模式,传递高层特征。

PAN:引入了 自底向上的 路径,使得底层信息更容易传递到顶部,通过concat到方式传递

CLIP如何训练模型:

图像编码器对图像提取特征;

文本编码器对文本提取特征;

计算图像与文本的余弦相似度;

图像和文本组成矩阵对角线上是正样本。

DETR

基本思想:

CNN得到各Patch作为输入,再套transformer做编码和解码;

编码路子跟VIT基本一样,重在解码,直接预测100个坐标框。

网络架构:

输出层就是100个object queries预测。object queries是核心。

Encoder得到的是各个目标的注意力结果,相当于准备好特征,等解码器来选秀,得到想要的结果。

解码器首先随机初始化object queries(0 + 位置编码),相当于直接用【位置编码】做初始化向量。

通过多层让其学习如何利用输入特征。

注意力的作用:能够找到被遮挡的目标,且使目标 整体结合 不错乱。

DeepSort比Sort算法多了级联匹配(CaseMatched)和轨迹确认(REID)

ReID特征:提前准备一个训练好的模型+已经提取到的特定目标(例如:人)进行训练得到128维向量。这个model是行人重识别训练得到的model,和目标追踪没有关系。

DeepSort算法核心思想:结合了CNN进行目标检测和特征提取,以及在特征空间中使用余弦距离进行多目标关联;

基本步骤:

目标检测和特征提取(预训练的目标检测模型检测视频帧并提取目标特征)

特征匹配和关联 (余弦距离或其他相似性度量方法进行目标之间的匹配和关联)

卡尔曼滤波运动预测和轨迹更新

匈牙利算法进行比对目标关联匹配和重识别

Camshift算法:是基于MeanShift算法的改进,加入了尺度变化。是一种基于【HSV直方图】和【MeanShift算法】实现目标跟踪的计算机视觉算法

MeanShift算法基本思想:选定区域的圆心总是向下一帧点集密度最大方向(点集质心方向)移动;利用直方图比对相似性【选定区域直方图和下一帧直方图】

SA(self-attention)比较擅长在一个序列中,找不同部分之间的关系;词法分析中帮助理解AT更擅长寻找两个序列之间的关系,例如翻译任务。

Mask classification是指对图像中的物体进行分类,并且在分类的同时,还需要对物体的位置进行精确的定位。在mask- classification中,模型需要对图像中的每个像素进行分类,同时生成一个与输入图像大小相同的掩码mask,这个mask用于表示每个像素属于哪个类别。

【MaskFormer】:即可以语义分割;也可以实例分割;计算N个概率高的掩膜对,进行分类;

三个模块:

第一个模块:per-pixel embedding像素级别的模块

逐像素进行Embedding,每个点都被编码映射成向量;这就导致 计算量很大、很吃显存;

第二个模块:transformer模块:

使用标准的transformer-Decoder解码器,Decoder中N个queries(初始化是0+positionEmbedding,可学习的位置编码)会对输入的图像特征进行计算分类(类似CA:Cross Attention);每一个Query会对每一个关注的Mask块进行编码全局信息(即寻找到全局特征信息),并行操作;

第三个模块:输出模块-segmentation分割模块:

*包含了Masked- attention,用了提取一些局部的特征;通过限制CA(因为逐像素计算量太大而SA的计算量比较小,不需要限制)再得到可预测的区域。

*with our proposed Transformer decoder replacing the standard transformer; 修改了注意力计算方法;限制了CA,只是关注了前景(即实例对象,由Query预测得到),而不是关注整个特征图;为了解决小目标,由提出了高效的【多尺寸策略】去利用【高分辨率】的特征(此处借鉴了-可变形DETR)

*不仅加入了正弦曲线位置编码,还加入了【可学习的scale-level编码】

Multi-Head Attention上方还包括一个Add&Norm层;Add表示残差链接(Res- Connection)用于防止网络退化,保留了原始信息;Norm表示LN,用于对每一层的激活值进行归一化。

BN强行让一个batch 每个样本数据的同一个特征(即同一个channel)进行归一化,LN是对一个样本数据的所有特征(即所有channel)进行归一化。

BN批标准化有助于解决反向传播过程中产生的梯度消失、梯度爆炸问题,降低对 超参数的敏感性,并且每个batch分别进行归一化的时候,起到了一定的正则化效果,从而能够获得更好的收敛速度和收敛效果

整个Yolo-V3结构里面,没有池化层和全连接层;而下采样是通过设置卷积的stride=2来达到的,每当通过这个卷积层后图像的尺寸就会减少一半。残差模块中的1x、2x、8x等表示残差模块的个数。

Yolo-V3采用K-means聚类得到先验框的尺寸,为每种尺寸设定3种先验框,总共聚类除9种尺寸

Resnet残差块:解决网络退化问题,至少保留了原始信息。

ResNet进行特征提取,FPN结构作用特征融合,当前层的特征图会融合未来层的特征进行上采样,并加以利用。在实例的FeatureMap中,随着网络深度的加深,浅层的featuremap中主要包含低级的信息(物体边缘、颜色、初级位置信息等),深层的featuremap中包含高等信息(例如物体的语义信息:狗、猫、汽车等)

Fast-RCNN系列,筛选候选区域+目标分割2个阶段;YOLO是通过预定义预测区域的方法来完成目标分割,将候选区和目标合二为一。

传统的机器学习算法 依赖于 人工设计特征,并进行特征提取;而深度学习方法不需要人工,而是依赖算法自动提取特征。

3D点云---最远采样点:

首先是选一个点,在已经确定的点群中,看已知的哪个点距离这个点最近,这个距离需要被录入。重复如此会待定n个点,接着在所有待定的点中,找其对应已经被录入的距离表中最大距离的那个点。

PointNet:

先升维再做Max操作;分别对每个点进行特征提取(卷积或全连接),再Max得到全局特征,再经过一层权重参数矩阵,然后进行输出。

缺点:没有局部特征融合,没有考虑局部样本点关系。

PointNet++:

基于半径选择局部区域(簇);对确定好的每一个局部区域进行PointNet,提取特征;针对得到的每个区域进行特征提取(卷积),做成矩阵向量;

关键点:如何选择区域(簇中心点选择是关键);如何定义半径,每个簇选择多少个样本点。通过【最远点采样】选簇中心点,然后分组(Grouping),对于同一个簇中心点,还会设计3个半径进行特征提取,然后将每个Group提取到的特征体进行拼接,此时一个点会产生3个特征。(维度变换-卷积操作)

做多次采样-分组-卷积提取特征

整体网络架构,经过多次采样-分组,pointnet得到最终整体特征,再进行分类;整体网络架构,分割任务,要得到每个点的特征,需要进行上采样操作。

分类就是得到整个特征再输出;

分割就是得到各个点特征输出结果,是对每个点做分类。

遇到的问题:容易受样本点个数的影响,点数一旦减少,效果明显降低;进而又迭代升级到PointNet++(MSG:Multi-Scale Grouping选择更多 或 MRG:Multi-res grouping)

同构图:点和边的关系只有一种

异构图:点有多种类型,边也有多种类型

传统网络是2D的,处理的是结构化数据,相当于全连接层,多层感知机,一个结构化数据,几个特征。例如f(x)=wx+b; 不能处理图片,由于参数太多。

MAP值是基于置信度阈值,不同阈值虾考虑所有的Precision和Recall下的情况,越接近1越好

卷积核的第三个维度大小,一般和输入的第三个维度一样,一般都是包含RGB的三维数据即包含【R,G,B】

Yolo-V5要求训练的输入的图片size宽高是一样的原因:

训练阶段要求batch size个图像送进去训练,每个图像都有大小,如果大小不一样,则网络没法做并行计算。

而预测阶段不需要图片大小一样的原因是:预测阶段图片是一张一张预测的

FlashAttention3:

HOPPER GPU上新硬件功能:

1,WGMMA 线程组矩阵乘加:此新功能利用了Hopper的新TensorCores,吞吐量显著提高

2,TMA 张量内存加速器: 专用硬件单元,可加速全局内存和共享内存之间的数据传输,负责所有索引计算和越界预测。释放了寄存器资源。

3,FP8低精度。这使Tensor Core吞吐量翻倍,通过使用更少的位数来表示浮点数,牺牲了精度。

4,异步性:重叠GEMM和SOFTMAX。注意力有GEMM(Q和K之间的矩阵乘法以及注意力概率P和V之间的矩阵乘法)和softmax作为其两个主要操作。

ps:Softmax(x) = e^x_i / Sum(e^x_i) ; x_i 表示第i个元素值x

姿态预估:

PAF标签值:包括所有人该连接处的向量;

在特征图上每个固定连接区域都包括一组向量(X方向、Y方向)

总共19种连接方式,每种连接方式对应X,Y两个方向的特征图,所以一共38个特征图。

对两个关键点A和B之间PAF权值计算;求两个关键点之间各点的PAF在线段AB投影的积分。如果线段上各点的PAF方向与线段的方向越接近,权值越大。

匹配时,用匈牙利算法。

行人重识别:

评估标准 两个概念: rank1和map值。

rank1:即第一张结果正确

map值:多次输入的结果ap值,再进行综合计算后的结果。

ap值:假如第一次查询图片1,图库中查询出5张相似图片ListA,查询图片1返回10张相似图片ListB,假如ListA中的五张图片分别对应着ListB中的第1,3,5,6,10。则ap值为(1+2/3+3/5+4/6+5/10 )/5

损失函数定义:分类损失+Triplet loss

Triplet loss:需要准备3份数据,Anchor表示当前数据,Positive是跟A相同人的数据,Negative是不同人的数据。分别对这3份数据进行编码,经过同样的网络处理计算它们的差异,通过差异值来更新权重参数。 使用Resnet50进行特征提取。

网络结构&实现步骤:

1,对整体进行特征提取,将输入数据resize后,输入到resnet网络中,基本所有的REID模型都先进行这一步。加载ImageNet预训练的resnet50模型。

2,将特征图分块,直接在h维度进行截取,分成n个 h/n块,分别进行多组实验,n可为2,4,6等

3,计算GCP特征,avgPool会引入局部与背景信息,差异特征更好描述局部关系。

GAP:全局平均池化层相当于全局都有了;GMP:全局最大池化层相当于最核心那一块。

GCP:相当于各个关键点的信息。

4,one vs rest:n个模块中任一模块都要和其他模块做类似attention机制的操作。出发点就是不要把局部信息给孤立了。

5,损失函数:计算分类损失+triplet loss

基于解决遮挡现象的REID模型:

数据重构,Occluded-DukeMTMC(query里面全是遮蔽现象的数据)

提出三个阶段的模型:

1,关键点局部特征提取; 

选择一个pose estimation姿态估计模型,得到各个关键点的热度图信息,通过热度图得到原始特征图的局部特征。其实就是一个乘法操作,用pose estimation得到的热度图来计算局部特征。全部特征是GAP得到。local和global的都需要进行CNN特征提取

2,图卷积融合关键点特征;即局部特征关系整合。

先初始化邻接矩阵来进行图卷积,邻接矩阵在学习过程中更新。图卷积重点就是如何利用各个点的特征。这个阶段就是要得到邻接矩阵来指导每个关键点如何跟其他关键点进行计算,并且矩阵要进行学习。和整体特征差异越大的越离群,利用 差异特征来学习邻接矩阵A。有了邻接矩阵A就能开始图卷积,来指导如何利用不同关键点的特征进行组合,最终再与输入的局部特征进行整合。

3,基于图匹配的方式来计算相似度并训练模型。

使用AP和AN两组图片(A是Anchor数据,P是positive数据,N是Negative数据)计算它们的相似度。图匹配就是一个相似度矩阵U,表示图与图之间的关系,交叉得到各自匹配的特征结果。

损失函数中,相对上面的算法的损失计算,还引入了验证损失就是sigmoid损失。

MobileNet不同版本对比:

V1: 

深度可分离卷积【先进行DW深度卷积,再进过ReLu,再进行PW逐点卷积】

DW深度卷积:对输入的每个Channel通道进行独立的空间卷积。对于具有C个输入Channel通道的输入特征图,深度卷积会对每个输入通道应用一个单独的卷积核,生成C个单通道的输出特征图。

PW逐点卷积:逐点卷积是常规的1x1卷积,用于将深度卷积的输出特征投影到新的特征空间。

深度可分离卷积显著减少了 参数数量和计算量,同时在一定程度上保持模型的表达能力。

V2:

先进行1x1的扩展升维,升维操作是为了能够做接下来的DW深度卷积, 然后再进行一次1x1的PW压缩。

先升维再ReLu,减少破环,残差连接要考虑特征图是否相同。

V3:

引入Squeeze- Excitation结构。标题名为SearchingForMobileNetV3

非线形变换改变,h-swish替换swish;

ps: Swish(x)=(βx);σ 是Sigmoid函数,β 是一个可学习的参数。

hard-swish是一个分段线形函数用来替换sigmoid函数,减少计算量;

h-swish(x)=x *ReLU6(x+3)/6

前提Tips:

Concat:张量拼接,通道维度会扩充

Add:张量相加,不会扩充维度。

YOLO系列

V1:2个Anchor,7*7grids; 

输入是Resize(448448),训练是224224,测试是448*448;

Backbone:GoogLenet(24个卷积层+2个FC全连接层+reshape)、Dropout防止过拟合、最后一层使用线性激活函数、其余层都是使用ReLu激活函数。 

无Neck层,

Predict/Train都使用了IOU_Loss、nms,一个网格只预测了2个框,并且都属于同一类,全连接层直接预测bbox的坐标值

V2:

5个anchors,13*13grids,通过k-means选择先验框;

输入是Resize(416*416);

BackBone是DarkNet-19:每一层卷积都是用BN和ReLu防止过拟合,舍弃dropout。提出pass through层,拆分高分辨率特征叠加到低分辨率特征中,进行特征融合,有利于小目标的检测。

无Neck层;

Predict/Train都使用了IOU_Loss、NMS;一个网络预测5个框,每个框都可以属于不同类;预测相对于anchor box的偏移量; 多尺度训练

V3: 【整个V3结构,没有池化层和全连接层,网络的下采样是通过设置卷积的stride=2来实现图像尺寸减半】

9种anchors,13*13 grids,三种尺度[三种面积尺寸]每种选三种宽高比;这9种尺寸的先验框是由K-means聚类算法得到的。

输入层:input图片size必须是32的倍数(32n32n),默认416416、图像增强、预处理(归一化、标准化)

BackBone:

DarkNet53(53个Conv卷积层),每一层卷积层后都使用BN和Leaky ReLu防止过拟合,残差连接。

Neck层:

FPN多尺度检测进行特征融合。

Predict/Train阶段使用了IOU_Loss、NMS;多指标预测softmax分类函数改为logistic二分类。

输出标签维度是[4+1+80], 4:极坐标x,y,s,r; 1:置信度; 80个类别概率

ps:logistics函数是sigmoid函数的一种,其输出值是[0,1]

正样本选择:

计算GT与anchor的IOU,选择较大的那个来检测当前的目标,获取该anchor的尺度;计算GT的中心点在该尺度的那个网格,该网格就负责检测目标;网格对应的3个anchor中IOU交并比最大的是正样本,其他的都是负样本

损失函数:

分类损失:交叉熵损失,只有负责目标检测的正样本才计算损失

回归损失:MSE均方误差,只有负责目标检测的正样本才参与计算(同上)

置信度损失:交叉熵损失函数,所有的都参与损失计算,负样本有一个系数0.5

V4: anchors

输入端:

是resize成32的倍数,默认608*608

Mosaic马赛克增强:

· 将四张图片(几何、颜色...)拼接在一起,

· 作用:检测小目标,对目标在图像中位置不再敏感

SAT(self-adversarial-training):引入噪声点、自对抗训练数据增强

Backbone:(CSPDarkNet53)

CSP模块是更丰富的梯度组合,同时减少计算量,跨小批量标准化;

DropBlock正则化(随机删除一大块神经元)

CBAM:卷积块注意力机制

SAM(spatial attention module):空间注意力机制,即在空间位置上添加权重;

CSPNet:

每个Block按照特征图的channel维度拆分为2个部分;一部分正常走block网络,一部分直接concat到这block的输出部分。

Neck层:

SPP(通过不同的池化层将不同尺寸的输入图像变得尺寸一致(池化层是并行同时进行),再进行特征拼接多尺度融合)

FPN + PAN(逆FPN方向融合特征图)

Predict/Train阶段:使用CIOU_Loss、DIOU_NMS、Label_Smoothing类标签化对真实标签添加噪声减少模型的过拟合,使得模型预测概率进行平滑(假如概率在[0,1]则进化平滑后为[0.05, 0.95]),即分类结果具有一定的模糊化,使得网络的抗过拟合性能力增强。

ps:GIOU在IOU基础上,还考虑了两个矩形形成的最小包围矩形A中,其不相交的区域B对A的比重; DIOU在GIOU的基础上还考虑了两矩形最长对角线长度和两矩形中心点距离的比值;CIOU在DIOU的基础上,还考虑了长宽比。

V5: 

输入是Resize(608*608)、Mosaic马赛克数据增强、自适应锚框计算、自适应图片放缩

Backbone层:

DarkNet53、

BottleNeck-CSP模块:与V3类似多了CSP。

每一个卷积层后都使用BN和LeakyReLU防止过拟合,

Focus模块

Neck层:

SPPF(SPP-Fast):使用的是3个5x5的最大池化层(A1、B1、C1)和SPP不同的是第一层池化层的结果,会再进行两次池化;第二层池化层的结果会再进行一次池化。

FPN+PAN

Predict/Train:GIOU_LOSS、DIOU_NMS;增加2个正样本(基于预测框进行上下左右偏移0.5的操作,扩展成3个预测框,缓解正负样本不平衡的问题)

V7: anchors

输入是resize(640*640),两个特征图

Backbone: 

DarkNet-53(CSP模块替换了ELAN模块、下采样变成了MP2层、每一个卷积层后都使用了BN和SiLU防止过拟合)、RepVGG(训练时多分支模型、推理时单路模型)

Neck:

SPP、FPN+PAN

激活函数使用Mish

      • 输入输出都是两个特征图、卷积和BN的合并、全部转成3x3的卷积(对1x1的核进行边缘填充padding全为0)、多个卷积核再合并、RepVGG(训练时多分支和推理时单路模式)
    • 正负样本分配策略:
      • 核心思想:GT中心点落入哪个点附近,其所对应就是anchor正样本。
      • 通过【长宽差异、类别预测差异】过滤。
        • 初次筛选规则:0.25 < gt框长度/anchor长度 < 4
        • 计算IOU,选Top-K个(输入n个正样本,每个正样本k个候选框,选损失最小的那个)
        • 计算类别预测损失:综上排名后,再进行第二次筛选。

: 为了增加召回率,对预测框中心进行了由原来的0.5到1个提升。使得由原来3个候选框增加到5个候选框

ps: Yolo-V7 将CSPNet升级为ELAN高效层聚合网络,简化了块结构。ELAN相对于CSP网络,删除了中间的transition-layer过渡层,合并了两条shorcut。

V8: 无锚框

输入是resize(640*640)

DarkNet53(增加了C2F模块:整体分两部分A和B,A进行n个BottleNeck连接输出Ax,另一部分B直接与经过处理后的Ax在通道上进行拼接)

ps: C2F模块中BottleNeck的数量是有模型的depth_multiple参数定义,这意味着可以根据需求灵活调整模块的深度和计算复杂度。

V9:基于Yolo-V5代码库。用更少的资源获得更高的准确性。

GELAN通用高效层聚合网络:

高效层聚合块:跨多个网络分枝聚合转换有效捕获多层肚特征;

计算模块:CSP块有助于跨层传播信息,任何块都可以根据 计算约束 进行替换

PGI可编程梯度信息:

辅助可逆分支:提供更清晰的梯度

多级梯度积分:避免了不同侧分支干扰的分歧。在反馈到主模型之前结合所有分支的梯度。

ps:CSPNet允许跨并行网络分枝聚合特征映射,同时增加最小的开销

V11: 增强特征提取、更少的参数、更高的准确度、跨环境(可以无缝部署到各种环境中)、支持任务范围广

from ultralytics import YOLO 
#导入model 
model = YOLO("yolo11n.pt") 
#训练model 
train_res = model.train(data="coco8.yaml", #path to dataset YAML
epochs=100,#number of train epochs
imgs=640, #training image size
device='cpu') #device to run on i.e device=0 or 1,2,3 or device='cpu' 
#在验证集上评价model性能高 
metrics = model.val() 
#对图片进行目标检测 
results = model("path/to/image.jpg") 
#导出模型到ONNX格式,ONNX(Open Neural Network Exchange)是一种开放的深度学习模型交换格式,它允许在不同深度学习框架之间共享和使用训练好的模型 
onnx_path= model.export(format='onnx')

卷积系列:

1x1的卷积:没有考虑在特征图局部信息之间的关系。

主要作用:实现跨通道的交互和信息整合,卷积核通道数的降维和升维,减少参数。

网络模型在测试集上的准确率并不高,可以从【增加卷积核输出通道数、增加全连接层的参数量、调整学习率、调整优化方法、修改激活函数等】

FPN层:单向特征融合;PAN:双向特征融合;BiFPN:多次特征融合。

活体检测:三维深度信息、脸部运动估计、多摸生物认证、人机交互、傅立叶频谱分析、眨眼、热红外线成像。

语音系列:

常用库: 

librosa:用于音频和音乐信号分析的库,用于处理音频数据、提取音频特征、进行音频分析和音乐信息检索等

常用功能:加载音频文件、提取 音频特征、音频可视化、音频分析工具、音频处理工具等

pyworld:用于声码器分析合成的库,提供了基本的功能进行基于声码器的语音分析和合成。可以提取语音信号的基本频谱特征,如基频、频谱包络等,以及声码器合成。

pysptk:用于语音信号处理的工具包,提供了常用的信号处理算法和工具,例如数字滤波、线性预测编码、倒谱系数等,可以用于语音信号的特征提取、语音合成、语音识别等

stargan-vc2: 

变声器原理: 把语音特征进行转换,只不过 内容不能变。

Voice-Conversion:

需要输入【声音数据】【标签编码】,整体还是GAN模型,主要解决 数据特征提取,网络模型定义。

· 编码时保留原始内容:这就得 去掉声音中 特性的 部分。

IN(Instance-Normalization):

对声音特征执行卷积操作,两个卷积核得到两个特征图,对每个特征图都执行Normalize,结果就是 均值为0 标准差为1 ,把声音都平均化了,也就没特性了

· 解码时放大个性:需要处理解码特征。

Adain(Adaptive-Instance-Normalization):

额外的FC层:Z'j = γ ⊙ Zj + β ; 跟BN有些类似,做了补偿,γ和β需要单独学习得到

stargan-vc2论文中选择的特征:MCEPs; log F0, APs。

输入数据:

频率: 每秒钟波峰所发生的数目 称之为 信号的频率,用单位kHz千赫兹表示。

0.1毫秒完成4.8次采样,则1秒48000次采样,采样率48KHZ。

预处理:

16KHZ重采样(属于经验值)

预加重:补偿高频信号,让高频信号权重 更大一些,因为其包含信息多

分帧:类似时间窗口,得到多个特征段

· 特征汇总:

~基频特征(F0):

声音可以分解成 不同频率的 正弦波,其中最低的那个。

~频谱包络:

语音是一个时序信号,如采样频率为16kHZ的音频文件(每秒包含16000个采样点),分帧后得到了 多个字序列,然后对 每个字序列 进行傅立叶变换操作,就得到了 频率-振幅 图(也就是描述 频率-振幅图 变化趋势的)

~Aperiodic参数:

基于F0与频谱包络计算得到

· MFCC:

梅尔倒谱系数:

流程:连续语音-预加重-加窗分帧-FFT-MEL滤波器组-对数运算-DCT

FFT傅立叶变换:把 语音 转换到 频域。

MEL滤波器变换后相当于得到更 符合人类听觉的效果。

DCT相当于提取每一帧的包络

网络架构:

生成器:

输入就是提取好的 特征,输出也是特征。

就像编码-解码过程,其中引入了IN和GLU单元。

判别器:

GSP:global sum pooling, 一个特征图压缩成一个点,batch512hw压缩成batch512

标签通过embedding编码成512维特征(batch*512),内积得到batch个判别结果。

语言合成:

tacotron2模型

输入为文本信息,输出为声音信号(例如字幕配音)

· 整体网络架构:

依旧是编码解码结构;

特征提取部分:CNN + LSTM

Attention部分额外引入了 位置信息。

语音分离:

Conv-TasNet模型

网络结构细节:

全卷积(深度可分离卷积+空洞卷积)

DW深度卷积+PW逐点卷积

堆叠DW卷积,节省内存和计算量

通过多次重复1-D的驻点卷积,并且还是空洞卷积,增大感受野。

纯语音输入输出、end-to-end。

语音识别:

LAS模型语音识别。

时间序列:

informer核心 思想:

套用transformer架构,建立好 长输入(input)和 长输出(output)之间的关系。

Informer要解决的三个问题:

attention要算的更快、Decoder要一次性输出所有预测、堆叠encoder也得快。

· ProbAttetion计算:

输入序列长度为96,首先在K中随机采样25个K;

选出重要的Q与跟部分K计算,例如源码中输出结果:32,8,96,25表示8个头,96个Q分别跟25个K计算的内积。

现在每个Q有25个得分(分别跟25个K计算得到),然后选择最大值与均匀分布算差异,在96个Q中,选出差异最大的25个(根据序列长度计算的一个参数值)

由此已经选择了25个Q。

由于25个K和25个Q只能得到25个位置的注意力结果。而其他的位置的V权重是用所有V得均值来替代,然后选出来25个更新,其他的都是均值向量。

经验发现:Q,K,V符合均匀分布。

~ Self-Attention Distilling计算方法:

做完一次attention之后,还要继续堆叠,先通过1D得maxpool操作进行下采样,假如第一次输入序列是96,下次输入序列是48,此时Q和K的采样由于序列长度变小,也会随之变小。重复堆叠多次就是Informer的Encoder架构。

不仅是下采样,还把stamp特征【local time stamp(位置embedding)+Global Time Stamp 周-月-日embedding】也融合进来。

Start标志位:

要让Decoder输出预测结果,得先告诉它从哪开始输出。

先给出一个引导,比如要输出20-30的预测结果,Decoder中需先给出前面一个序列的结果,例如10-20号的标签值。

Decoder输入:

源码中Decoder输入长度是72,其中前48个是真实值,后24个是预测值。

第一步还是做自身的ProbAttention,此时需要添加mask掩膜。

自身计算完Attention,再算与encoder的Attention即可。

Encoder和Decoder都加入了位置编码信息(绝对位置编码+跟时间相关的各种编码)

ps: transformer架构优势:

多头并行,比LSTM快,全局信息更丰富,注意力机制效果更好。LSTM在长序列预测中,如果序列越长,速度越慢,效果也越差。

长序列中attention需要每一个点跟其他点计算

Decoder是串行点,要基于上一个预测结果推断当前的预测结果