【论文阅读】【yolo系列】YOLO-Pose的论文阅读

Abstract

我们介绍YOLO-pose,一种无热图联合检测的新方法,基于流行的YOLO目标检测框架的图像二维多人姿态估计。
【现有方法的问题】现有的基于热图的两阶段方法是次优的,因为它们不是端到端可训练的,训练依赖于surrogate L1 loss,该损失不能直接优化评估指标–目标关键点相似度(OKS)。
【ours优势:端到端训练,并优化OKS指标本身,无复杂的后处理】该模型学习了在一次前向传递中 联合检测多个人的边界框及其相应的2D姿态,从而实现了自上而下和自下而上两种方法的最佳效果。
所提出的方法不需要对自下向上的方法进行后处理,以将检测到的关键点分组到一个骨架中,因为每个边界框都有一个相关的姿态,从而导致关键点的固有分组。与自上而下的方法不同,该方法在一次推理中定位所有人的姿态,无需多次前向传递。

YOLO-pose在COCO验证(90.2% AP50)和测试开发方面取得了新的最先进的结果
https://github.com/TexasInstruments/edgeai-yolov5
https://github.com/TexasInstruments/edgeai-yolox

1 Introduction

多人2D姿态估计是理解图像中的人的任务。给定一个输入图像,目标是检测每个人并定位他们的身体关节。由于图像中人数的变化、尺度的变化、身体部位的遮挡、人体的非刚性以及其他各种原因,因此推断图像中多个身体的姿势具有挑战性。
在这里插入图片描述
图1. COCO2017样本图像的检测结果。左图:从yolov5m6-pose的输出 显示了我们的方法的鲁棒性。一个人的关键点因为固有的分组而不会与另一个人误解。右图:来自HigherHRNetW32的输出,显示了即使在关键点位置基本正确,分组算法容易错误。自下向上的方法在拥挤的场景中容易出现这种分组错误。

【现有的姿态估计解决方案】分为自上而下和自下而上。

  • 自上而下的[30],[8],[12],[13],[19]或两阶段的方法是目前最先进的。他们首先使用一个人检测器,并对每个检测进行单人姿态估计。自上而下的方法的复杂性与图像中的人数呈线性上升。
    大多数需要持续运行时的实时应用程序不喜欢上顶方法,因为高复杂性和可变的运行时。
  • 自下而上的[4]、[5]、[14]、[23]、[25]方法提供恒定的运行时,因为它们依赖热图来检测单张图中的所有关键点,然后通过复杂的后处理将它们分组。在自下而上的方法中,后处理可以包括像素级NMS、线积分、细化、分组等步骤。坐标调整和细化 降低了下采样热图的量化误差,而NMS则用于寻找热图中的局部极大值。
    即使经过后处理,热图也可能不够尖锐,无法区分同一类型的两个非常接近的关节。同样,自下而上的方法不能被端到端训练,因为后处理步骤是不可微的,并在卷积网络之外进行。不同的方法,从线性规划到各种启发式[4],自下而上法的后处理方法有很大不同,但都很难使用CNN加速,因此速度相当慢。
  • one-shot法[34,35]虽然避免了分组任务,但其性能不如自下而上法。它们进一步依赖于额外的后处理来提高性能。

【将关键点检测与目标检测对齐统一的可行性】

  • 我们这项工作的动机是解决没有热图的姿态估计问题,与目标检测一致。目标检测具有类似于姿态估计的挑战,如尺度变化、遮挡、人体非刚性等。因此,如果单人的检测器网络能够解决这些挑战,它也就可以处理姿态估计。
    例如,最新的目标检测框架试图通过对多个尺度进行预测来减轻尺度变化的问题。在这里我们采用相同的策略,来预测对应的多个尺度上的人体姿态。同样,目标检测领域的所有主要进展,都无缝传递到姿态估计问题上。我们提出的姿态估计技术在不额外增加计算量的情况下,可以很容易地集成到任何计算机视觉系统。

