如何用NetVLAD训练自己的数据: 继承dbBase开发自定义地点识别数据集完整步骤

📅 发布时间:2026/8/22 14:50:20
如何用NetVLAD训练自己的数据: 继承dbBase开发自定义地点识别数据集完整步骤 如何用NetVLAD训练自己的数据: 继承dbBase开发自定义地点识别数据集完整步骤【免费下载链接】netvladNetVLAD: CNN architecture for weakly supervised place recognition项目地址: https://gitcode.com/gh_mirrors/ne/netvladNetVLAD 是一个面向弱监督地点识别place recognition的经典 CNN 架构MATLAB 开源实现只需提供图片和 UTM 坐标即可完成训练无需人工标注。本文带你完整走完 6 个步骤继承 dbBase.m 数据集基类开发一个自定义地点识别数据集并用trainWeakly在自己的数据上训练出可用的网络。一、开始之前数据与环境准备NetVLAD 的弱监督意味着你不需要标注这张图对应哪个地点只需要 3 样东西需要的数据说明数据库图片db用于建库的图像存放在一个根目录下查询图片q用于测试检索的图像可单独一个目录UTM 坐标每张图拍摄位置的 (x, y) 坐标单位米组成2×N矩阵只要知道两张图的 UTM 距离小于某个阈值posDistThr它们就被认为可能为正样本这就是弱监督信号的全部来源。环境方面需要 MATLAB relja_matlab MatConvNet可选 Yael 提速依赖配置写在 localPaths.m.setup 中——把它复制为localPaths.m并修改路径即可。拿到代码git clone https://gitcode.com/gh_mirrors/ne/netvlad二、读懂 dbBase一切从这里开始datasets/dbBase.m 是所有内置数据集Pittsburgh、Tokyo 24/7、Tokyo Time Machine 等的父类。它的属性定义了数据集的全部核心信息name数据集短标识名同时也是规格文件的文件名dbPath / dbImageFns数据库图片根目录 相对文件名列表qPath / qImageFns查询图片根目录 相对文件名列表utmDb / utmQ两组 UTM 坐标posDistThr正样本距离阈值米nonTrivPosDistSqThr训练时非平凡正样本的距离平方上限最关键的逻辑在 dbLoad 方法它会从paths.dsetSpecDir/db.name.mat加载一个名为dbStruct的 MATLAB 结构体自动完成三件事把dbStruct各字段灌入数据集属性调用 closePosition 构建空间哈希索引db.cp让找距离阈值内的正样本和随机采负样本都变成毫秒级操作校验坐标列数与图片数量一致并把路径转成绝对路径。也就是说你只需要准备好数据和一个结构体正负样本挖掘、召回率评测等逻辑全部由基类免费赠送。三、开发自定义数据集的 6 个步骤文件头部的注释dbBase.m#L1-L16就是官方指南最简范例可参考 dbPitts.m。第 1 步继承 dbBase 创建子类在datasets/下新建dbMyCity.m文件名必须与类名一致classdef dbMyCity dbBase methods function db dbMyCity(whichSet) % whichSet: train 或 val assert( ismember(whichSet, {train,val}) ); % 第 2 步短标识名 db.name sprintf(mycity_%s, whichSet); % 第 4 步图片根目录来自 localPaths.m paths localPaths(); db.dbPath [paths.dsetRootMyCity, images/]; db.qPath [paths.dsetRootMyCity, queries/]; % 第 5 步加载 db.dbLoad(); end end end注意[dbPath, dbImageFns{i}]与[qPath, qImageFns{i}]拼接后必须是能直接打开的完整图片路径。第 2 步为每个 split 指定db.name训练、验证、测试集应使用不同的 name如mycity_train、mycity_val因为每个 name 对应一个独立的.mat规格文件trainWeakly也靠 name 区分缓存文件。第 3 步生成规格文件 dbStruct写一段一次性脚本遍历你的图片目录、读取 GPS/UTM 元数据组装出 6 个必备字段后保存dbStruct struct(); dbStruct.dbImageFns {…}; % celldb 图片相对文件名 dbStruct.qImageFns {…}; % cellquery 图片相对文件名 dbStruct.utmDb utmDb; % 2×numImages dbStruct.utmQ utmQ; % 2×numQueries dbStruct.posDistThr 10; % 正样本阈值米按场景尺度定 dbStruct.nonTrivPosDistSqThr 2000^2; % 训练用非平凡正样本上限米² save(sprintf(%s/%s.mat, paths.dsetSpecDir, mycity_train), dbStruct);⚠️posDistThr是灵魂参数街区级数据取 10~30 米比较合理设得过大同一地点图片混太多负样本质量下降loss 会虚低。第 4 步在 localPaths.m 注册路径在 localPaths.m 中添加数据集根目录变量例如paths.dsetRootMyCity ~/Databases/MyCity/;并在构造函数中引用它。同时确认paths.dsetSpecDir指向你存放.mat规格文件的目录。第 5 步构造函数末尾调用db.dbLoad()缺了这一步所有属性都是空的。第 6 步可选重写方法适配特殊数据如果你的 query 是从 db 中挖出来的同一位置多次拍摄建议参考 dbTokyoTimeMachine.m 重写nontrivialPosQ把同一时刻拍摄的正样本排除掉迫使网络学习真正的泛化能力也可重写nnSearchPostprocess对搜索结果做去重NMS。普通数据集可以完全跳过这一步。✅ 快速自检db dbMyCity(train); disp([db.numImages, db.numQueries]); % 数量应 0 disp(db.isPosQ(1, 1:100)); % 查一下第 1 张 query 的正样本四、开始训练一次 trainWeakly 调用数据集就绪后训练入口就是 trainWeakly.m参数说明详见 README_more.mddbTrain dbMyCity(train); dbVal dbMyCity(val); sessionID trainWeakly(dbTrain, dbVal, ... netID, vd16, layerName, conv5_3, backPropToLayer, conv5_1, ... method, vlad_preL2_intra, ... learningRate, 0.0001, ... doDraw, true); [~, bestNet] pickBestNet(sessionID); % 按验证集 recall5 挑最优 finalNet addPCA(bestNet, dbTrain, doWhite, true, pcaDim, 4096);几个关键参数netID/layerName初始网络AlexNet 或 VGG-16 预训练模型截取到最后一层卷积method特征聚合方式vlad_preL2_intra即标准 NetVLAD也可换max/avg做基线backPropToLayer反向传播的深度小数据集建议只训 NetVLAD 层附近doDraw实时绘制 loss 与 recallN 曲线新手强烈建议打开。 正式开跑前可先用内置的微型数据集 dbTiny.m 验证整个流程见 demo.m#L181-L199 的 tiny 示例几分钟即可确认依赖、路径、GPU 全部配置正确。五、常见坑清单现象原因与解法训练报错路径不存在dbImageFns必须相对于dbPath且.mat文件名必须与db.name一致特征提取极慢图片尺寸不一致时batchSize只能为 1建议统一缩放输入loss 不降但 recall 提升硬负样本挖掘的正常现象看 recallN 曲线为准同时跑多组实验互相污染相同 namenetIDmethod 会写同一缓存文件给每次实验加不同的checkpoint0suffix中断后重跑失败上次生成的不完整.bin文件不会重算先删除输出目录或运行 cleanup.m六、小结用 NetVLAD 训练自己的地点识别数据本质上就是整理图片和 UTM 坐标 → 继承 dbBase 写一个 20 行的子类 → 存好 dbStruct 规格文件 → 调用 trainWeakly。基类已经帮你处理了正负样本挖掘与召回率评测剩下的精力都可以花在数据质量和超参数调优上。按本文 6 步走从数据整理到拿到finalNet的完整链路就此打通。【免费下载链接】netvladNetVLAD: CNN architecture for weakly supervised place recognition项目地址: https://gitcode.com/gh_mirrors/ne/netvlad创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考