目标检测综述文章解读——Object Detection in 20 Years: A Survey
论文:Object Detection in 20 Years: A Survey
作者:Zhengxia Zou, Keyan Chen, Zhenwei Shi, Yuhong Guo, Jieping Ye
链接:https://arxiv.org/abs/1905.05055
这是一篇关于目标检测综述性文章,自2019年5月第一次提交后,一直在更新版本,本文解读的是2023年1月更新的第三个版本了,文章分五个部分介绍目标检测,包括引言、近20年的目标检测算法、检测算法加速方面、检测算法最新进展及未来展望。
文章目录
- 1、引言
- 2、近20的目标检测
- 2.1 目标检测路线
- 2.2 目标检测数据集及评估指标
- 2.3 关键技术演变
- 2.3.1 多尺度检测技术发展
- 2.3.2 上下文启发的技术演变
- 2.3.3 难负样本挖掘技术演变
- 2.3.4 损失函数的技术演变
- 2.3.5 非极大值抑制技术的演变
- 3、检测算法在加速方面的改进
- 4、近3年检测算法最新进展
- 5、总结及展望
1、引言
目标检测是非常重要的一项任务,它是其他机器视觉算法的基础,比如实例分割、为图片配文字、目标跟踪等等。得益于深度学习技术的快速发展,目标检测也取得了显著的突破,使其成为一个研究热点,受到前所未有的关注。目前,目标检测已广泛应用于许多现实应用中,如自动驾驶、机器人视觉、视频监控等。过去20年,关于“目标检测”的出版物也大量涌现,如下图所示:
2、近20的目标检测
在这一节,作者从多方面回顾近20年目标检测算法历史,包括具有里程碑意义的目标检测算法,目标检测数据库及评估方式,关键技术演变。
2.1 目标检测路线
近二十年来,人们普遍认为,目标检测的进展大致经历了两个历史时期:“传统目标检测时期(2014年以前)”和“基于深度学习的检测时期(2014年后)”。如下图所示:
这里作者直接分为传统、深度学习双阶段及深度学习单阶段三个部分,各个部分又简单描述了代表性的算法,我这里直接列举算法,没有对算法做详细解读。
- A.传统检测器
大多数早期的目标检测算法都是基于手工特征构建的。由于当时缺乏有效的图像表示,人们不得不设计复杂的特征表示和各种加速技巧。
Viola Jones Detectors
HoG Detector
Deformable Part-based Model (DPM) - B.深度学习两阶段检测器
RCNN
SPPNet
Fast RCNN
Faster RCNN
Feature Pyramid Networks(FPN) - C.深度学习单阶段检测器
You Only Look Once (YOLO)
Single Shot MultiBox Detector (SSD)
RetinaNet
CornerNet
CenterNet
DETR
2.2 目标检测数据集及评估指标
- A.数据集
Pascal VOC
ILSVRC
MS-COCO
Open Images - B.评估指标
早期为漏检率(Miss rate)与每个窗口误报率(FPPW),到2009年加州理工学院引入了行人检测基准,此后,评估指标从FPPW变为每张图片误报率(FPPI)。
最近几年,都用”Average Precision(AP)”,它最初是在VOC2007中引入的。AP定义为不同召回下的平均检测精度,通常用于评估某一个具体的类。Mean AP(mAP)则代表全部类别的平均AP值,通常用作性能的最终度量。为了计算定位精度,预测框和gt框的IoU来作为判别标准,比如IoU设置为0.5,两者之间的IoU大于0.5,则算预测框预测到了,反之小于0.5则算预测框没有预测到。0.5-IoU mAP成为了物体检测的实际度量标准。
在2014年后,由于引进了MS-COCO数据集,研究人员开始更加关注物体定位的准确性。所以不再采用一个固定的IoU值作为阈值。MS-COCO的AP计算是平均了多个IoU阈值(0.5到0.95)。
2.3 关键技术演变
在本小节中,作者将介绍检测系统的一些重要组成部分及其技术演变。比如:模型设计中的多尺度和上下文启动,训练过程中的样本选择策略和损失函数的设计,非极大值抑制。
2.3.1 多尺度检测技术发展
多尺度检测,利用不同尺度大小和不同宽高比进行检测的技术跨越了整个检测算法的20年,如下图所示。
-
A.特征金字塔+滑动窗口
从2004年开始,许多里程碑式的检测器都是基于这种模式,如Haar Det,HoG Det等等,主要是传统检测算法。 -
B.目标提议框检测
目标提议指的是一组与类无关的参考框,这些参考框可能包含任何对象。使用目标提议进行检测有助于避免在图像上进行穷举滑动窗口搜索。主要是从2014年以后大量出现的以CNN为主的anchor-based检测算法,如:R-CNN系列和YOLO系列。 -
C.深度回归和anchor-free检测
通过像素坐标的中心点或者目标角点位置直接回归目标的方式,如CornerNet,DETR等。 -
D.目标多匹配及多个特征图检测
对于处理图像中存在不同尺度目标尤其重要,每个特征图负责不同大小的目标检测,分而治之,2014年后逐渐流行。
2.3.2 上下文启发的技术演变
视觉对象通常与周围环境嵌入在一个典型的上下文中。我们的大脑利用物体和环境之间的联系来促进视觉感知和认知。长期以来,上下文关联一直被用来提高检测能力。下图显示了上下文启发在目标检测中的演化过程。
-
A.局部上下文检测
局部上下文是指被检测对象周围区域的视觉信息。早在2000年时,就有研究人员发现包含一些人脸轮廓外的上下文信息有助于检测人脸,最近的深度学习检测器也可以通过简单地扩大网络的接受域或对象提案的大小来改进局部上下文。 -
B.全局上下文检测
全局上下文利用场景配置作为对象检测的附加信息源。最近研究进展分为两个方面,一个是利用深度神经网络尽可能增大网络感受野,有些甚至超过了输入图片大小,有些利用注意力机制(比如non-local,transformers等)实现增大感受野,都得到了很好的效果。另一个是把全局上下文看作是一个信息序列,利用循环神经网络学习。 -
C.上下文交互
上下文交互是指视觉元素之间的约束和依赖关系。最近的一些研究表明,现代检测器可以通过考虑上下文交互来改进。最近的一些改进可以分为两类,第一类是探索单个对象之间的关系,第二种是探索对象和场景之间的依赖关系。
2.3.3 难负样本挖掘技术演变
检测器的训练本质上是一个不平衡学习问题。在基于滑动窗口的检测器的情况下,背景和目标之间的不平衡可能高达107:1。在这种情况下,若使用所有的背景对训练是有害的,因为大量简单的负样本(背景)会淹没学习过程。难负样本挖掘(Hard Negative Mining, HNM)旨在克服这一问题。HNM的技术演进如图7所示。
-
A. Bootstrap
目标检测中的Bootstrap是指从一小部分背景样本开始训练,然后迭代地增加新的误分类样本的一组训练技术。在早期的检测器中,bootstrap通常用于减少数百万个背景下的训练计算。后来,它成为DPM和HOG检测器中解决数据不平衡问题的标准技术。 -
B. 深度学习检测算法中的难负样本挖掘
为了缓解训练过程中的数据不平衡问题,像Faster RCNN和YOLO这样的检测器只是在正窗和负窗之间平衡权重,然而并这并不能完全解决不平衡问题。另一种改进方法是设计新的损失函数(比如:FocalLoss),通过重塑标准的交叉熵损失,使其更多地关注难的、错误分类的例子。
2.3.4 损失函数的技术演变
损失函数衡量模型与数据的匹配程度(即预测与真实标签的偏差)。计算损失产生模型权重的梯度,随后可以通过反向传播更新以更好地适应数据。分类损失和定位损失构成了目标检测问题的损失形式,如下:
这里t和t*代表边框坐标预测和真实标注;p和p*代表它们的类别概率,IoU{a,a*}代表参考框a和真实框a*两者之间的IoU大小;η代表IoU的阈值,比如0.5,当a和a*的IoU小于0.5时,则a框不会参与localization损失计算。
-
A. 类别损失
分类损失是用来评价预测类别与实际类别的偏离程度的,早期像YOLOv1和YOLOv2就简单采用MSE/L2损失。后面大多采用CE损失(Cross-Entropy)。为提高分类效率,也为了提高模型泛化能力,解决噪声标签上的过信度(标注数据存在噪声,标签过度自信)问题,提出了标签平滑(Label Smooth);为了解决类别不平衡和分类难度差异问题,设计了焦点损失(Focal loss)。这些改进都是在CE Loss的基础上进行改进的。 -
B. 定位损失
定位损失用于优化位置和尺寸偏差。L2 Loss在早期研究中普遍存在,但受离群值(噪声数据)影响较大,容易发生梯度爆炸。结合L1 Loss和L2 Loss的优点,研究者提出Smooth L1 损失,公式如下:
其中x表示目标值与预测值之间的差值。在计算目标检测误差时,利用上述损失将表示边界框的四个坐标[x,y,w,h]进行带入计算4个Smooth L1。在进一步,研究人员利用目标框与预测框的位置关系,提出了IoU损失,它利用IoU确定预测框是否与实际地面真值框相对应,其公式如下:
在这之后,对IoU损失进行改进的损失越来越多,比如:G-IoU(Generalized IoU)解决了IoU=0,即预测框和真实框不重叠情况下不能优化的问题;D-IoU(Distance IoU) 同时结合了三个几何指标:重叠面积、中心点距离和纵横比;C-IoU(Complete IoU)在DIoU的基础上考虑了纵横比差异。
2.3.5 非极大值抑制技术的演变
对于基于密集提议框的检测算法,由于相邻窗口通常具有相似的检测分数,因此需要采用非极大值抑制作为后处理步骤,去除重复的边界框,得到最终的检测结果。在早期的目标检测中,并不总是集成NMS。这是因为当时目标检测系统的期望输出并不完全清楚。下面的图8显示了近20年来NMS的演变。
-
A. 贪婪选择
贪婪选择是执行NMS的一种老式但最流行的方式。这种思想简单且直观:对于一组重叠的检测,选择检测得分最高的边界框,而对于剩余的检测框,则根据预定义的重叠阈值去除。虽然贪婪选择现在已经成为NMS事实上的方法,但它仍然有一些改进的空间。首先,得分最高的盒子可能不是最合适的。其次,它可能会抑制附近的物体。最后,它不能抑制假阳性检测框。 -
B. 边界框聚合
它是另一组用于NMS的技术,其思想是将多个重叠的边界框组合或聚类成一个最终检测。这种方法的优点是充分考虑了对象关系及其检测框的空间布局。一些著名的检测器使用这种方法,如VJ探测器。 -
C. 可学习的NMS
其主要思想是将NMS视为一个过滤器,重新对所有原始检测进行评分,并以端到端方式将NMS作为网络的一部分进行训练,或者训练网络来模仿NMS的行为。这些方法在改善遮挡和密集目标检测方面比传统的手工设置的NMS方法显得更有竞争力。 -
D. NMS-free
为了从NMS中解脱出来,实现完全端到端的目标检测训练网络,研究人员开发了一系列方法来完成一对一的标签分配(即一个对象只有一个预测框)。这些方法经常遵循一个规则,即要求使用最高质量的box用来训练,以实现NMS-free的效果。
3、检测算法在加速方面的改进
检测算法的加速一直是一个具有挑战性的问题。目标检测中的加速技术可以分为三个层次:“检测流程”加速,“检测模型”加速及“数值计算”加速。如下图9展示了目标检测算法加速方面的占比情况:
-
A.特征图共享计算(Feature map shared computation)
在检测器的不同计算阶段中,特征提取通常占用大量耗时,减少特征计算冗余最常用的思路是只计算一次整幅图像的特征映射,这种方法已经实现了数十倍甚至数百倍的加速。比如Fast-RCNN,FPN等等。 -
B.级联检测
级联检测是一种常用的技术。它采用了一种由粗到精的检测思想,用简单的计算过滤掉大多数简单的背景窗口,然后用复杂的窗口处理那些更困难的窗口。近年来,级联检测特别适用于“大场景中的小物体”的检测任务,如人脸检测和行人检测等。 -
C.网络剪枝和模型量化
网络剪枝和模型量化是给CNN模型加速常用的方法,前者是指修剪网络结构或权值,后者是指减少它们的编码长度。对“网络剪枝”的研究,最早可以追溯到1980年。最近的网络剪枝方法通常采用迭代的训练和修剪过程,即在每一阶段的训练后只去除一小组不重要的权值,并重复这些操作。最近关于网络量化的工作主要集中在网络二值化上,其目的是通过将其激活或权重量化为二进制变量(例如0/1)来压缩网络,以便将浮点运算转换为逻辑运算。 -
D.轻量化网络结构设计
1、可分解的卷积(Factorizing Convolutions),为了加速,可以将卷积操作进行分解拆分,这是设计轻量化网络结构的重要依据,这里介绍两种可分解的方法。第一种是将大卷积核分解成多个小卷积核,在相同的感受野情况下,后者更高效,如图10(b);第二种是在卷积之前先将channel维度压缩,然后卷积完再在channel维度升维。如图10(c)。
2、分组卷积(Group Convolution),分组卷积的出发点是通过将输入特征图拆分成不同的组进行卷积操作以达到减少卷积参数的目的。如图10(d)所示,若将输入特征图拆分成m组,在不改变其他配置的情况下,理论上计算量将减少到原来的1/m。
3、深度可分离卷积(Depth-wise Separable Convolution),它可以看作是分组卷积的一种特殊情况,即当分组的数量与输入特征图channel的数量相等时。通常,使用多个1x1滤波器进行维度转换,以便最终输出具有所需的通道数量。如图10(e)所示,通过使用深度可分卷积,可以将计算量从O(dk2c)减少到O(ck2)+O(dc)。这一思想最近被应用于目标检测和细粒度分类中。
4、瓶颈设计(Bottle-neck Design),瓶颈层设计常用于设计轻量型网络,如MobileNet系列,在检测网络中,对检测器的输入层进行压缩,以减少从检测开始的计算量。也可以压缩特征图,使其更薄,从而加快后续的检测速度。
5、网络结构搜索(Detection with NAS),基于深度学习的检测器正变得越来越复杂,严重依赖于手工制作的网络架构和训练参数。网络结构搜索(NAS)主要关注的是确定候选网络的适当空间,改进快速准确搜索的策略,以及以低成本验证搜索结果。在设计检测模型时,NAS可以减少对网络骨干和锚框设计的人为干预。 -
E. 数值加速
数值加速旨在从底层实现对目标检测器的加速。可分为如下几个方面:
1、通过积分图像进行加速,积分图像是图像处理中的一种重要方法。它有助于快速计算图像子区域的和。目标检测任务中,积分图像也用来加速求特征值,如颜色直方图,梯度直方图等,一个典型的应用是用积分HOG maps加速HOG算子的计算,在不损失任何精度的情况下实现了数十倍的加速效果。另外,在传统方法人脸检测中的用到Haar特征,也用积分图方式加速计算过程。
2、频域加速,在适当的条件下,两个信号I * W的卷积的傅里叶变换F是它们的傅里叶空间中的逐点积。
而傅里叶变换及逆傅里叶变换可通过快速傅里叶变换(FFT)和逆快速傅里叶变换(IFFT)加速。
3、矢量量化(Vector Quantization),矢量量化(VQ)是信号处理中的一种经典量化方法,其目的是通过一组小的原型向量来近似一组大数据的分布。它可以用于目标检测中的数据压缩和加速内积运算。
4、近3年检测算法最新进展
-
A.不止于滑窗的检测
由于图像中的目标可以通过其gt框的左上角和右下角唯一确定,因此检测任务可以等效地成为成对关键点定位问题。例如CornerNet通过目标热力图的角点实现检测。Centernet利用目标中心点和角点进行检测。另一种方法是将对象视为一个/多个点,并直接预测对象的属性(例如:高度和宽度)。该方法的优点是可以在语义分割框架下实现,不需要设计多尺度anchor。此外,通过将目标检测视为集合预测,DETR就是采用这种思想。 -
B.旋转和尺度变换的鲁棒检测
1、旋转鲁棒检测,旋转目标在人脸检测、文字检测和遥感影像检测中很常见,这个问题最直接的解决方案是执行数据增强,这样任何方向的对象都可以被增强的数据分布很好地覆盖,或者为每个方向分别训练独立的检测器。设计旋转不变损失函数是最近流行的一种解决方案,其中增加了对检测损失的约束,使旋转对象的特征保持不变。另一个最近的解决方案是学习候选对象的几何变换。在两阶段检测器中,ROI Pooling的目的是为任意位置和大小的目标提议框提取固定长度的特征表示。由于特征池化通常是在直角坐标系下进行的,因此对旋转变换不具有不变性。而最近的改进是在极坐标中执行ROI Pooling,以便特征对旋转变化具有鲁棒性。
2、尺度鲁棒检测,近年来,在训练阶段和检测阶段都进行了尺度鲁棒检测的研究。
尺度适应性训练,现代检测器通常将输入图像重新缩放到固定大小,并在所有尺度上反向传播物体的损失。这样做的缺点是会有“尺度失衡”问题。在检测过程中构建图像金字塔可以缓解这个问题,但不能从根本上解决。最近的改进是对图像金字塔进行Scale Normalization(SNIP),它在训练和检测阶段都构建图像金字塔,并且只反向传播一些选定尺度的损失,如下图12所示。一些研究者进一步提出了一种更有效的训练策略:SNIP with efficient Resampling (SNIPER),即:将图像裁剪并重新缩放到一组子区域,以便从大批量训练中获益。
尺度自适应检测,在基于CNN的检测器中,anchor的大小和纵横比通常都是经过精心设计的。这样做的缺点是不能适应异常的尺度变化。为了提高对小目标的检测,最近一些检测器提出了一些“自适应放大”技术,将小目标自适应地放大为“较大的目标”。最近的另一个改进是预测图像中物体的比例分布,然后根据它自适应地重新缩放图像。 -
C. 使用更好的backbone
检测器的精度和速度很大程度上依赖于网络的特征提取能力,也就是backbone,例如:ResNet,CSPNet,Hourglass,Swin Transformer等。最近,Transformer强大的特征提取能力使目标检测提升很大,在COCO数据集上,排名前10的检测方法都是基于Transformer的。 -
D. 目标框定位的提升
目标框定位的提升分为两个方面,一是bounding box的细化微调,二是精确定位的损失函数改进
提升检测定位精度最直观的方法是对bounding box的进一步细化微调,这可以看作是对检测结果的后处理。最近的一种方法是迭代地将检测结果输入到BB回归器中,直到预测收敛到正确的位置和大小,比如Cascade R-CNN。
第二种就是提出新的定位损失,以现代检测器的思路,目标检测框的定位问题被看作是一个回归问题。然而,这种看法有很多困难点,首先是回归损失与定位的最终评估标准并不是对应的关系,特别是对于一些具有非常大宽高比的目标。第二,传统的BB回归方法没有提供定位的置信度,当有多个BB相互重叠时,这可能导致非最大值抑制失败。所以得通过设计新的损失函数缓解上述问题,IoU及近几年的IoU相关变体定位损失函数的提出进一步提升了目标检测定位精度。 -
E. 加入分割损失函数的学习
目标检测和语义分割都是计算机视觉基础任务,最近有研究者发现在目标检测任务中引入语义分割损失可以提升目标检测器的性能。为了利用分割损失改进检测器,最简单的方法是将分割网络视为一个固定的特征提取器,并将其作为辅助特征集成到检测器中。该方法的优点是易于实现,缺点是分割网络可能带来额外的计算量。
另一种方法是在原始检测器的基础上引入一个额外的分割分支,并用多任务损失函数对该模型进行训练。这种方法的优点是分割分支可以在推理阶段被删除,检测器的速度不会受到影响。然而,缺点是训练需要图像带有像素级的分割标注。 -
F. 对抗训练
生成对抗训练(GAN)自2014年被提出以来,一直备受关注,大量应用于图像生成、图像风格转换及图像超分辨率。最近,对抗训练也应用于目标检测,特别是用在对小目标及遮挡目标的提升上。对于小目标检测,GAN可以通过缩小大小物体之间的表示来增强小物体的特征。对于目标检测中遮挡情况,最近的一个想法是通过使用对抗性训练来生成遮挡mask,对抗网络不是在像素空间中生成样本,而是直接修改特征来模拟遮挡。 -
G. 弱监督目标检测
训练一个基于深度学习的目标检测器通常需要大量手工标记的数据。弱监督对象检测(Weakly Supervised Object Detection, WSOD)旨在通过仅使用图像级标注而不是边界框标注训练检测器来减轻对数据标注的依赖。
多实例学习(Multi-instance learning)是一组监督学习算法,在WSOD中得到了广泛的应用。
类激活映射(Class activation mapping)是WSOD的另一组最新方法。
除了上述方法外,还有一些研究者认为WSOD是一种建议排序过程,通过选择信息量最大的区域,然后用图像级标注对这些区域进行训练。其他一些研究人员则建议将图像的不同部分屏蔽掉,如果检测分数急剧下降,则被屏蔽区域可能包含一个高概率的对象,这类似于对抗训练的方式。 -
H. 域自适应检测(泛化)
大多数目标检测器的训练过程本质上可以看作是在独立同分布(i.i.d)数据假设下的似然估计过程。非id对象检测。数据,特别是对于一些现实世界的应用,仍然是一个挑战。除了收集更多的数据或应用适当的数据扩展之外,领域适应(泛化)还提供了缩小领域之间差距的可能性。为了获得域不变(泛化能力更强)的特征表示,已经在图像、类别或对象级别探索了特征正则化和基于对抗训练的方法。
5、总结及展望
在过去的20年里,目标检测取得了令人瞩目的成就。本文对20多年来的一些里程碑检测器、关键技术、加速方法、数据集和指标进行了综述。一些有希望的未来方向可能包括但不限于以下方面:
轻量目标检测:轻量目标检测旨在加速检测推理,以便在低功耗边缘设备上运行。一些重要的应用包括移动增强现实、自动驾驶、智慧城市、智能摄像头、人脸验证等。虽然近年来已经做出了很大的努力,但机器与人眼的速度差距仍然很大,特别是在检测一些小物体或检测多源信息时。
端到端目标检测:虽然现在有少量方法使用一对一的标签分配训练以实现完全端到端方式检测对象,但大多数方法仍然使用一对多的标签分配方法,这就导致必须使用非最大值抑制操作来消除冗余的检测框。未来对该主题的研究可能集中于设计端到端的检测流程,以保持较高的检测精度和效率。
小目标检测:小目标检测是检测任务中一个长期需要攻克的难点。该研究方向的一些潜在应用包括计算人群或露天动物的数量以及从卫星图像中检测军事目标。一些进一步的方向可能包括视觉注意机制的整合和高分辨率轻量级网络的设计。
3D目标检测:尽管最近在二维物体检测方面取得了进展,但自动驾驶等应用仍依赖于获取物体在三维世界中的位置和姿态。未来的目标检测将在三维世界和多源、多视角数据(例如:RGB图像,3D点云数据等)的利用中得到更多的关注。
在视频中检测:在高清视频中进行实时目标检测/跟踪对于视频监控和自动驾驶具有重要意义。传统的目标检测器通常被设计为基于图像的检测,而忽略了视频帧之间的相关性。通过探索计算限制下的时空相关性来改进检测是一个重要的研究方向。
跨源检测:现在数据源种类越来越多,比如:RGB-D图像,激光雷达,流,声音,文本,视频等,如何将检测器迁移到不同的数据模式,如何进行信息融合以提高检测性能等都是将来的研究方向。
面向开放集的检测:域外泛化(Out-of-domain generalization)、零样本目标检测(zero-shot detection)和增量检测(incremental detection)是目标检测领域的新兴课题。而面向开放集中的物体检测旨在发现未明确给出或部分给出监督信号的未知物体类别,这在机器人和自动驾驶等应用中具有很大的前景。
相关文章:

