论文解读:FastSAM | Fast Segment Anything | 基于yolov8-seg实现 比SAM快50倍

news2024/11/25 12:23:30

发表时间:2023.06.21
论文地址:http://export.arxiv.org/pdf/2306.12156
项目地址:https://github.com/CASIA-IVA-Lab/FastSAM

最近提出的任意分割模型(SAM)在许多计算机视觉任务中产生了重大影响。它正在成为许多高级任务的基础步骤,如图像分割、图生文和图像编辑。然而,它巨大的计算成本使它无法在行业场景中得到更广泛的应用。计算主要来自于高分辨率输入下的Transformer体系结构。在本文中,我们提出了一种性能相当的基本任务的加速替代方法。通过将任意任务重新定义为分割生成和提示,我们发现一个带有实例分割分支的常规CNN检测器也可以很好地完成该任务。具体来说,我们将该任务转换为研究充分的实例分割任务,并仅使用SAM作者发表的SA-1B数据集的1/50来训练现有的实例分割方法。通过我们的方法,我们在50×的运行速度下实现了与SAM方法相当的性能。

关键解读

任务背景

1、segment anything model(SAM)是图像领域的基础大模型,可以应用在各种工业视觉需求中,但其达不到实时的运行效果
2、SAM在点输入越多的情况下,运行速度越满

关键内容

1、基于YOLOv8-seg实现了FastSAM,它比SAM快50倍,且训练数据只有SAM的1/50,同时运行速度不受point输入数量的影响
2、FastSAM定义Segment Anything Task(SAT)为根据提示进行语义分割任务,提示指:前景|背景点、bounding boxes、mask、text;
3、将SAT分解为2阶段,第一阶段为对输入图像的全景实例分割,第二阶段为根据提示输入对全景实例分割结果进行稀疏化选择

实验效果

在4种级别的任务上进行zero-shot对比:边缘检测、目标Proposal、实例分割、提示输入分割,具体在第4章节。

  • 边缘检测:将模型的全景实例分割结果用sobel算子得到边缘,FastSAM与SAM性能相近,都倾向于预测更多的边(数据集中没有标注的边)
  • 目标Proposal:在coco上对比了SAM、ViTDet、OLN和FastSAM,FastSAM与SAM略差,但其是zero-shot transfer,而OLN在voc上进行预训练
  • 实例分割:使用ViTDet [23]生成的边界框(bbox)作为提示符来完成实例分割任务,FastSAM比SAM差一些。具体原因见第6节的讨论部分
  • 提示输入分割:与SAM性能类似,但是运行效率有些底下(这主要是受CLIP模型的影响)

1. Introduction

最近,提出了分段任意模型(SAM)[19]。它被认为是一个里程碑式的愿景基础模型。它可以在各种可能的用户交互提示的引导下分割图像中的任何对象。SAM利用了在广泛的SA-1B数据集上训练的Transformer模型,这使它能够熟练地处理广泛的场景和对象。SAM打开了一扇令人兴奋的新任务的大门,它被称为segment aything model。这项任务,由于其普遍性和潜力,已经成为未来广泛的视觉任务的基石。

然而,尽管有了这些进步,SAM和后续模型在处理任何任务方面有希望的结果,但这实际应用仍然具有挑战性。最明显的问题是与Transformer(ViT)模型相关的大量计算资源需求,这是SAM体系结构的主要部分。与卷积模型相比,vit以其繁重的计算资源需求而突出,这给它们的实际部署带来了障碍,特别是在实时应用程序中。因此,这种限制阻碍了segment aything task的进展和潜力。

基于对segment anything model(SAM)模型的工业化应用,我们为SMA设计了一个实时的解决方案,FastSAM。我们将Segmant Anything Task解耦为两个连续的阶段,即全景实例分割和提示引导选择。第一阶段依赖于一个基于卷积神经网络(CNN)的检测器的实现。它产生了图像中所有实例的分割Mask。然后在第二阶段,它输出与提示符对应的感兴趣区域。通过利用cnn的计算效率,我们证明了segment aything model是可以实现实时的,而不影响性能质量。我们希望所提出的方法将促进segment aything model在基础任务上的工业应用。

