尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

CMC@1到底怎么算?cosine_metric_learning行人重识别评估指标代码全解

CMC@1到底怎么算?cosine_metric_learning行人重识别评估指标代码全解 CMC1到底怎么算cosine_metric_learning行人重识别评估指标代码全解【免费下载链接】cosine_metric_learningDeep Cosine Metric Learning for Person Re-identification项目地址: https://gitcode.com/gh_mirrors/co/cosine_metric_learningcosine_metric_learning是论文《Deep Cosine Metric Learning for Person Re-identification》的 TensorFlow 实现用于训练与评估行人重识别模型。CMC1Cumulative Matching Characteristics Rank 1是它最核心的评估指标。这篇文章带你逐段读懂该项目评估指标代码看懂 CMC1 是如何从特征向量一路算出来的probe探针与 gallery候选库又是怎么构造、跨批次汇总的。先搞懂CMC1行人重识别的Top-1命中率在行人重识别任务中probe 集是查询gallery 集是候选池。CMC1 的算法逻辑非常直白对每一张 probe 图像计算它与 gallery 中所有图像的距离把 gallery 图像按距离从近到远排序如果排名第 1 的图像与 probe 是同一个人记 1 分否则记 0 分所有 probe 得分求平均就是 CMC1。 换句话说CMC1 就是行人重识别的 Top-1 命中率每张查询图排第一的候选人是不是同一个人。同理 CMC5 / CMC10 看正确的人是否落在前 5 / 前 10 名。本项目把这些指标以Precision1、Precision5、Precision10、Precision20的名字写入 TensorBoard。概念含义Probe查询图像集每个身份一张代表图Gallery被检索的候选图像集每个身份一张代表图num_relevantgallery 中与 probe 同身份的图像数通常为 1k排名位置k1 即 CMC1metrics.py里的两个距离函数CMC计算的起点CMC 的排序完全依赖距离函数metrics.py提供了两个pdist()第 6-29 行欧氏距离平方传统重识别的经典选择cosine_distance()第 32-53 行余弦距离 1 − 余弦相似度是本项目的 cosine-softmax 损失配套的距离度量。余弦距离的核心实现只有三行a_normed tf.nn.l2_normalize(a, dim1) b_normed a_normed if b is None else tf.nn.l2_normalize(b, dim1) return 1.0 - tf.matmul(a_normed, tf.transpose(b_normed))先对特征做 L2 归一化再取内积距离越小相似度越高。核心代码拆解recognition_rate_at_k如何算单张图的命中率metrics.py第 56-127 行的recognition_rate_at_k()是 CMC1 的心脏。简化后的关键流程如下# ① 标签匹配矩阵probe 和 gallery 同身份记 1 label_eq_mat tf.cast(tf.equal(probe_y, gallery_y), tf.float32) # ② 相关图像数每个身份只有一张 gallery 图通常为 1 num_relevant tf.minimum(k, tf.reduce_sum(label_eq_mat, axis1)) # ③ 距离 → 相似度再用 top_k 取出最近的 k 张 predictions tf.exp(-measure(probe_x, gallery_x)) _, prediction_indices tf.nn.top_k(predictions, kk) label_mat tf.gather(gallery_y, prediction_indices) # ④ 检查 top-k 里是否出现正确身份 true_positives_at_k tf.reduce_sum( tf.cast(tf.equal(label_mat, probe_y), tf.float32), axis1) # ⑤ 单张图的识别率CMC 场景下结果只有 0 或 1 return true_positives_at_k / num_relevant两个值得注意的细节tf.exp(-measure(...))的距离变相似度技巧tf.nn.top_k只会挑最大的值而距离是越小越好取负号再 exp 后距离越小相似度值越大top_k 选出的恰好是最近的候选为什么要除以 num_relevant本项目保证每个身份在 gallery 中恰好一张图num_relevant 恒为 1所以单图结果非 0 即 1代表该张图在 rank-k 是否命中。streaming_mean_cmc_at_k跨批次汇总出CMC1评估集是分 batch 喂给网络的指标必须跨批次累积。metrics.py第 130-163 行的streaming_mean_cmc_at_k()把上面的识别率包进slim.metrics.streaming_meanrecognition_rate recognition_rate_at_k( probe_x, probe_y, gallery_x, gallery_y, k, measure) return slim.metrics.streaming_mean(recognition_rate)slim.metrics.streaming_mean返回当前值 更新操作一对张量每个 batch 跑一次更新操作运行均值就自动累积整个评估集扫完即得到最终 CMCk。把 k 分别取 1、5、10、20一次评估就能得到整条 CMC 曲线上的四个点。probe与gallery是怎么构造的create_cmc_probe_and_gallery配对不是随便抽的。datasets/util.py第 116-171 行的create_cmc_probe_and_gallery()做了三件事对每个身份各选一张图做 probe、一张图做 gallery若该身份出现在多个相机下会随机挑两个不同相机各取一张构成 cross-view跨视角配对——更贴近真实场景也更具难度若该身份图像不足 2 张直接跳过无法配对的样本不参与评估。在评估主循环eval_loop()train_app.py第 295-442 行中会固定随机种子生成 10 组独立的 probe/gallery 组合probe_indices, gallery_indices util.create_cmc_probe_and_gallery( data_y, camera_indices, seedrandom_seed i)对 10 组 gallery 取平均能显著降低单次配对的偶然性让验证集指标更稳定、跨 run 可比。动手跑起来在Market1501上运行CMC评估没有本地副本时先获取项目git clone https://gitcode.com/gh_mirrors/co/cosine_metric_learning训练启动后另开一个终端并行执行评估命令完整说明见README.mdpython train_market1501.py \ --modeeval \ --dataset_dir./Market-1501-v15.09.15/ \ --loss_modecosine-softmax \ --log_dir./output/market1501/ \ --run_idcosine-softmax \ --eval_log_dir./eval_output/market1501该命令会一直阻塞等待queued_trainer.py中的QueuedTrainer.evaluate()第 417-542 行每 60 秒轮询一次 checkpoint 目录训练进程每存一个新 checkpoint 就自动触发一轮 CMC 评估把Precision1/5/10/20写入eval_output/market1501用 TensorBoard 即可观察曲线tensorboard --logdir ./eval_output/market1501/cosine-softmax --port 6007⚠️ 注意评估用的距离度量会跟随训练损失自动选择——cosine-softmax 用cosine_distance其余损失默认pdisttrain_app.py第 425-427 行保证排序距离与特征训练空间一致。总结CMC1计算流程五步一图流步骤做什么代码位置①构造 probe/gallery 跨视角配对datasets/util.py→create_cmc_probe_and_gallery()②网络提特征train_app.py→eval_loop()③算余弦/欧氏距离矩阵metrics.py→cosine_distance()/pdist()④top_k 排序并判断 top-k 是否命中metrics.py→recognition_rate_at_k()⑤跨批次流式求平均得 CMCkmetrics.py→streaming_mean_cmc_at_k()至此 CMC1 的完整链路就清晰了配对 → 特征 → 距离 → 排序 → 平均。理解了这条管线后无论是替换新的距离函数、修改配对策略还是迁移到自己的重识别数据集都可以在这个框架上直接上手。【免费下载链接】cosine_metric_learningDeep Cosine Metric Learning for Person Re-identification项目地址: https://gitcode.com/gh_mirrors/co/cosine_metric_learning创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表