Unsupervised Learning of Depth and Ego-Motion from Video 论文精读

news2024/12/22 20:02:01

视频中深度和自我运动的无监督学习

摘要

我们提出了一个无监督学习框架,用于从非结构化视频序列中进行单眼深度和相机运动估计。与其他工作[10,14,16]一样,我们使用端到端的学习方法,将视图合成作为监督信号。与之前的工作相比,我们的方法完全没有监督,只需要单目视频序列进行训练。我们的方法使用单视图深度和多视图姿态网络,损失基于使用计算的深度和姿态将附近的视图扭曲到目标。因此,网络在训练过程中由于损耗而耦合,但可以在测试时独立应用。对KITTI数据集的经验评估证明了我们方法的有效性:

1)单眼深度与使用地面实况姿态或深度进行训练的监督方法相比表现良好,

2)姿态估计在类似输入设置下与已建立的SLAM系统相比表现良好。

一、介绍

即使在短时间尺度上,人类也能推断出自我运动和场景的3D结构。例如,在街道上导航时,我们可以很容易地找到障碍物,并迅速做出反应以避开它们。多年的几何计算机视觉研究未能为真实世界场景(例如,存在非刚性、遮挡和缺乏纹理的场景)重新创建类似的建模能力。那么,为什么人类擅长这项任务呢?一种现象是,我们通过过去的视觉体验对世界产生了丰富的结构性理解,这种体验主要包括四处走动和观察大量场景,以及对我们的观察进行一致的建模。从数百万次这样的观察中,我们了解了世界上道路平坦、建筑物笔直、汽车由道路支撑等的规律,我们可以在感知新场景时应用这些知识,即使是从单个单眼图像中也可以。

图1. 我们系统的训练数据仅由从不同视点捕捉场景外观的未标记图像序列组成,其中不提供图像的姿态。我们的训练过程产生了两个独立运行的模型,一个用于单视图深度预测,另一个用于多视图相机姿态估计。

在这项工作中,我们通过训练一个模型来模拟这种方法,该模型观察图像序列,并旨在通过预测可能的相机运动和场景结构来解释其观察结果(如图1所示)。我们采用端到端的方法,允许模型直接从输入像素映射到自我运动的估计(参数化为6-DoF变换矩阵)和底层场景结构(参数化的为参考视图下的每像素深度图)。我们特别受到先前工作的启发,这些工作建议将视图合成作为一种度量[44],以及最近在端到端框架中处理校准的多视图3D情况的工作[10]。我们的方法是无监督的,可以简单地使用图像序列进行训练,而无需手动标记,甚至无需相机运动信息。

我们的方法建立在这样一个观点的基础上,即几何视图合成系统只有在其对场景几何和相机姿态的中间预测与物理地面实况相对应时才能始终表现良好。虽然对于某些类型的场景(例如,无纹理),不完美的几何形状和/或姿态估计可能会在合理的合成视图中作弊,但当呈现另一组具有更多样布局和外观结构的场景时,同一模型将惨败。因此,我们的目标是将整个视图合成管道公式化为卷积神经网络的推理过程,以便通过在大规模视频数据上训练网络进行视图合成的“元”任务,迫使网络学习深度和凸轮时代姿态估计的中间任务,以便对视觉世界做出一致的解释。对KITTI[15]基准的经验评估证明了我们的方法在单视图深度和相机姿态估计方面的有效性。我们的代码将在 GitHub - tinghuiz/SfMLearner: An unsupervised learning framework for depth and ego-motion estimation from monocular videos 上提供。

二、相关工作

运动产生的结构

结构和运动的同时估计是一个经过充分研究的问题,具有已建立的技术工具链[12,50,38]。虽然传统的工具链在许多情况下是有效和高效的,但它对精确图像对应的依赖可能会在低纹理、复杂几何/光度、薄结构和遮挡区域造成问题。为了解决这些问题,最近使用深度学习解决了几个流水线阶段,例如特征匹配[18]、姿态估计[26]和立体[10,27,53]。这些基于学习的技术很有吸引力,因为它们能够在训练期间利用外部监督,并且在应用于测试数据时可能会克服上述问题。

