news 2026/10/15 10:15:59

人体2D关键点检测2016-2020:从OpenPose到HRNet的论文复现与工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
人体2D关键点检测2016-2020:从OpenPose到HRNet的论文复现与工程实践

人体2D关键点检测这个方向,我从2018年前后开始跟进,中间踩过不少坑,也复现过不少论文。2020年之后这个领域基本被自顶向下和自底向上两条路线瓜分,但真正把2016到2020年这几篇里程碑式的工作串起来看,会发现很多设计思路其实是一脉相承的。这篇文章我打算把这几年的核心论文和配套代码做一个系统梳理,重点讲清楚每篇工作到底解决了什么问题、关键模块怎么实现、复现时要注意哪些细节。如果你正在做姿态估计相关的项目,或者想从零搭建一套关键点检测系统,这篇内容应该能帮你省下不少查资料和试错的时间。

1. 人体2D关键点检测的整体技术脉络

1.1 这个任务到底在解决什么问题

人体2D关键点检测,说白了就是从一张RGB图像里找出人体各个关节的位置,比如鼻子、左右肩、左右肘、左右腕、左右髋、左右膝、左右踝这些点,通常COCO数据集定义的是17个点,MPII是16个点。输出形式一般是每个点的(x, y)坐标,有时候还会带一个置信度分数。

这个任务看起来简单,实际做起来难点非常多。人体姿态变化极大,有正面、侧面、背面,还有各种遮挡、截断、多人重叠的情况。衣服颜色、光照、背景复杂度都会影响检测效果。更麻烦的是,关键点本身是语义概念,不像角点那样有明确的纹理特征,所以早期基于手工特征的方法效果一直上不去。

2016年之后深度学习全面接管这个领域,核心思路变成了两个:一是把关键点检测当成热力图回归问题,每个关键点生成一张高斯热力图,峰值位置就是预测坐标;二是用CNN来提取多尺度特征,解决不同尺度下人体关键点的定位问题。这两条思路基本奠定了后面几年的技术基调。

1.2 两条主流技术路线:自顶向下 vs 自底向上

自顶向下的思路是先用一个人体检测器把图中所有人框出来,然后对每个人框单独做单人的关键点检测。这种方法的优点是每个框里只有一个人,尺度归一化后关键点检测相对简单,精度通常更高。缺点是检测框的质量直接影响最终结果,而且人数越多耗时越长,因为每个人都要跑一遍网络。

自底向上的思路是先检测出图中所有的关键点,然后通过聚类或者关联算法把这些点组装成不同的人。这种方法的优点是推理速度和人数基本无关,适合多人场景。缺点是在拥挤场景下,关键点归属容易出错,后处理比较复杂。

2016到2020年这段时间,两条路线都有代表性工作。自顶向下的代表是CPN、SimpleBaseline、HRNet,自底向上的代表是OpenPose、Associative Embedding、HigherHRNet。实际工程中选哪条路线,主要看你的场景是单人还是多人、对实时性要求高不高、算力预算有多少。

1.3 从2016到2020的关键节点

2016年OpenPose出来的时候,第一次实现了实时多人2D关键点检测,用的是Part Affinity Fields来关联关键点,这个思路影响了很多后续工作。同年,Stacked Hourglass把多尺度特征和重复堆叠结构引入这个任务,在MPII上刷到了很高的精度。

2017年CPN提出级联金字塔结构,用GlobalNet和RefineNet两级网络分别处理简单和困难的关键点,在COCO上拿了冠军。2018年SimpleBaseline用最朴素的反卷积结构证明了,不需要太复杂的网络设计,只要骨干网络够强、训练策略对,也能达到很好的效果。

2019年HRNet是个转折点,它全程保持高分辨率特征,通过并行多分辨率子网和反复交互来融合不同尺度的信息,在COCO和MPII上都达到了当时的SOTA。2020年HigherHRNet把HRNet扩展到自底向上场景,解决了小尺度人体的检测问题。

这几篇工作基本代表了2016到2020年这个领域的最高水平,代码也都很成熟,适合拿来复现和学习。

2. 核心论文与代码拆解

2.1 OpenPose:实时多人检测的奠基之作

OpenPose的核心贡献是提出了Part Affinity Fields,简称PAFs。传统的自底向上方法要么先检测关键点再聚类,要么先检测人体部件再组装,但OpenPose用PAFs来编码关键点之间的关联信息,直接端到端训练。