【ours方案的操作】

  • 我们基于流行的YOLOv5 [1]框架,将我们的方法称为YOLO-Pose。这是第一次集中尝试解决没有热图的二维姿态估计的问题,重点是摆脱目前使用的各种非标准化的后处理。我们的方法使用了与目标检测中相同的后处理方法。
    我们在COCO关键点数据集[7]上验证了我们的模型,并证明了与具有类似复杂性的模型相比,在AP上的竞争性准确性,及在AP50方面的显著改进。
  • 在我们的方法中,与ground truth box匹配的一个anchor box或 anchor point,将存储其完整的2D姿态和边界框的位置。
  • 好处:恒定的运行时间和简单的后处理。
    • 与自下而上相比,来自不同的人的两个相似的关节可以在空间上彼此接近。
      热图的方式,很难区分不同的人的两个空间相近的关节;当这两个人与不同的锚点相匹配,就很容易区分空间上接近和相似的关键点。
    • 与自顶向下的方法不同,YOLO-Pose的复杂性与图像中的人数无关。

我们的贡献:

  • 1 向统一 目标检测和关键点检测 这两个领域迈出了第一步。
    我们建议根据目标检测来解决多人姿态估计,因为主要的挑战是相同的(如尺度变化、遮挡等)。我们的方法将直接受益于目标检测领域的任何进展。
  • 2 端到端、恒定的运行时间、简单的后处理。
    heatmap-free方法使用标准的目标检测后处理,而不是复杂的后处理(包括像素级NMS、调整、细化和线积分、各种分组算法)。该方法是鲁棒性的,因为端到端训练,无需独立的后处理。
  • 3 将IOU LOSS从 box detection扩展到关键点。
    对象关键点相似度(OKS)不仅用于评估,还用于训练的损失。OKS损失是尺度不变的,固有地给不同的关键点给予不同的权重。
  • 4 效果好、速度快、复杂度低:实现SOTA AP50,且减少了4倍的计算量。
    • 在cocotest-dev2017上,SOTA DEKR [30]在283.0 GMACS上达到89.4的AP50;Yolov5m6pose在66.3 GMACS达到89.8的AP50。
    • 将检测与姿态估计联合的框架,在目标检测框架上几乎不额外增加运算实现了姿态估计。
    • 提出了低复杂度的模型,明显超过了EfficientHRNet等实时的模型。

2 Related Work

多人2D姿态估计可以分为自上而下和自下向上的方法。

2.1.自顶向下的方法

自上而下的[8][12][13][19][20][21]或两阶段方法首先使用像快速RCNN [21]这样的较大的人检测器进行人体检测,然后估计每个被检测到的人的2d姿态。因此,计算复杂度随人数呈线性增加。现有的自上而下的方法主要侧重于网络架构的设计。如:Mask-RCNN [20]检测关键点作为分割掩码;Simple Baseline[8]提出了一个简单的架构:具有较深的主干和几个反卷积层,以扩大输出特性的分辨率。
这些方法是尺度不变的,因为它们在相同的尺度上处理所有的目标,在主流的基准测试上实现了最先进的性能。然而,它们在处理遮挡方面很差。

2.2.自下而上的方法

自下向上的方法是[4][5][14][23][25]在一个张图中找出图像中所有的人的关键点,然后将他们分组到个人实例中。自下而上的方法使用heatmap的概率映射,它估计了特定关键点在每个像素的概率。关键点的确切位置是通过NMS找到的热图的局部极大值。自下而上的方法通常的复杂性较低,并且具有恒定运行时的优势。
然而,与自上而下的方法相比,准确性有了大幅下降。还有各种其他的调整和细化步骤,以从热图中提取更好的关键点。不同方法中,不一致的部分是将关键点检测分到的身体部位进行分组的策略。

  • OpenPose [4]构建了一个模型,其中包含两个分支来预测关键点热图和关键点之间的亲和度,它们是建模关节之间关联的二维向量。在分组过程中使用了亲和度。
  • 在associative embedding[5]中,训练网络来预测每个关节的关键点热图和标签值。损失函数被定义为预测属于同一个人的关节的相似标签值,以及属于不同人的关节的不同标签值。
  • Chen等人提出了更高的HRNet [9],它利用更高的输出分辨率来大幅度提高预测精度。
  • Geng et.al. [30]最近提出了disentangled keypoint representation(DEKR),提出了一种使用偏移映射的直接回归方法。它提出一个可利用自适应卷积来回归相应关键点的偏移量的 具有k个分支的结构。这种方法需要关键点热图和后处理中的各种NMS操作的中心热图。尽管后处理没有任何分组,但它并不像我们的那样简单。