目标检测综述文章解读——Object Detection in 20 Years: A Survey
论文:Object Detection in 20 Years: A Survey 作者:Zhengxia Zou, Keyan Chen, Zhenwei Shi, Yuhong Guo, Jieping Ye 链接:https://arxiv.org/abs/1905.05055 这是一篇关于目标检测综述性文章,自2019年5月第一次提交后ÿ…...

Android make_vbmeta_image的参数值定义
网上生成vbmeta_system.img的命令,分析下这些参数的赋值,key的路径 out/host/linux-x86/bin/avbtool make_vbmeta_image --algorithm SHA256_RSA2048 --key device/mediatek/system/common/key/rsa2048/oem_prvk.pem --padding_size 4096 --rollback_index 0 --...

代码规范 —— 并发编程规范
优质博文:IT-BLOG-CN 【1】【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 说明: 资源驱动类、工具类、单例工厂类都需要注意。 【2】【强制】创建线程或线程池时请指定有意义的线程名称,方便出错时回溯。…...

仪器仪表控制:pymeasure常用模块以及API
下面是对 pymeasure.experiment 模块中各类和方法的详细介绍,包括它们的功能和用法。 pymeasure.experiment 模块详细介绍 Experiment 类 Experiment 类是 Pymeasure 中用于定义和管理实验的核心类。它包含实验的设置、执行和数据记录等功能。 构造函数 class …...