具体来说,网络输入一张图像,输出两组热力图:一组是关键点置信度图,每个关键点一张;另一组是PAFs,每对相邻关键点之间一张,比如左肩到左肘、左肘到左腕。PAFs是2通道的向量场,表示从第一个关键点指向第二个关键点的方向信息。

后处理的时候,先对关键点置信度图做非极大值抑制得到候选点,然后沿着PAFs的积分来匹配相邻关键点,最后组装成完整的人体骨架。这个匹配过程用的是二分图匹配,把关键点关联问题转化成最优匹配问题。

代码复现的时候有几个关键点要注意。首先是网络结构,OpenPose用的是VGG-19的前10层作为骨干,后面接多阶段的双分支结构,每个阶段都输出关键点热力图和PAFs,然后和上一阶段的输出拼接后送入下一阶段。这种多阶段 refinement 的设计能逐步优化预测结果。

训练数据方面,OpenPose用的是COCO和MPII的混合数据,但COCO只有17个关键点,MPII有16个,需要做映射。实际训练的时候,关键点热力图用的是高斯峰值,PAFs用的是单位向量场,损失函数是L2损失。

注意:OpenPose的官方代码是Caffe写的,后来有PyTorch版本,但复现时建议先用官方预训练模型验证推理效果,再尝试训练。训练时batch size要足够大,否则PAFs的匹配效果会很差。

实测下来,OpenPose在单人场景下精度不错,但多人拥挤场景下容易把不同人的关键点串在一起。另外它的推理速度在1080Ti上大概能到20多FPS,但用VGG-19骨干比较重,后来很多人换成MobileNet做轻量化。

2.2 Stacked Hourglass:多尺度堆叠的经典结构

Stacked Hourglass是2016年出来的,核心思想是用重复的hourglass模块来捕捉多尺度信息。每个hourglass模块先通过一系列卷积和池化把特征图降采样,然后再上采样回来,中间用skip connection把同尺度的特征连起来。这样既能捕捉全局信息,又能保留局部细节。

多个hourglass堆叠的时候,每个模块的输出都会用来做中间监督,同时也会作为下一个模块的输入。这种设计让网络可以在不同阶段反复 refinement,逐步优化关键点位置。

代码实现上,每个hourglass模块通常包含4阶降采样,每阶用残差模块。中间监督用的是MSE损失,对每个hourglass的输出都计算损失,最后加权求和。这种中间监督能加速收敛,也能防止梯度消失。

复现的时候要注意,Stacked Hourglass对输入分辨率比较敏感,通常用256x256的输入。训练时数据增强很重要,随机旋转、缩放、翻转都要做,否则容易过拟合。另外它的参数量比较大,8个hourglass堆叠的时候大概有25M参数,推理速度偏慢。

实操心得:Stacked Hourglass在MPII上效果很好,但在COCO上不如后来的HRNet。如果要做多人场景,建议还是用自顶向下的框架,Stacked Hourglass作为单人检测器。

2.3 CPN:级联金字塔网络的两级 refinement

CPN是2017年COCO关键点挑战赛的冠军方案,核心是两级网络:GlobalNet和RefineNet。GlobalNet负责检测容易的关键点,比如眼睛、鼻子、肩膀这些;RefineNet负责检测困难的关键点,比如手腕、脚踝这些容易被遮挡或者截断的点。

GlobalNet用的是ResNet作为骨干,后面接几个卷积层输出热力图。RefineNet把GlobalNet的中间特征和输出拼接起来,再通过一系列卷积和反卷积来 refinement。这种级联结构能让网络先关注简单点,再逐步处理困难点。

代码复现的时候,关键是要把GlobalNet和RefineNet的训练分开做,先训GlobalNet,再固定它的参数训RefineNet。损失函数用的是L2,但困难点的权重要调高一些,否则网络会偏向容易的点。

CPN在COCO上的AP大概能到72左右,在当时是很高的水平。但它的结构比较复杂,训练时间也长,实际工程中如果追求性价比,SimpleBaseline可能更合适。

2.4 SimpleBaseline:最朴素的结构也能打

SimpleBaseline是2018年出来的,它的核心贡献其实不是网络结构,而是证明了训练策略的重要性。网络结构非常简单:ResNet作为骨干,后面接几个反卷积层把特征图恢复到输入分辨率的1/4,然后输出热力图。

