news 2026/10/14 2:22:20

ViTPose 仓库 DeepFashion 服装关键点检测实战:DeepPose + ResNet 回归模型配置与评估指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ViTPose 仓库 DeepFashion 服装关键点检测实战:DeepPose + ResNet 回归模型配置与评估指南
  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】ViTPose

The official repo for [NeurIPS'22] "ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation" and [TPAMI'23] "ViTPose++: Vision Transformer for Generic Body Pose Estimation"

项目地址:https://gitcode.com/gh_mirrors/vi/ViTPose
点击查看免费下载

导读

本文聚焦当前 ViTPose 仓库中服装(时尚)二维关键点检测的DeepPose 回归方案,以 resnet_deepfashion.md 为骨架,完整拆解其基于 ResNet 骨干 + DeepPose 回归头的配置体系、数据流、训练/测试命令与 PCK/AUC/EPE 评估指标。读完本文,你将掌握如何在 DeepFashion(Fashion Landmark Detection)数据上复现 upper / lower / full 三个子集的关键点检测模型,并理解该方案与仓库源码(DeepposeRegressionHead)之间的实现对应关系。

一、方案背景:DeepPose 算法、ResNet 骨干与 DeepFashion 数据集

该配置组合了三个经典工作,文档顶部以 BibTeX 形式给出了全部引用,便于学术复现时正确署名:

角色论文出处
算法DeepPose: Human Pose Estimation via Deep Neural Networks(Toshev & Szegedy)CVPR 2014
骨干网络Deep Residual Learning for Image Recognition(He 等)CVPR 2016
数据集DeepFashion: Powering Robust Clothes Recognition and Retrieval with Rich Annotations(Liu 等)CVPR 2016
任务定义Fashion Landmark Detection in the Wild(Liu 等)ECCV 2016

其中DeepPose 是首个用深度神经网络直接回归关键点坐标的方案,与热力图(heatmap)范式不同,它把关键点检测建模为坐标回归问题;本配置正是该经典范式在服装关键点任务上的落地实现。

二、模型配置详解:ResNet50 + DeepposeRegressionHead

仓库为 DeepFashion 提供 9 个配置,按backbone(res50/res101/res152)× 子集(upper/lower/full)组合,目录位于 configs/fashion/2d_kpt_sview_rgb_img/deeppose/deepfashion/。以 res50_deepfashion_upper_256x192.py 为例,核心结构如下:

2.1 模型主体(model)

model = dict( type='TopDown', pretrained='torchvision://resnet50', backbone=dict(type='ResNet', depth=50, num_stages=4, out_indices=(3, )), neck=dict(type='GlobalAveragePooling'), keypoint_head=dict( type='DeepposeRegressionHead', in_channels=2048, num_joints=channel_cfg['num_output_channels'], loss_keypoint=dict(type='SmoothL1Loss', use_target_weight=True)), train_cfg=dict(), test_cfg=dict( flip_test=True, post_process='default', shift_heatmap=True, modulate_kernel=11))

要点说明:

  • type='TopDown':该配置沿用 top-down 流程,先由检测器给出服装区域 bbox,再在裁剪区域内回归关键点;
  • pretrained='torchvision://resnet50':使用 torchvision 提供的 ImageNet 预训练权重初始化;
  • backbone:ResNet50,num_stages=4、out_indices=(3,),只取最后一个 stage 输出;
  • neck=GlobalAveragePooling:将骨干输出的特征图全局平均池化为一维向量,供后续全连接回归头使用;
  • keypoint_head=DeepposeRegressionHead:输入通道 2048(ResNet50/101/152 的 stage4 输出通道数一致),输出关节数由channel_cfg决定(upper 为 6、lower 为 4、full 为 8);
  • loss_keypoint=SmoothL1Loss:回归损失采用 Smooth L1,且开启use_target_weight=True,按各关节的可见性权重加权。

res101与res152版本仅将pretrained与depth对应替换,其余结构相同,见 res101_deepfashion_full_256x192.py 与 res152_deepfashion_full_256x192.py。

2.2 通道配置(channel_cfg)

