【论文翻译】A simple yet effective baseline for 3d human pose estimation

news2024/10/7 4:32:33

【论文】https://arxiv.org/abs/1705.03098v2 

 【pytorch】weigq/3d_pose_baseline_pytorch: A simple baseline for 3d human pose estimation in PyTorch. (github.com)

【tensorflow】https://github.com/una-dinosauria/3d-pose-baseline 

摘要

随着深度卷积网络的成功,最先进的3d人体姿势估计方法集中在深度端到端系统上,该系统预测给定原始图像像素的3d关节位置。尽管它们表现出色,但通常不容易理解它们剩余的错误是源于有限的2d姿势(视觉)理解,还是源于未能将2d姿势映射到3d位置。

为了了解这些误差来源,我们开始构建一个系统,给定2d关节位置可以预测3d位置。令我们惊讶的是,我们发现,利用目前的技术,将 ground truth关节位置“提升”到3d空间是一项可以以非常低的错误率解决的任务:一个相对简单的深度前馈网络在Human3.6M(最大的公开可用的3d姿态估计基准)上比报道的最佳结果高出约30%。此外,在一个现成的最先进的2d检测器的输出上训练我们的系统(即使用图像作为输入)会产生最先进的结果——这包括一系列专门为此任务进行了端到端训练的系统。我们的研究结果表明,现代深度3d姿态估计系统的很大一部分误差来自于视觉分析,并提出了进一步推进3d人体姿态估计技术水平的方向。

1.介绍

        现有的绝大多数对人类的描绘都是二维的,例如视频片段、图像或绘画。传统上,这些表象在向他人传达事实、想法和感受方面发挥着重要作用,而这种传递信息的方式之所以成为可能,多亏了人类能够理解存在深度模糊的复杂空间安排。对于大量的应用,包括虚拟现实和增强现实、服装尺寸估计甚至自动驾驶,赋予机器这种空间推理能力是至关重要的。在本文中,我们将专注于这个空间推理问题的一个特定实例:从单个图像中估计3d人体姿势。

        更正式地说,给定一个人的图像(二维表示),三维姿态估计是生成一个与所描绘的人的空间位置相匹配的三维图形的任务。为了将图像转换为3d姿势,算法必须对许多因素保持不变,包括背景场景、照明、服装形状和纹理、肤色和图像缺陷等。早期的方法通过轮廓[1]、形状上下文[28]、SIFT描述符[6]或边缘方向直方图[40]等特征来实现这种不变性。虽然在2d姿态估计(也需要这些不变性)等任务上,渴求数据的深度学习系统目前优于基于人类工程特征的方法,但由于缺乏野外图像的3dground truth姿态数据,直接从彩色图像推断3d姿态的任务具有挑战性

        最近,一些系统探索了使用端到端深度架构从图像中直接推断3d姿势的可能性[33,45],而其他系统认为可以通过对合成数据进行训练来实现从彩色图像中进行3d推理[38,48]。在本文中,我们将三维位姿估计解耦为已深入研究的二维姿态估计问题[30,50]和基于二维关节检测的三维姿态估计问题中,重点研究了后者。将姿态估计分离为这两个问题使我们有可能利用现有的二维姿态估计系统,这些系统已经为前面提到的因素提供了不变性。此外,我们可以用在受控环境中捕获的大量3d动作捕捉数据训练数据不足算法来解决2d-to-3d问题,同时使用低维表示,可以很好地适应大量数据

        我们对这个问题的主要贡献是设计和分析了一个神经网络,它的性能略好于最先进的系统(当检测经过微调时增加其边际,或ground truth),并且速度很快(在64大小的批处理上,向前传递大约需要3毫秒,允许我们在批处理模式下处理多达300帧/秒),同时易于理解和复现。这种精度和性能飞跃的主要原因是一组简单的想法,比如估计相机坐标系中的3d关节,添加残差连接和使用批量归一化。由于网络的简单性,这些想法可以与其他不成功的想法(例如估计关节角度)一起快速测试

        实验表明,在现有最大的3d姿势数据集上,从真实的2d投影推断3d关节可以以惊人的低错误率(比现有技术低30%)得到解决。此外,在最近的2d关键点检测器的噪声输出上训练我们的系统,产生的结果略优于最先进的3d人体姿势估计,这来自于从原始像素端到端训练的系统。

        我们的工作在使用Human3.6M的无噪声2d检测的基础上大大改进了之前最好的2d-to-3d姿态估计结果,同时还使用了更简单的架构。这表明,尽管还远远没有解决,但提升2d姿势的任务比之前想象的要简单。由于我们的工作也从现成的2d检测器的输出中获得了最先进的结果,这也表明,通过专注于在2d图像中对人体的视觉解析,可以进一步改进当前的系统。此外,我们还提供并发布了一个高性能、轻量级且易于重现的基线,为今后的工作设定了新的标准。我们的代码可以在https://github.com/una-dinosauria/ 3d-pose-baseline上公开获取