就这么简单的结构,在COCO上能到70+的AP,比很多复杂网络都好。关键在于训练策略:用了更好的数据增强、更长的训练周期、更合理的损失函数权重。这说明在关键点检测任务里,数据增强和训练策略可能比网络结构更重要。

代码复现非常容易,PyTorch版本几十行就能写完。反卷积层用的是kernel size 4、stride 2、padding 1的配置,输出通道数分别是256、256、17。损失函数用的是MSE,优化器用Adam,学习率用step decay。

注意:SimpleBaseline的反卷积层容易产生棋盘效应,实际用的时候可以用双线性插值加卷积代替反卷积,效果差不多但更稳定。

实测下来,SimpleBaseline在单人场景下精度和速度平衡得很好,适合作为baseline。但它的骨干网络ResNet-152比较重,如果要做实时应用,可以换成ResNet-50或者MobileNet。

2.5 HRNet:高分辨率特征贯穿始终

HRNet是2019年的工作,核心思想是全程保持高分辨率特征。传统的网络都是先降采样再上采样,高分辨率信息在降采样过程中会丢失。HRNet用并行多分辨率子网,从高到低都有,然后反复做跨分辨率的信息交换。

具体来说,HRNet一开始只有一个高分辨率分支,然后逐步增加低分辨率分支,每个阶段都把不同分辨率的特征做融合。融合的方式是:低分辨率特征上采样后和高分辨率特征相加,高分辨率特征下采样后和低分辨率特征相加。这样每个分辨率都能获得其他分辨率的信息。

这种设计让HRNet在关键点检测上效果非常好,COCO上AP能到75+,MPII上PCKh能到92+。而且它的参数量和计算量都比Stacked Hourglass小,推理速度也更快。

代码复现的时候,关键是理解多分辨率融合的实现。HRNet的官方代码是PyTorch写的,结构很清晰,但要注意每个stage的通道数和分辨率配置。训练时用Adam优化器,学习率用cosine decay,数据增强用随机旋转、缩放、翻转。

实操心得:HRNet对输入分辨率很敏感,通常用256x192或者384x288。输入分辨率越高,精度越好,但速度越慢。实际部署时可以根据场景选择合适的分辨率。

2.6 HigherHRNet:自底向上的高分辨率方案

HigherHRNet是2020年的工作,把HRNet扩展到自底向上场景。它的核心贡献是提出了高分辨率特征金字塔和热力图聚合策略,解决了小尺度人体检测的问题。

传统的自底向上方法在小尺度人体上效果很差,因为降采样后小人的关键点就几个像素,很难检测。HigherHRNet用高分辨率特征金字塔,在不同尺度上都做预测,然后把结果聚合起来。聚合的时候用的是softmax加权,让网络自己学习不同尺度的权重。

代码复现的时候,要注意它的后处理比较复杂,需要做关键点聚类和人体组装。官方代码提供了完整的推理流程,但训练时要注意多尺度监督的实现。

HigherHRNet在COCO test-dev上AP能到70+,在自底向上方法里是很高的水平。但它的推理速度比自顶向下方法慢,因为要做多尺度预测和后处理。

3. 实操复现的关键步骤与配置

3.1 环境搭建与依赖安装

复现这些代码,环境配置是第一步。我一般用conda建虚拟环境,Python版本选3.7或3.8,PyTorch选1.6到1.8之间的版本,太新的版本可能会有兼容性问题。

conda create -n pose python=3.8 conda activate pose conda install pytorch==1.7.1 torchvision==0.8.2 cudatoolkit=10.2 -c pytorch pip install opencv-python numpy scipy matplotlib pip install pycocotools

pycocotools是必须的,因为COCO数据集的评估要用它。安装的时候如果报错,可以先装cython再装pycocotools。

数据准备方面,COCO数据集大概25G,MPII大概12G。下载后解压到指定目录,然后按照官方代码的说明生成标注文件。COCO的标注文件是person_keypoints_train2017.json和person_keypoints_val2017.json,MPII的是mpii_annotations.json。

注意:COCO数据集的标注格式和MPII不一样,如果要做混合训练,需要先做格式转换。COCO是17个关键点,MPII是16个,映射关系要搞清楚。