3 YOLO-Pose

yolo-pose不使用热图。它将一个人的所有关键点与anchor point 联系起来。它是基于YOLOv5的目标检测框架,也可以扩展到其他框架。我们已经在YOLOX [2]上也一定程度上对其进行了验证。图2说明了具有用于姿态估计的关键点头的总体架构。
在这里插入图片描述


3.1 Overview

yolov5的选择
为了展示我们的解决方案的全部潜力,我们必须选择一个能够良好地检测人类的架构。YOLOv5在精度和复杂性方面是一个领先的检测器。因此,我们选择它作为我们的基础,并在其之上构建。YOLOv5主要关注于80类COCO [7]目标检测,box_head 预测每个锚点85个元素。它们对应于80个类的边界框、目标分数和置信度。对应于每个网格位置,有三个不同形状的锚点。

关键点检测的添加

  • head 输出的设计:
    对于人类姿态估计,它归结为一个单类的人检测问题,每个人有17个相关的关键点,每个关键点再次识别一个位置和可信度: x,y,conf \text{x,y,conf} x,y,conf。因此,与一个锚点关联的17个关键点总共有51个元素。因此,对于每个锚点,关键点头预测51个元素,检测框预测6个元素。对于具有n个关键点的锚点,总体预测向量定义为: P v = C x , C y , W , H , b o x c o n f , c l a s s c o n f , K x 1 , K y 1 , K c o n f 1 , . . . , . . . , K x n , K y n , K c o n f n P_{v}={C_x,C_y,W,H,box_{conf},class_{conf},K^1_x,K^1_y,K^1_{conf},...,...,K^n_x,K^n_y,K^n_{conf}} Pv=Cx,Cy,W,H,boxconf,classconf,Kx1,Ky1,Kconf1,...,...,Kxn,Kyn,Kconfn关键点置信度是基于该关键点的可见性标志进行训练的。如果一个关键点是可见的或被遮挡的,那么标签的置信度为1;在视场之外则置信度设置为0。在推理过程中,我们保留了可信度大于0.5的关键点。所有其他预测的关键点都将被去除。预测的关键点置信度不用于评估。由于网络预测了每个检测的所有17个关键点,我们需要过滤掉视场之外的关键点。否则,就会有悬挂的关键点,导致骨骼变形。现有的基于热图的自下而上方法不需要这样做,因为视场之外首先没有检测到关键点。
  • 整体结构的设计:
    YOLO-Pose使用CSP-darknet53[27]作为主干,而PANet [6]来融合来自主干的不同尺度的特征。接下来是四个不同尺度的检测头。最后,有两个解耦的头用于预测检测框和关键点。
  • 模型复杂度:
    在这项工作中,我们将其复杂性限制在150 GMACS,在此范围内,我们能够实现具有竞争力的结果。随着复杂性的进一步增加,能够缩小与自上而下方法的差距。然而,我们并不追求这条道路,因为我们关注的是实时模型。

3.2 基于Anchor的多人姿势公式

对于一个给定的图像,与一个人匹配的anchor的位置内会存储人体的2D姿态和位置框。这样关键点和目标框都被预测到锚的中心。

  • box的中心会根据锚点进行转换,而框的宽高会被锚的宽高标准化。
  • 关键点位置会根据锚点进行转换,但不会与锚的高度和宽度进行标准化。由于这样的改进独立于锚的宽度和高度,它可以很容易地扩展到anchor-free的目标检测方法,如YOLOX [2],FCOS [28]。

3.3 基于IoU的边界框的损失函数

