系列文章目录
文章目录
- 系列文章目录
- 前言
- 一、CV篇
- 1、batch-normalization过程是什么样的?
- 2、激活函数有什么用?常见的激活函数的区别是什么?
- 3、Softmax的原理是什么?有什么作用?
- 4、CNN的平移不变性是什么?如何实现的?
- 5、VGG,GoogleNet,ResNet等网络之间的区别是什么?
- 6、残差网络为什么能解决梯度消失的问题?
- 7、常见的模型加速方法
- 8、 目标检测里如何有效解决常见的前景少背景多的问题?
- 9、目标检测里有什么情况是SSD、YOLOv3、Faster R-CNN等所不能解决的,假设网络拟合能力无限强?
- 10、ROIPool和ROIAlign的区别是什么?
- 11、常见的梯度下降优化方法有哪些?
- 12、人体姿态估计主流的两个做法是啥?
- 13、在onnx中Transpose算子和ConvTranspose算子有什么区别?
- 14、在使用CTC进行文本识别时,能不能使用ConvTranspose算子替代Transpose算子?
- 15、CUDA,OpenCL,Metal GPU加速有什么区别?
- 16、在模型推理过程中,autoanchor的作用是什么?
- 17、为什么编译后的opencv动态库只有libopencv_img_hash.so和libopencv_world.so库,没有其他库?
- 18、调用目标检测模型和摄像头进行实时检测时,存在目标检测框不稳定不连续的闪烁现象,该如何解决?
- 19、kalman滤波简单理解
- 20、yolov5训练过程中的指标mAP@0.5与指标mAP@0.5:0.95的含义
- 21、在多分类的情况下,根据任务的数据集中不同类的不同数量分布,来决定应该选用哪个评价指标:
- 二、NLP篇
- 三、AI嵌入式篇
- 持续更新。。。
前言
浅浅记录一些工作中的知识,一方面作为笔记记录下来,另一方面做一些分享。
一、CV篇
1、batch-normalization过程是什么样的?
批量归一化(Batch Normalization)简称BN,是一种常用的对深度神经网络的优化技术,有两个基本也是最重要的功能
1、防止模型过拟合
2、加快训练速度
简单描述就是它通过将每一层调用它的网络层的输入数据做归一化来实现,以此再进行正常的训练过程。
进一步解释这个批量归一化,过程如下:
1、以每批输入的mini-batch 为单位,计算每个 mini-batch 中每个输入变量的均值和标准差。
2、对于每个 mini-batch 中的每个输入变量,减去均值,再除以标准差,从而得到归一化的结果。这样就会突出个别数据的主要特征的同时缩小所需要学习的数据的大小,既有利于模型的学习又有利于数据的计算。
3、把归一化的结果作为网络的输入,继续正常的训练过程。
4、训练结束后,再反向把归一化的结果转换成原来的输入。
2、激活函数有什么用?常见的激活函数的区别是什么?
激活函数(Activation Function)是神经网络中重要的组成部分,它可以把一个实数值信号转换为另一个实数值信号,用于处理神经网络中的输入和输出。
它的用处有:
1、用于计算神经元的激活状态;
2、使用激活函数可以使神经元的输出维持在一定的范围,从而提高神经网络的可靠性;
3、使用不同的激活函数可以增加神经网络的表达能力,从而提高神经网络的性能。
常见的激活函数有:
Sigmoid 函数:Sigmoid 函数可以把神经元的输出映射到 0 到 1 之间的值,适用于分类问题;
ReLU 函数:ReLU 函数可以让神经元在激活时输出大于 0 的值,通常比 Sigmoid 函数有更好的表现;
Tanh 函数:Tanh 函数可以把神经元的输出映射到 -1 到 1 之间的值,可以用于正负号判别;
Softmax 函数:Softmax 函数可以把神经元的输出映射到 0 到 1 之间,并且各个神经元的总和为 1,常用于多分类问题。
不同的激活函数有不同的优缺点:
Sigmoid 函数:优点是计算简单,可以把神经元的输出映射到 0 到 1 之间;缺点是如果梯度较小,梯度消失,其表现力较差。
ReLU 函数:优点是在 0 处有断点,可以快速收敛,计算速度快,并且不会出现梯度消失的问题;缺点是在 0 之下的区域不激活,可能会出现梯度爆炸的情况。
Tanh 函数:优点是比 Sigmoid 函数的输出更加稳定,因此不容易出现梯度消失的问题;缺点是输出小于 0 的值,可能在训练过程中效率不够高。
Softmax 函数:优点是可以把输出映射到 0 到 1 之间,并且各个神经元的总和为 1,适用于多分类问题;缺点是若输出值较大,可能会出现数值稳定性问题。
3、Softmax的原理是什么?有什么作用?
Softmax 是一种常用的多分类技术,它可以将一个得到的输入值转换成概率。
其中,
n
n
n表示分类的类别个数,
x
x
x表示模型的输出(不同类别的输出可能不同),表示各个类别的累加和,最终输出的概率值范围为 0 到 1(即归一化后的结果)。
它有两个主要的作用:
1、将一个实数输入转换成概率:Softmax 通过将输入的实数值映射到 0 到 1 之间,从而可以将其转换成概率。
2、用于多分类任务:由于 Softmax 可以输出类概率,因此它也可以用于多分类任务,可以帮助我们更加准确地预测分类结果。
4、CNN的平移不变性是什么?如何实现的?
CNN 的平移不变性是指在视觉识别中,物体即使改变位置,CNN仍能正确识别出物体。它是通过使用卷积神经网络(CNN)实现的,由于卷积核的权重在整个图像中是一致的,因此它可以减少对输入图像位置的依赖,从而实现平移不变性。
CNN的平移不变性涉及到两个要素:
1、空间块(Spatial Blocks):在卷移过程中,输入图像的像素会被划分为一系列的空间块,每个空间块的大小取决于卷移核的大小。
2、共享权重(Shared Weights):在CNN中,卷移核具有一定的权重,这些权重在整个图像中是一致的,由此,卷移核可以保持对输入图像位置的不变性。
5、VGG,GoogleNet,ResNet等网络之间的区别是什么?
1、VGG (Visual Geometry Group),该网络由 Simonyan 和 Zisserman 在 2014 年发表,它巧妙地使用 3×3 的小卷积核来构建深层网络,网络的深度仅仅是使用了卷积核和池化层的叠加,最后使用全连接层作为输出层。
2、GoogleNet 是2014年ILSVRC比赛的获胜者,由 Szegedy 等人设计,主要特点是使用 Inception 模块来组成网络,这些 Inception 模块有效地减少参数量,同时提升模型精度,GoogleNet 中还引入 batch normalization 和 dropout ,让网络具有更好的收敛和泛化能力。
3、ResNet (Residual Network) 是2015 ILSVRC比赛的获胜者,由 Kaiming He 等人提出,它首次提出了残差模块,通过跳跃连接将上游的特征融合到下游特征中来提高网络的深度,从而提升网络性能,这种跳跃连接使得网络深度增加而不会出现梯度消失现象。
6、残差网络为什么能解决梯度消失的问题?
残差网络(ResNet)是一种深度神经网络,它能够有效解决深层神经网络中梯度消失问题。它利用跳跃连接(skip connections)来替代简单的堆叠层,从而让梯度能够在深层网络中顺利传播,从而防止梯度消失问题发生。跳跃连接能够有效保存浅层特征以及它们对深层特征的影响,这样可以在训练过程中减少参数的更新,从而有效避免梯度消失的问题。
7、常见的模型加速方法
1、对模型进行缩减:降低模型参数的数量,从而减少模型的计算量,从而加快模型的运行速度。常见的方法有剪枝、瘦身、混合精度训练等。
2、选择高效算法:使用更高效的算法来加速模型的训练和推理过程,例如使用基于深度学习的算法,可以比传统机器学习算法更快地训练和预测。
3、采用分布式训练:分布式训练可以利用多台计算机的资源,将模型的训练和测试任务分给不同的计算机,从而大大加快模型的训练速度。
4、优化模型结构:可以通过调整模型结构,减少模型中不必要的复杂度,减少模型的计算量,从而提高模型的运行速度。
5、使用硬件加速:使用 GPU 加速、英伟达的 TensorRT、英特尔的 OpenVINO 等都可以加速深度学习模型的计算和推理过程。
8、 目标检测里如何有效解决常见的前景少背景多的问题?
1、图像增强:图像增强是一种有效的解决前景少背景多的方法,它可以通过增加或减少图像的噪声、添加变换、改变对比度、添加颜色、旋转和其他变换等来增加前景背景的特征差异。
2、改变损失函数:改变损失函数是解决前景少背景多的另一种有效方法,损失函数可以赋予背景更高的权重,以便更有效地检测出前景目标。
3、分类和定位:分类和定位是一种有效的解决前景少背景多的方法,它将目标检测任务分为两个部分:分类(判断是否有目标)和定位(确定目标的位置)。在分类的步骤中,可以通过更有效地检测前景目标来减少背景图像。
4、选取较小的网络:使用较小的网络,可以让模型更具有针对性,更容易检测出前景目标,避免对于背景的过度识别。
5、采用多尺度预测:采用多尺度预测的方法可以更有效地检测出前景目标。它可以通过使用多种比例的输入图像来进行多次预测,以便更有效地检测出前景目标。
9、目标检测里有什么情况是SSD、YOLOv3、Faster R-CNN等所不能解决的,假设网络拟合能力无限强?
SSD、YOLOv3、Faster R-CNN 等算法仅能够检测图像中的静态物体,无法检测动态物体;
由于 SSD、YOLOv3、Faster R-CNN 等技术均采用卷积神经网络,一次只能处理单张图片,FPS无法满足处理视频的能力;
由于 SSD、YOLOv3、Faster R-CNN 等技术仅能检测定长边界框,无法检测不规则形状;
由于 SSD、YOLOv3、Faster R-CNN 都是监督学习,需要大量有标注的数据集进行训练,若标注数据有误或缺失,模型性能会受到影响;
由于 SSD、YOLOv3、Faster R-CNN 等算法不能够理解图片的语义,因此不能准确地检测到场景内的物体。
10、ROIPool和ROIAlign的区别是什么?
ROIPool和ROIAlign都是按照Region of Interest (ROI) 来对输入特征映射(Feature Map)作出处理的操作,用于对输入特征映射输出的结果进行缩放,使得输出的维度固定。
ROIPool:ROIPool以给定的ROI将输入特征映射分割成固定大小的网格,然后在每个网格中取最大值,生成固定大小的输出。
ROIAlign:ROIAlign与ROIPool相似,但它使用双线性插值计算输出,而不是只取每个网格中的最大值,因此生成的输出具有更高的精度。
11、常见的梯度下降优化方法有哪些?
1、普通梯度下降是每次迭代只使用一个样本点来更新参数,每次迭代都要计算所有样本点的梯度,比较耗时。
2、批量梯度下降是每次迭代使用所有样本点来更新参数,把所有样本点的梯度求和再更新参数,虽然计算量大,但是比普通梯度下降更准确和更快。
3、随机梯度下降是每次迭代使用一个样本点来更新参数,样本点是随机选取的,每次迭代只需要计算一个样本点的梯度,收敛效果比普通梯度下降慢一点,但是比较节省计算资源。
4、小批量梯度下降是每次迭代使用一小部分样本点来更新参数,样本点是随机选取的,比较节省计算资源,可以比较快速地收敛。
5、动量梯度下降是在普通梯度下降的基础上添加了一个动量参数,可以抑制梯度的震荡,更快的收敛。
12、人体姿态估计主流的两个做法是啥?
1、机器学习方法:
卷积神经网络(CNN):使用卷积神经网络(CNN)来识别图像中的人体姿态,并预测出相应的轮廓信息;
支持向量机(SVM):利用支持向量机(SVM)来进行监督学习,通过学习分类器来识别人体姿态。
2、基于图像分析方法:
人体图像分割:基于模板匹配算法,提取图像中人体部分;
人体轮廓识别:利用图像处理技术,识别出人体轮廓;
运动跟踪:利用视觉相关算法,跟踪人体的运动轨迹;
人体姿态估计:利用多种计算机视觉技术,包括姿态估计、多视角跟踪等,来识别并估计人体的姿态。
13、在onnx中Transpose算子和ConvTranspose算子有什么区别?
在ONNX中,Transpose算子和ConvTranspose算子都是用于对张量进行转置操作的,但是它们的具体功能和使用场景是不同的。
Transpose算子主要用于对张量的维度进行重新排列,可以通过指定维度的顺序来实现不同的转置操作。例如,可以将一个形状为[batch_size, height, width, channels]的张量转置为[batch_size, channels, height, width]的张量。Transpose算子通常用于数据预处理和特征提取等任务中。
ConvTranspose算子则是用于反卷积操作的,也称为转置卷积。它可以将一个低维的特征图通过填充和卷积操作转换为一个高维的特征图。ConvTranspose算子通常用于图像生成、语音合成等任务中。
因此,Transpose算子和ConvTranspose算子虽然都是用于张量转置操作,但是它们的具体功能和使用场景是不同的。
14、在使用CTC进行文本识别时,能不能使用ConvTranspose算子替代Transpose算子?
在使用CTC(Connectionist Temporal Classification)进行文本识别时,通常需要使用Transpose算子而不能直接使用ConvTranspose算子进行替代。
CTC是一种用于序列标注任务的损失函数,常用于文本识别中。在CTC中,需要对输入序列的维度进行转置,以便与标签序列进行对齐和比较。这个转置操作是为了将时间步(或帧)维度与标签对齐,以便计算CTC损失。
Transpose算子可以直接对张量的维度进行重新排列,将时间步维度与标签对齐。而ConvTranspose算子是用于反卷积操作的,不适用于CTC中的维度转置操作。
因此,在使用CTC进行文本识别时,应该使用Transpose算子来进行维度转置,以便正确计算CTC损失并进行训练和推理。
15、CUDA,OpenCL,Metal GPU加速有什么区别?
CUDA是计算通用设备架构,是英伟达专有的给计算加速卡或者GPU进行计算用程序设计的底层API,一般使用C语言编程,主要特点是分主程序(Host)还有设备程序(Device)两部分,内存部分分开,一般无法进行图形渲染。
OpenCL是一种可以在CPU,GPU,而且不分品牌的跨平台计算用编程API。主要特点是你要把真正的要在设备上运行的代码作为字符串写在程序的源码中,如同俄罗斯套娃,然后在编译的时候选一个目标(GPU或者CPU)进行编译,一般无法进行图形渲染。
Metal是苹果推出的,苹果专有的,兼顾图形还有计算的,面向底层的程序设计API。一般采用C++编程,或者使用Metal的高端API(xxKit),只能在苹果设备上使用,但是它既能面向计算,也能面向图形(Shader)进行编程。
16、在模型推理过程中,autoanchor的作用是什么?
autoanchor是一种用于目标检测任务的技术,它的作用是自动选择适合的锚框尺寸。锚框是一种预定义的边界框,用于在图像中定位和识别目标物体。autoanchor的目标是根据训练数据集中目标物体的尺寸分布,自动确定一组合适的锚框尺寸,以便在推理阶段更好地适应不同尺寸的目标物体。
通过使用autoanchor技术,模型可以根据训练数据中目标物体的尺寸特征,自动调整锚框的尺寸范围,从而提高目标检测的准确性和泛化能力。这样可以更好地适应不同尺寸的目标物体,使模型在推理阶段能够更好地检测和定位目标物体。
如果推理得到的图片中,同一个目标有多个检测框标注,这代表autoanchor可能存在尺寸不合适或者过于敏感等问题。
17、为什么编译后的opencv动态库只有libopencv_img_hash.so和libopencv_world.so库,没有其他库?
可能是因为编译前勾选了opencv_world选项。
OpenCV中有很多模块,模块间保持最小的依赖关系,用户可以根据自己的实际需要链接相关的库,而不需链接所有的库,这样在最终交付应用程序时可以减少总库的大小。但如果需要依赖OpenCV的库太多,有时会带来不方便,此时可以使用OpenCV的world模块。
OpenCV中的world模块,也称为超级模块(super-module),它结合了用户选择的所有其它模块。它是一个一体化(all-in-one)模块,具有所有库的功能。使用world模块可能会使应用程序的编译时间略有增加。
18、调用目标检测模型和摄像头进行实时检测时,存在目标检测框不稳定不连续的闪烁现象,该如何解决?
1、强化数据集,训练模型,提升模型泛化能力。但是局限性太大,有些图像噪音是无法预估;
2、检查标注框是否规范(比如是否刚好贴近目标轮廓、是否有漏标目标)。大小标准不统一,对检测框稳定性影响很大;
3、将视频前后帧中的同一目标进行关联,在绘制边界框时应用平滑技术,做一些轨迹平滑处理、轨迹缓存处理:
滑动平均法:在每一帧中,将当前帧检测到的边界框与前几帧的边界框进行平均,以减少抖动。可以使用以下步骤实现滑动平均法:
维护一个边界框队列,保存最近几帧的边界框。
在每一帧中,将当前帧检测到的边界框添加到队列中。
计算队列中所有边界框的平均值,得到平滑后的边界框。
使用平滑后的边界框进行显示或后续处理。
卡尔曼滤波器:卡尔曼滤波器是一种常用的状态估计滤波器,可以用于平滑目标检测框。可以使用以下步骤实现卡尔曼滤波器:
定义状态变量,例如目标的位置和速度。
初始化卡尔曼滤波器的状态和协方差矩阵。
在每一帧中,使用当前帧检测到的边界框更新卡尔曼滤波器的状态。
使用卡尔曼滤波器估计的状态来获得平滑后的边界框。
19、kalman滤波简单理解
可以在任何含有不确定信息的动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况。在连续变化的系统中使用卡尔曼滤波是非常理想的,它具有占用内存小的优点(除了前一个状态量外,不需要保留其它历史数据),并且速度很快,很适合应用于实时问题和嵌入式系统。
Kalman滤波主要分为两个方面:预测下一个时刻的位置;修正当前状态的位置。采用递归的方法解决,并且其只需要当前的测量值(当前鼠标采集的坐标位置)和前一个采样周期的估计值就能进行状态估计,需要的存储空间小,每一步的计算量小。
20、yolov5训练过程中的指标mAP@0.5与指标mAP@0.5:0.95的含义
mAP@0.5:mean Average Precision(IoU=0.5)
即将IoU设为0.5时,计算每一类的所有图片的AP,然后所有类别求平均,即mAP。
mAP@[.5:.95]:mean Average Precision(表示为mAP@[.5——.95])
表示在不同IoU阈值(从0.5到0.95,步长0.05)(0.5、0.55、0.6、0.65、0.7、0.75、0.8、0.85、0.9、0.95)上的平均mAP。
21、在多分类的情况下,根据任务的数据集中不同类的不同数量分布,来决定应该选用哪个评价指标:
1、若数据集各类别数据量是不平衡的且所有类别都是同样重要,那用macro-F1就行,因为它是按类别计算,再取平均的F1作为最后值。大多数应该就是这种情况了(micro-F1在极度不平衡数据下会≈数据量大的那一类F1,不能很好的衡量模型的整体效果)。
2、若是在一个非平衡的数据集上,你个人希望侧重于一些类,那当然是weighted-F1 了(这个相当于就是macro-F1的加权平均,权重则是各类的数量占总体数量的权重)。
3、若是平衡的数据集,且是忽略类别的情况那就用micro-F1好了
二、NLP篇
1、LSTM为什么能解决梯度消失/爆炸的问题?
LSTM(Long Short-Term Memory)能够解决梯度消失/爆炸的问题,这是因为它具有记忆细胞和遗忘门,以及输入门和输出门。
1、记忆细胞帮助网络长期记忆,并且可以容纳较大的梯度,从而避免梯度消失现象。
2、遗忘门可以控制信息的流动,有助于梯度能够在网络中传播,而不是消失。
3、输入门可以控制新信息的流入,防止梯度爆炸。
4、输出门可以控制信息传播的量,从而防止梯度爆炸。
因此,LSTM通过这些门和记忆细胞等方式,能够解决梯度消失/爆炸的问题。
2、Attention对比RNN和CNN,分别有哪些优势?
1、RNN的优势
对于序列问题有很好的处理能力。
展示独特的内存功能,可以查看非常长时间范围内的数据。
2、CNN的优势
可以捕获局部联系。
可以应用在图像和文本分类中,在这些任务中具有出色的效果。
3、Attention的优势
可以为全局序列联系提供动态调节。
可以更加精准地指定哪些序列信息被注意。
可以更加容易地解决训练时间长的问题。
3、写出Attention的公式
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d k ) V Attention(Q,K,V)=softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dkQKT)V
4、Attention机制,里面的q,k,v分别代表什么?
q (query): 查询,指的是输入的查询向量,一般是RNN的隐层状态或者词嵌入。
k (key): 键,指的是查询空间中的样本,一般也是RNN的隐层状态或者词嵌入。
v (value): 值,指的是查询空间中样本对应的权重系数,一般也是RNN的隐层状态或者词嵌入。
5、为什么self-attention可以替代seq2seq?
Self-Attention 可以作为一种替代 Seq2Seq 模型的技术。与 Seq2Seq 不同,Self-Attention 模型通过引入一个全局注意机制,使模型更具有自我理解能力,能够联系长距离的输入输出之间的关系,而不是像 Seq2Seq 那样只能覆盖较短的距离,因此模型的性能得到了显著提升。此外,Self-Attention 模型还可以减少计算量,这是由于与经典的 Seq2Seq 模型比较,Self-Attention 模型可以在一次网络前向传播中完成所有操作,而不需要多次前向传播来计算输入序列和输出序列之间的关系。
三、AI嵌入式篇
1、交叉编译后生成的bin、include、lib、share四个文件夹分别有什么区别?
交叉编译后生成的bin include lib share四个文件夹,是交叉编译后的程序和相关资源。
在交叉编译过程中,生成的可执行文件通常包含四个主要部分:bin、include、lib和share:
bin(二进制文件):这个目录包含了交叉编译后生成的可执行文件。这些文件是在目标体系结构上运行的程序,可以直接在目标计算机上执行。
include(头文件):这个目录包含了用于编译目标体系结构上的程序所需的头文件。头文件包含了函数和变量的声明,用于在编译时进行类型检查和函数调用。
lib(库文件):这个目录包含了目标体系结构上的库文件。库文件是预编译的代码,包含了一组函数和数据,可以在程序中被调用和使用。在交叉编译中,生成的库文件是为目标体系结构而编译的,以便在目标计算机上使用。
share(共享文件):这个目录包含了一些共享的数据文件,如配置文件、资源文件等。这些文件在不同的程序之间可以共享和重用。
交叉编译后生成的bin目录包含可执行文件,include目录包含头文件,lib目录包含库文件,share目录包含共享文件。