3.2 数据增强与预处理

数据增强在关键点检测里非常重要,直接影响最终精度。常用的增强手段包括随机旋转、随机缩放、随机翻转、随机裁剪、颜色抖动。

随机旋转的角度范围一般是-30到30度,缩放范围是0.75到1.25,翻转概率是0.5。翻转的时候要注意左右关键点的索引要交换,比如左肩和右肩、左肘和右肘。

预处理方面,输入图像要归一化到0到1之间,然后减去均值除以标准差。均值标准差一般用ImageNet的配置,即mean=[0.485, 0.456, 0.406],std=[0.229, 0.224, 0.225]。

热力图生成的时候,用的是高斯核,sigma一般取2到3个像素。生成的时候要注意,如果关键点被遮挡或者超出图像范围,对应的热力图要置零,不参与损失计算。

def generate_heatmap(keypoints, heatmap_size, sigma=2): heatmap = np.zeros((num_keypoints, heatmap_size[1], heatmap_size[0])) for i, (x, y, v) in enumerate(keypoints): if v == 0: continue xx, yy = np.meshgrid(np.arange(heatmap_size[0]), np.arange(heatmap_size[1])) heatmap[i] = np.exp(-((xx - x)**2 + (yy - y)**2) / (2 * sigma**2)) return heatmap

3.3 模型训练与调参

训练的时候,batch size一般设32或64,学习率初始值设1e-3,用Adam优化器。学习率调度用step decay,比如每30个epoch降一次,降为原来的0.1。

损失函数用MSE,但要注意对不可见的关键点要mask掉,不计算损失。如果用的是中间监督,每个阶段的损失都要加权求和,权重一般设1.0。

训练周期方面,COCO数据集一般训210个epoch,MPII训200个epoch。训练时间取决于GPU,用V100的话,HRNet大概要2到3天。

实操心得:训练的时候要监控验证集的AP,如果AP不涨了就可以停。另外,用预训练的骨干网络能加速收敛,比如ResNet用ImageNet预训练的权重。

调参的时候,学习率和batch size是最重要的两个参数。学习率太大容易震荡,太小收敛慢。batch size太小梯度噪声大,太大显存不够。我一般先用小学习率试几个epoch,看loss下降情况再调整。

3.4 推理与后处理

推理的时候,输入图像先做resize和padding,然后送进网络得到热力图。热力图的峰值位置就是关键点坐标,但要做一些后处理。

首先是对热力图做高斯滤波,平滑一下。然后找每个关键点的最大值位置,如果最大值小于阈值,就认为该关键点不可见。最后把热力图坐标映射回原图坐标,注意要减去padding的偏移。

多人场景下,自顶向下的方法要先做人体检测,可以用YOLO或者Faster R-CNN。检测框做NMS后,对每个框单独做关键点检测。自底向上的方法要做关键点聚类,可以用Associative Embedding或者PAFs。

def get_max_preds(heatmaps): batch_size, num_keypoints, height, width = heatmaps.shape heatmaps_reshaped = heatmaps.reshape((batch_size, num_keypoints, -1)) idx = np.argmax(heatmaps_reshaped, 2) maxvals = np.amax(heatmaps_reshaped, 2) idx = idx.reshape((batch_size, num_keypoints, 1)) preds = np.tile(idx, (1, 1, 2)).astype(np.float32) preds[:, :, 0] = preds[:, :, 0] % width preds[:, :, 1] = preds[:, :, 1] // width preds = np.where(np.tile(maxvals, (1, 1, 2)) > 0.0, preds, -1) return preds, maxvals

4. 常见问题与排查技巧

4.1 训练不收敛怎么办

训练不收敛是最常见的问题,可能的原因有几个。一是学习率太大,loss震荡不下降,这时候把学习率调小10倍试试。二是数据增强太强,网络学不到有效特征,可以先把增强关掉,看能不能过拟合小数据集。三是损失函数有问题,比如热力图生成的时候sigma设得太小,导致正样本太少。

还有一种情况是骨干网络没有用预训练权重,从头训很难收敛。建议先用ImageNet预训练的权重初始化骨干,再训关键点检测头。

排查技巧:先拿10张图做小规模训练,看能不能过拟合。如果过拟合都做不到,说明网络结构或者损失函数有问题。如果能过拟合但验证集不涨,说明是过拟合或者数据分布问题。