大多数目标检测器会使用 优化了IoU 损失的变体:GIoU、DIoU、CIoU(不是基于距离的框检测损失)。因为这些损失是尺度不变的,并能够直接优化了评估策略本身。
我们使用CIoU损失来进行边界框监督。对于一个标定的真实边界框,匹配上第k个anchor,位置 (i,j) 和比例s上的锚点,损失定义为 L b o x ( s , i , j , k ) = ( 1 − C I O U ( B o x g t x , i , j , k , B o x p r e d x , i , j , k ) ) L_{box}(s,i,j,k)=(1-CIOU(Box^{x,i,j,k}_{gt},Box^{x,i,j,k}_{pred})) Lbox(s,i,j,k)=(1CIOU(Boxgtx,i,j,k,Boxpredx,i,j,k)) B o x p r e d x , i , j , k Box^{x,i,j,k}_{pred} Boxpredx,i,j,k是第 k t h k^{th} kth的anchor在位置(i,j)和尺度为s的检测框。在本文的设计中,每个位置都有三个锚点,预测发生在四个尺度上。


3.4 人体姿态损失函数公式

OKS是评估关键点的最流行的指标。

  • L1损失的问题:
    传统上,基于热图的自下而上方法使用L1损失来检测关键点。然而,L1的损失并不一定适合获得最佳的OKS。同样,L1损失是简单的,并且没有考虑对象的比例或关键点的类型。由于热图是概率图,因此在基于纯热图的方法中不可能使用OKS作为损失。
  • OKS用作损失函数:
    仅当使用回归的方法获取关键点位置时。Geng et. al. [30]提出使用尺度归一化L1损失进行关键点回归,这是迈向OKS损失的一步。因此,我们在锚点直接回归的关键点,我们可以优化评估策略本身,而不是一个代理损失函数。
  • 我们扩展了边界框的IOU损失到关键点上。
    在出现关键点时,OKS被视为IOU。OKS损失本质上是尺度不变的,对某些关键点更重要。例如,一个人头部上的关键点(眼睛、鼻子、耳朵)比他身体上的关键点(肩膀、膝盖、臀部等)受到的惩罚更多。这些加权因子是由COCO的作者从冗余注释的验证集中根据经验选择的。原始的IOU损失会在非重叠时出现梯度消失,但OKS损失不会停滞。因此,OKS损失更类似于dIoU [37]损失。

工程中具体的公式

  • OKS损失
    针对每一个单独的关键点计算OKS,并累计到最终的OKS损失或关键点IOU,即:
    在这里插入图片描述
  • 置信参数损失
    对于每个关键点,我们学习一个置信参数,显示该人是否存在一个关键点。在这里,关键点是否可见作为真实标签。可得:
    在这里插入图片描述
  • 总的损失
    如果真实标注的边界框和第 K t h K^{th} Kth个anchor匹配了,那么在位置(i,j),尺度s 以及anchor的损失将会有效。最后,在所有尺度、anchors和位置上的损失表示为:
    在这里插入图片描述
    其中, λ c l s \lambda_{cls} λcls=0.5, λ b o x \lambda_{box} λbox=0.05, λ k p t s _ c o n f \lambda_{kpts\_conf} λkpts_conf=0.5

3.5.测试时间调整

所有的姿态估计的SOTA方法都依赖于测试时间增强(TTA)来提高性能。

  • 推理时间的增加
    翻转和多尺度是两种常用的技术。翻转增加了2倍;而多尺度在三个尺度{0.5X,1X,2X}上,增加了复杂性(0.25X + 1X+4X)= 5.25X。随着翻转测试和多尺度测试的进行,5.25*2x=10.5X的复杂性上升。在我们的比较表中,我们相应地调整了复杂性。
  • 准备增强的数据本身也可能很昂贵。
    在翻转时,翻转图像来增加系统的延迟。同样,多尺度测试也需要为每个尺度调整大小操作。这些操作可能相当昂贵,它们自身不会加速,不像CNN的操作。
  • 融合各种正向传播的输出会带来额外的成本。

对于一个嵌入式系统,如果我们能在没有任何TTA的情况下获得有竞争的结果,这是最有利的。我们所有的结果都没有任何TTA。


3.6 边界框外的关键点