我们提出的FastSAM是基于YOLOv8-seg [16]的,这是一个配备了实例分割分支的对象检测器,它利用了YOLACT [4]方法。我们还采用了由SAM发布的广泛的SA-1B数据集。通过直接在仅2%(1/50)的SA-1B数据集上训练这个CNN检测器,它实现了与SAM相当的性能,但大大减少了计算和资源需求,从而实现了实时应用。我们还将其应用于多个下游分割任务,以显示其泛化性能。在MS COCO [13]的对象检测任务上,我们在AR1000上实现了63.7,比32×32点提示输入的SAM高1.2分,在NVIDIA RTX 3090上运行速度快50倍。

实时SMA对工业应用都是有价值的。它可以应用于许多场景。所提出的方法不仅为大量的视觉任务提供了一种新的、实用的解决方案,而且它的速度非常高,比目前的方法快数十或数百倍。它还为一般视觉任务的大型模型架构提供了新的用途。我们认为,对于专业的任务,专业的模型具备更好的效率和准确性的权衡。然后,在模型压缩的意义上,我们的方法证明了一个路径的可行性,通过引入一个人工的结构,可以显著减少计算工作量。

我们的贡献可以总结如下:

  • 介绍了一种新的、实时的基于cnn的segmant anything任务解决方案,它在保持竞争性能的同时显著降低了计算需求。
  • 这项工作首次提出了将CNN检测器应用于segmant anything任务的研究,为轻量级CNN模型在复杂视觉任务中的潜力提供了见解。
  • 在多个基准测试上对提出的方法和SAM进行比较评估,可以深入了解该方法在任何领域的优缺点。

2. Preliminary

在这章节,会对Segment Anything Model进行思考,并重新定义Segment Anything Task.
Segment Anything Model. 在图像分割领域,SAM是一个时代性的进步,因为其提出的训练方法及其在大型图像数据集(web规模)上的性能SAM提供了高精度、类别无关的分割能力,并具备zero-shot的迁移能力。作为一个图像领域的大模型,它通过简单交互式输入展示了计算机视觉的荣耀,但其能力是通过语义分割任务所实现。SAM会成为一个针对于现实世界图像的基础大模型。然而,这个模型的性能还是存在一定的不足,其无法保证实时的图像处理能力,这制约了SAM的在实时分割领域的广泛应用、
Segment Anything Task. Segment Anything Tasks被定义为‘依赖输入进行语义分割任务’。这个输入可以是前景/背景点、一个粗糙的背景框或者mask、自由格式的text、或者任意可以暗示分割任务的图像。我们发现Segment Anything Tasks可以被有效的分割成实际应用中的两个阶段。这第一阶段检测或者分割出图像中的所有目标,就像图像全景分割一样;第二阶段依赖提供的输入信息对全家分割信息进行稀疏化(找到感兴趣的目标)。这种解耦,可以使SAT任务变得简单一些,基于此可能会实现一个实时的SAM。

3. Methodology

3.1. Overview

图2展示了所提出方法Fast SAM的结构,该方法由全实例分割和输入引导选择构成。前一个阶段是基础,后一个阶段是任务导向处理的精髓。不同于端到端的transformer,这个方法对于视觉分割任务,引入了很多人类先验知识,例如conv的局部连接,目标感受野的局部相关性。这使它适合于视觉分割任务,可以在更少的参数上收敛更快。

3.2. All-instance Segmentation