2.先前的工作

图像深度 从纯粹的2d刺激中感知深度是一个经典问题,至少从文艺复兴时期开始,布鲁内莱斯基在他的佛罗伦萨建筑画作中使用透视的数学概念来传达空间感,这个问题就吸引了科学家和艺术家的注意力。

        几个世纪后,类似的透视线索在计算机视觉中被用于推断任意场景中的长度、面积和距离比。除了透视信息,经典的计算机视觉系统还尝试使用其他线索,如阴影[53]或纹理[25]来从单张图像中恢复深度。现代系统[12,26,34,39]通常从监督学习的角度来处理这个问题,让系统推断哪些图像特征对深度估计最有鉴别性。

自顶向下三维推理 深度估计的第一个算法采用了不同的方法:利用场景[37]中物体的已知3d结构。研究表明,这种自上而下的信息也被人类使用,当感知人类运动抽象成一组稀疏点投影[8]时。从稀疏的2d投影等最小表示中推理3d人体姿势的想法,抽象出其他潜在的更丰富的图像线索,激发了我们在这项工作中处理的2d关节的3d姿势估计问题。

二维到三维关节 从三维关节的二维投影推断三维关节的问题可以追溯到Lee和Chen[23]的经典工作。他们表明,考虑到骨头的长度,这个问题可以归结为一个二叉决策树,其中每个分裂对应于关节相对于其父节点的两种可能状态。这个二叉树可以基于联合约束进行修剪,尽管它很少产生单一的解决方案。Jiang[20]使用了一个大型的姿势数据库来解决基于最近邻居查询的歧义。有趣的是,利用最近邻来改进姿态推断结果的想法最近被Gupta等人[14]和Chen和Ramanan[9]重新提出,他们在搜索过程中纳入了时间限制。从数据集中编译关于3d人体姿势的知识的另一种方法是通过创建适合于将人体姿势表示为稀疏组合的过完备基[2,7,36,49,55,56],将姿势提升到可重复的核心希尔伯特空间(RHKS)[18]或通过从极端人体姿势的专门数据集中创建新的先验[2]。

基于深度网络的2d到3d关节 我们的系统与最近用深度神经网络学习2d和3d之间映射的工作最相关。Pavlakos等[33]引入了一种基于堆叠沙漏架构[30]的深度卷积神经网络,它不是回归2d联合概率热图,而是映射到3d空间的概率分布。Moreno-Noguer[27]学习从2到3维空间预测成对距离矩阵(DM)。距离矩阵对于旋转、平移和反射都是不变的;因此,多维缩放与人类姿态的先验[2]相补充,以排除不可能的预测。

        Moreno-Noguer的DM回归方法以及Pavlakos等人的体积方法背后的一个主要动机是,从2d检测中预测3d关键点本质上是困难的。例如,Pavlakos等人[33]提出了一个基线,其中使用了直接的3d关节表示(如我们的)([33]中的表1),其结果比使用体积回归要准确得多。我们的工作应该避免与直接从2d关节检测中回归3d关键点的想法相矛盾,并表明一个设计良好和简单的网络可以在2d到3d关键点回归任务中表现得相当有竞争力。