自上而下的方法在遮挡条件下表现不佳。与自上而下的方法相比,YOLO-Pose方法的优点之一是对关键点在预测的边界框内没有约束。因此,如果关键点由于遮挡而位于边界框之外,那么它们仍然可以被正确识别。然而,在自上而下的方法中,如果人的检测不正确,姿态估计也会失败。在我们的方法中,遮挡和错误的边界框检测的这些挑战都在一定程度上得到了缓解,如图3所示。
在这里插入图片描述
图3. 解决自上而下的方法所面临的挑战。
顶部: YOLO-pose正确地预测了位于边界框外的被遮挡的关键点。底部:对于中间的人,框的检测并不准确。然而,这并没有限制右脚踝出错的关键点。自上而下的方法可能会完全错过右脚踝的关键点。


3.7.ONNX导出,以易于部署

ONNX将深度学习模型转换为ONNX,使其能够在各种平台上有效地部署。现有自下而上方法的后处理没有标准化,使用的操作不是标准深度学习库的一部分。例如,基于关联嵌入的自下而上方法使用 KuhnMunkres算法[29]进行分组,该算法不可微,不属于任何深度学习库的一部分。
在我们的模型中使用的所有操作符都是标准的深度学习库的一部分,并且也与ONNX兼容。因此,整个模型可以导出到ONNX中,使其易于跨平台部署。这个独立的ONNX模型可以使用ONNX Runtime来执行,它将一个图像作为输入,并推断出图像中每个人的边界框和姿势。

4. Experiments


4.1. COCO Keypoint Detectio

  • 数据集
    在COCO数据集上评估了我们的模型。它包含了超过20万张图片,有25万人的实例,有17个关键点。train2017 包含57K图像,而val2017 和 test-dev2017 分别由5K和20K图像组成。我们在train2017上训练该模型,并报告val2017和test-dev2017上的结果。
  • 评价指标
    我们遵循标准的评估指标,并使用基于OKS的COCO姿态指标评价。我们报告了不同阈值和不同对象大小下的平均精度和平均召回率评分: AP、AP50、AP75、APL、AR。
  • 训练
    我们采用了与YOLOv5 [1]类似的增强、锚定选择和损失加权策略。我们使用随机尺度([0.5,1.5])、随机翻译的数据增强[-10,10]、概率为0.5的随机翻转、概率为1的镶嵌增强以及各种颜色增强。我们使用带有余弦调度器的SGD优化器。基本学习率设置为1e-2。我们对这个模型训练了300轮。选择损失重量以平衡第3.4节中所述的各种损失。
  • 测试
    我们首先将输入图像的大边调整到所需的尺寸,以保持长径比。图像的下方被填充以生成一个正方形图像。这就确保了所有的输入图像都具有相同的大小。

4.2. Results on COCO val2017

YOLOpose取得了领先的性能,并且运算量比同期最领先的DEKR节省近一半的运算量。
在这里插入图片描述


4.3.消融研究: OKS损失与L1损失。

OKS的损失是我们工作的主要贡献之一。由于这种损失比L1损失更受到限制,因此训练时更加稳定。当使用L1损失训练时 我们必须调整损失权重。在YOLv5- s6_960上的测试中,OKS损失明显优于L1损失。我们用[30]中的尺度归一化L1损失来训练我们的模型,以检查尺度不变性对我们的损失公式的影响。
在这里插入图片描述
表3. 各项损失函数的比较。在损失中添加比例信息可以提高准确性。然而,OKS损失是获得最优OKS度量的最佳选择


4.4.消融研究:跨分辨率。

我们已经通过不同的分辨率训练了我们的模型。我们选择了960作为我们的基本分辨率,因为我们能够在这个分辨率下获得具有竞争力的性能。除此之外,YOLOv5-s6模型的性能增益已经大大饱和,如下图所示:
在这里插入图片描述
在较低的分辨率下,YOLOv5s6姿态的表现明显优与现有的最先进的低复杂度模型,如COCO上的EfficientHRNet。


4.5.消融研究:量化