Model Architecture. yolov8的结构发展于yolov5,并受到了yolox、yolov6、yolov7等算法的启发。yolov8的backbone和neck部件主要是将yolov5中对应部件的C3模块替换成了C2f模块。并升级head为解耦的结构(分类头和bboxes头使用不同的参数),并将其从anchor base更改为anchor free。
Instance Segmentation. YOLOv8-seg应用YOLACT [4]原则进行实例分割。它首先通过主干网络和特征金字塔网络(FPN)[24]从图像中提取特征,集成了不同大小的特征。输出由检测分支和分割分支组成。
检测分支输出类别和边界框,而分割分支输出k个原型(在FastSAM中默认为32)以及k个Mask系数。分割和检测任务是并行计算。分割分支输入一个高分辨率的特征图,保留空间细节,并包含语义信息。这个映射通过一个卷积层进行处理,然后进行放大,然后通过另外两个卷积层来输出Mask。Mask系数,类似于检测头的分类分支,范围在-1和1之间。将Mask系数与原型相乘,得到实例分割结果。

YOLOv8可以用于各种目标检测任务。通过实例分割分支,YOLOv8-Seg可以适应SAT,其目的是准确地检测和分割图像中的每个对象或区域,而忽略对象类别。原始的类型和Mask系数为及时的指导提供了很大的可扩展性。作为一个简单的例子,另外训练了一个简单的提示编码器和解码器结构,以各种提示和图像特征嵌入作为输入,Mask系数作为输出。在FastSAM中,我们直接使用YOLOv8-seg方法进行全实例分割阶段。更人工的设计可能会带来额外的改进,但我们认为它超出了这项工作的范围,并留给未来的研究。

3.3. Prompt-guided Selection

使用yolov8进行全景实例分割或目标检测,SAT的下一步就是使用各种输入来区分感兴趣的目标。它主要涉及点输入、box输入和text输入。

Point prompt 点输入主要包含匹配目标mask的点集,其目标是决断出哪个目标mask被输入点定位了。与SAM类似,我们也使用前景点和背景点作为输入,前景点表示点在目标上,背景点表示点在目标外,它们对于不同的目标mask是可以被重新定义的。通过使用前景|背景点集,我们可以选择感兴趣区域的多个mask。这些mask将会被合并为一个大的mask去表示感兴趣的目标。此外,我们使用形态学操作来提升mask合并的效果。

Box prompt box输入涉及到了IOU的概念,其用于指定与输入box iou值最大的bbox所对应的mask。 其目标是找到与输入box iou最大的目标

Text prompt 文字输入用于指定图像中感兴趣的目标mask。使用CLIP模型对文字输入进行编码,依据编码选择与相似度得分最高的mask。

通过提示输入选择技术,FastSAM可以选择出指定图像中感兴趣的目标,上述方法提供了一个高效的手段去实现实时的SAM,其极大的提示了yolov8模型对于复杂图像分割任务中的实用性。【一个高效的提示引导选择技术在未来会得到更多的研究】

4.Experiments

这章分析了FastSAM的效率,实验包括4种zero-shot任务,以及现实场景中的应用、效率和部署。第一个实验验证FastSAM与SAM的相似度。参考SAM,我们同样进行了4个不同级别的任务:1、low-level 边缘检测;2、mid-level 目标proposal生成;3、high 实例分割;4、提示输入分割。我们的实验还进一步的验证了FastSAM在真实环境下的能力(应用和速度)。

Implementation Details.
默认配置为:

  • (1) FastSAM采用YOLOv8-x [16]模型作为其体系结构的主要部分,输入大小为1024;
  • (2) FastSAM的训练在2%的SA-1B数据集[19]上进行;
  • (3) 我们使用默认的超参数设置训练模型100个epoch,除了bboxes回归模块中的reg_max从16改为26来预测大实例。

4.1. Run-time Efficiency Evaluation

SAM使用Transformer架构来构建一个端到端算法。Transformer是一种通用的架构,它可以表示各种任务的多种形式的映射函数。为了分割任何东西,SAM通过对大规模数据的学习过程来学习面向视觉的归纳偏差。相反,利用人类结构设计的先验知识,FastSAM得到了一个相对紧凑的模型。从图3中可以看出,FastSAM产生了相对令人满意的结果。

在表1中,我们报告了在单个NVIDIA GeForste RTX 3090 GPU上SAM和F090GPU上的运行速度。可以看出,FastSAM在所有的point prompt输入数量上都超过了SAM。此外,FastSAM的运行速度不会随着提示而变化,使其成为所有模式中的最佳选择。