2d到3d角度姿态 从图像推断3d姿态的算法的第二个分支是根据角度(有时是身体形状)估计身体配置,而不是直接估计关节的3d位置[4,7,31,54]。这些方法的主要优点是,由于人类关节的约束流动性,问题的维数较低,并且所得到的估计被迫具有类似人类的结构。此外,用这个表示[51]约束诸如骨长或关节角度范围等人体属性相当简单。我们也尝试过这样的方法;然而,根据我们的经验,关节和2d点之间的高度非线性映射使得学习和推理更加困难,计算成本更高。因此,我们选择直接估计三维关节。

3.解决方法

        我们的目标是在给定二维输入的情况下估计三维空间中的身体关节位置。形式上,我们的输入是一系列2d点x∈\mathbb{R}^{2n},而我们的输出是3d空间y∈\mathbb{R}^{3n}中的一系列点。我们的目标是学习一个函数f *: \mathbb{R}^{2n}\mathbb{R}^{3n},使N个姿态数据集上的预测误差最小化:

 

        在实践中,x_{i} 可以在已知的相机参数下通过真实的2d关节位置或使用2d关节检测器获得。预测相对于固定全局空间(相对于根关节)的3d位置也很常见,这会导致稍微低维的输出。

        我们关注f *是深度神经网络的系统,并努力找到一个简单、可扩展和高效的架构,在这项任务中表现良好。这些目标是我们网络设计选择背后的主要原理。

 3.1. 我们的方法——网络设计

图1。这是我们方法的示意图。我们的网络的构建块是一个线性层,然后是批量归一化、退出和RELU激活。重复两次,两个块被包裹在一个残差连接中。外层块重复两次。系统的输入是一个二维关节位置数组,输出是一系列三维关节位置。

        图1显示了我们的体系结构的基本构建块。我们的方法基于一个简单的、深度的多层神经网络,具有批量归一化[17]、dropout[44]和整流线性单元(RELUs)[29]以及残差连接[16]。该图中没有描述两个额外的线性层:一个直接应用于输入,将其维数增加到1024,另一个应用于最终预测之前,产生大小为3n的输出。在我们的大多数实验中,我们使用2个残差块,这意味着我们总共有6个线性层,我们的模型包含400到500万个可训练参数。

        我们的架构受益于对深度神经网络优化的多个相对近期的改进,这些改进主要出现在非常深度的卷积神经网络环境中,并且一直是提交给ILSVRC (Imagenet[10])基准测试的最先进系统的关键组成部分。正如我们所演示的,这些贡献也可以用于改善我们的2d-to-3d姿态估计任务的泛化。

2 d / 3 d位置 我们的第一个设计选择是使用2d和3d点作为输入和输出,而最近的工作使用原始图像[11,13,24,32,33,33,45,44,56]或2d概率分布[33,56]作为输入,3d概率[33],3d运动参数[54]或基本姿态系数和相机参数估计[2,7,36,55,56]作为输出。虽然2d检测携带的信息较少,但它们的低维度使其非常具有吸引力;例如,在训练网络时,可以轻松地将整个Human3.6M数据集存储在GPU中,这减少了整体训练时间,并大大加快了网络设计和训练超参数的搜索速度。

Linear-RELU层 大多数用于3d人体姿势估计的深度学习方法都是基于卷积神经网络,该网络学习可应用于整个图像[13,24,32,33,45]或二维关节位置热图[33,56]的平移不变滤波器。然而,由于我们处理的是低维点作为输入和输出,我们可以使用更简单、计算成本更低的线性层。RELUs[29]是在深度神经网络中添加非线性的标准选择。

残差连接 我们发现残差连接,最近被提出作为一种技术来促进非常深的卷积神经网络[16]的训练,提高泛化性能并减少训练时间。在我们的案例中,它们帮助我们减少了大约10%的错误。