【激活的选择】
Renjie Liu等人[38]观察到的,像SiLU或hardSwish 的无界激活函数对量化不友好的,而具有ReLUX激活的模型对量化是鲁棒的,因为他们有界的本性。
YOLOv5模型是基于SiLU激活。我们这里使用ReLU激活 重新训练了我们的模型。我们观察到在从SiLU改变到ReLU的激活过程中下降了约1-2%。我们称这些模型为YOLOv5_relu。
【量化后的性能】
我们已经将这些模型量化,以进一步将它们定位为嵌入式友好型。这些模型可以被量化,其精度下降可以忽略不计(~1.2%),如下表以YOLOv5-s6_960_relu为例所示。
在这里插入图片描述
【量化时具体的操作】

  • 使用16位量化,AP的下降0.1%可以忽略不计,而AP50没有下降。
  • 在使用8位量化时,精度会显著下降。
  • 在混合精度中,只有一个选定的少数卷积层在16位,其余的层在8位,我们能够从浮动大大过渡到1.2%。在我们的混合精度设置中,我们设置所有层中的16位层占比约为30%。
    由于大多数CNN加速器都是针对整数操作进行优化的,因此通过8位量化或混合精度实现良好的精度对于在嵌入式系统中部署任何模型都是至关重要的。量化后的模型可以降低延迟和降低功耗。

以上结果是通过训练后量化(PTQ),而不是量化感知训练(QAT)。


4.6.COCOtest-dev2017上的指标

在test-dev dataset上的结果如表2所示。
在这里插入图片描述
对于mAP,与具有相似计算量的自下而上SOTA方法相比,我们的模型具有竞争力。YOLOPose显示了AP50的强大结果,超过了如图6所示的所有自下而上的方法。这归因于我们的方法是固有分组的、端到端的训练,该分组比其他自下而上的方法中的独立分组要健壮得多。
如图1所示。YOLO-Pose有联合学习的好处。由于我们的模型可以正确地定位每个人的实例,因此它能够以相当好的精度预测相关的关键点,从而显著改善AP50。图5和图6提供了AP50的简单比较。
YOLOv5m6-Pose达到了89.8的AP50。
DEKR(以HRNetW48为backbone)达到了89.4的AP50。
在这里插入图片描述

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

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

相关文章

Linux pageset

1. 引言 在用户进程发生缺页异常时,Linux内核需要分配所需物理页面以及建立也表映射,来维持进程的正常内存使用需求。而对于分配物理页面仅依赖于buddy系统,对于小order页面的分配效率较低。因此Linux通过在每个cpu维护一个page链表&#xff…

12 Autosar_SWS_MemoryMapping.pdf解读

AUTOSAR中MemMap_autosar memmap-CSDN博客 1、Memory Map的作用 1.1 避免RAM的浪费:不同类型的变量,为了对齐造成的空间两份; 1.2 特殊RAM的用途:比如一些变量通过位掩码来获取,如果map到特定RAM可以通过编译器的位掩码…

爬取链家二手房房价数据存入mongodb并进行分析

实验目的 1.使用python将爬虫数据存入mongodb; 2.使用python读取mongodb数据并进行可视化分析。 实验原理 MongoDB是文档数据库,采用BSON的结构来存储数据。在文档中可嵌套其他文档类型,使得MongoDB具有很强的数据描述能力。本节案例使用的…

IP地址定位可以精确到哪里

IP地址定位能够精确到的位置级别取决于多种因素,包括IP地址的分配方式、数据库的质量和更新频率、用户的移动性等。一般而言,IP地址定位可以精确到市级,甚至可以达到街道级别 https://www.ip66.net/?utm-sourceLJ&utm-keyword?1146 但需…

LeetCode494. Target Sum——01背包

文章目录 一、题目二、题解 一、题目 You are given an integer array nums and an integer target. You want to build an expression out of nums by adding one of the symbols ‘’ and ‘-’ before each integer in nums and then concatenate all the integers. For …

大数据在电商领域的典型应用

大数据作为一种新兴的信息技术,是无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。 大数据技术是指在数据获取、存储、管理、…

程序媛的mac修炼手册-- 如何彻底卸载Python

啊,前段时间因为想尝试chatgpt的API,需要先创建一个python虚拟环境来安装OpenAI Python library. 结果,不出意外的出意外了,安装好OpenAI Python library后,因为身份认证问题,根本就没有获取API key的权限…

Shader基础的简单实现(基于URP渲染)