channel_cfg = dict( num_output_channels=6, # upper 子集为 6,lower 为 4,full 为 8 dataset_joints=6, dataset_channel=[[0, 1, 2, 3, 4, 5]], inference_channel=[0, 1, 2, 3, 4, 5])

该配置同时控制模型输出关节数、数据集关节定义以及推理时的通道映射。三个子集对应的关键点定义(见 deepfashion_upper.py、deepfashion_lower.py、deepfashion_full.py):

  • upper(6 点):left collar、right collar、left sleeve、right sleeve、left hem、right hem;
  • lower(4 点):left waistline、right waistline、left hem、right hem;
  • full(8 点):left collar、right collar、left sleeve、right sleeve、left waistline、right waistline、left hem、right hem。

从源码看,deepfashion_dataset.py 的DeepFashionDataset正是按subset='upper'/'lower'/'full'加载相应注释文件,并在dataset_info缺失时回退读取对应的_base_/datasets/deepfashion_*.py,与配置文件中的subset参数一一对应。

2.3 数据配置与预处理流水线(data_cfg / pipeline)

data_cfg = dict( image_size=[192, 256], # 输入图像尺寸(宽×高) heatmap_size=[48, 64], num_output_channels=channel_cfg['num_output_channels'], num_joints=channel_cfg['dataset_joints'], dataset_channel=channel_cfg['dataset_channel'], inference_channel=channel_cfg['inference_channel'], soft_nms=False, nms_thr=1.0, oks_thr=0.9, vis_thr=0.2, use_gt_bbox=False, det_bbox_thr=0.0, bbox_file='data/coco/person_detection_results/' 'COCO_val2017_detections_AP_H_56_person.json', )

说明:虽然配置文件名与文档结果表写作256x192,实际image_size=[192, 256]表示宽 192、高 256,即 256×192(H×W)。heatmap_size=[48, 64]在本回归方案中不参与目标生成,仅作数据结构预留。

训练流水线(train_pipeline)依次执行:LoadImageFromFile→TopDownRandomFlip(翻转概率 0.5)→TopDownGetRandomScaleRotation(旋转幅度 ±40 度、尺度变化 0.5)→TopDownAffine仿射变换 →ToTensor→NormalizeTensor(ImageNet 均值/方差)→TopDownGenerateTargetRegression(关键:生成回归坐标目标而非热力图)→Collect。验证/测试流水线仅去掉数据增强,保留仿射变换与归一化,见 res50_deepfashion_upper_256x192.py 第 70-108 行。

2.4 数据集路径与加载

data_root = 'data/fld' data = dict( samples_per_gpu=64, workers_per_gpu=2, val_dataloader=dict(samples_per_gpu=32), test_dataloader=dict(samples_per_gpu=32), train=dict( type='DeepFashionDataset', ann_file=f'{data_root}/annotations/fld_upper_train.json', img_prefix=f'{data_root}/img/', subset='upper', ...), ...)

即数据需按data/fld/annotations/fld_upper_{train,val,test}.json、fld_lower_*、fld_full_*的目录结构组织,图像放在data/fld/img/。仓库测试数据样例见 tests/data/fld/test_fld.json 及配套的img_00000128.jpg、img_00000132.jpg,可用于快速验证数据格式。

三、源码级的回归头实现原理

回归方案的灵魂在于 DeepposeRegressionHead,其结构异常精简——仅一层全连接:

self.fc = nn.Linear(self.in_channels, self.num_joints * 2) def forward(self, x): output = self.fc(x) N, C = output.shape return output.reshape([N, C // 2, 2])
  • 输入为GlobalAveragePooling后的 2048 维特征向量,输出被 reshape 为[N, K, 2],即每个关节的(x, y)坐标;
  • get_loss调用SmoothL1Loss计算回归损失,损失实现在 regression_loss.py 中,use_target_weight=True时对输出与目标按权重加权后计算F.smooth_l1_loss;
  • get_accuracy使用keypoint_pck_accuracy计算训练过程监控的 PCK 精度;
  • inference_model支持flip_pairs水平翻转回归融合(配合配置中flip_test=True使用);
  • decode将归一化坐标通过keypoints_from_regression(见 top_down_eval.py 第 441 行)乘回img_size,并利用transform_preds结合 bbox 的center与scale反变换回原图坐标;
  • init_weights对全连接层做normal_init(mean=0, std=0.01)初始化。

对比可见:DeepPose 回归头没有卷积解码、没有热力图生成,推理路径极短,这是其轻量、直接的特点。

四、训练与测试命令

4.1 训练

单卡训练 upper 子集模型:

python tools/train.py configs/fashion/2d_kpt_sview_rgb_img/deeppose/deepfashion/res50_deepfashion_upper_256x192.py

常用参数(详见 tools/train.py):

  • --work-dir:日志与模型保存目录;
  • --no-validate:训练期间跳过验证;
  • --gpu-id:指定 GPU(默认 0);
  • --seed/--deterministic:随机种子与 CUDNN 确定性;
  • --cfg-options:覆盖配置项,例如--cfg-options model.backbone.depth=50;
  • --launcher:多机训练可切换pytorch/slurm/mpi,也可参考仓库提供的 dist_train.sh 与 slurm_train.sh。

优化策略(继承自各 res50 配置):Adam 优化器、初始学习率 5e-4,warmup='linear'、warmup 500 iters、warmup 比例 0.001,学习率在 epoch 170 与 200 处按 step 策略衰减,总训练 210 epochs;每 10 个 epoch 保存一次 checkpoint(checkpoint_config = dict(interval=10),见 default_runtime.py)。

4.2 测试与评估

python tools/test.py \ configs/fashion/2d_kpt_sview_rgb_img/deeppose/deepfashion/res50_deepfashion_upper_256x192.py \ <checkpoint路径> \ --eval PCK AUC EPE

--eval接受多个指标(详见 tools/test.py 第 46-50 行),DeepFashionDataset.evaluate(deepfashion_dataset.py 第 154 行起)支持PCK、AUC、EPE三个指标,传入不支持的指标(如mAP)会抛出KeyError——这一点由 test_fashion_dataset.py 中的单测直接验证。配置中evaluation = dict(interval=10, metric='PCK', save_best='PCK')指定验证周期与最优模型保存依据。

五、评估指标解读:PCK / AUC / EPE

三个指标的含义与实现依据如下:

  • PCK@0.2(Percentage of Correct Keypoints):预测点与真值点的归一化距离小于阈值(0.2)的比例。归一化通常取 bbox 尺寸,实现见 top_down_eval.py 的_calc_distances与keypoint_pck_accuracy(第 179 行);
  • AUC(Area Under Curve):以不同 PCK 阈值为横轴绘制的曲线下面积,keypoint_auc(第 218 行)按 20 个步长采样计算;
  • EPE(End Point Error):预测点与真值点之间的平均欧氏距离,数值越小越好。

六、DeepFashion val 集实验结果

以下为文档给出的 ResNet50 回归模型在 DeepFashion val 集上的结果:

SetArchInput SizePCK@0.2AUCEPEckptlog
upperdeeppose_resnet_50256x2560.9650.53517.2ckptlog
lowerdeeppose_resnet_50256x2560.9710.67811.8ckptlog
fulldeeppose_resnet_50256x2560.9830.60214.0ckptlog

同一份结果同时登记在 resnet_deepfashion.yml 的模型索引中(含权重下载地址),可供模型库自动收集。三个子集因关键点数量与任务难度不同,指标呈现明显差异:lower 子集仅 4 个关键点、EPE 最低(11.8),full 子集 8 个关键点、PCK@0.2 最高(0.983)而 EPE 居中(14.0)。

七、小结

DeepFashion 上的 DeepPose 回归配置展示了 ViTPose 仓库对“非热力图范式”的完整支持:通过TopDownGenerateTargetRegression生成坐标目标、以单层全连接回归头输出关键点坐标、用SmoothL1Loss训练、并支持 PCK/AUC/EPE 三指标评估。仓库同时提供 res50/res101/res152 与 upper/lower/full 的 9 个组合配置,读者可基于 res50_deepfashion_upper_256x192.py 直接修改subset、ann_file与骨干深度,快速迁移到其他服装关键点场景。

  • 人工智能
  • 计算机视觉
  • 深度学习

【免费下载链接】ViTPose

The official repo for [NeurIPS'22] "ViTPose: Simple Vision Transformer Baselines for Human Pose Estimation" and [TPAMI'23] "ViTPose++: Vision Transformer for Generic Body Pose Estimation"

项目地址:https://gitcode.com/gh_mirrors/vi/ViTPose
点击查看免费下载

相关推荐

上一篇:XUnity.AutoTranslator:十分钟让没中译的 Unity 游戏跑起来
下一篇:GitHub_Trending/aw/awesome-computer-vision奖学金资源:计算机视觉领域 funding 信息

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

惠普 DL380 Gen9 安装win10系统

1.图片2.先F10 清除原来的阵列信息 创建单盘raid0 作为系统盘 然后F11进入冰封启动pe 然后diskgenis创建自动分区1 然后安装win10的镜像到系统清除阵列并重新创建&#xff0c;会丢失该阵列上的所有数据&#xff0c;操作前请务必确认数据已完成备份或确实不再需要。1. 清除现…

作者头像 李华
网站建设 2026/10/14 2:21:28

ponytail插件:轻量级代码去重与资源收拢实战指南

1. 从“ponytail”这个词说起&#xff1a;它到底指什么第一次看到“ponytail”这个词&#xff0c;绝大多数人脑子里蹦出来的画面是发型——马尾辫。但在技术圈和工具圈里&#xff0c;这个词最近被反复提起&#xff0c;尤其是和“插件”绑在一起之后&#xff0c;它的含义就完全变…

作者头像 李华
网站建设 2026/10/14 2:20:30

DNS与ICMP实战:从网站打不开到网络故障排查全解析

早上九点刚过&#xff0c;同事在群里喊了一嗓子"官网打不开了&#xff0c;快点看一下"。第一反应自然是先确认连通性——ping一下域名&#xff0c;结果直接报unknown host&#xff0c;连域名都解析不出来。改成ping IP地址&#xff0c;通了&#xff0c;延迟还很正常。…

作者头像 李华