批处理归一化和dropout 虽然具有上述三个组件的简单网络在ground truth2d位置上训练时,在2d到3d姿态估计上获得了良好的性能,但我们发现,在2d检测器的输出上训练时,或者在2d ground truth上训练并在有噪声的2d观测上测试时,它表现不佳。批归一化[17]和dropout[44]在这两种情况下提高了我们系统的性能,同时导致训练和测试时间略有增加

Max-norm限制 我们还对每一层的权重施加了约束,使它们的最大范数小于或等于1。加上批处理归一化,我们发现当训练和测试示例之间的分布不同时,这可以稳定训练并改善泛化。

3.2. 数据预处理

        我们通过减去平均值并除以标准差对2d输入和3d输出应用标准归一化。由于我们不预测3d预测的全局位置,我们将3d姿势设为髋关节周围的零中心(与之前的工作和Human3.6M的标准协议一致)。

相机坐标系 在我们看来,通过期望算法在任意坐标空间中推断三维关节位置是不现实的,因为任何平移或旋转该空间都不会导致输入数据的变化。全局坐标框架的自然选择是相机框架[11,24,33,46,54,56],因为这使得2d到3d问题在不同的相机之间相似,隐式地支持每个相机更多的训练数据,并防止过度拟合到特定的全局坐标框架。我们通过旋转和平移3d ground truth 根据相机的反变换来做到这一点。在任意全局坐标系中推断三维姿态的一个直接影响是无法回归人的全局方向,这导致所有关节都有很大的误差。请注意,这个坐标框架的定义是任意的,并不意味着我们在测试中利用姿态真实值。

2d检测 我们使用Newell等人[30]的最先进的堆叠沙漏网络获得2d检测,在MPII数据集[3]上进行预训练。与之前的工作相似[19,24,27,32,46],我们使用H3.6M提供的包围框来估计图像中人的中心。我们在这个计算中心周围裁剪一个大小为440 × 440像素的正方形到检测器(然后通过堆叠沙漏调整大小为256 × 256)。这些检测与 ground truth 2d位置之间的平均误差为15像素,略高于Moreno-Noguer[27]在同一数据集上使用CPM[50]报告的10像素。我们更喜欢堆叠沙漏而不是CPM,因为(a)它在MPII数据集上显示出更好的结果,并且(b)它的评估速度快了大约10倍,这使得我们可以在整个H3.6M数据集上计算检测。

        我们还对Human3.6M数据集(最初在MPII上进行了预训练)上的stacked hourglass模型进行了微调,该模型在目标数据集上获得了更准确的2d联合检测,并进一步降低了3d姿态估计误差。我们使用了所有默认的堆叠沙漏参数,除了由于GPU内存限制,我们将小批量大小从6个减少到3个。我们将学习率设置为2.5 × 10−4,并训练40000次迭代。

训练细节 我们使用Adam[21]训练我们的网络200个epoch,起始学习率为0.001和指数衰减,使用大小为64的小批量。最初,线性层的权重是使用kaiing初始化[15]设置的。我们使用Tensorflow实现了我们的代码,在Titan Xp GPU上,向前+向后传递大约需要5毫秒,向前传递大约需要2毫秒。这意味着,再加上最先进的实时2d检测器(例如[50]),我们的网络可以成为实时运行的完整像素到3d系统的一部分。

4. 实验评价

