Person Re-Identification by Deep Joint Learning of Multi-Loss Classification——准研究生论文周报

1 标题

  Person Re-Identification by Deep Joint Learning of Multi-Loss Classification 来源:IJCAI 2017  日期:7月6日

2 概述

  发文当时(2017年),用特征提取做REID的学者很多,但这些工作往往仅通过全局(global)特征或局部(local)特征实现。全局特征和局部特征之间存在一定的互补性,合理结合两种特征,能达到一加一大于二的效果,且在捕获信息时,同时观察全局信息和局部信息更贴近人类视觉系统。
  为此,作者建立了结合全局特征与局部特征的模型,以最大限度地发挥两者的互补优势,且仅用常规度量方式如L2距离来实现REID。

3 主要贡献

  • 提出了结合全局特征和局部特征的观点。
  • 提出了多损失联合学习(Joint Learning Multi-Loss,JLML) CNN模型,它也是一个双分支网络。它能够通过优化多分类损失(multiple classification losses)学习更具辨别性的全局特征和局部特征,此外,它能利用global和local特征的互补优势来应对图片中局部未对齐(local misalignment)的问题以及优化整体匹配标准(holistic matching criteria)。
  • 提出了基于结构稀疏性的特征选择学习机制(structured sparsity based feature selection learning mechanism)来提高多损失联合特征学习的鲁棒性,改善local和global representations之间的noise和data covariance。

4 算法及实验

4.1 网络结构

  • JLML模型结构,可以看出它是一个双分支网络,就如同之前提到的换衣数据集文章里的BC-Net一样。它包含了局部分支和全局分支,每个分支单独训练。整张图像经卷积层之后得到的特征传入global分支,将该特征切为m块送入local分支,前述的卷积得到的特征其实是由global分支和local分支共享的。
    model
  • JLML的Backbone是ResNet-50,经调整后其实是ResNet-39,网络结构如下,可以看出传入local branch的特征实际上被分成了4块。
    model
  • 加入structured sparsity特征选择学习机制之后
    • 全局分支的正则化项: l 2 , 1 = ∣ ∣ W G ∣ ∣ 2 , 1 = ∑ i = 1 d g ∣ ∣ w g i ∣ ∣ 2 l_{2,1}=||W_G||_{2,1}=\sum_{i=1}^{d_g}||w_g^i||_2 l2,1=WG2,1=i=1dgwgi2 W G W_G WG c g × d g c_g\times{d_g} cg×dg大小的矩阵;
    • 局部分支的正则化项: l 1 , 2 = ∣ ∣ W L ∣ ∣ 1 , 2 = ∑ i = 1 c l ∑ j = 1 m ∣ ∣ w l , j i ∣ ∣ 1 2 l_{1,2}=||W_L||_{1,2}=\sum_{i=1}^{c_l}\sum_{j=1}^m||w_{l,j}^i||_1^2 l1,2=WL1,2=i=1clj=1mwl,ji12 W L W_L WL m × d l m\times{d_l} m×dl大小的矩阵, m m m就是前面提到的分块数;
    • 分类损失用交叉熵损失 l l l,这样一来,最终损失函数: l g l o b a l = l + λ g l o b a l ∣ ∣ W G ∣ ∣ 2 , 1   ,   l l o c a l = l + λ l o c a l ∣ ∣ W L ∣ ∣ 1 , 2 l_{global}=l+\lambda_{global}||W_G||_{2,1}\,,\,l_{local}=l+\lambda_{local}||W_L||_{1,2} lglobal=l+λglobalWG2,1llocal=l+λlocalWL1,2

4.2 实验

  1. 实验一共用到了四个数据集VIPeR, GRID, CUHK03, Market-1501,其中前两个是我未用过的,实验用到了caffe框架,下面的实验结果中,红色/蓝色条目分别代表第一、第二好。
  2. 不同数据集上模型性能对比
    • CUHK03数据集上性能对比
      E1
    • Market-1501上模型性能对比
      E2
    • VIPeR上模型性能对比,两个最好的方法是人工方法,与其他深度方法相比,JLML仍具优势
      E3
    • GRID上模型性能对比,和上一条一样,hand-craft方法占优势
      E4
  3. 不同的参数、方法设置模型性能对比,基于Market-1501数据集
    • 单独使用全局特征或局部特征
      E5
    • 使用Multi Loss效果更好,与某篇论文里的UniLoss对比
      E6
    • 是否共享低级特征(通过浅层卷积层得到的特征)
      E7
    • 是否用structured sparsity based feature selection learning(SFL)
      E8
  4. 模型复杂度对比
    E9

5 收获与心得

  本文提出的网络模型也是双分支网络,和上一篇换衣数据集那个BC-Net类似,本文结合了全局特征与局部特征,BC-Net结合了生物特征与服饰特征,均把比较重要的特征结合。
  整体来看,这些模型在网络结构上并没有什么质的创新,更多的是思想、方法的新颖,就比如本文的JLML,核心只是对ResNet-50进行了修改,不过ResNet本身就是一个很简洁的网络。总结来说,ResNet,DenseNet这种Backbone的创新发明不容易,但是基于Backbone衍生一些有趣的模型相对简单,但衍生容易,保证模型性能难。包括上上周的加法器网络,用L1 norm代替卷积,简单巧妙,想到这些需要对深度学习和神经网络有一定的了解和直观认识,要学的还有很多!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,以下是使用PyTorch实现 "Learning a Deep ConvNet for Multi-label Classification with Partial Labels" 论文的示例代码。 ```python import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision.transforms import transforms from sklearn.metrics import f1_score from dataset import CustomDataset from model import ConvNet # 设置随机数种子,保证结果可重复 torch.manual_seed(2022) # 定义超参数 epochs = 50 batch_size = 128 learning_rate = 0.001 weight_decay = 0.0001 num_classes = 20 num_labels = 3 # 定义数据预处理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) # 加载数据集 train_dataset = CustomDataset(root='./data', split='train', transform=transform) train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=True, num_workers=2) test_dataset = CustomDataset(root='./data', split='test', transform=transform) test_loader = DataLoader(test_dataset, batch_size=batch_size, shuffle=False, num_workers=2) # 定义模型 model = ConvNet(num_classes=num_classes, num_labels=num_labels) # 定义损失函数和优化器 criterion = nn.BCEWithLogitsLoss() optimizer = optim.Adam(model.parameters(), lr=learning_rate, weight_decay=weight_decay) # 训练模型 for epoch in range(epochs): # 训练阶段 model.train() running_loss = 0.0 for i, data in enumerate(train_loader): inputs, labels = data optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() train_loss = running_loss / len(train_loader) # 测试阶段 model.eval() y_true, y_pred = [], [] with torch.no_grad(): for data in test_loader: inputs, labels = data outputs = model(inputs) predicted_labels = torch.round(torch.sigmoid(outputs)) y_true.extend(labels.cpu().numpy()) y_pred.extend(predicted_labels.cpu().numpy()) f1 = f1_score(y_true, y_pred, average='macro') print('[Epoch %d] Train Loss: %.3f, Test F1: %.3f' % (epoch + 1, train_loss, f1)) ``` `CustomDataset` 和 `ConvNet` 分别是数据集类和模型类,需要根据您的具体情况进行实现。在训练阶段,使用 `nn.BCEWithLogitsLoss()` 作为损失函数进行优化。在测试阶段,使用 `sklearn.metrics.f1_score()` 计算 F1 值作为模型评估指标。 希望以上示例代码对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

远方的河岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值