一个模型是很多个顶点组成,顶点数据中包含坐标、法线、切线、UV坐标、顶点颜色等等组成。 URP(Universal Render Pipeline)通用渲染管线,是Unity在2019.3版本之后推出的一种新的渲染管线。传统的渲染管线在渲染多光源的情况,是把每一个主要光…

C语言第二十八弹---整数在内存中的存储

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】 目录 1、整数在内存中的存储 2、大小端字节序和字节序 2.1、什么是大小端? 2.2、为什么有大小端? 2.3、练习 2.3.1、练习1 2.3.2、练习2 2.…

Java 注解机制解密并发编程的时间之谜:揭开Happens-Before的神秘面纱

优质博文:IT-BLOG-CN 一、简介 为什么需要happens-before原则: 主要是因为Java内存模型 , 为了提高CPU效率,通过工作内存Cache代替了主内存。修改这个临界资源会更新work memory但并不一定立刻刷到主存中。通常JMM会将编写的代码…

Pytorch 复习总结 2

Pytorch 复习总结,仅供笔者使用,参考教材: 《动手学深度学习》Stanford University: Practical Machine Learning 本文主要内容为:Pytorch 线性神经网络。 本文以机器学习中的两大基本问题 —— 回归和分类为例,介绍…

【数据结构初阶 6】二叉树:堆的基本操作 + 堆排序的实现

文章目录 🌈 Ⅰ 二叉树的顺序结构🌈 Ⅱ 堆的概念与性质🌈 Ⅲ 堆的基本操作01. 堆的定义02. 初始化堆03. 堆的销毁04. 堆的插入05. 向上调整堆06. 堆的创建07. 获取堆顶数据08. 堆的删除09. 向下调整堆10. 判断堆空 🌈 Ⅳ 堆的基本…

【selenium】八大元素定位方式|xpath css id name...

目录 一、基础元素定位 二、cssSelector元素定位——通过元素属性定位 三、xpath元素定位——通过路径 1 、xpath绝对定位 (用的不多) 缺点:一旦页面结构发生变化(比如重新设计时,路径少两节)&#x…

从计网的角度讲明白什么是网关

网关(Gateway)又称网间连接器、协议转换器。网关在传输层上以实现网络互连,是最复杂的网络互连设备,仅用于两个高层协议不同的网络互连。网关的结构也和路由器类似,不同的是互连层。网关既可以用于广域网互连,也可以用于局域网互连…

JDBC实现连接池

简单上手 使用 JDBC 来执行 SQL 查询和更新操作 import java.sql.*;public class Main {public static void main(String[] args) {String url "jdbc:mysql://localhost:3306/your_database_name";String username "your_username";String password &…

vs2015零基础编译zlib从失败到成功

本博文源于笔者不断尝试从0编译zlib到能够将文件打包成zip的一个简单过程,其中包含了如何下载zlib,如何编译zlib,如何使用zlib等。内容堪比教科书级别,可以收藏,可以自用,希望博文能帮助到读者。 1、下载z…

Protocol Buffers v21.12 安装 ( linux 系统 )

下载 Protocol Buffers v21.12 Protocol Buffers v21.12 解压 tar zxvf protobuf-cpp-3.21.12.tar.gz执行 进入解压目录,执行下面configure可执行程序,目的是监测安装环境,生成makefile ./configure执行完后可以检查是否生成makefile文件 构…

Unity单元测试

Unity单元测试是一个专门用于嵌入式单元测试的库, 现在简单讲下移植以及代码结构. 源码地址: GitHub - ThrowTheSwitch/Unity: Simple Unit Testing for C 1.我们只需要移植三个文件即可: unity.c, unity.h, unity_internals.h 2.然后添加需要测试的函数. 3.在main.c中添加…

Swift基础知识:23.Swift析构过程

在 Swift 中,析构过程是指在一个类的实例被释放之前进行的清理操作。通常,这些清理操作包括释放实例所持有的资源、取消订阅通知、关闭文件等。Swift 使用析构器(deinitializer)来实现析构过程,它类似于构造器&#xf…

公司文件防泄密管理系统

公司文件防泄密管理系统是一种综合性的解决方案,旨在确保企业文件的安全性和保密性,防止内部员工或外部攻击者非法获取、泄露或篡改敏感信息。 PC端:https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfedee 以下是关于…