数据集和协议 我们将数值评估集中在两个用于三维人体姿势估计的标准数据集上:HumanEva[42]和Human3.6M[19]。我们还展示了在MPII数据集[3]上的定性结果,对于该数据集,ground truth 3d是不可用的。

        据我们所知,Human3.6M是目前最大的用于人类三维姿态估计的公开数据集。该数据集由360万张图片组成,其中包括7位专业演员表演的15种日常活动,如走路、吃饭、坐着、打电话和参与讨论。2d关节位置和3d ground truth 位置是可用的,以及所有演员的投影(摄像机)参数和身体比例。另一方面,HumanEva是一个较小的数据集,主要用于对过去十年的工作进行基准测试。MPII是一个基于数千个youtube短视频的二维人体姿势估计的标准数据集。

        在Human3.6M上,我们遵循标准方案,使用受试者1、5、6、7和8进行训练,使用受试者9和11进行评估。我们报告了在根(髋关节中央)关节对齐后,所有关节和摄像机的实际情况与我们的预测之间的平均误差(毫米)。通常,训练和测试是在每个操作中独立进行的。我们称之为协议#1。然而,在我们的一些基线中,预测已经通过刚性转换进一步与 ground truth保持一致(例如[7,27])。我们称之为后处理协议#2。类似地,最近的一些方法为所有的动作训练一个模型,而不是建立特定于动作的模型。我们已经发现这种实践可以持续地改善结果,因此我们报告了我们的方法在这两种变化下的结果。在HumanEva中,训练和测试是在所有对象和每个动作上分别进行的,并且误差总是在刚性转换后计算。

4.1. 定量结果

2d- 3d回归的上限 我们的方法基于二维关节位置的直接回归,自然依赖于二维姿态检测器输出的质量,并在使用真实二维关节位置时获得最佳性能。

        我们遵循Moreno-Noguer[27],并在不同水平的高斯噪声下测试一个最初用2d ground truth训练的系统。结果如表1所示。对于所有级别的噪声,我们的方法在很大程度上优于距离矩阵方法[27],并且在ground truth 2d投影上训练时,达到了37.10 mm误差的峰值性能。这比我们所知道的ground truth 2d关节[27]的最好结果要好43%。此外,请注意,这个结果也比Pavlakos等人[33]报道的51.9毫米好了大约30%,这是我们所知道的Human3.6M上的最好结果——然而,他们的结果没有使用ground truth 2d位置,这使得这个比较不公平。

        虽然每一帧都是独立评估的,而且我们不使用时间,但我们注意到我们的网络产生的预测是相当流畅的。可以在https: // youtube .be/Hmi3Pd9x1BE上找到这些和更多定性结果的视频。

对检测器噪声的鲁棒性 为了进一步分析我们方法的鲁棒性,我们还实验了测试系统(总是用ground truth 2d位置训练)与(噪声)图像的2d检测。这些结果也报告在表1.2的底部。在这种情况下,我们也优于以前的工作,并证明我们的网络在ground truth训练和在2d检测器的输出上测试时可以表现得相当好。

2d检测训练 虽然在训练和测试时使用2d ground truth 来描述我们网络的性能很有趣,但在实际应用中,我们的系统必须与2d检测器的输出一起工作。我们在表2中报告了Human3.6M协议#1的结果。在这里,我们最接近的竞争对手是最近的Pavlakos等人[33]的体积预测方法,它使用堆叠沙漏架构,在Human3.6M上进行端到端训练,并对所有动作使用单一模型。即使在使用开箱即用的堆叠沙漏检测时,我们的方法也比这一最先进的结果高出4.4 mm,当二维探测器在H3.6M上微调时,差距增加了一倍多,达到9.0 mm。在H3.6M的15个动作中,我们的方法也始终优于之前的工作。

        我们在协议#2下的Human3.6M上的结果(使用与ground truth的严格对齐)如表3所示。虽然我们的方法比以前的开箱即用检测稍微差一些,但当我们使用微调检测时,它回到了第一位。

        最后,我们在表4中报告了HumanEva数据集的结果。在这种情况下,我们在6个案例中有3个获得了迄今为止最好的结果,总的来说,慢跑和步行的平均误差是最好的。由于这个数据集相当小,并且在训练和测试集中出现了相同的受试者,我们认为这些结果不像我们在Human3.6M中使用的方法获得的结果那么显著。