基于翘曲的视图合成

几何场景理解的一个重要应用是新颖视图合成任务,其目标是合成从新颖的相机视点看到的场景的外观。视图合成的经典范例是首先明确地估计潜在的3D几何结构或在输入视图之间建立像素对应关系,然后通过合成来自输入视图的图像块来合成新视图(例如,[4,55,43,6,9])。最近,端到端学习已被应用于通过基于深度或流转换输入来重建新视图,例如,DeepStereo[10]、Deep3D[51]和Appearance Flows[54]。在这些方法中,底层几何体分别由量化深度平面(DeepStereo)、概率视差图(Deep3D)和视图相关流场(外观流)表示。与直接从输入视图映射到目标视图的方法不同(例如,[45]),基于扭曲的方法被迫学习几何和/或对应关系的中间预测。在这项工作中,我们的目标是从训练来执行基于扭曲的视图合成的细胞神经网络中提取这种几何推理能力。

从注册的二维视图学习单视图三维

我们的工作与最近的一系列研究密切相关,这些研究涉及从注册的2D观测中学习单视图3D推断。Garg等人[14]建议学习单视图深度估计CNN,将投影误差应用于校准的立体声孪晶进行监督。同时,Deep3D[51]使用立体电影镜头作为训练数据,从输入图像预测第二立体视点。Godard等人[16]也采取了类似的方法,增加了左右一致性约束,并采用了更好的架构设计,从而获得了令人印象深刻的性能。与我们的方法一样,这些技术只从世界的图像观测中学习,而不像需要明确深度进行训练的方法,例如[20,42,7,27,30]。

这些技术与结构和运动估计的直接方法有一些相似之处[22],其中调整相机参数和场景深度以最小化基于像素的误差函数。然而,基于CNN的方法并没有直接将误差最小化以获得估计,而是只对每一批输入实例采取渐进步骤,这允许网络工作从大量相关信息库中学习隐式先验。几位作者已经探索了在他们的模型中构建可微分的重排序操作,这些模型是以这种方式训练的,例如[19,29,34]。

虽然上述大多数技术(包括我们的技术)主要集中于推断深度图作为场景几何输出,但最近的工作(例如[13,41,46,52])也表明,基于类似的投影几何原理,从2D观测中学习3D体积表示是成功的。Fouhey等人[11]进一步表明,通过利用场景规则性,甚至可以在没有3D标签(或注册的2D视图)的情况下学习3D推理

无监督/自我监督的视频学习

与我们的另一项相关工作是从视频中进行视觉表示学习,其中的总体目标是设计借口任务,用于从视频数据中学习通用视觉特征,这些任务后来可以重新用于其他视觉任务,如对象检测和语义分割。此类借口任务包括自我运动估计[2,24]、跟踪[49]、时间一致性[17]、时间顺序验证[36]和对象运动掩码预测[39]。虽然我们在这项工作中专注于推断明确的场景几何和自我运动,但直观地说,深度网络(尤其是单视图深度CNN)学习的内部表示应该捕捉到某种程度的语义,这些语义也可以通用于其他任务。

在我们工作的同时,Vijayanarasimhan等人[48]独立地提出了一个从视频中联合训练深度、相机运动和场景运动的框架。虽然这两种方法在概念上相似,但我们的方法侧重于无监督方面,而它们的框架增加了结合超视觉(例如,深度、相机运动或场景运动)的能力。在训练过程中,场景动力学的建模方式存在显著差异,在训练中,它们明确地解决了对象运动,而我们的可解释性遮罩不考虑经历运动、聚集和其他因素的区域。

三、方法