4.2. Zero-Shot Edge Detection

Approach FastSAM方法利用BSDS500 [1,28]对FastSAM进行了基本的低级边缘检测任务的评估。具体来说,我们从FastSAM的全实例分割阶段的结果中选择了Mask概率图。然后,对所有Mask概率映射进行Sobel滤波[33]操作,生成边缘映射。最后,我们用边缘NMS [6]来结束预测。
Result 具有代表性的边缘图如图4所示。通过定性观察,很明显,尽管FastSAM的参数明显较少(只有68M),但它产生了一个普遍良好的边缘图。与GT相比,FastSAM和SAM都倾向于预测更多的边,包括一些在BSDS500中没有标注的逻辑边。表2显示,我们在SAM中实现了类似的性能,特别是更高的R50和较低的AP。

4.3. Zero-Shot Object Proposal Generation

Background 长期以来,目标proposal生成一直是许多计算机视觉任务的基本预处理步骤,包括一般目标检测、few-shot目标检测和图像理解。许多著名的proposal生成方法见证了过去几十年来视觉识别的演变,作为视觉识别方法的基本步骤的一个作用。这些建议的生成方法包括EdgeBox [38],Geodesic[21], Selective Search[34],MCG[2]。近年来,许多基于深度学习的方法被提出,如DeepMask [29],OLN [17]。例如,RCNN系列目标检测方法[11,12]采用Selective Search方法,最近提出的开放世界检测器,单探测器[36],采用OLN方法。虽然大多数现有的对象检测器都使用RPN [32],但它只能生成学习类别的对象建议,限制了其在开放词汇表识别任务中的应用。因此,zero-shot目标proposal的生成是相当重要的。一种较好的视觉识别方法对于这些视觉识别任务的良好性能具有重要意义。
我们直接使用FastSAM第一阶段生成的边界框作为对象Proposal。为了评估性能,我们根据现有的评估策略,在LVIS [13]和COCO [25]数据集上进行了测试。此外,在SAM的实验设置之后,我们还通过使用第一阶段的全实例Mask来测试MaskProposal的准确性。

Details 我们报告了SAM、ViTDet [23]和FastSAM的结果。由于SAM没有公布其详细的评估代码,我们使用官方的LVIS评估代码[13]复制了分类不可知的mask和bboxes召回。然而,我们未能重现在SAM的论文[20]中提出的ViTDet和SAM的MaskAR结果。然而,我们认为我们的评估结果仍然反映了FastSAM与SAM相比的几个特征。

Results 结果如表3、表4、表5所示。结果表明,该方法在Boxes Proposal生成任务上具有显著的优势。表3给出了COCO验证集上各种方法的平均召回率(AR)。其中,EdgeBoxes [38], Geodesic [21],Sel.Search [34], 和 MCG[2]是不需要训练的方法,而DeepMask [29]和OLN [17]是监督方法,对COCO训练集中的VOC类别进行训练,然后在所有类别中进行测试。相比之下,我们的方法和SAM [20]实现了完全zero-shot transfer。从表中可以看出,与以前的监督方法如OLN [17]相比,我们的方法和SAM [20]的AR@10精度表现得不太好。

然而,在AR@1000中,我们的方法明显优于OLN [17]。原因是以前的方法是对COCO的某些类别进行训练,导致在推理过程中这些类别有更高的置信水平。然而,由于我们的方法和SAM是zero-shot 的,这导致了不同类别之间的平衡置信水平,从而预测出更多没有在COCO中出现的类别。更多的比较情况见图5。

在表4中,我们报告了VitDet-H [23]、SAM [20]的bbox AR@1000的结果和我们在LVIS v1数据集上的方法的结果。我们的方法大大超过SAM计算最密集的模型SAM-he645%以上。然而,与在LVIS数据集上训练的VitDet-H [23]相比,它的不足。产生这些结果的原因是,在我们的训练过程中,我们使用了地面真相(gt)、边界框(bbox)信息作为监督信号。另一方面,SAM [20]只使用Mask作为监督信号,其在推理时的bbox是通过从Mask中提取外盒来生成的。

