卷积神经网络的特点
权值共享 稀疏连接 局部感知
有哪些卷积
常规卷积 3*3等
单通道卷积 channel
多通道卷积
3D卷积
转置卷积
1 x1 卷积
深度可分离卷积
空洞卷积/膨胀卷积
深度可分离卷积
一些轻量级的网络,如MobileNet中,会有深度可分离卷积depthwise separable convolution 由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map。相比常规的卷积操作,参数数量和运算成本低。
主要包含两步:
1,逐通道卷积 Depthwise Convolution
一个卷积核负责一个通道,一个通道只被一个卷积核卷积
完全在二维平面内进行。卷积核的数量和上一层的通道数相同。所以一个三通道的图像经过运算后生成了3个Feature map,Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。
2,逐点卷积
升维的作用。卷积核尺寸为1x1xM,M为上一层的通道数。
所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map
1*1卷积的作用
1),增加非线性,增加网络的表达能力
2), 降维升维
3),跨通道信息交互(channel的变换)
深度学习为什么要深层?
1.模型复杂度提升,学习能力提升
2.层次更深,特征不变性强,类别分类能力越强,要学习复杂的任务需要更深的网络。
如何改善训练模型的效果?
1,通过提升数据,获取良好数据,对数据预处理,零均值1方差化,数据扩充或者增强
2,诊断去哪个罗是否过拟合欠拟合。通过偏差方差。正则化,早停等解决过拟合。
3,通过学习率,激活函数的选择,改善网络全连接层个数层数,优化算法,BN层
4,权值初始化,Xavier初始化,
如何解决梯度爆炸与消失?
1.使用预训练加微调 梯度剪切 权重正则(针对梯度爆炸)
2,使用不同的激活函数
3,使用bn层
4,使用残差结构
5,使用LSTM网络
CNN池化层有什么作用?
1,减少图像尺寸,数据降维
2,缓解过拟合
3,保持一定程度的旋转和平移不变性,maxpooling能保证卷积神经网络在一定范围内平移特征能得到同样的激励,具有平移不变性。
卷积神经网络中空洞卷积的作用是什么?
空洞卷积页脚扩张卷积,在保持采纳数个数不变的情况下增大卷积核的感受野,同时可以保证输出的特征映射的大小保持不变。一个扩张率为2的3X3卷积核,感受野与5X5的卷积核相同,但是参数数量仅为9个。
常用的分割算法有哪些?
1,基于阈值的分割方法:比较常用的阈值法有大律法和最小误差法
2,基于边缘的分割方法:常见的微分算子包括Robert算子、Sobel算子,Canny算子等。
3,基于区域的分割方法:主要包括种子区域生长法、区域分裂合并法和分水岭法等
4,基于图论的分方法:Graph Cut方法
5,深度学习:语义分割等。
BN的原理,作用和实现细节
优点:
1)加快训练速度,这样我们就可以使用较大的学习率来训练网络。
2)提高网络的泛化能力。解决过拟合
3)BN层本质上是一个归一化网络层,可以替代局部响应归一化层(LRN层)。
4)可以打乱样本训练顺序(这样就不可能出现同一张照片被多次选择用来训练)论文中提到可以提高1%的精度。
BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。
BN层的位置:可以在激活函数之前也可以之后,使用relu可以放后面,而sigmoid和tanh放激活函数前面,避免破坏非线性特征的分布。
激活函数,哪些和特点
激活函数作用:加入激活函数可以给模型加入非线性因素,提升模型表达能力。
激活函数的类型:
1)sigmod函数
区间在【0,1】之间,不受欢迎主要是因为梯消失问题,输出不是以0 为中心,梯度更新的不同的方向走太远。sigmoid收敛缓慢。
2)tanh函数 双曲正切函数
输出范围【-1,1】,以0为中心,优化更容易些,但是仍存在梯度消失的问题
3)Relu函数
4)Leaky ReLu
它的收敛性提高了6倍
它可以避免和纠正梯度消失问题。现如今,几乎所有深度学习模型现在都使用ReLu函数。
但它的局限性在于它只能在神经网络模型的隐藏层中使用。
ReLu函数的另一个问题是,一些梯度在训练过程中可能很脆弱,甚至可能会死亡。它可以导致权重更新,这将使其永远不会在任何数据点上激活。简单地说ReLu可能会导致死亡神经元。
为了解决这个问题,我们引进了另一个被称为Leaky ReLu的修改函数,让它来解决死亡神经元的问题。它引入了一个小斜坡从而保持更新值具有活力。在0上不可导,可以使用二阶导值,或者一个梯度的定值。
然后,我们还有另一个变体,它形成于ReLu函数和Leaky ReLu函数的结合,我们称之为Maxout函数。
5)Mish激活函数
怎么解决梯度消失和梯度爆炸?
用ReLU、Leaky ReLU、PReLU、RReLU、Maxout等替代sigmoid函数。
用Batch Normalization。
可以通过添加正则项,避免梯度爆炸,压缩wi权重大小。
LSTM的结构设计也可以改善RNN中的梯度消失问题。
使用残差结构,主要是解决网络退化
使用更有的初始化方式,或者采用pre_train,fine_tuning模式
损失函数哪些,作用
1)l1范数误差,计算预测值与标签差值的绝对值:torch.nn.L1Loss(reduction=‘mean’)
2)均方误差损失函数
3)交叉熵损失函数
4)KL散度torch.nn.KLDivLoss(reduction=‘mean’)
5)二进制交叉熵损失BCELoss 二分类任务时的交叉熵计算函数。用于测量重构的误差, 例如自动编码机. 注意目标的值 t[i] 的范围为0到1之间.
6)BCEWithLogitsLoss 把sigmoid集合进BCELoss中
7)MarginRankingLoss torch.nn.MarginRankingLoss(margin=0.0, reduction=‘mean’)
对于batch中的每个实例的损失如下 m a x ( 0 , − y ∗ ( x 1 − x 2 ) + m a r g i n ) max(0,-y*(x_1-x_2)+margin) max(0,−y∗(x1−x2)+margin)
8)三元组损失函数:TripletMarginLoss
torch.nn.TripletMarginLoss(margin=1.0, p=2.0, eps=1e-06, swap=False, reduction=‘mean’)
具体例子:给一个A,然后再给B、C,看看B、C谁和A更像。
L(a,p,n)=max{d(a,p)-d(a,n)+margin,0}
过拟合/欠拟合的预防方法
过拟合
方差大,偏差小
解决办法:
1),重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
2),增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
3),采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。
4),采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。降低网络训练时的网络复杂度
欠拟合
1)添加其他特征项
2)减小正则化参数
3)添加多项式特征,增加网络复杂度
梯度消失和梯度爆炸,现象、原因和解决方法
原因:梯度的累乘,激活函数的特性决定。比如sigmiod在饱和区梯度很小,累乘后消失,在0处梯度很大,累乘会变成很大的值。
解决方案: bn relu 正则化 resnet模块
网络退化的现象、原因和解决方法
参考文章:https://blog.csdn.net/cristiano20/article/details/104309948
理论上网络深度越深,特征的提取能力越强。但是实际并非如此,上图所示拥有56层数的网络结构明显差于拥有20层数的网络结构,造成这一现象的原因的大概有:过拟合、梯度消失/爆炸和深度网络的退化(信息损失)。
解决方法:ResNet,引入残差结构
ResNet的初衷,就是让网络拥有这种恒等映射的能力,能够在加深网络的时候,至少能保证深层网络的表现至少和浅层网络持平。
各种优化器,特点和公式
1) SGD
SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了
缺点:1,学习率难以选择,2,容易产生局部最优
2)Momentum
参考文献:https://blog.csdn.net/fengchao03/article/details/78208414?utm_source=blogxgwz5
momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度,动量的大小和梯度有关。
adam
经验:
对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果
有源码将源码跑通,没有的话考虑自己搭建模型;
主干网络可以直接考虑resnet,(后续网络优化部分再考虑裁剪或者其他网络结构)
loss根据任务考虑,分类多试交叉熵,回归是最小二乘法;
优化函数,采用Adam或者SGD都可以。
学习率可以从0.1或者0.01开始
batchsize:32 或者64
2)准备小规模样本
比如存在100w数据,可以先打包1w数据或者几千样本,可以暂时先不考虑数据增强,正常打包后直接训练网络,用小批量样本来测试网络搭建中可能存在的bug,直到网络可以收敛,确保网络搭建的准确性,方便后续出现问题时,问题的定位。
3)小规模样本训练收敛之后,则可以确定模型框架没有问题。开始加大样本规模到100W,使用大规模样本训练;
4)训练后,分析训练集和测试集LOSS的变化情况,考虑上述过拟合、欠拟合、收敛不稳定不同情况,优化相应的参数;
5,在Loss出现较为理想的结果后,基本上网络训练也趋于稳定。接下来则是重点排查难点问题,尝试创新性的调整网络架构,尝试新的loss,调整数据增强策略,不同优化函数,不同学习率,不同batchsize等等,通过各种手段,来提高准确度。
softmax原理
计算将 x i x_i xi归属类别j的概率为:
p ( y i = j ∣ x i ; θ ) = e θ j T x i ∑ l = 1 k e θ l T x i p(y_i=j|x_i;\theta)=\frac{e^{\theta_{j}^Tx_i}}{\sum_{l=1}^ke^{\theta_l^Tx_i}} p(yi=j∣xi;θ)=∑l=1keθlTxieθjTxi
梯度的物理意义
pooling层的作用
降低特征图尺寸 降低尺寸,有助于减少计算量以及特征数量,保留主要特征,增大卷积核感受野,防止过拟合。 提取空间特征
监督学习和非监督学习举例子
生成对抗网络(GAN)是一种无监督学习方法,经常被用来做图像生成(如深度卷积对抗生成网络(DCGAN)可用于生成卡通图像)。
卷积后的感受野计算
l k = l k − 1 + [ ( f k − 1 ) ∗ ∏ i = 1 k − 1 s i ] l_k=l_{k-1}+[(f_k-1)*\prod_{i=1}^{k-1}s_i] lk=lk−1+[(fk−1)∗∏i=1k−1si]
其中 l k − 1 l_{k-1} lk−1为第 k − 1 k-1 k−1层对应的感受野大小, f k f_k fk为第 k k k层的卷积核大小,或者池化层的池化尺寸大小, s s s为步长。
解决模型不收敛问题
数据和标签
数据分类标注是否准确?数据是否干净?数据库太小一般不会带来不收敛的问题,只要你一直在train总会收敛(rp问题跑飞了不算)。反而不收敛一般是由于样本的信息量太大导致网络不足以fit住整个样本空间。样本少只可能带来过拟合的问题
学习率设定不合理
在自己训练新网络时,可以从0.1开始尝试,如果loss不下降的意思,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 学习率设置过大,很容易震荡。不过刚刚开始不建议把学习率设置过小,尤其是在训练的开始阶段。在开始阶段我们不能把学习率设置的太低否则loss不会收敛。我的做法是逐渐尝试,从0.1,0.08,0.06,0.05 …逐渐减小直到正常为止,
有的时候候学习率太低走不出低估,把冲量提高也是一种方法,适当提高mini-batch值,使其波动不大。,
网络设定不合理
如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛,换网络换网络换网络,重要的事情说三遍,或者也可以尝试加深当前网络。
数据集label的设置
检查lable是否有错,有的时候图像类别的label设置成1,2,3正确设置应该为0,1,2。
改变图片大小
博主看到一篇文章,说改变图片大小可以解决收敛问题,具体博主没试过,只看到有这个方法,具体文章链接:https://blog.csdn.net/Fighting_Dreamer/article/details/71498256
数据归一化
神经网络中对数据进行归一化是不可忽略的步骤,网络能不能正常工作,还得看你有没有做归一化,一般来讲,归一化就是减去数据平均值除以标准差,通常是针对每个输入和输出特征进行归一化
L1和L2正则化怎么选择
l1 稀疏数据 降低模型复杂度
l2 降低模型权重值
解释梯度下降
目的是通过迭代找到目标函数的最小值,或者收敛到最小值。迭代过程为:
θ j = θ j − α δ δ θ j J ( θ ) \theta_j=\theta_j-\alpha\frac{\delta}{\delta\theta_j}J(\theta) θj=θj−αδθjδJ(θ)
可以看出,梯度下降的更新参数的方式为目标函数在当前参数取值下的梯度值,前面再加上一个步长控制参数 α \alpha α.
牛顿法
牛顿法是为了求解函数值为0时变量的取值问题,具体地,当要求解 f ( θ ) = 0 f(\theta)=0 f(θ)=0时,如果f可导,那么通过迭代公式来迭代求得最小值。
θ = θ − l ′ ( θ ) l ′ ′ ( θ ) \theta=\theta-\frac{l'(\theta)}{l''(\theta)} θ=θ−l′′(θ)l′(θ)
当 θ \theta θ是向量时,牛顿法可以用下面式子表示:
θ = θ − H − 1 ▽ θ l ( θ ) \theta=\theta-H^{-1}\bigtriangledown_\theta l(\theta) θ=θ−H−1▽θl(θ)
H是海森矩阵,是对参数 θ \theta θ的二阶导
网络权重初始化可不可以都为0?
网络权重初始化可不可以都为0
考虑全连接层的深度神经网络,同一层中的任意神经元都是同构的,他们拥有相同的输入输出,如果再将参数全部初始化为同样的值,那么无论前向传播还是反向传播的取值都是完全相同的。学习过程将永远无法打破这种对称性,最终同一网络层中的各个参数仍然相同的。因此可以随机初始化或者取值范围一定的均匀分布(xvaire初始化),或者满足高斯分布(He初始化)
卷积操作加速的的方式:
1, 卷积核分解 NxN->1xN+Nx1
2,瓶颈层
3,卷积核数合并(对GPU)
4, depthwise separable convolutions 先分组卷积,每个channel 一个卷积核,再使用11m的卷积核对上面的特征图进行加权组合。
L1,L2损失在目标检测中的应用
SmoothL1 loss是在 faster RCNN中提出,对于离群点更加鲁棒,训练不易跑飞,相比于L2,结合了L1误差和L2误差,输入较小时,表现为L2,输入较大表现为L1误差
如何解决数据不平衡问题?
1,重采样下采样和上采样,上采样不要重复采样可以对数据集进行翻转,旋转,平移和尺度拉伸,对比度,亮度,色彩变化来增加数据。
2,组合不同的重采样数据,建立多个模型,然后模型融合
3,更改分类器指标,最好选择P-R曲线或者F1指数。
logistic回归
数学原型:sigmoid函数
SVM
选择传统机器学习还是深度学习的标准是什么
数据的特征的获取
随机森林
投票法
bagging 和随机森林的区别
bagging:装袋法,算法过程如下:
第一步:我们将这n个train集进行训练,因此产生了n个基分类器,也可以说是n个决策树
第二步:利用这n个基分类器对测试集进行预测,因此会得到n个结果。
第三步:采取多数投票(majorty vote):将n个预测的结果出现频率最高的类作为总体预测
随机森林也需要对自助抽样训练集建立一系列的决策树,这和决策树类似。不过,随机森林在建立树的时候,不和装袋法一样,装袋法建树的时候是将所有预测变量都考虑进去,而随机森林则是考虑每一个分裂点时,都是从所有的预测变量p中随机选取m个预测变量,分裂点所用的预测变量只能从这m个变量中选择。
boosting
独热数据类型为什么不适合决策时模型
特征稀疏,
什么时候使用SVM,什么时候使用XGboost
Xgboost为什么拟合的是残差?
拟合的都是负梯度,平方误差损失函数的负梯度正好等于残差
one-hot的编码适不适合决策树算法,为什么?
PCA与LDA算法原理
PCA无监督,LDA有监督的学习
LDA:最大化两类投影中心距离的准则,中心思想就是最大化类间距离,最小化类内距离
PCA:使用了协方差和特征值分解的概念,选出特征值最大的前d个对应的特征矩阵,作为新的特征。
从应用的监督,可以掌握一个基本的原则-对无监督的任务使用PCA进行降维,对有监督应用LDA。
Kmeans++算法思想
K均值的改进算法中,对初始值选择的改进是很重要的一部分。而这类算法中,最具影响力的是Kmeans++,在K值的选取上进行了改进。
第一个聚类中心,是随机初始化的,然后假设在选取了n个初始聚类中心,在选取第n+1个聚类中心时,距离当前n个聚类中心越远的点会有更高的概率被评选为第n+1个聚类中心。
证明K-means属于EM算法的特例
E步骤:对于每个样本点,找最近的聚类中心
M步骤:根据当前分配求新的聚类中心的操作
奥卡姆剃刀原理:如无必要,勿增实体。条件越多,可能性越小,所以条件尽可能小,且支撑结论的证明。
减少偏差的原则
增加模型复杂度;
根据误差分析结果、调整输入特征;
较少或者去除Regularization(正则化)
修改模型结构
增加更多的训练样本
减少方差的原则
增加样本的多样性
增加正则化
加入提前终止
选择性减少输入的特征
减小模型规模
根据误差分析结果,调整输入特征
修改模型结构,较小模型复杂度
CNN
调试,模型提优
简述 CNN 的演变
LeNet:2个卷积3个全连接,最早用于数字识别
AlexNet:12年ImageNet冠军,5个卷积3个全连接,多个小卷积代替单一大卷积;使用ReLU激活函数,解决梯度小数问题;引入dropout避免模型过拟合;最大池化。
ZF-Net:13年ImageNet冠军,只用了一块 GPU 的稠密连接结构;将AlexNet第一层卷积核由11变成7,步长由4变为2。
VGG-Nets:14年ImageNet分类第二名,更深的网络,卷积层使用更小的filter尺寸和间隔;多个小卷积让网络有更多的非线性,更少的参数。
GoogLeNet:14年ImageNet分类第一名。引入Inception模块,采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;采用了average pooling来代替全连接层;避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。
ResNet:引入残差单元,简化学习目标和难度,加快训练速度,模型加深时,不会产生退化问题;能够有效解决训练过程中梯度消失和梯度爆炸问题。
DenseNet:密集连接;加强特征传播,鼓励特征复用,极大的减少了参数量。
1*1卷积的作用
1.1x1卷积的主要目的是为了减少维度(降维),还用于修正线性激活(ReLU)。
比如上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。
2,加深了网络的层次,同时也增强了网络的非线性
瓶颈结构和沙漏结构都能看到它的踪影
cnn模型最后几层的作用
全特征的提取+分类器
现在大多在最后一层全连接层分类器使用全局平均池化代替之前的全连接,减少计算也有很好的模型解释性
图神经网络
目标检测
单步模型:OverFeat,SSD,YOLO
两步模型: R-CNN SSPNet,Fast R-CNN ,Faster R-CNN
最新的:
单步模型:CornerNet,CenterNet,RefineNnet,ExtremeNet
两步模型:
PANet,Cascade R-CNN ,Mask Score R-CNN
提升对小物体检测能力的方法
1)模型设计可以采用特征金字塔、沙漏结构等网络子结构、来增强网络对多尺度尤其小尺度的特征的感知和处理能力;尽可能提升网络的感受野,使得网络能够更多地利用上下文信息来增强检测效果;同时减少网络的总的下采样比例,使得最后用于检测的特征分辨率更高。
2)在训练方面,提高小物体样本在总体样本中的比例;也可以利用数据增强手段,将图像缩小以生成小物体样本。
3)在计算量允许的范围内,可以尝试使用更大的输入图像尺寸
光学字符识别
深度学习的两种方法:基于候选框的文本检测框架和基于像素分割的文本检测框架,两个区别一个是目标检测任务,一个是图像分割任务。
1,基于候选框的文本检测框架: Rosetta,SegLink和TextBoxes,对小文本检出率高,但是对倾斜角度较大的密集文本块,很容易无法适应文本方向的剧烈变化而失败。
基于像素分割的文本检测框架:基于FCN的TextSnake,由Mask R-CNN衍生的SPCNet和MaskTextSpotter. 具有更好的检测精度,但是小文本稀疏场景检出率不高,除非牺牲速度,扩大图像尺寸。
也可以将两者结合,18年的云从科技的论文将两者融合。
端到端的文本检测识别算法:CRNN,FOTS
CRNN:cnn+lstm+转录层,将预测结果输出比较可信的标签序列。
图像标注
为一张图像生成一句话,用来简述图像内容。包含了理解图片,表达图片内容两个部分。
图像标注的评测指标:BLEU,ROUGE,METEOR,CIDErSPICE
人体姿态识别(2D,3D)
最后输出人体部位热图,用点代表部位中心。大致分为自底向上和自顶向下方法:
**自底向上:**openpose
视频编解码
国际主流编码之一:HEVC,帧内预测编码,利用空域周边像素信息预测改点的像素值。
深度学习在帧内预测主要有两种思路:
1,基于HEVC编码标准,只介入模式决策部分的处理;前面用卷积池化操作输出特征,然后用全连接层与HEVC的35种帧内预测模式相连,输出结果就是帧内预测的模式,独热编码并选取交叉熵作为误差函数。
2,第二种思路完全是代替现有的帧内预测流程,打破HEVC的编码标准。使用全连接层,输入为待编码图像块周边像素作为网络的输入,经过多层全连接网络,输出当前编码图像块的预测值。可以用均方误差作为损失函数
深度学习模型实现环路滤波模块
多尺度问题怎么解决?
1,图像分类中最常见的是上采样,将网络输入的图像大小resize统一大小;
2,用膨胀卷积、空洞卷积等这类特殊的卷积来提高检测器对分辨率的敏感度;(空洞卷积是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3 x3的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。在保持参数个数不变的情况下增大了卷积核的感受野)
3,在浅层和深层的Feature map上直接各自独立做预测,比如YOLOv3。
4,用FPN这种将浅层特征和深层特征融合的,或者最后预测的时候,用浅层特征和深层特征一起预测;YOLOv4
5,SNIP:在训练和反向更新参数时,只考虑那些指定的尺度范围内的目标。
数字图像处理,各种滤波的定义
参考文章:https://www.cnblogs.com/xiaojianliu/p/9075872.html
包括了:平滑均值 高斯平滑,图像的锐化,梯度(水平梯度,垂直梯度),Soble边缘检测等。
图像数据预处理的方法包括哪些
图像预处理一般有数字化,归一化,几何变化,平滑,复原和增强等步骤。
在检测边缘前,通常会进行灰度化处理,噪声处理,二值化,开闭运算
图形学知道哪些
计算机图形学主要包含四大部分的内容:建模(Modeling)、渲染(Rendering)、动画(Animation)和人机交互(Human–computer Interaction, HCI)。
图像处理Opencv
边缘检测算子有哪些
比较常用的方法有三种,Sobel算子,Laplacian算子,Canny算子。
参考文章:https://www.jianshu.com/p/2a06c68f6c14
霍夫变换
步骤:
1),针对每个像素点(x,y),使得theta从-90度到180度,使用公式 p = x c o s ( θ ) + y s i n ( θ ) p=xcos(\theta)+ysin(\theta) p=xcos(θ)+ysin(θ)计算得到共270组(p, θ \theta θ)代表着霍夫空间的270条直线。将这270组值存储到H中。
如果一组点共线,则这组点中的每个值,都会使得 H ( p , θ ) H(p,\theta) H(p,θ)加1
2),因此找到 H ( p , θ ) H(p,\theta) H(p,θ)值最大的直线,就是共线的点最多的直线,可以根据一定的阈值,将比较明显的线全部找出来。
图像的特征提取有哪些算法,适用范围、优缺点
文章:详细描述文章
Hog:图像局部纹理的特征
SIFT:尺度不变特征变换,关键点检测
LBP:纹理特征提取
FAST:角点检测算子 ORB是对其的改进
Harris:角点检测
Haar:Haar特征很简单,分为三类:边缘特征、线性特征、中心特征和对角线特征,组合成特征模板。
深拷贝与浅拷贝
在浅拷贝时,拷贝出来的新对象的地址和原对象是不一样的,但是新对象里面的可变元素(如列表)的地址和原对象里的可变元素的地址是相同的,也就是说浅拷贝它拷贝的是浅层次的数据结构(不可变元素),对象里的可变元素作为深层次的数据结构并没有被拷贝到新地址里面去,而是和原对象里的可变元素指向同一个地址,所以在新对象或原对象里对这个可变元素做修改时,两个对象是同时改变的,但是深拷贝不会这样,这个是浅拷贝相对于深拷贝最根本的区别。
list与tuple的区别
在list集合中可以实现元素的添加、修改、插入、以及删除。tuple集合看似与list类似,但两者还是有很大的区别。
在tuple集合中,一旦元素被存储,以后就不能修改,删除了,这比list集合安全许多,所以能用tuple就用tuple
is 与‘==’异同
is 要求地址相同但是== 要求地址相同,属于同一对象
list参数传递,如果list在函数里改变,原来的list是否改变
改变,传递的是对象,如果是不可变对象,比如数字,字符或者元组,原对象就不会改变。
匿名函数的使用 使用sort对字典的值进行排序
stu = {1002: 78, 1003: 89,
1001: 77, 1006: 98,
1005: 92, 1004: 100}
score = sorted(stu.items(), key=lambda item:item[1],reverse=True)
# 查看score
print(score)
# 取前三名
for index, val in enumerate(score):
if index < 3:
print(val[0], val[1], sep=" ")
指针与引用的区别
1)初始化要求不同:指针可以初始化为空,但是引用必须初始化,而且还要是一个已有对象的引用,
2)可修改性不同。指针可以改变指向,可以指向别的对象,。引用只能是一个对象的引用,不能被改变为另一个对象的引用。
3)指针有自己的内存空间,引用没有
4)指针的sizeof大小是固定的,引用要根据引用的对象的数据类型决定
5)有多级指针,但是没有多级引用
继承与多态
继承:继承是实现代码复用的重要手段,继承是利用已存在的类的形式,在保持原有类特性的基础上进行扩展,增加功能。这样产生新的类,成为派生类。
多态:c++中的虚函数的作用主要是实现了多态的机制。多态简而言之就是用父类型别的指针指向其子类实例,然后通过父类的指针调用实际子类的成员函数。这种技术可以让父类的指针有“多种形态”。
数组与链表
数组和链表的区别浅析
内存泄漏和溢出
内存溢出:通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。
内存泄漏:是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
c++ malloc free和new delete的区别
共同点:都是从堆上申请空间,并且需要用户手动释放
不同点:1,malloc和free是函数,new和delete是操作符;
a) malloc申请的空间不会初始化,new可以初始化
b) malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
c) malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
d) malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需 要捕获异常
e) 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new 在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成 空间中资源的清理。