在这里,我们提出了一个框架,用于从未标记的视频序列中联合训练单视图深度CNN和相机姿态估计CNN。尽管是联合训练的,但深度模型和姿态估计模型可以在测试时间推断期间独立使用。我们模型的训练示例包括由移动相机拍摄的场景的短图像序列。虽然我们的训练过程在一定程度上对场景运动是稳健的,但我们假设我们感兴趣的场景大多是刚性的,即不同帧之间的场景外观变化由相机运动主导。

3.1.将综合视为监督

我们的深度和姿态预测神经网络的关键监督信号来自新视图合成任务:给定场景的一个输入视图,合成从不同相机姿态看到的场景的新图像。给定图像中的每像素深度,再加上附近视图中的姿势和可见性,我们可以合成目标视图。正如我们接下来将要展示的那样,该合成过程可以以完全可微的方式实现,将细胞神经网络作为几何和姿态估计模块。可见性以及非刚性和其他非建模因素可以通过使用“可解释性”掩码来处理,我们稍后将对此进行讨论(第3.3节)。

让我们表示<I1,In>作为训练图像序列,其中一帧It是目标视图,其余帧是源视图Is(1≤s≤N,s不等于t)。视图合成目标可以公式化为

其中,p在像素坐标上进行索引,Iõs是源视图。基于基于深度图像的渲染模块[8](如第3.2节所述),将源视图扭曲到目标坐标系,采用预先预测的深度Plot Dt,即预测的4×4相机变换矩阵1 T Plot T→s和源代码视图Is作为输入。

请注意,最近还探索了将视图合成作为监督的想法,用于学习单视图深度估计[14,16]和多视图立体[10]。然而,据我们所知,之前的所有工作都需要在训练过程中设置姿势图像集(在DeepStereo的情况下也需要测试),而我们的框架可以应用于没有姿势信息的标准视频。此外,它还将姿势作为学习框架的一部分进行预测。有关深度和姿态估计的学习管道,请参见图2。

图2:基于视图合成的监理管道概述。深度网络仅将目标视图作为输入,并输出每个像素的深度图。姿势网络将目标视图(It)和附近/源视图(例如,It−1和It+1)作为输入,并输出相对相机姿势(Tt→t−1,Tt→t+1)。然后,两个网络的输出用于反向扭曲源视图(见第3.2节),以重建目标视图,光度重建损失用于训练细胞神经网络。通过利用视图合成作为监督,我们能够以无监督的方式从视频中训练整个框架。

3.2.基于不同深度图像的渲染

如等式1所示,我们的学习框架工作的一个关键组件是一个可微分的基于深度图像的渲染器,该渲染器通过基于预测的深度图 Dt 和相对姿态T从源视图Is采样像素来重构目标视图It→s

设pt表示目标视图中像素的齐次坐标,K表示相机内部矩阵。我们可以通过2获得pt在源视图ps上的投影坐标

请注意,投影坐标ps是连续值。为了获得Is(ps)来填充Iõs(pt)的值(见图3),我们使用空间变换器网络[23]中提出的可微双线性采样机制,该机制线性地对ps的4像素邻居(左上、右上、左下和右下)的值进行三次插值,以近似Is(ps。Iõs(pt)=Is(ps)=P I∈{t,b},j∈{l,r}w ij Is(P ij s),其中w ij与ps和P ij之间的空间接近度成线性比例,并且P I,j w ij=1。[54]中使用了类似的策略来学习在不同视图之间直接扭曲,而这里像素扭曲的坐标是通过投影几何获得的,该几何能够对深度和相机姿态进行因子分解。

图3。可微分图像扭曲过程的说明。对于目标视图中的每个点pt,我们首先基于预测的深度和相机姿态将其投影到源视图上,然后使用双线性插值来获得位置pt处扭曲图像I的值。

3.3.模型限制建模

注意,当应用于单眼视频时,上述视图合成公式隐含地假设

1)场景是静态的,没有移动对象;