消融和超参数分析 我们还进行了消融分析,以更好地了解网络设计选择的影响。以我们的非微调MA模型为基础,我们在表5中展示了这些结果。去除掉差或批量归一化导致误差增加3- 8毫米,残留连接在我们的结果中占约8毫米的增益。然而,不将数据预处理到摄像机坐标的网络会导致超过100毫米的误差,这比最先进的性能差得多。

        最后,我们分析了网络对深度和宽度的敏感性。使用单个残留块可减少6mm, 2块后性能达到饱和。根据经验,我们观察到将层减少到512个维度的性能更差,而具有2 048个单元的层则要慢得多,并且似乎没有提高精度。

4.2. 定性结果

        最后,我们在图2中显示了Human3.6M的一些定性结果,在图3中显示了来自MPII测试集的“在野外”的图像。我们在MPII上的结果揭示了我们方法的一些局限性;例如,我们的系统无法从失败的检测器输出中恢复,并且它很难处理与H3.6M中的任何例子不相似的姿势(例如人倒立)。最后,在野外,大多数人的照片都没有完整的身体,而是在某种程度上被剪裁过。我们的系统受过全身姿势训练,目前无法处理这种情况。

5. 讨论

        从表2中,我们可以看到,在所有动作中使用SH检测进行训练时,与使用ground truth 2d进行训练相比,误差普遍增加——正如人们所预期的那样。然而,拍照、打电话、坐着和坐下的班级增加得特别多。我们假设这是由于这些动作中严重的自我遮挡——例如,在一些电话序列中,我们从来没有看到演员的一只手。同样,在坐着和坐下时,腿经常与相机视点对齐,这导致了大量的透视缩短。

进一步的改进方向 我们的系统的简单性表明在未来的工作中有多个改进方向。例如,我们注意到堆叠沙漏产生的最终联合检测热图大小为64 × 64,因此更大的输出分辨率可能会导致更细粒度的检测,使我们的系统在ground truth训练时更接近其性能。另一个有趣的方向是使用来自2d堆叠沙漏热图的多个样本来估计预期梯度(à la policy gradients,通常用于强化学习),以便端到端训练网络。还有一种想法是使用三维动作捕捉数据库和“假”摄像机参数来模拟二维探测器的输出,以进行数据增强,可能会遵循Shrivastava等人[41]的对抗方法。学习一致地估计场景中每个人的深度是一个有趣的研究路径,因为它将允许我们的系统对多人的3d姿势进行估计。最后,我们的体系结构很简单,对网络设计的进一步研究很可能会在2d-to-3d系统上取得更好的结果。

5.1. 我们结果的意义

        我们已经证明了一个相对简单的深度前馈神经网络可以在三维人体姿势估计上实现非常低的错误率。与最先进的2d检测器相结合,我们的系统获得了迄今为止3d姿态估计的最佳结果。

我们的结果与最近的工作相反,后者专注于从像素到3d位置的深度端到端系统训练,并与证明最近最先进的3d人体姿势估计方法的复杂性的潜在假设相矛盾。例如,[33]等人的体积回归方法是基于直接回归3d点本身就很困难的假设,而在体积空间中回归会为网络提供更容易的梯度(见[33]中的表1)。尽管我们同意图像内容应该有助于解决具有挑战性的模糊情况(例如考虑经典的转弯芭蕾舞者光学错觉),但通过简单的高容量系统,可以从2d点实现具有竞争力的3d姿态估计。这可能与人们[47]可以感知到的二维关节刺激中存在的关于精微身体和运动特征的潜在信息有关,如性别。类似地,在[27]中使用距离矩阵作为主体表示的理由是,不变的、人为设计的特征应该提高系统的准确性。然而,我们的结果表明,训练有素的系统可以以简单的方式超越这些特定的功能。看看关节距离和关节位置的组合是否会进一步提高性能,这将是很有趣的——我们把这个留给未来的工作。

6. 结论和未来工作