从表5来看,我们的Mask Proposal生成在召回率上相对较低。我们发现这主要是由于我们的分割Mask的小对象不是粗粒度的,我们将在第6节中进行更详细的讨论。

4.4. Zero-Shot Instance Segmentation

Approach 与SAM方法类似,我们利用ViTDet [23]生成的边界框(bbox)作为提示符来完成实例分割任务。如第3.3节所述,我们选择具有bbox的Union(IoU)中交集最高的Mask作为预测Mask。
Results 表6给出了评价结果。在这项任务上,我们未能达到高AP。我们推断,这主要是由于分割Mask精度或基于盒的Mask选择策略。第6节给出了几个例子。

4.5. Zero-Shot Object Localization with Text Prompts

Approach 最后,我们考虑一个甚至高级的任务,即用自由形式的文本分割对象。本实验是为了展示FastSAM对于文本提示处理能力(与SAM类似)。不同于SAM,FastSAM不需要修改训练程序。它直接通过CLIP的文本编码器进行嵌入,然后使用生成的文本嵌入在推理时找到最相似的Mask。
Results 我们在图6中显示了定性的结果。FastSAM可以根据文本提示很好地分割对象。然而,文本到Mask分割的运行速度并不令人满意,因为每个Mask区域都需要被输入到CLIP特征提取器中。如何将CLIP嵌入提取器组合到FastSAM的主干网络中仍然是模型压缩方面的一个有趣的问题。

5. Real-world Applications

在本节中,我们将评估FastSAM在不同应用程序场景中的性能,并分析了它的优点和局限性。我们使用点提示、方框提示和所有模式,展示了FastSAM分割的可视化,并将其与SAM和GT进行了比较。
Anomaly Detection.
如[3]中详细介绍的,异常检测是一项旨在区分制造过程中有缺陷和正常样品的任务。使用MVTec AD数据集[3]对FastSAM进行评估,结果如图7所示。在所有模式下,FastSAM可以分割几乎所有与SAM相似的区域,但与SAM相比,其精度水平较低。此外,背景的Mask并不能完全覆盖整个背景,这是YOLACT [4]的固有特征。通过前景/背景点(在FastSAM点中分别为黄色和品红色的点)或盒引导选择,FastSAM可以在精确的缺陷区域上进行分割。

Salient Object Segmentation.
突出目标分割[5]的目的是从图像中分割出最引人注目的对象。这个任务是类不可知的,使它有别于语义分割。我们将FastSAM应用于著名的显著性数据集,ReDWeb-S [27]。如图8所示,FastSAM与SAM只有很小的差异,因为它分割的与任务无关的背景对象更少。通过点引导选择,如fastsam点中的黄色点,我们可以获得所有感兴趣对象的Mask。FastSAM-point的分割结果与sam点和GT的分割结果几乎相同,在边缘只丢失了微小的细节。感兴趣的对象也可以通过框提示符来选择,如FastSAM-box中的绿色框。但是,使用单个boxes去选择多个目标,即使是SAM-box也无法实现。

Building Extracting.
光学遥感图像建筑提取具有广泛的应用前景,如城市规划。我们在[14]提出的数据集上评估了FastSAM。如图9所示,FastSAM在分割规则形状的物体方面表现良好,但与SAM相比,分割的与阴影相关的区域更少。我们还可以通过点提示和框提示选择感兴趣的区域,如FastSAM-point和FastsSAM-box所示。值得注意的是,我们在fastsam点的阴影区域中定位了一个点。但是,基于这一点,通过合并仍然可以获得建筑的正确Mask。这表明该方法在一定程度上能够抵抗噪声的干扰

6. Discussion

一般来说,提议的FastSAM具有与SAM相同的性能,但速度运行速度比SAM(32×32)快50倍,比SAM(64×64)快170倍。运行速度使其成为工业应用的良好选择,如道路障碍物检测、视频实例跟踪和图像操作。在一些图像上,FastSAM甚至为大型对象生成更好的Mask,如图10所示。