4.2 关键点抖动严重怎么解决

关键点抖动一般是因为热力图峰值不够尖锐,或者后处理的时候没有做平滑。解决方法有几个:一是训练的时候用更大的sigma,让热力图更平滑;二是推理的时候对热力图做高斯滤波;三是用时序信息做平滑,比如视频场景下用卡尔曼滤波。

另外,输入分辨率太低也会导致抖动,因为热力图分辨率低,峰值位置精度不够。可以适当提高输入分辨率,或者用soft-argmax代替argmax,得到亚像素精度的坐标。

4.3 多人场景下关键点串人怎么办

自底向上方法在多人场景下容易串人,主要是因为关键点关联出错。解决方法有:一是用更强的PAFs或者Associative Embedding;二是后处理的时候用二分图匹配,而不是简单的贪心匹配;三是用人体检测框做约束,把不在框内的关键点过滤掉。

自顶向下方法一般不会串人,但检测框漏检或者重叠的时候会有问题。可以调低检测阈值,增加召回率,然后用NMS去掉重复框。

4.4 推理速度太慢怎么优化

推理速度优化有几个方向。一是换轻量骨干,比如MobileNet、ShuffleNet,精度会降一些但速度快很多。二是降低输入分辨率,从384x288降到256x192,速度能快一倍。三是用TensorRT或者ONNX Runtime做推理加速,能快2到3倍。四是剪枝和量化,把不重要的通道剪掉,或者用INT8量化。

实测下来,HRNet用MobileNet骨干,输入256x192,在1080Ti上能到30FPS左右,精度降2到3个点,基本能满足实时需求。

优化方法速度提升精度损失实现难度
换轻量骨干2-3倍2-4 AP低
降低分辨率1.5-2倍1-3 AP低
TensorRT2-3倍0-1 AP中
剪枝量化1.5-2倍1-2 AP高

4.5 小尺度人体检测效果差怎么办

小尺度人体检测是自底向上方法的痛点。解决方法有:一是用高分辨率特征金字塔,比如HigherHRNet;二是多尺度测试,把图像放大后再检测;三是用数据增强,训练的时候多放一些小尺度的人体。

自顶向下方法在小尺度上相对好一些,因为检测框会把小人放大到统一尺度。但如果检测器漏检了小人,后面也白搭。可以专门训一个针对小目标的检测器,或者用多尺度检测。

5. 工具选型与工程落地建议

5.1 框架选择:PyTorch vs TensorFlow

2016到2020年这段时间,关键点检测的代码大部分是PyTorch写的,少部分是TensorFlow。PyTorch的动态图机制调试方便,社区活跃,新论文的官方代码基本都是PyTorch。TensorFlow在部署上有优势,特别是TF Lite和TF Serving。

如果要做研究或者复现论文,建议用PyTorch。如果要做工程部署,可以考虑把PyTorch模型转成ONNX,再用TensorRT或者ONNX Runtime推理。

5.2 骨干网络选型对比

骨干网络的选择直接影响精度和速度。ResNet系列是最常用的,ResNet-50速度精度平衡,ResNet-152精度高但慢。HRNet系列精度最高,但计算量也大。MobileNet系列速度最快,但精度一般。

骨干网络参数量COCO AP推理速度适用场景
ResNet-5025M70+快通用
ResNet-15260M72+中高精度
HRNet-W3228M74+中高精度
MobileNetV23M65+很快移动端

5.3 部署注意事项

部署的时候要注意几点。一是输入分辨率要和训练时一致,否则精度会降。二是预处理和后处理要和训练时一致,特别是归一化和热力图生成。三是模型转换的时候要注意算子兼容性,有些自定义算子ONNX不支持。

如果部署在移动端,建议用NCNN或者MNN,对ARM架构优化好。如果部署在服务器,用TensorRT能获得最好的性能。

实操心得:部署前一定要做精度对齐测试,用同样的输入分别跑训练框架和推理框架,看输出差异有多大。如果差异超过1个像素,就要检查预处理和后处理是不是一致。

6. 从2016到2020的技术演进总结

6.1 网络结构设计的演变

从OpenPose的多阶段双分支,到Stacked Hourglass的重复堆叠,到CPN的级联金字塔,到SimpleBaseline的极简反卷积,再到HRNet的并行多分辨率,网络结构的设计越来越注重多尺度信息的融合和高分辨率特征的保持。

