asp.net网站建设项目实战 董义革,百度seo关键词优化市场,东莞寮步网,网站后台分析图怎么做pooling层是如何进行反向传播的#xff1f;
average pooling#xff1a; 在前向传播中#xff0c;就是把一个patch的值取平均传递给下一层的一个像素。因此#xff0c;在反向传播中#xff0c;就是把某个像素的值平均分成n份 分配给上一层。 max pooling#xff1a; 在前…pooling层是如何进行反向传播的
average pooling 在前向传播中就是把一个patch的值取平均传递给下一层的一个像素。因此在反向传播中就是把某个像素的值平均分成n份 分配给上一层。 max pooling 在前向传播中把一个patch中最大值传递给下一层其他值会被舍弃掉。因此在反向传播中就是将当前梯度直接传递给前一层的某个像素而让同一个patch中的其他像素值为0。 pooling层的作用
增加非线性。保留主要的特征同时减少参数和计算量防止过拟合提高模型的泛化能力。提供invariance不变性包括平移 旋转尺度等增大感受野
ROI Pooling 和 ROI Align区别
ROI Pooling使用两次量化操作分割任务像素级导致定位偏移太大检测还是没太大影响。
ROI Align 并没有采用两次量化仅使用双线性插值算法。
Cascade RCNN的motivation
**先介绍Faster RCNN中相关点**在训练阶段经过RPN提取2000左右proposals 这些proposals会被送入到Fast RCNN中。在Fast RCNN中首先会计算每个proposals 和gt之间的IOU然后通过人为设定的IOU阈值把这些proposals分成正负样本并对这些样本进行采样使得他们之间的比例尽量满足1:3128之后将128个proposals送入Roi Pooling最后进行类别分类和box回归。在inference阶段RPN网络提取300左右的proposals而300个全被当作正样本送去分类和回归。
Cascade中所提出的问题
过拟合问题提高IOU阈值满足这个阈值条件的proposals必然比之前少了 容易导致过拟合更加严重的mismatch问题训练阶段都是质量比较高的proposal会导致过拟合而inference阶段由于没有经过阈值的采样因此会存在很多的质量较差的proposals而检测器之前都没见过这么差的proposal。
难负样本挖掘OHEM 和 Focal loss的区别
OHEM
硬加权选中的样本权重为1。滤掉的样本权重为0。挖掘固定比例或数量的样本不能充分利用所有样本
Focal Loss
软加权分类越正确容易样本权重越低分类越错误困难样本 权重越高所有的样本都能参与训练能够充分利用所有样本。
插值算法
最近邻插值
算法在待求像素的四个邻域中将距离待求像素最近的像素值赋值给待求像素如下图待求像素为(iu, jv)的像素灰度值其中i和j为正整数如果u,0.5 v 0.5则把(i,j)这个值赋值给待求像素点 在FPN中从下到上的上采样使用的就是最近邻插值 双线性插值
算法利用待求像素四个相邻像素的灰度在两个方向上做线性插值也就是做两次线性变换。
优缺点计算量比最近邻插值更大但没有灰度不连续的缺点
三次内插法
利用三次多项式求逼近理论上的最佳插值函数待求像素的灰度值由其周围16个灰度值加权内插得到。
三者比较
效果最近邻插值 双线性插值 三次插值速度最近邻插值 双线性插值 三次插值
开操作和闭操作
开操作
先腐蚀再膨胀开操作可以移除较小的明亮区域在较细的地方分离物体。应用例子通过开操作将阈值处理后的细胞分离可以更清晰地统计细胞的数目 闭操作
先膨胀后腐蚀闭操作可以填充物体内的细小空间、连接邻近的明亮物体 顶帽操作
步骤原图与开操作的差
效果局部亮度极大点被分割出来
黑帽操作
步骤闭操作与原图的差
效果局部黑色的洞被分割出来
目标检测anchor -base 和 anchor-free
anchor-based
优点
使用anchor机制产生密集的anchor box 使得网络可直接在此基础上进行目标分类及边界框坐标回归。加入先验框训练稳定密集的anchor box可有效提高网络目标召回率对于小目标检测来说提升非常明显
缺点
anchor机制下需要设定超参这需要较强的先验知识造成严重的正负样本不平衡问题泛化能力差
anchor-free
优点
anchor-free要比anchor-base少2/3在预测的时候计算量不需要设定超参数容易部署解码方便直接对heatmap使用池化就等价于做了NMS然后利用偏移和宽高就可以获得对应的检测框。FCOS使用nmscenternet使用池化。nms计算只能在cpu上无法在GPU上并行
缺点
语义模糊性两个目标中心点重叠现在主要是用focal loss和FPN来缓解通用能力差泛化能力强
anchor-base流程
在图像中提前铺设大量的anchor回归目标相对于anchor的四个偏移量用对应的anchor和回归的偏移量修正精确的目标位置
目标检测中为什么要引入anchor
相当于在检测网络中引入先验信息因为在一张图片中修正目标位置比定位目标位置更容易一些
anchor-free
anchor-free的精度能媲美anchor-based方法最大功劳归于FPN提供多尺度信息其次归于Focal Loss对中心区域的预测有很大帮助
基于anchor-free的目标检测算法有两种方式
关键点检测通过定位目标物体的几个关键点来限定它的搜索空间。中心点检测通过目标物体的中心点来定位然后预测中心到边界的距离。
基于关键点检测算法
CornerNet通过检测目标框的左上角和右下角两个关键点获得预测框。整个网络流程输入图像通过串联多个Hourglass模块来特征提取然后输出两个分支即左上角预测分支和右下角点预测分支每个分支模型通过corner pooling后输出三个部分1. heatmaps预测角点位置 2. embeddings预测角点分组 3. offsets微调预测框。
基于关键点检测算法
CenterNet 只需要提取目标的中心点无需对关键点分组和后处理。网络结构采用编解码的方式提取特征输出端分为三块1. heatmap预测中心点的位置 2. wh对应中心点的宽高 3. reg对应中心点的偏移
centernet推理
输入图片对输入图片进行下采样在128*128大小的heatmap上执行预测然后在128*128大小的heatmap上采用3x3的最大池化操作来获取heatmap中满足条件的关键点类似nms效果并选取100个关键点最后根据confindence阈值来过滤最终的检测结果
目标检测为什么要考虑去掉anchor
预先设定的anchor尺寸需要根据数据集的不同做改变可以人工设置或对数据集聚类得到anchor的数量相比目标的个数多很多造成正负样本不均衡的现象
ATSS自适应的选取正样本
对于每个输出的检测层计算每个anchor的中心点和目标中心点的L2距离选取K个anchor中心点离目标中心点最近的ahchor为候选正样本计算每个候选正样本和GT之间的IOU计算这组IOU的均值和方差根据均值m和方差g设置选取正样本的阈值t m g
特征提取器通过函数将同一类型的数据分布映射到同一解空间归为一类
为什么max pooling更常用什么场景下average pooling比max pooling更合适
max pooling做特征选择选出分类辨识度更好的特征提供了非线性。pooling作用一方面是去掉冗余信息一方面保留feature map的特征信息在分类问题中我们需要知道图像有什么object而不关心这个object位置在哪显然max pooling比average pooling更合适。average pooling 更强调对整体信息进行一层下采样在减少参数维度的贡献上更大一点更多体现在信息的完整传递这个维度上在一个很大很有代表性的模型中比如说DenseNet中的模块之间的连接大多采用average pooling在减少维度的同时更有利信息传递到下一个模块进行特征提取。
数据增强方式
单样本几何变换翻转、旋转、裁剪、缩放单样本像素内容变换噪声、模糊、颜色扰动多样本插值mix up 图像和标签都进行线性插值
为什么在模型训练开始会有warm up
warm up在刚刚开始训练时以很小的学习率进行训练使网络熟悉数据随着训练的进行学习率慢慢变大到了一定程度以设置的初始学习率进行训练。
有助于减缓模型在初始阶段对mini-batch的提前过拟合现象保持分布的平稳有助于保持模型深层的稳定性
简述一下 R CNN到Faster R CNN
R CNN
首先通过Selective Search算法在图片上获取2000个左右Region Proposal将这些Region Proposal通过预处理统一尺寸输入到预训练的cnn中进行特征提取然后将提取的特征输入到SVM中进行分类最后对分类后的region proposal进行bbox回归。
SPPNet
提出了空间金字塔池化只提取一次全局特征图
Fast R CNN
首先通过selective search算法在图片上获取2000个左右region proposal接着对整张图片进行特征提取然后利用region proposal坐标在CNN的最后一个特征图上进去ROI pooling提取目标特征然后将ROI pooling提取到的特征输入到FC模块中此时算法的整个过程相比R-cnn 得到极大简化 但依然无法联合训练
Faster Rcnn
首先通过可学习的RPN网络进行Region Proposal的提取接着利用region proposal坐标在CNN的特征图上进行ROI pooling操作然后利用ROI pooling进行空间池化使其所有特征图输出尺寸相同最后将所有特征图输入到后续的FC层进行分类和回归实现了端到端的训练。
阐述一下mask rcnn网络并相比与faster rcnn有哪些改进的地方
mask rcnn是基于faster rcnn提出的目标检测网络该网络可以有效地完成目标检测的同时完成实例分割。mask rcnn主要的贡献如下
强化了基础网络通过ResNext101fpn用作特征提取网络Roi align替换了faster rcnn中的roi pooling使用新的损失函数mask rcnn的损失函数是分类回归mask预测的损失之和
阐述一下SSD网络及其优缺点
SSD网络是对不同尺度下的feature map的每个点都设置一些default box这些default box有不同的大小和纵横比对这些框进行分类和边框回归的操作。SSD的核心是固定设置default box计算属于各类物体的概率以及坐标调整的数值。
优点ssd运行速度超过yolo精度在一定条件下超过faster rcnn。
缺点需要人工设置先验框和长宽比网络中default box的基础大小和形状不能直接通过学习获得虽然使用了图像金字塔的思路但对小目标的召回率依然一般。
FPN为什么能提升小目标的准确率
底层的特征语义信息比较少但是目标定位准确高层的特征语义信息比较丰富但是目标位置比较粗略。原来多数的object detection算法都是用高层特征做预测。FPN同时利用底层和高层的语义信息通过融合这些不同特征层的特征达到预测的效果并且预测是在每个融合后的特征层上单独进行的。
训练过程中loss一直无法收敛可能的原因
数据和标签的问题学习率设定不合理网络模型不合理数据归一化
为什么图像输入到网络之前需要进行归一化操作
如果输入层很大在反向传播时候传递到输入层的梯度会变得很大。梯度很大学习率就得非常小否则越过最优。一般归一化是做减去均值除以方差的操作这种方式可以移除图像的平均亮度值很多情况下我们对图像的亮度并不感兴趣而更多地关注其内容比如在目标检测任务追踪图像的整体明亮程度并不会影响图像中存在的是什么物体。此时在每个样本上做归一化可以移除共同部分凸显个体差异。
Yolox中nms free采用的pss结构 在最后增加一个pss分支用来代替nms并提出与其相匹配的loss。
在inference的时候最终bbox得分是 然后正负样本直接对这个数进行排序取topk得到无nms过程。
Batchsize如何影响模型性能
大的batch size减少训练时间提高稳定性大的batch size导致模型泛化能力下降主要原因是小的batch size带来的噪声有助于逃离局部最优batch size在变得很大超过临界点会降低模型的泛化能力在此临界点之下模型的性能变换随batch size通常没有学习率敏感。
数据增强的方式
随机裁剪可保留主要特征裁剪掉背景噪声mixup两张图按0.5比例叠加增加样本数量丰富了目标背景提高模型的泛化能力cutmixcutout和mixup结合将图片的一部分区域擦除并随机填充训练集中的其他数据区域像素值random erasing随机选择一个区域然后采用随机值进行覆盖模拟遮挡场景cutout只用正方形填充填充值只有0或其他纯色填充作者发现区域的大小比形状更重要
参数初始化 随机初始化过小导致梯度消失过大导致梯度爆炸带BN的随机初始化BN可以将过大过小的数据都归一化到0-1分布避免了梯度爆炸和梯度消失的情况xavier初始化泽维尔保证输入和输出的数据分布一致即保证输入输出的均值和方差一致。he初始化xavier适合关于0点对称的激活函数不适合relu解决思想在relu网络中假定每一层有一半神经元被激活另一半为0所以要保持方差不变只需要在xavier基础上再除以2 pytorch中function和module的区别
function只是定义一个操作无法保存参数module是保存了参数因此适合定义一层function需要定义三个方法initforwardbackwardmodule只需要定义init和forward而backward的计算由自动求导机制构成module由一系列的function组成因此在forward的过程中function和variable组成了计算图在backward时只需要调用function的backward就可以得到结果因此module不需要再定义backwardmodule不仅包括了function还包括了对应的参数以及其他函数与变量
python列表、元组、集合和字典的区别 list set dict Relu 优缺点
优点
不存在梯度饱和收敛速度快计算效率高且将负值截断为0为网络引入了稀疏性进一步提升了计算高效性
缺点
Relu的输出不是0均值对称导致梯度更新方向出现锯齿路径dead relu问题。解决方法1. 学习率不要设置过大使用动量等优化方法 2. leaky reluα 取值0.01 PRelu α是可学习参数没有对数据做压缩容易出现nan低维度做relu运算容易造成信息的丢失而高维度进行relu运算信息丢失则会很少
内部协变量偏移ICS
每个神经元的输入数据不再是”独立同分布‘
上层参数需要不断适应新的输入数据分布降低学习速度下层输入的变化可能趋向于变大或者变小导致上层落入饱和区使得学习过早停止每层的更新都会影响到其他层因此每层的参数更新策略需要尽可能的谨慎
YOLO系列
v1创新点
将整张图作为网络输入直接在输出层回归bounding box的位置和所属的类别速度快one-stage detection开山之作
v2创新点
大尺度预训练分类新的backboneDarknet19加入anchor
v3创新点
新的backboneDarknet53融合FPN用逻辑回归替代softmax作为分类器
改善模型思路
数据角度模型角度调参优化角度训练角度
工业落地流程
产品定义需求调研场景约束数据采集baseline开发针对性优化算法部署多维测试持续维护功能拓展
TensorRT
将现有的模型编译成一个engine类似于c编译过程。在编译engine过程中会为每一层的计算操作寻找最优的算子方法将模型结构和参数以及相应kernel计算方法都编译成一个二进制engine因此在部署之后大大加快了推理速度。
优势
把一些网络层进行了合并取消一些不必要的操作比如不用专门做concat操作TensorRT会针对不同的硬件做相应的优化得到优化后的engineTensorRT支持INT8和FP16的计算通过在减少计算量和保持精度之间达到一个理想的trade-off
端侧静态多batch和动态多batch的区别
当设置静态多batch为6时那么之后不管是输入batch2还是batch4都会按照batch6的预设开始申请资源。
而动态多batch不用预设batch数会根据实际场景中的真实输入batch来优化资源的申请提高端侧实际效率由于动态多batch的高性能通常推理耗时和内存占用会比静态batch时要大。
滑动平均
用来估计变量的局部均值使得变量的更新与一段时间内的历史取值有关 滑动平均的优势占用内存少不需要保存过去10个或者100个历史值就能估计其均值。滑动平均虽然不如将历史值全部保存下来计算准确但后者占用更多内存并且计算成本更高。
为什么滑动平均在测试过程中被使用
滑动平均可以使模型在测试数据上更加鲁棒。
python中实例方法、静态方法和类方法三者的区别
不用classmethod和staticmethod修饰的方式为实例方法采用classmethod修饰的方法为类方法采用staticmethod修饰的方法为静态方法
DataLoader内部调用方式步骤 确定数据集长度dataset的____len____方法实现 确定抽样的indicesdataloader中的sampler和batchsampler实现 取出一批批样本batchdataset的____getitem___方法实现 整理成features和labelsdataloader的collate_fn方法实现
损失函数有哪些
回归模型通常使用nn.MSELoss二分类模型通常使用nn.BCELoss或者nn.BCEWithLogitsLoss多分类模型通常推荐使用nn.CrossEntropyLoss(y_pred未经过nn.softmax) y_pred(经过softmax) nn.NLLLoss
nn.MSELoss均方误差损失也叫做L2损失用于回归nn.L1Loss L1损失也叫做绝对值误差损失用于回归nn.SmoothL1Loss (平滑L1损失当输入在-1到1之间时平滑为L2损失用于回归)nn.BCELoss (二元交叉熵用于二分类输入已经过nn.Sigmoid激活对不平衡数据集可以用weigths参数调整类别权重)nn.BCEWithLogitsLoss (二元交叉熵用于二分类输入未经过nn.Sigmoid激活)nn.CrossEntropyLoss (交叉熵用于多分类要求label为稀疏编码输入未经过nn.Softmax激活对不平衡数据集可以用weigths参数调整类别权重)nn.NLLLoss (负对数似然损失用于多分类要求label为稀疏编码输入经过nn.LogSoftmax激活)nn.KLDivLoss (KL散度损失也叫相对熵等于交叉熵减去信息熵用于标签为概率值的多分类要求输入经过nn.LogSoftmax激活)nn.CosineSimilarity(余弦相似度可用于多分类)nn.AdaptiveLogSoftmaxWithLoss (一种适合非常多类别且类别分布很不均衡的损失函数会自适应地将多个小类别合成一个cluster)
Pytorch建模流程
准备数据定义模型训练模型评估模型使用模型保存模型
编解码结构设计思想
在编码器中引入池化层可以增加后续卷积层的感受野并能使特征提取聚焦在重要信息中降低背景干扰有助于图像分类。然而池化操作使位置信息大量流失经过编码器提取出的特征不足以对像素进行精确的分割。这给解码器修复物体的细节造成了困难使得在解码器中直接由上采样/反卷积层生成的分割图像较为粗糙因此有人提出了建立快捷连接unet和aspp结构使高分辨率的特征信息参与到后续解码环节进而帮助解码器更好地复原目标地细节信息。
介绍一下yolov5
yolov5和v4都是在v3基础上改进的性能与v4旗鼓相当但从用户角度来说易用性和工程性v5更优。v5的原理可以分为四个部分
输入端针对小目标检测沿用v4的mosaic增强使用自适应锚框计算将锚框的计算加入了训练的代码中backbone沿用v4的cspdarknet53结构但是在图片输入之前加入Focus操作v6.0换成6*6卷积。在v5中提供了四种不同大小的网络结构s、m、l、x通过depth和width两个参数控制neck采用sppf panet多尺度特征融合输出端沿用v3的head使用GIOU损失进行边界框回归输出还是三个部分置信度、边框信息、分类信息。
RPN实现细节
一个特征图经过sliding window处理得到256特征对每个特征向量做两次全连接操作一共得到2个分数前景和背景分数4个坐标针对原图坐标的偏移
交叉熵CE不适用于回归问题
当mse和交叉熵同时应用到多分类场景下时mse对于每一个输出的结果都非常看重而交叉熵只对正确分类的结果看重。 从上述公式中可以看出交叉熵的损失函数只和分类正确的预测结果有关系而mse的损失函数还和错误的分类有关系该分类函数除了让正确的分类尽量变大还会让错误的分类变得平均但实际在分类问题这个调整没有必要。但是对于回归问题来说这样的考虑就显得很重要了。
深度学习中优化学习方法一阶、二阶
一阶方法随机梯度下降、动量、牛顿动量法Nesterov动量、adagrad自适应梯度、Rmsprop、adam二阶方法牛顿法、拟牛顿法、自适应优化算法adagrad、rmsprop、adam 深度学习为什么在计算机视觉领域这么好
以目标检测为例传统的计算机视觉方法首先基于经验手工提取特征然后使用分类器分类这两个过程都是分开的。而深度学习中使用cnn来实现对局部区域信息的提取获得更高级的特征当神经网络层数越多时提取的特征会更抽象将有助于分类同时神经网络将提取特征和分类融合在一个结构中。
L1正则化和L2正则化有什么区别
L1能产生稀疏性导致w中许多项变为零。稀疏性除了在计算量的好处外更重要的是更具有“可解释性”。比如说一个病如果依赖于 5 个变量的话将会更易于医生理解、描述和总结规律但是如果依赖于 5000 个变量的话基本上就超出人肉可处理的范围了L2使得模型的解偏向于范数较小的W通过限制解空间从而在一定程度上避免了过拟合。
Python中生成器是什么
生成器是一种创建迭代器的工具它们和常规函数的区别是在返回数据时使用yield语句。每当对它调用next函数生成器从它上次停止的地方重新开始。
生成器和迭代器的区别
生成器本质上是一个函数它记住了上一次返回时函数体的位置生成器不仅仅记住了它的数据状态也记住了它执行的位置。迭代器是一种支持next操作的对象它包含一组元素执行next操作返回其中一个元素当所有元素都返回时再执行则会报错
区别
生成器是生成元素迭代器是访问集合元素的一种方式
Python的传参是传值还是地址
实参为不可变参数则用值传递实参为可变参数则引用传递
Python中的is和 有什么区别?
is比较两个对象的id值是否相等
比较的是两个对象的内容是否相等默认会调用对象equal()方法
python 进程和线程
线程是一个基本的cpu执行单元它必须依托于进程存活。多线程的优点在于多个线程可以共享进程的内存空间所以进程间的通信非常容易实现但是如果使用官方的CPython解释器多线程受制于GIL全局解释器锁并不能利用CPU的多核特性进程是指一个程序在给定数据集合上的一次执行过程是系统分配内存的基本单位每个进程启动时都会最先产生一个主线程然后主线程会创建其他的子线程。使用多进程可以充分利用CPU的多核特性但是进程间通信相对比较麻烦需要使用IPC机制管道、套接字等
区别
线程必须在某个进程中执行。一个进程可包含多个进程其中有且只有一个主线程。多线程共享同个地址空间打开的文件以及其他资源。多进程共享物理内存、磁盘、打印机以及其他资源。
选择多线程还是多进程
CPU密集型程序比较偏重于计算需要经常使用CPU来运算。———————— 多进程I/O密集型程序需要频繁进行输入输出操作。例如 爬虫 —————————— 多线程
os和sys模块的作用
os模块负责程序与操作系统的交互提供了访问操作系统底层的接口。sys模块负责程序与python解释器的交互提供了一系列的函数和变量用于操控python的运行环境。
闭包
在函数内部再定义一个函数并且这个函数用到了外边函数的变量那么将这个函数以及用到的一些变量称为闭包。
OSTU算法大津法
OSTU是一种用于二值化最佳阈值的选取方法基本原理是根据阈值T将图像中的像素点分为C1和C2两类不断调整阈值T之后若此时两类之间存在最大类间方差那么此阈值即是最佳阈值。
图像分割
图像分割有基于阈值、基于区域、基于边缘、基于聚类、基于深度学习的图像分割方法等。
https://blog.csdn.net/m0_45447650/article/details/124398438
固定阈值法——直方图双峰法
基本思想假设图像中有明显的目标和背景则其灰度直方图呈双峰分布当灰度级直方图具有双峰特性选取双峰之间的谷底对应的灰度值作为阈值。 自动阈值法
自适应阈值法对于简单的图像固定阈值法可以很好的分割但是对于元素多明暗变化不均匀的图像固定阈值法就无法很好的进行分割
cv2.adaptiveThreshold(): 小区域阈值计算方式 1. 小区域内取均值 2. 小区域内加权求和权重是个高斯核
迭代阈值分割1. 求出图像的最大灰度值和最小灰度值 令初始阈值T0 最大灰度值最小灰度值/2 **2.**根据阈值将图像分割为前景和背景分别计算前景和背景的平均灰度值z1z2 3. 求出新的阈值 T1 (z1 z2)/2 4. 若T0 T1则所得即为阈值否则转2迭代计算 5. 使用计算后的阈值进行固定阈值分割otsu大津法最大类间方差是一种基于全局阈值的自适应方法即寻找一个阈值让前景和背景的类间方差最大化。
边缘检测
canny算子 梯度方向和模计算