Weakness 然而,正如在实验中所展示的,我们的盒子生成有一个显著的优势,但我们的Mask生成性能低于SAM。我们将在图11中可视化这些示例。我们发现FastSAM具有以下特性。

  • 低质量的小尺寸分割Mask具有较大的置信度分数。我们认为这是因为置信度分数被定义为YOLOv8的bbox分数,它与Mask质量并不密切相关。修改网络以预测MaskIoU或其他质量指标是改善这一点的一种方法。
  • 一些小尺寸物体的Mask往往靠近正方形。此外,大型物体的Mask在边界框的边界上可能有一些伪影。这是YOLACT方法的弱点。通过增强Mask原型的能力或重新制定Mask生成器,有望解决这个问题。
    此外,由于我们只使用了SA-1B数据集的1/50进行训练,因此该模型的性能也可以通过使用更多的训练数据来进一步提高。

7. Conclusion

在本文中,我们重新考虑了segment of anything task和相应模型结构的选择,并提出了一个比SAM-ViT-H (32×32)运行速度快50倍的替代解决方案。实验结果表明,FastSAM可以很好地解决多个下游任务。尽管如此,FastSAM仍有几个弱点可以加以改进,比如评分机制和实例面具生成范式。这些问题都留待进一步研究。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/701626.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NIO总结

简要介绍 NIO(Non-blocking IO)是Java 1.4版本开始引入的一个新的IO API,旨在代替传统IO,它引入了缓冲区和通道的概念,通过选择器实现多路复用。 传统IO会区分字节流InputStream和OutputStream以及字符流Reader和Wri…

GD32 时钟和晶振修改

芯片型号:gd32f470zi 库版本:GD32F4xx_Firmware_Library_V3.0.4 当需要修改外部晶振和主频时需要修改到以下几个地方 1.gd32f4xx.h //此宏定义为我们实际使用的外部晶振频率,此处改为实际使用的25M #define HXTAL_VALUE ((uint32_t)2…

单片机学习 13-I2C_EEPROM

I2C-EEPROM 实验 ​ 这一章我们来学习如何使用 51 单片机的 IO 口模拟 I2C 时序,并实现与AT24C02(EEPROM)之间的双向通信。开发板板载了 1 个 EEPROM 模块,可实现IIC 通信。本章要实现的功能是:系统运行时&#xff0c…

如何排查 Electron V8 引发的内存 OOM 问题

经过长达大半年时间的崩溃治理后,基于 Electron 框架开发的新版 PC 淘宝直播推流客户端的稳定性终于赶超基于QT 框架开发的旧版本了。剩下的崩溃问题中有 40% 是跟内存 OOM 有关,其中 V8FatalErrorCallback js heap OOM 问题整整困扰了我一个多月。历经千…

Pytorch--模型微调finetune--迁移学习 (待继续学习)

https://www.bilibili.com/video/BV1Z84y1T7Zh/?spm_id_from333.788&vd_source3fd64243313f29b58861eb492f248b34 主要方法 torchvision 微调timm 微调半精度训练 背景(问题来源) 解决方案 大模型无法避免过拟合,

嵌入式综合性开源项目分享

不定期有小伙伴问: 哪里有好的嵌入式项目? 怎么才能提高编程水平? 有实战项目可以分享一下吗? 目录 第一:嵌入式综合Awesome Embedded 第二:多功能按键MultiButton 第三:软件定时器模块M…

计算机网络学习笔记-应用层