2) 在目标视图和源视图之间不存在遮挡/不遮挡;

3) 表面是Lambertian的,因此照片一致性误差是有意义的。

如果在训练序列中违反了这些假设中的任何一个,则梯度可能会被破坏,并可能抑制训练。为了提高我们的学习管道对这些因素的鲁棒性,我们还训练了一个可解释性预测网络(与深度和姿态网络联合并同时训练),该网络为每个目标-源对输出每个像素的软掩模Es,这表明该网络相信直接视图合成将成功地为每个目标像素完全建模。基于预测的Es,视图合成目标相应地由

由于我们没有对Es的直接监督,用上述损失进行训练将导致网络的平凡解决方案总是预测Es为零,这完美地将损失最小化。为了解决这个问题,我们添加了正则化项Lreg(Es),该正则化项通过最小化每个像素位置处具有常数标签1的交叉熵损失来鼓励非零预测。

3.4.克服梯度局部性

上述学习流水线的一个剩余问题是,梯度主要从I(pt)和I(ps)的四个邻居之间的像素强度差导出,如果正确的ps(使用地面实况深度和姿态投影)位于低纹理区域或远离当前估计,则这将抑制训练。这是运动估计中众所周知的问题[3]。 根据经验,我们发现两种策略可以有效地解决这个问题:

1)使用卷积编码器-解码器架构,该架构对深度网络有一个小瓶颈,它隐含地限制输出全局平滑,并有助于梯度从有意义的区域传播到附近的区域;

2) 显式的多尺度和平滑度损失(例如,如[14,16]中所述),其允许直接从较大的空间区域导出梯度。

我们在这项工作中采用了第二种策略,因为它对架构选择不太敏感。对于平滑度,我们最小化预测深度图的二阶梯度的L1范数(类似于[48])。

我们的最终目标是

其中,不同图像尺度上的l个索引,源图像上的s个索引,以及λs和λe分别是深度平滑度损失和可解释性正则化的权重。

3.5.网络架构

单视图深度

对于单视图深度预测,我们采用了[35]中提出的DispNet架构,该架构主要基于具有跳过连接和多尺度侧预测的编码器-解码器设计(见图4)。除预测层外,所有conv层之后都是ReLU激活,其中我们使用α=10和β=0.1的1/(α*sigmoid(x)+β)来将预测深度限制在合理范围内始终为正。我们还尝试使用多个视图作为深度网络的输入,但没有发现这能改善结果。这与[47]中的观察结果一致,其中需要强制执行光流约束以有效利用多个视图

图4。我们的深度/姿势/可解释性预测模块的网络架构。每个矩形块的宽度和高度分别指示相应层处的输出通道和特征图的空间维度,并且大小的每次减小/增加指示因子2的变化。(a) 对于单视图深度,我们采用了具有多尺度侧预测的DispNet[35]架构。除前4个conv层外,所有层的内核大小均为3,分别为7、7、5、5。用于第一conv层的输出通道的数量是32。(b) 姿态和可解释性网络共享最初的几个对流层,然后分别分支预测6-DoF相对姿态和多尺度可解释性掩码。第一conv层的输出通道的数量是16,并且除了前两个conv和最后两个去卷积/预测层之外的所有层的内核大小是3,其中我们分别使用7、5、5、7。详见第3.5节。

姿势

姿态估计网络的输入是与所有源视图连接的目标视图(沿着颜色通道),输出是目标视图和每个源视图之间的相对姿态。该网络由7个跨步-2卷积组成,然后是1×1卷积,具有6个*(N−1)输出通道(对应于每个源视图的3个欧拉角和三维平移)。最后,将全局平均池应用于所有空间位置的聚合预测。除了没有应用非线性激活的最后一层之外,所有conv层之后都是ReLU。

可解释性掩码