如何理解openfoam案例里面的blockMesh文件里面的simpleGrading
总结: simpleGrading参数分为xyz三个方向。如果你想使得网格在某个方向上更密集,可以在simpleGrading中将该方向的渐变率设置为小于 1 .更稀疏则设置大于1. 一、案例 比如我这个爆炸案例: 对应的blockMeshDIct文件如下: // 定…...

算法竞赛的制胜法宝:被严重低估的位运算究竟有什么用?
大家好,我是干货哥。今天咱们来聊聊一个让很多人都忽略的神技——位运算。等等,你是不是已经准备关掉这篇文章了?你以为位运算只是计算机底层的鸡肋操作?你以为这些不过是编程语言里最基础、最无趣的东西?但真的是这样…...

Qt QTableWidget 去除序号列
ui->tableWidget->verticalHeader()->setHidden(true);//垂直序列号(表左侧)ui.tableWidget->horizontalHeader()->setHidden(true);//水平序列号(表上方)删除后效果图:...

【C++】5.类和对象(3)
文章目录 3.析构函数析构函数的特点: 4.拷贝构造函数拷贝构造的特点: 3.析构函数 析构函数与构造函数功能相反,析构函数不是完成对对象本身的销毁,比如局部对象是存在栈帧的,函数结束栈帧销毁,他就释放了&…...