早期的网络靠堆叠和级联来提升精度,后来的网络靠结构设计来提升效率。HRNet是个分水岭,它证明了全程保持高分辨率特征比先降后升更好。这个思路后来被很多工作借鉴,包括分割、检测等任务。

6.2 训练策略的演进

训练策略方面,数据增强越来越强,训练周期越来越长,损失函数越来越精细。SimpleBaseline的工作特别强调了训练策略的重要性,同样的网络结构,好的训练策略能提升好几个点。

另外,中间监督、多尺度监督、在线难例挖掘这些技术也被广泛使用。HRNet用了多分辨率监督,HigherHRNet用了多尺度聚合,都是为了让网络更好地学习不同尺度的特征。

6.3 实际工程中的选型建议

实际工程中选哪个方案,主要看场景。单人场景或者人数少的场景,用自顶向下的HRNet或者SimpleBaseline,精度高速度快。多人拥挤场景,用自底向上的HigherHRNet或者OpenPose,速度稳定但精度稍低。

如果算力有限,用MobileNet骨干的SimpleBaseline,精度够用速度很快。如果追求极致精度,用HRNet-W48,但速度会慢一些。

我个人在实际项目中的体会是,没有最好的方案,只有最合适的方案。先明确场景需求,再选技术路线,最后调参优化。不要一上来就追求SOTA,先把baseline跑通,再逐步改进。

最后再分享一个小技巧:复现论文的时候,先跑通推理,用预训练模型验证效果,再尝试训练。训练的时候先用小数据集过拟合,确认网络和损失函数没问题,再上全量数据。这样能省很多调试时间。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/15 10:15:22

从“还行”到无可挑剔:打造高质量交付的实操流程

1. 从“还行”到“无可挑剔”:impeccable到底在讲什么“impeccable”这个词,最早在我这儿扎下根,不是因为英语词典,而是因为一次交付现场。客户验收时什么都没说,只回了一句“This is impeccable.” 我当时愣了一下&am…

作者头像 李华
网站建设 2026/10/15 10:15:06

Superpowers技能包:AI编程助手能力扩展与安装配置指南

1. 从“superpowers”这个标题说起:它到底是什么第一次看到“superpowers”这个词,很多人脑子里蹦出来的可能是漫威电影里的超能力,或者是某个游戏里的技能系统。但如果你最近在开发者社区、效率工具圈或者AI辅助编程的讨论里频繁刷到它&…

作者头像 李华
网站建设 2026/10/15 10:14:32

ponytail插件:轻量级数据聚合与自动化工作流实战指南

1. 从“ponytail”这个词说起:它到底指什么第一次看到“ponytail”这个词,大多数人脑子里蹦出来的画面是扎在脑后的马尾辫。但在技术圈和工具生态里,ponytail 早就不是一个发型词汇了。它是一类轻量级、可插拔、专注于“收束与聚合”能力的工…

作者头像 李华
网站建设 2026/10/15 10:14:10

SpringBoot整合NapCatQQ实现高效QQ机器人开发

1. 项目概述:当QQ机器人遇上SpringBoot去年接手公司内部自动化通知系统改造时,我第一次将NapCatQQ与SpringBoot整合。这个组合带来的开发效率提升让我印象深刻——原本需要两周完成的客服机器人原型,用这个方案三天就跑了通。NapCatQQ作为轻量…

作者头像 李华
网站建设 2026/10/15 10:13:58

考虑P2G与碳捕集的热电联供综合能源系统优化调度模型

去年在搭一个某区域综合能源系统仿真平台的时候,我盯着跑完的冬季日数据看了很久。电负荷高、热负荷也高,热电联供机组几乎满发;到了夜间风电上来,电负荷往下掉,可热负荷几乎没降,机组为了供热根本压不住发…

作者头像 李华
网站建设 2026/10/15 10:13:22

CTF隐写题“藏藏藏”破解全流程:从PNG尾部到二维码

1. 先拆解"藏藏藏"背后的出题思路1.1 三个"藏"字,暗含的关卡节奏拿到这道题的第一反应,其实是觉得出题人挺会起名的。很多隐写题的标题都很直白,比如"图中有图""隐秘的信息",一看就知道考什么。但"藏藏藏"三个字叠在一起,给…

作者头像 李华