可解释性预测网络与姿态网络共享前五个特征编码层,然后是具有多尺度侧预处理的5个去卷积层。除了没有非线性激活的预测层之外,所有的对流/去对流层之后都是ReLU。每个预测层的输出通道数为2*(N−1),每两个通道都通过softmax进行归一化,以获得对应源-目标对的解释性预测(归一化后的第二个通道为Eõs,用于计算方程中的损失。3)。

四、实验

在这里,我们评估了我们的系统的性能,并在单视图深度和自我运动估计方面与现有方法进行了比较。我们主要使用KITTI数据集[15]进行基准测试,但也使用Make3D数据集[42]来评估跨数据集的泛化能力。

培训详细信息

我们使用公开可用的TensorFlow[1]框架实现了该系统。对于所有实验,我们设置λs=0.5/l(l是相应尺度的降尺度因子)和λe=0.2。在训练过程中,我们对除输出层外的所有层使用了批处理正态化[21],并使用了Adam[28]优化器,其中β1=0.9,β2=0.999,学习率为0.0002,小批量大小为4。训练通常在大约150K次迭代之后收敛。所有实验都是用单眼相机拍摄的图像序列进行的。在训练过程中,我们将图像大小重新调整为128×416,但在测试时,对于任意大小的图像,深度和姿态网络都可以完全卷积运行。

4.1单视图深度估计

我们在[7]提供的分割上训练我们的系统,并从测试场景中排除所有帧,以及平均光流幅度小于1像素的静态序列进行训练。 我们将图像序列的长度固定为3帧,并将中心帧作为目标视图,将±1帧作为源视图。我们使用两个彩色相机拍摄的图像,但在形成训练序列时独立处理它们。这导致总共44540个序列,其中我们使用40109个用于训练,使用44331个用于验证。

据我们所知,以前不存在以无监督的方式从单眼视频中学习单视图深度估计的系统。尽管如此,我们在这里提供了与先前的深度监督方法[7]和最近使用校准立体图像(即姿势监督)进行训练的方法[14,16]的比较。由于我们的方法预测的深度被定义为一个比例因子,因此为了进行评估,我们将预测的深度图乘以与中值和地面实况相匹配的标量s trl,即s trl=中值(Dgt)/中值(Dpred)。

与[16]类似,我们还试验了首先在较大的Cityscapes数据集[5]上对系统进行预训练(样本预测如图5所示),然后对KITTI进行微调,这会导致性能略有提高。

KITTI

在这里,我们评估了[7]测试分割的697幅图像的单视图深度性能。如表1所示,我们的无监督方法与几种监督方法(如Eigen等人[7]和Garg等人[14])的性能相当,但达不到Godard等人[16]的并行工作,后者使用具有左右循环一致性损失的校准立体图像(即姿势监督)进行训练。对于未来的工作,将类似的周期一致性损失纳入我们的框架是否可以进一步改善结果,这将是一个有趣的问题。图6提供了我们的结果与一些监督基线之间的视觉比较示例,这些比较示例涵盖了各种示例。可以看出,尽管以无监督的方式进行训练,但我们的结果与监督基线的结果相当,有时可以更好地保留深度边界和薄结构,如树木和路灯。

在这里,我们在图7中显示了由我们的初始城市景观模型和最终模型(在城市景观上预训练,然后在KITTI上微调)所做的样本预测。由于两个数据集之间的领域差距,我们的城市景观模型有时很难恢复汽车/灌木丛的完整形状,并将其误认为是远处的物体。

说明

Lambertian

Lambertian表面是指在一个固定的照明分布下从所有的视场方向上观测都具有相同亮度的表面

光学知识(一) - 知乎

作者介绍

Tinghui Zhou

Tinghui Zhou's Homepage

个人理解

公式二的讲解,这个很关键

这篇论文应该算是基于深度图和姿态进行自监督学习的一个鼻祖吧