CTF-RCE
eval执行 ?cmdsystemctl("ls"); ?cmdsystemctl("ls /"); ?cmdsystemctl("cat /flag_27523); 命令注入 输入ip试试发先可以执行 127.0.0.1 查看一下看看有社么 127.0.0.1 | ls 试着看看php文件 127.0.0.1 | cat 297581345892.php 貌似这个文件有…...

谷歌账号登录时,多次验证后变成“您的计算机或网络可能在发送自动查询内容”,原因分析和解决建议
最近有多个朋友联系GG账号服务,反馈说谷歌账号登录的时候,提示谷歌账号活动异常,需要输入手机号验证,但是自己的手机号无法验证,要不提示无法用于进行验证,要不提示用于验证的次数过多。 有一些朋友第一次遇…...

【SpringMVC】详细介绍SpringMVC的执行流程
目录 1. 概念 2.SpringMVC工作原理 3. springMVC的简单使用 1.在pom.xml中导入相关依赖 2.在web.xml中配置dispatcherServlet 3.创建springMVC.xml核心配置文件 4. SPringMVC分层后各个模块的作用 1. 概念 什么是MVC? MVC是下面三个组件的简写,模型…...

工地云SaaS系统,通过物联网与可视化等先进技术的综合应用,搭建的智慧工地管理云平台源码
通过物联网与可视化等先进技术的综合应用,搭建智慧工地管理云平台。以绿色、安全施工管理为主线,从人员、设备、环境、监控#度管理、施工管理、工程管理等多个维度对现场要素进行信息化,实现数据实时更新、人员精确管理、风险及时预警、管理便…...

使用自定义注解和AOP解决登录校验问题
1、如果每次都从Redis获取token,会有很多冗余代码 2、使用面向切面编程的思想 在不改变源代码或者很少改变源代码的情况下,增强类的某些方法。 在业务代码之前设置 切入点 创建切面类,也就是比如登录校验的某些公共方法 切面类从切入点切入流…...

【数据结构初阶】队列
hello! 目录 一、概念与结构 二、队列的实现 Queue.h Queue.c test.c 一、概念与结构 1、概念:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出的特性。 入队列:进行插入操作…...

《决胜B端 产品经理升级之路》 知识点总结
什么是b端产品? b端产品是指面向企业或组织的经营管理问题,旨在解决企业规模、成本、效率、品质和风控等方面的产品。这些产品主要帮助企业提高运营效率、降低成本、改善品质和控制风险等。b端产品适用于各种行业和企业类型,可以为企业带来深…...

2024年6月 青少年python一级等级考试真题试卷
202406 青少年软件编程等级考试Python一级真题 试卷总分数:100分 第 1 题 在使用turtle绘制图形时,如果要控制小海龟移动到 x 坐标为 200,y 坐标为150 的位置,以下代码能够实现效果的是?( ) …...

TCFormer:通过标记聚类Transformer实现视觉识别
摘要 Transformer在计算机视觉领域得到了广泛应用,并取得了显著成功。大多数最先进的方法将图像分割成规则网格,并用视觉标记表示每个网格区域。然而,固定的标记分布忽略了不同图像区域的语义含义,导致性能次优。为了解决这个问题…...

haproxy实现七层负载均衡详解(基本配置与算法)
目录 一、haproxy介绍 1.1 haproxy工作原理 1.2 相关配置类型 二、全局配置 2.1相关参数说明 2.2实验示例 实验环境: 2.2.1 设置多进程 2.2.2 设置日志显示 三、proxies代理配置 3.1 参数说明 3.2 default配置相关属性参数 3.2. 配置前端fronttend后端ba…...

海量日志数据收集监控平台应该怎么设计和实现
设计和实现一个海量日志数据收集和监控平台,需要考虑以下几个关键方面:数据采集、数据存储、实时处理、监控与告警、可视化分析、扩展性和高可用性。以下是一个详细的设计和实现方案: 1. 需求分析 日志来源:明确日志的来源&…...

Windows图形界面(GUI)-MFC-C/C++ - CSliderCtrl
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 CSliderCtrl 创建滑动条 设置滑动条属性 成员函数 消息处理 注意事项 示例代码 CSliderCtrl 创建滑动条 在对话框编辑器中,从工具箱中拖拽一个Slider Control到对话框…...

常见中间件漏洞复现之【WebLogic】!
Weblogic介绍 WebLogic是美国Oracle公司出品的⼀个application server,确切的说是⼀个基于JAVAEE架构的中间件,默认端⼝:7001 WebLogic是⽤于开发、集成、部署和管理⼤型分布式Web应⽤、⽹络应⽤和数据库应⽤的Java应⽤服务器。将Java的动态…...

Linux服务器中限制远程IP登录的深入指南
在当今的数字化时代,Linux服务器的安全性是企业和个人用户不可忽视的重要方面。远程登录,尤其是通过SSH(Secure Shell)协议,是服务器管理中最常见的操作之一。然而,不限制远程登录的IP地址可能会暴露服务器…...

卫星通信中的拥塞控制算法
结论:现有的Cubic和BBR2算法可直接用于卫星通信网络的拥塞控制中,专为卫星设置的拥塞控制算法目前没有集成到系统中,但各自的性能表现需要根据实测情况进行取舍。 TCP Hybla...

全网超详细haproxy七层代理
一:负载均衡 1、概念 负载均衡: Load Balance ,简称 LB ,是一种服务或基于硬件设备等实现的高可用反向代理技术, 负载均 衡将特定的业务(web 服务、网络流量等 ) 分担给指定的一个或多个后端特定的服务器或设 备&…...

Docker日志文件全局配置
这段配置是Docker容器的日志驱动配置,具体来说是json-file日志驱动的配置。这个配置的作用是定义容器日志文件的大小和数量限制。 {"log-driver": "json-file","log-opts": {"max-size": "500m","max-file…...

bia文件中码偏差对实时PPP解算分析
1. 码偏差对定位影响 码偏差对未知收敛时间有影响,对最终精度影响不大(权比1000:1)...

探索list与iterator的区别及yield的用法
1 问题 探索list与iterator的区别探索yield的用法 2 方法 通过网上学习后了解到 List返回的类型是list,list只会查询一级缓存。list()中返回的List中每个对象都是原本的对象。查询的时候没遍历一个对象会产生一条sql;而iterator这个迭代器返回的类型是it…...

github技巧和bug解决方法短篇收集
有一些几句话就可以说明白的观点或者解决的的问题,小虎单独收集到这里。 Commits没有算入每天的activity fork的仓库是不算的。 Commits made in a fork will not count toward your contributions. 参考: Contribution activity not shown for github…...

学习笔记五:在k8s中安装EFK组件(elasticsearch+fluentd+kibana)
在k8s 1.3安装EFK组件 前置条件上传压缩包安装nfs供应商创建nfs作为存储的供应商通过deployment创建pod用来运行nfs-provisioner 安装elasticsearch组件安装kibana组件安装fluentd组件 前置条件 查看k8s版本 kubectl get node -owide相关安装包 链接:https://pan.ba…...

Golang编译-如何忽略某些文件去编译
在 Go 语言中,编译好的二进制文件不会被再次加入到编译过程中。Go 编译器只会编译源代码文件(如 .go 文件),而不会将已经编译好的二进制文件(如可执行文件或静态库)作为输入来进行编译。 详细解释…...