Market-1501
收藏人员重识别使用ResNet18在Market-1501数据集上
项目概述
本项目使用修改后的ResNet18架构在Market-1501数据集上实现人员重识别(ReID)系统。目标是准确识别和匹配多摄像头监控系统中多个非重叠摄像头视图中的个体。
关键特性
- 模型架构:修改后的ResNet18主干网络
- 数据集:Market-1501
- 评估指标:平均精度均值(mAP),累积匹配特征(CMC)
- 损失函数:带标签平滑的交叉熵损失
数据集
Market-1501数据集包含1,501个身份的32,668个带注释的边界框。图像从6个不同的摄像头捕获,其中5个高分辨率摄像头和1个低分辨率摄像头。数据集分为训练集和测试集。
方法论
模型架构
我们使用修改后的ResNet18作为主干网络。最后的完全连接层被新的嵌入层和分类层替换。这使得网络能够学习用于人员重识别的判别特征,同时保持相对轻量级的架构。
训练过程
- 数据预处理:图像被调整为256x128像素并进行归一化。
- 数据增强:在训练过程中应用随机水平翻转和颜色抖动。
- 优化:Adam优化器,学习率为0.001,权重衰减为5e-4。
- 学习率调度:步长衰减,每20个周期学习率减少0.1倍。
损失函数
我们采用带标签平滑的交叉熵损失。标签平滑有助于防止模型变得过于自信并提高泛化能力。损失函数定义如下:
python class CrossEntropyLabelSmooth(nn.Module): def init(self, num_classes, epsilon=0.1): super(CrossEntropyLabelSmooth, self).init() self.num_classes = num_classes self.epsilon = epsilon self.logsoftmax = nn.LogSoftmax(dim=1)
def forward(self, inputs, targets):
log_probs = self.logsoftmax(inputs)
targets = torch.zeros_like(log_probs).scatter_(1, targets.unsqueeze(1), 1)
targets = (1 - self.epsilon) * targets + self.epsilon / self.num_classes
loss = (-targets * log_probs).mean(0).sum()
return loss
该损失函数在所有类别中均匀分配一个小概率(ε),有助于减少过拟合并提高模型的泛化能力。
结果
经过训练,我们的模型在测试集上取得了以下性能:
- mAP(平均精度均值):0.7837
- Rank-1准确率(CMC@1):0.9348
- Rank-5准确率(CMC@5):0.9825
- Rank-10准确率(CMC@10):0.9903
这些结果表明模型性能强劲,模型在top-1匹配中正确识别同一个人的准确率为93.48%,在top-5匹配中准确率为98.25%。
结论
本项目展示了修改后的ResNet18架构在Market-1501数据集上进行人员重识别的有效性。损失函数中使用标签平滑和仔细的数据预处理有助于在保持相对轻量级模型架构的同时实现有竞争力的结果。
未来工作
- 尝试更高级的架构,如ResNet50或DenseNet
- 实现三元组损失或其他度量学习方法
- 探索注意力机制,专注于人的判别部分
- 研究跨数据集泛化的域适应技术