核心思想就是深度网络出深度图,姿态网络出相机姿态,详细见公式二的讲解,图像左乘相机参数和深度,得到像素点在3D坐标系下的坐标,然后乘姿态(两张图的相对位姿),得到目标图在3D坐标系下的坐标,然后乘相机参数,将目标图的3D坐标转为2D。之后将预测的目标图和真实的目标图做差(损失函数,公式一),训练最终得到可用的深度网络和姿态网络

论文下载地址

https://arxiv.org/pdf/1704.07813.pdf

工程下载地址

GitHub - tinghuiz/SfMLearner: An unsupervised learning framework for depth and ego-motion estimation from monocular videos

参考

【SLAM系列】Unsupervised Learning of Depth and Ego-Motion from Video_^_^ 晅菲的博客-CSDN博客

Unsupervised Learning of Depth and Ego-Motion - 知乎

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

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

相关文章

C++ 线程

linux使用线程 在linux使用线程可能出现,在编译时不会报错,但执行出错的问题。 undefined reference to pthread_create这是由于ubuntu平台下调用pthread_create()函数,pthread 库不是 Linux 系统默认的库,连接时需要使用静态库 …

Word转PDF:简单步骤,轻松完成!推荐两个实现的方法

随着社会的发展,PDF 文件已经成为一种非常流行的文件格式,对于一些需要对文件进行保密的企业而言,更是必不可少。在这样的大背景下,如何将 Word 文件转换为 PDF 文件呢?下面是一些简单的步骤,帮助您轻松完成…

Rust-Shyper:基于 Rust 语言的高可靠、开源嵌入式 Hypervisor

「Rust-Shyper 是北京航空航天大学计算机学院王雷教授团队设计开发的虚拟机监控器,该系统基于 Rust 语言,实现了一个高可靠、嵌入式 Hypervisor。2023 年 2 月 15 日 Rust-Shyper 正式在 openEuler 社区开源。」 项目地址:https://gitee.com…

论文阅读笔记:Hearing Lips Improving Lip Reading by Distilling Speech Recognizers

目录 论文链接 研究背景 LIBS 的整体框架 序列级知识蒸馏 上下文级知识蒸馏 最长公共子序列 (LCS) 帧级别知识蒸馏 论文链接 [1911.11502] Hearing Lips: Improving Lip Reading by Distilling Speech Recognizers (arxiv.org) 研究背景 这篇文章针对由于唇语识别动作…

【观察】解码“一网统管”:城市治理“新范式”,推动数字城市建设迈向“新高度”...

众所周知,随着城市化进程加快,大量的人员、物资、技术和信息等要素日益向城市汇聚,城市系统变得越来越复杂,随之而来的社会问题和“城市病”也层出不穷,而传统的治理模式和治理手段越来越难以胜任日益复杂城市的管理需…

深聊丨第四范式陈雨强:如何用AI大模型打开万亿规模传统软件市场?

文丨亲爱的数据 谭婧 “GPT大模型到底能不能用?用在哪里?” 这是目前中国大型企业一把手最关心的问题之一。AI大模型也被媒体称为“一把手”工程。 大型企业会非常认真地考虑大模型的应用。最近个把月,大型企业客户对大模型的热烈反应让第四范…

进程状态以及两种特殊进程

目录 进程状态1 具体状态2 进程状态的意义3 进程状态实例3.1 R&S&T认识3.2 认识Z & 僵尸进程 & 孤儿进程僵尸进程孤儿进程 进程状态 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内…

==、equals区别 | java学习笔记

做一些java基础知识的记录📕 java基本类型:byte short int long float double char boolean(指向具体的数值) java引用类型:类 接口 数组等。指向的不是具体的数值,而是指向了对象的地址。 用于判断基本类…

JavaWeb|在IDEA中创建基于Maven的Web项目| Servlet依赖|这一篇就够了(超详细)

🙈作者简介:练习时长两年半的Java up主 🙉个人主页:老茶icon 🙊 ps:点赞👍是免费的,却可以让写博客的作者开兴好久好久😎 📚系列专栏:Java全栈,计…