目录 概述 客户-服务器方式(C/S) 对等方式(P2P) 域名系统DNS 域名 四种类型 根域名服务器 顶级域名服务器 权限域名服务器 本地名服务器 域名解析过程 万维网WWW 超媒体与超链接 工作方式 URL(统一资源…

Spring Boot 中的 WebSocketMessageBrokerConfigurer

Spring Boot 中的 WebSocketMessageBrokerConfigurer 在现代 Web 应用程序中,WebSocket 已成为一种流行的通信协议,它允许客户端和服务器之间实时双向通信。在 Spring Boot 中,我们可以使用 WebSocketMessageBrokerConfigurer 接口来配置 We…

vivo 自研鲁班分布式 ID 服务实践

作者:vivo IT 平台团队- An Peng 本文介绍了什么是分布式ID,分布式ID的业务场景以及9种分布式ID的实现方式,同时基于vivo内部IT的业务场景,介绍了自研鲁班分布式ID服务的实践。 一、方案背景 1.1 分布式ID应用的场景 随着系统的…

【Servlet】HttpServletRequest、HttpServletResponse

目录 🎁1 HttpServletRequest 💥1.1 通过 query string 来进行传递 🐷1.2 通过 body (form) 来进行传递 🛸1.3 通过 body(json) 来进行传递 🍘2. HttpServletResponse 👶2.1 为响应设置状态码 200 …

JVM 常量池

一、常量池使用 的数据结构 常量池底层使用HashTable key 是字符串和长度生成的hashValue,然后再hash生成index, 改index就是key;Value是一个HashTableEntry; 1、key hashValue hash string(name, len) index hash to…

LeetCode 打卡day48--打家劫舍I, II, III

一个人的朝圣 — LeetCode打卡第48天 知识总结 Leetcode 198. 打家劫舍题目说明代码说明 Leetcode 213. 打家劫舍 II题目说明代码说明 Leetcode 337. 打家劫舍 III题目说明代码说明 知识总结 今天全是打家劫舍系列的题目, 还挺有意思的 Leetcode 198. 打家劫舍 题目链接 题目…

SpringBoot配置

1.配置文件 SpringBoot使用一个全局的配置文件,配置文件名是固定的; application.propertiesapplication.yml 配置文件的作用:修改SpringBoot的自动配置的默认值;SpringBoot在底层都给我们自动配置好; YAML 是一个标记语言;不是…

一步一步学OAK之三:实现RGB相机场景切换

目录 Setup 1: 创建文件Setup 2: 安装依赖Setup 3: 导入需要的包Setup 4: 遍历所有场景模式和特效模式Setup 5: 创建pipelineSetup 6: 创建节点Setup 7: 连接设备并启动管道Setup 8: 创建与DepthAI设备通信的输入队列和输出队列Setup 9: 定义putText函数Setup 10: 主循环获取视…

SpringBoot3【① 快速入门 示例+基本框架】

SpringBoot3-特性介绍和快速入门 1、简介 1. 前置知识 Java17Spring、SpringMVC、MyBatisMaven、IDEA 2. 环境要求 环境&工具版本(or later)SpringBoot3.0.5IDEA2021.2.1Java17Maven3.5Tomcat10.0Servlet5.0GraalVMCommunity 22.3Native Build …

2-NumPy如何使用?【视频版】

目录 问题视频解答 问题 视频解答 点击观看: 2-NumPy如何使用?

TypeScript学习(一):快速入门

文章目录 一、TypeScript 简介1、TypeScript 是什么?2、TypeScript 与 JavaScript 的区别3、JavaScript 的缺点4、为什么使用 TypeScript 二、TypeScript 开发环境搭建1、下载Node.js2、安装Node.js3、使用npm全局安装TypeScript4、创建一个ts文件5、使用tsc对ts文件…

ubuntu无法打开edge

vim /usr/bin/microsoft-edge在最后加上 --user-data-dir --no-sandbox

git常用命令之config

14. config 14.1 查看 config 命令作用git config --local -l查看仓库级别git 配置信息git config --global -l查看全局级别git 配置信息git config --system -l查看系统级别git 配置信息git config -l查看所有级别配置信息git config --local --list --show-origingit confi…

【STM32】基于stm32的阿里云智能家居

摘 要 智能家居是一种通过物联网将家里的各种电器设备连接在一起,并由中心控制器统一管理的信息系统。系统的核心是各类家居信息的采集与处理。阿里云能够提供云端的数据存储和分析功能,可以作为智能家居中心控制器的重要平台。 本文主要研究了基于阿里云…