行人重识别基线代码:集定量与定性指标于一体的高效框架,支持多数据集及换衣行人识别

张开发
2026/4/3 16:20:52 15 分钟阅读
行人重识别基线代码:集定量与定性指标于一体的高效框架,支持多数据集及换衣行人识别
行人重识别基线代码baseline: 搭建了一个行人重识别代码 [1]定量指标包括Rank mAP [2]定性指标包括cam热度图ranklist排序图 [3]支持常见的market,duke,msmt,cuhk,veri等数据集 同时针对换衣行人重识别也搭建了另外一套baseline 针对当下代码综合囊括了实验所需要的定量和定性的所有要求不再需要切换代码繁琐操作代码结构简单干净方便各种idea的搭建行人重识别的代码框架说复杂其实有套路说简单又容易踩坑。今天分享的这套baseline算是把常见需求都包圆了从训练到验证一条龙服务。咱们直接上硬货先看项目结构├── configs │ ├── market.yml │ └── clothes.yml ├── data_loader │ ├── triplet_sampler.py │ └── transform.py └── engine ├── trainer.py └── evaluator.py配置文件里藏着玄机比如数据路径和损失函数权重都能改。举个栗子想换数据集只要改两行dataset: name: market1501 root: /your/path数据增强这块有个骚操作叫RandomErasing你懂的就是随机给图片打码。代码实现贼简单但效果拔群from albumentations import CoarseDropout transform_train A.Compose([ A.HorizontalFlip(p0.5), CoarseDropout(max_holes1, max_height32, max_width32, p0.5), ])模型部分默认用ResNet50当backbone重点在最后的embedding层。这里有个细节——BNNeck结构能有效缓解分类损失和度量学习的矛盾class Baseline(nn.Module): def __init__(self, num_classes): super().__init__() self.backbone resnet50(pretrainedTrue) self.bottleneck nn.BatchNorm1d(2048) self.classifier nn.Linear(2048, num_classes) def forward(self, x): features self.backbone(x) bn_features self.bottleneck(features) if self.training: return features, bn_features return bn_features训练时triplet loss和交叉熵得配合着用。注意这里logits计算用的是BN前的特征而metric loss用BN后的def compute_loss(features, bn_features, targets): cls_loss F.cross_entropy(classifier(features), targets) tri_loss TripletLoss()(bn_features, targets) return cls_loss tri_loss * 0.5验证环节的mAP计算直接调用了faiss库的暴力搜索比手写循环快10倍不止index faiss.IndexFlatL2(feature_dim) index.add(gallery_features) _, indices index.search(query_features, k100)可视化才是重头戏。用Grad-CAM生成热度图时记得把hook注册到最后一个卷积层class CAMWrapper: def __init__(self, model): self.model model self.features None model.layer4.register_forward_hook(self.save_features) def save_features(self, module, input, output): self.features output.detach()排序结果展示用了matplotlib的gridspec能把查询图和前10个结果拼成一张图。重点标出正确匹配的框框plt.subplot(2, 6, 1).set_title(fQuery\n{query_id}) for i, (idx, sim) in enumerate(zip(indices, similarities)): ax plt.subplot(2, 6, i2) if gallery_ids[idx] query_id: ax.patch.set_edgecolor(lime) ax.patch.set_linewidth(3)换衣场景的baseline主要在数据预处理上动刀。比如把颜色直方图特征拼接到embedding里或者用局部对齐策略class ClothAwareModel(Baseline): def forward(self, x): global_feat super().forward(x) color_hist extract_color_hist(x) return torch.cat([global_feat, color_hist], dim1)最后说下实战效果。在Market1501上跑完50个epochRank-1能到88.3%mAP 72.6%。可视化结果里有个有趣现象——模型对背包的关注度比预想的高可能因为这是个稳定特征行人重识别基线代码baseline: 搭建了一个行人重识别代码 [1]定量指标包括Rank mAP [2]定性指标包括cam热度图ranklist排序图 [3]支持常见的market,duke,msmt,cuhk,veri等数据集 同时针对换衣行人重识别也搭建了另外一套baseline 针对当下代码综合囊括了实验所需要的定量和定性的所有要求不再需要切换代码繁琐操作代码结构简单干净方便各种idea的搭建

更多文章