【c语言】详解c语言#预处理期过程 | 宏定义前言

c语言系列专栏&#xff1a; c语言之路重点知识整合 创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持…

微信小程序php+python+nodejs+vue大学生心理健康测试职位推荐系统

心理测试开发使系统能够更加方便学生捷&#xff0c;同时也促使心理测试变的更加系统化、有序化。系统界面较友好&#xff0c;易于操作。具体在系统设计上&#xff0c;客户端使用微信开发者&#xff0c;后台也使用php技术在动态页面上进行了设计&#xff0c;Mysql数据库&#xf…

算法 DAY44 动态规划6 完全背包 518. 零钱兑换 II 377. 组合总和 Ⅳ

完全背包 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 完全背包和01背包问题唯一不同…

Java每日一练(20230427)

目录 1. 螺旋矩阵 2. LRU 缓存机制 3. 解数独 &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 螺旋矩阵 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#…

Leetcode——495. 提莫攻击

&#x1f4af;&#x1f4af;欢迎来到的热爱编程的小K的Leetcode的刷题专栏 文章目录 1、题目2、题目分析3、题解代码 1、题目 题目链接&#xff1a;Leetcode——495. 提莫攻击 在《英雄联盟》的世界中&#xff0c;有一个叫 “提莫” 的英雄。他的攻击可以让敌方英雄艾希&…

国民技术N32G430开发笔记(1)-macos开发环境搭建

macos开发环境搭建 1、安装arm-none-eabi- 工具链 brew tap ArmMbed/homebrew-formulae brew install arm-none-eabi-gcc如果没有安装brew&#xff0c;请先安装brew。 2、安装vscode 3、安装pyocd a、python官网下载最新版的python b、pip3 install -U pyocd 我的开发板为N3…

Hadoop 1:Apache Hadoop、HDFS

Hadoop核心组件 Hadoop HDFS&#xff08;分布式文件存储系统&#xff09;&#xff1a;解决海量数据存储 Hadoop YARN&#xff08;集群资源管理和任务调度框架&#xff09;&#xff1a;解决资源任务调度 Hadoop MapReduce&#xff08;分布式计算框架&#xff09;&#xff1a;解决…

MyBatis的代理开发方式、动态sql语句和typeHandlers和plugins标签实战

文章目录 Mybatis的Dao层实现传统开发方式编写UserDao接口编写UserDaoImpl实现mapper文件测试传统方式 代理开发方式代理开发方式介绍编写UserMapper接口测试代理方式 MyBatis映射文件深入动态sql语句动态sql语句概述动态 SQL 之<if>动态 SQL 之<foreach>SQL片段抽…

信号处理的本质是什么?

信号处理的宗旨是“将信号中蕴涵的信息变得显然”&#xff0c;从数学角度分析, 信号即是某个物理量x的函数f(x), 信号所蕴含的信息需要通过此类函数予以揭示. 自然地可将f(x)投影到其所在空间中的一组基函数上, 由投影系数或加权系数来构成函数f(x)在变换域上的表示。在一定条件…

Nginx基本配置

文章目录 准备环境安装NginxNginx配置初始配置信息配置详解1. 全局块2. events 块3. http 块3.1 http 全局块3.2 server 块3.2.1 全局 server 块3.2.2 location 块 启动Nginx 参考资料 本教程讲述Nginx的基本配置和操作。首先需要安装 Nginx&#xff0c;关关于具体的安装方式&a…

输入网址url到网页显示,期间发生了什么?

当我们在浏览器输入一个网址后&#xff0c;知道网页显示在我们眼前&#xff0c;这一期间是如何发生的&#xff0c;接下来就将详细介绍在这期间发生的过程及使用的协议栈 1、浏览器解析URL并生产HTTP请求消息 URL是我们输入的网址信息&#xff0c;比如 https://www.taobao.com …