ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Patch-NetVLAD的PCA降维魔法:add_pca.py完整工作流,128/512/4096维如何选择

Patch-NetVLAD的PCA降维魔法:add_pca.py完整工作流,128/512/4096维如何选择 Patch-NetVLAD的PCA降维魔法add_pca.py完整工作流128/512/4096维如何选择【免费下载链接】Patch-NetVLADCode for the CVPR2021 paper Patch-NetVLAD: Multi-Scale Fusion of Locally-Global Descriptors for Place Recognition项目地址: https://gitcode.com/gh_mirrors/pa/Patch-NetVLADPatch-NetVLAD 是 CVPR 2021 的多尺度融合位置识别VPR框架其 add_pca.py 脚本负责给训练好的模型加上 WPCA白化 PCA降维层把 8192 维的 NetVLAD 全局描述子压缩到128 / 512 / 4096 维在精度、存储和检索速度之间自由权衡。本文将从零讲清 PCA 在 Patch-NetVLAD 中的作用原理、add_pca.py的完整四步工作流以及三种维度该怎么选。为什么 NetVLAD 描述子必须做 PCA 降维 Patch-NetVLAD 的编码链是VGG16 编码器512 维特征→ NetVLAD 池化16 个聚类→ 8192 维描述子。这个 8192 维向量虽然信息丰富但直接用有两个痛点存储与检索成本8192 维 × 4 字节 ≈ 每张图片 32KB万级图库就是数百 MB距离计算也成倍变慢方差分布不均原始特征各方向方差差异极大直接算距离时少数大方差维度会主导结果降低检索区分度。WPCA 一次性解决两个问题先做 PCA 去掉相关性、按方差排序保留主要成分再白化每个成分除以其特征值平方根让所有保留维度方差趋于一致最后 L2 归一化让余弦/欧氏距离都更稳定。这正是 patchnetvlad/training_tools/tools.py 中pca()函数源自原始 NetVLAD 的 MATLAB 实现做的事。add_pca.py 完整工作流4 步看懂降维魔法 运行前只需记住一点PCA 必须在已有 checkpoint 的基础上做——add_pca.py需要--resume_path指向一个训练好的模型否则直接报错。第 1 步加载 checkpoint自动推断模型结构脚本用 add_pca.py 的--resume_path加载权重并从pool.centroids的形状自动推断聚类数num_clusters再以不追加 PCA 层的方式重建模型patchnetvlad/models/models_generic.py 中的get_model(..., append_pca_layerFalse)。同时用 patchnetvlad/configs/train.ini 里的seed固定随机性保证可复现。第 2 步批量推理提取训练特征脚本从 PCA 数据集里随机抽样最多 10000 张图像nFeatures 10000两选一--dataset_choice mapillary用 MSLS 训练城市MSLS(modetest, citiestrain)--dataset_choice pitts读 patchnetvlad/dataset_imagenames/pitts30k_imageNames_index.txt 图库列表。然后逐 batch 跑encoder → pool把每张图片的 8192 维描述子存进dbFeat矩阵10000 × 8192。第 3 步计算 PCA 并白化核心魔法所在 ✨pca(dbFeat, num_pcs)的计算细节减均值后若维度 样本数走对偶路线在 10000×10000 协方差矩阵上求特征否则直接对 8192×8192 矩阵用scipy.sparse.linalg.eigs稀疏求特征值特征值按从大到小排序取前num_pcs个白化U × diag(1/√λ)让每个主成分贡献均等。第 4 步构建 WPCA 层另存新模型白化矩阵被封装成一个1×1 卷积 Flatten L2Norm的WPCA模块挂到模型尾部1×1 卷积在这里就等价于一次线性投影。最终保存路径有讲究原 checkpointxxx.pth.tar→ 新文件xxx_WPCA{num_pcs}.pth.tar如mapillary_WPCA4096.pth.tar后续 feature_extract.py 会根据配置里的num_pcs字段自动拼接加载对应权重resumepath num_pcs .pth.tar所以你改配置里的num_pcs推理时用的就是对应维度的 WPCA 模型。128 / 512 / 4096 维到底怎么选三个维度对应三种取舍官方同时提供了 mapillary / pitts 三档预训练权重如mapillary_WPCA128.pth.tar一般无需自己训练维度单图特征存储精度表现适用场景128≈ 512 B略有损失但依然很强资源受限、超大规模图库、移动端部署512≈ 2 KB中高档位均衡之选存储与精度都想兼顾的通用场景4096≈ 16 KB最高论文主实验结果精度优先、服务器端检索选型口诀先默认 4096它是论文默认配置patchnetvlad/configs/train.ini 与 patchnetvlad/configs/performance.ini 中num_pcs 4096追求最高 Recall 就选它图库上万张、设备吃紧 → 128Patch-NetVLAD 的本地重排机制让低维特征也能保持竞争力拿不准 → 512折中档位pitts 数据集也提供了对应权重。⚠️ 注意pca()内部有assert num_pcs n_dims即num_pcs必须小于 8192128/512/4096 都在安全范围内。实战速查3 条命令跑通全流程 ⚡1️⃣ 给 checkpoint 加 WPCA 层num_pcs由配置文件决定pixi run add-pca \ full/path/to/your/saved/checkpoint.pth.tar \ /path/to/your/mapillary/datasetCPU 环境记得加--nocuda用 Pitts 图库训练 PCA 则加--dataset_choice pitts。2️⃣ 提取特征自动按num_pcs加载 WPCA 权重pixi run extract \ pitts30k_imageNames_index.txt \ /path/to/your/pitts/dataset \ patchnetvlad/output_features/pitts30k_index3️⃣ 双图匹配验证效果官方示例图东京街景查询对 vs 数据库图pixi run match-two \ patchnetvlad/example_images/tokyo_query.jpg \ patchnetvlad/example_images/tokyo_db.png新手常见踩坑清单 ⚠️没带 checkpoint 就跑add_pca.py必须提供--resume_path否则抛出ValueError: Need an existing checkpoint in order to run PCA恢复官方预训练模型训练WPCA 层不是可训练主干resume 官方模型前需先移除 WPCA 层README 有提示维度与权重不匹配feature_extract.py会断言权重WPCA.0.bias的维度等于配置num_pcs配置和文件不一致会报错跑完忘了清空显存脚本末尾自动torch.cuda.empty_cache()批量换维度连跑时注意这一点。小结add_pca.py就是 Patch-NetVLAD 的收尾魔法——用 1 万张图估出白化投影把 8192 维描述子压到 128/512/4096 维。默认 4096 保精度128 省存储512 取平衡一条命令即可完成整个降维流程。【免费下载链接】Patch-NetVLADCode for the CVPR2021 paper Patch-NetVLAD: Multi-Scale Fusion of Locally-Global Descriptors for Place Recognition项目地址: https://gitcode.com/gh_mirrors/pa/Patch-NetVLAD创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表