我们已经证明了一个简单、快速和轻量级的深度神经网络可以在2d-to-3d人体姿势估计任务中获得惊人的准确结果;再加上最先进的2d检测器,我们的工作结果是易于再现,但高性能的基线,在3d人体姿势估计方面优于最先进的水平。我们从2d ground truth进行3d姿态估计的准确性表明,尽管2d姿态估计被认为是一个接近解决的问题,但它仍然是3d人体姿态估计任务中误差的主要原因之一。此外,我们的工作以简单的2d和3d坐标表示姿势,这表明寻找人体的不变(和更复杂)表示,就像最近工作的重点一样,可能不是至关重要的,或者没有充分利用其潜力。

最后,考虑到其简单性和该领域的快速发展,我们喜欢将我们的工作视为未来的基线,而不是一个成熟的3d姿态估计系统。这意味着未来工作的多个方向。首先,我们的网络目前无法获得视觉证据;我们相信,无论是通过对二维检测进行微调,还是通过多传感器融合,将这些信息添加到我们的管道中,都将进一步提高性能。另一方面,我们的架构类似于多层感知器,这可能是人们能想到的最简单的架构。我们相信,对网络架构的进一步探索将会提高性能。这些都是未来工作的有趣领域。

鸣谢 作者感谢NVIDIA捐赠本研究中使用的图形处理器。Julieta在一定程度上得到了马克斯·普朗克智能系统研究所感知系统小组的支持。这项研究得到了加拿大自然科学与工程研究委员会(NSERC)的部分支持。

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

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

相关文章

手把手教你如何在项目中使用阿里字体图标IconFont

阿里图标官网地址:IconFont-阿里巴巴矢量图标库 一、注册账号 要使用阿里图标,首先你要在它的官网注册一个账号,注册的方式有多种(手机号,Github,微博,阿里域账号),根据…

【CSDN的2022与2023】普普通通的三年,从懵懂、焦虑到坚定、奋进,破除焦虑努力成为更好的自己

大家好,我是黄小黄!一名普通的软件工程在读学生。最近终于闲下来了一丢丢!借着休息之余,来写一篇年度总结散散心~与其说是年度总结,不如说是给大学生活与莽莽撞撞的自己一个交代叭! 这些都是小标题~碎碎念1…

行为型模式-观察者模式

1.概述 定义:又被称为发布-订阅(Publish/Subscribe)模式,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能…

深度卷积对抗神经网络 基础 第四部分 可控制的GANs(Controllable GANs)

不同的生成模型定义 深度卷积对抗神经网络包含两种不同的生成模型, 条件生成模型 和非条件生成模型。非条件生成模型就像是一个彩票机或者赌博机,你输入一个任意数字的硬币数量,而输出则是随机的彩球。这样的系统,我们不能控制输…

第九层(3):STL之vector类

文章目录前情回顾vrctor类vrctor类的功能vector与普通数组的区别vector的迭代器vector类内的构造函数vector类内的赋值操作vector类内对容器和大小操作vector类内的插入操作vector类内的删除操作vector类内的单个访问vector类内的交换函数vector类内的预留空间下一座石碑&#…

goto语句——“C”

各位CSDN的uu你们好啊,好久不见,甚是想念。今天小雅兰要带大家学习的内容是一个小知识点——goto语句,好啦,就让我们进入goto语句的世界吧 C语言中提供了可以随意滥用的goto语句和标记跳转的标号。 从理论上 goto语句是没有必要…

Python爬虫教你爬取视频内容

前面介绍了基本的数据爬取,图片爬取的相关案例前面文章也有涉及,关于有些案例网站不能登录的问题,可以再找些别的网站,因为道理既然明白了,其实什么网站都一样,它有反爬机制,自然有应对它的办法…

安装mysql 5.7.24

官网 https://downloads.mysql.com/archives/community/ 安装 安装好后解压有如下内容 配置电脑环境变量 MYSQL_HOME mysql安装目录 PATH %MYSQL_HOME%\bin 配置mysql相关信息 (1)新建配置文件my.ini 配置的是字符集类信息与存储引擎相关信息 &…

(Java高级教程)第四章必备前端基础知识-第二节2:CSS属性

文章目录一:CSS属性一览表二:常用属性详解(1)字体属性(2)文本属性(3)背景属性一:CSS属性一览表 W3C:元素属性 A: align-content规定弹性容器内…

[Android开发练习1] 绘制国旗

前言 本题主要在于熟练使用线性布局,了解其布局特点学会横向与纵向排列控件,以及认识TextView控件,同时学会使用对控件赋予不同的权重值来布局,在布局中使用了权重的控件的宽度就要设置成0dp。另外,了解到如何应对xml代…

Linux常见命令 25 - RPM包安装、升级、卸载、查询、校验、提取

目录 1. 包名与包全名 2. RPM安装 3. RPM包升级 4. RPM包卸载 5. 查询是否安装RPM包 6. RPM包校验 7. RPM包中文件提取 1. 包名与包全名 包全名:操作的包是没有安装的软件包时,使用包全名,而且要注意路径包名:操作已经安…

【进击的算法】基础算法——怎么优雅地控制边界范围

学习范围 : ✔️数组 ✔️边界控制本文作者 : 蓝色学者i 边界控制的艺术前言一、为什么需要控制边界?二、怎么优雅地控制边界?三、令人抓狂的二分查找3.1 题目概述3.2解题思路3.3 解决方案方案一:边界都有效方案二&…

Python3 循环语句

本章节将为大家介绍 Python 循环语句的使用。 Python 中的循环语句有 for 和 while。 Python 循环语句的控制结构图如下所示: while 循环 Python 中 while 语句的一般形式: while 判断条件(condition):执行语句(statements)…… 执行流程…

【数据结构之二叉树系列】万字深剖普通二叉树的遍历+分治算法思想

目录前言一、背景知识二、前序遍历三、中序遍历四、后序遍历五、求二叉树中结点的个数1. 遍历计数(1)前序遍历计数(2)中序遍历计数(3)后序遍历计数2.分治算法思想(推荐)敬请期待前言…

Java基础 IO

IO流 IO流 什么是IO流? 存储和读取数据的解决方案 I:input O:output 流:像水流一样传输数据 IO流的作用? 用于读写数据(本地文件,网络) IO流按照流向可以分类哪两种流&#xff1f…

数据库02_函数依赖,数据库范式,SQL语句关键字,数据库新技术---软考高级系统架构师009

1.首先我们来看这个,给定一个X,能确定一个Y那么就说,X确定Y,或者Y依赖x,那么 比如y = x * x 就是x确定y,或者y依赖于x 2.然后再来看图,那么左边的部分函数依赖,就是,通过A和B能决定C,那么如果A只用给就能决定C,那么就是部分函数依赖. 3.然后再来看,可以看到,A可以决定B,那么…

servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别

servlet过滤器Filter简要回顾-过滤请求字符编码,/和/*和/**的区别servlet过滤器1.filter过滤器的含义2.filter过滤器的使用3.测试-过滤字符编码正确响应中文编码3.1 创建servlet用于显示中文字符3.2 自定义过滤器3.3 配置web.xml中的servlet映射以及过滤器请求拦截3.4 运行输出…

【编程入门】开源记事本(安卓版)

背景 前面已输出多个系列: 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 本系列对比云笔记,将更为简化,去掉了网络调用&#xff0…

第二章 物理层

第二章 物理层 2.1 物理层的基本概念 物理层考虑的是怎样才能在连接各种就算机的传输媒体上传输数据比特流,而不是指具体的传输媒体 物理层的主要任务描述为确定与传输媒体的接口有关的一些特性 机械特性 指明接口所用接线器的形状和尺寸,引脚数目和排…

辗转相除以及辗转相减法

文章目录前言辗转相除法(又名欧几里算法)辗转相减法(又名更相减损法)原始辗转相减法改版辗转相减法(减的是指数)参考文章前言 在学习Acwing c蓝桥杯辅导课第八讲数论-AcWing 1223. 最大比例时有使用到求指…