论文速读|Joint Detection and Identification Feature Learning for Person Search.用于人员搜索的联合检测和识别特征学习.CVPR17

论文地址:https://arxiv.org/abs/1604.01850#
代码地址:https://github.com/ShuangLI59/person_search
bib引用:

@misc{xiao2017jointdetectionidentificationfeature,
      title={Joint Detection and Identification Feature Learning for Person Search}, 
      author={Tong Xiao and Shuang Li and Bochao Wang and Liang Lin and Xiaogang Wang},
      year={2017},
      eprint={1604.01850},
      archivePrefix={arXiv},
      primaryClass={cs.CV},
      url={https://arxiv.org/abs/1604.01850}, 
}

贡献:①提出数据集CUHK-SYSU( 18184 张图像、8432 个身份和 96143 个行人边界框);②提出Online Instance Matching (OIM)损失;③提出新的Person search学习框架(行人检测+reid放到单个CNN中共同处理)

摘要

Existing person re-identification benchmarks and methods mainly focus on matching cropped pedestrian images between queries and candidates. However, it is different from real-world scenarios where the annotations of pedestrian bounding boxes are unavailable and the target person needs to be searched from a gallery of whole scene images. To close the gap, we propose a new deep learning framework for person search. Instead of breaking it down into two separate tasks—pedestrian detection and person re-identification, we jointly handle both aspects in a single convolutional neural network. An Online Instance Matching (OIM) loss function is proposed to train the network effectively, which is scalable to datasets with numerous identities. To validate our approach, we collect and annotate a large-scale benchmark dataset for person search. It contains 18, 184 images, 8, 432 identities, and 96, 143 pedestrian bounding boxes. Experiments show that our framework outperforms other separate approaches, and the proposed OIM loss function converges much faster and better than the conventional Softmax loss.
现有的人再识别基准和方法主要集中在查询图像和候选图像之间的裁剪行人图像匹配上。然而,这与现实世界的场景不同,在现实世界中,行人边界框的标注不可用,需要从整个场景图像库中搜索目标人物。为了缩小这一差距,我们提出了一种新的用于人物搜索的深度学习框架。我们不是将其分解为两个独立的任务——行人检测和人再识别,而是在单个卷积神经网络中共同处理这两个方面。提出了一种在线实例匹配(OIM)损失函数来有效地训练网络,该函数可扩展到具有众多身份的数据集。为了验证我们的方法,我们收集并标注了一个用于人物搜索的大规模基准数据集。它包含 18184 张图像、8432 个身份和 96143 个行人边界框。实验表明,我们的框架优于其他独立的方法,并且提出的 OIM 损失函数比传统的 Softmax 损失收敛得更快更好。

Introduction

reid研究意义及现状

人物再识别(re-id)[8,39]旨在将目标人物与行人图像库进行匹配。它有许多视频监控应用,例如寻找罪犯[33]、跨摄像机人物跟踪[38]和人物活动分析[23]。由于人体姿势、相机时代视点、光照、遮挡、分辨率、背景杂波等的复杂变化,该问题具有挑战性。因此在最近几年引起了广泛的研究关注[4,19,21,24,35,43]。
虽然已经提出了许多行人重识别数据集和方法,但问题设置本身与实际应用之间仍存在很大差距。在大多数基准测试中(如[10,14,18,19,45]),图库仅包含手动裁剪的行人图像(图 1a),而在实际应用中,目标是在全场景图像的图库中找到目标人物,如图 1b 所示。遵循这些基准测试的协议,大多数现有的行人重识别方法假设行人检测是完美的。然而,这些手动裁剪的边界框在实际应用中是不可用的。现成的行人检测器不可避免地会产生误报、漏检和未对准的情况,这可能会严重损害最终的搜索性能。
2014年,徐等人[36]朝着缩小这一差距迈出了第一步,他们将人物搜索问题引入社区,提出了基于行人检测和人物匹配分数相结合的滑动窗口搜索策略,但性能受限于手工制作的特征,滑动窗口框架不具有可扩展性。
在这里插入图片描述

本文工作

与传统方法将问题分解为两个独立的任务——行人检测和人物重新识别不同,我们在单个卷积神经网络(CNN)中联合处理这两个方面。我们的CNN由两部分组成,给定一个完整的输入图库图像,pedestrian proposal net 用于生成候选人物的边界框,这些边界框被输入到识别网中以提取特征以与目标人物进行比较。行人提议网和识别网在联合优化过程中相互适应。例如,proposal net 可以更关注召回而不是精度,因为误报可以通过后一个特征匹配过程来消除。同时,提案的错位也是可以接受的,因为它们可以通过识别网进一步调整。为了提高整个系统的可扩展性,受目标检测[27]最新进展的启发,我们鼓励两个部分共享底层卷积特征图,这显着加快了推理过程
传统的re-id特征学习主要采用 成对pairwise 或三元组距离损失函数[1,3,5,19]。然而,它们并不高效,因为每次只比较几个数据样本,并且有O(N2N^2N2)个潜在输入组合,其中N是图像的数量。不同的采样策略可能会显着影响收敛速度和质量,但随着N的增加,找到高效的采样策略变得更加困难。另一种方法是学习使用Softmax损失函数[35]对身份进行分类,它有效地同时比较所有样本。但是随着类的数量增加,训练大Softmax分类器矩阵变得慢得多,甚至无法收敛。在本文中,我们提出了一种新颖的在线实例匹配(OIM)损失函数来应对这些问题。我们维护了所有标记身份的特征查找表,并比较了小批量样本和所有注册条目之间的距离。另一方面,许多未标记的身份可能会出现在场景图像中,这可以作为标记身份的底片。因此,我们利用循环队列来存储它们的特征也用于比较。这是人员搜索问题设置带来的另一个优势。在我们的实验中,所提出的无参数OIM损失收敛得比Softmax损失快得多,也更好。

Softmax 损失通过将身份分类为不同类别,能够同时比较所有样本,从而有效解决 pairwise 和 triplet 损失的效率问题。然而,不足:①类数量的扩展性问题:随着身份类别(类)的数量增加,Softmax 分类器的权重矩阵维度会显著增大,导致训练速度变慢甚至无法收敛。②计算开销高:大规模数据集下的 Softmax 分类需要大量计算资源,难以应用于具有海量身份类别的 Re-ID 场景。
OIM在线实例匹配:维护一个动态的特征存储表,记录所有标注身份和未注册身份之间的特征距离。

本文贡献

  • 提出了一个新的深度学习框架,从整个场景图像库中搜索目标人物。不是简单地结合行人探测器和人物re-id方法,而是在单个CNN中联合优化这两个目标,它们更好地相互适应。
  • 其次,提出了一个在线实例匹配损失函数OIM loss,以更有效地学习识别特征,这使得所提出的框架能够扩展到具有众多身份的大型数据集。加上快速的推理速度,所提出的框架更接近现实世界的应用需求。
  • 最后,收集并注释了一个用于人物搜索的大规模基准数据集CUHK-SYSU,涵盖了来自街道和电影快照的数百个场景。该数据集包含18,184张图像、8,432个身份和96,143个行人边界框。与该数据集上的其他基线相比,我们验证了我们方法的有效性。

Figure 2. Our proposed framework. Pedestrian proposal net generates bounding boxes of candidate people, which are fed into an identification net for feature extraction. We project the features to a L2-normalized 256-d subspace, and train it with a proposed Online Instance Matching loss. Both the pedestrian proposal net and the identification net share the underlying convolutional feature maps.

图2.提出的框架。行人提案网生成候选人的边界框,这些边界框被输入到识别网络中进行特征提取。我们将特征投射到L2归一化的256维子空间,并使用建议的在线实例匹配损失对其进行训练。行人提案网和识别网共享底层卷积特征图。

3. 方法

我们提出了一个新的深度学习框架,在单个卷积神经网络(CNN)中联合处理行人检测和人员重新识别,如图2所示。给定一个完整的场景图像作为输入,我们首先使用 stem CNN 从原始像素转换为卷积特征图(橙色那块)。行人提议网络建立在这些特征图的基础上,以预测候选人员的边界框,然后将其输入到具有RoI-pooling[9]的识别网络中,为每个人提取L2标准化的256维特征
推理阶段,我们根据他们到目标人员的特征距离对画廊人员进行排名。
训练阶段,我们在特征向量之上提出了一个在线实例匹配(OIM)损失函数来监督识别网络,以及其他几个损失函数来以多任务方式训练提议网络。
下面我们将首先详细介绍CNN模型结构,然后详细说明OIM损失函数。

模型图推理(各阶段输入输出维度变化)

obsidian画的Specifically

  1. 输入图像到 Stem CNN
    输入:整张场景图像,假设其分辨率为H×W×3H \times W \times 3H×W×3(RGB 图像)。
    Stem CNN:基于 ResNet-50 的前 3 个卷积块(conv1 到 conv3.4)。

    • ResNet-50 的前 3 个卷积块将原始图像尺寸缩减为原来的 116\frac{1}{16}161
      • Conv1:卷积核为 7×77 \times 77×7,步长为 2,输出通道数为 64,特征图尺寸减半。
      • MaxPooling:步长为 2,特征图再次减半。
      • Conv2.x 和 Conv3.x:多个残差块,步长最终为 16。
        因此,输出维度为: H16×W16×1024\frac{H}{16} \times \frac{W}{16} \times 102416H×16W×1024 其中,通道数1024 是 conv3.x 的输出通道数。
  2. Pedestrian Proposal Net
    Pedestrian Proposal Net 在 Stem CNN 的输出特征图上生成候选框。

    • 输入维度:H16×W16×1024\frac{H}{16} \times \frac{W}{16} \times 102416H×16W×1024
    • 网络结构:一个 3×33 \times 33×3 的卷积层(通道数为 512),再接两个分支:
      • Anchor Classification(Softmax 分类):预测每个候选框是否包含行人。
      • Anchor Regression:回归候选框位置。
        输出:生成候选框位置和类别(维度依赖于候选框的数量)。经过非极大值抑制(NMS),保留最多 128 个候选框。
  3. RoI Pooling:将每个候选框区域从特征图中提取固定大小的特征。

    • 输入维度:H16×W16×1024\frac{H}{16} \times \frac{W}{16} \times 102416H×16W×1024
    • 每个候选框通过 RoI Pooling 转换为固定大小14×1414 \times 1414×14的特征图。
      输出维度128×1024×14×14128 \times 1024 \times 14 \times 14128×1024×14×14(假设保留 128 个候选框)。
  4. Id Net:提取每个候选框的特征。

    • 输入维度:128×1024×14×14128 \times 1024 \times 14 \times 14128×1024×14×14
    • 网络结构:
    • ResNet-50 的 conv4.4 到 conv5.3(残差块,通道数逐渐升为 2048)。
    • 全局平均池化(GAP):将2048×7×72048 \times 7 \times 72048×7×7 的特征图转换为 2048−d2048-d2048d全局特征向量。
    • L2 归一化:将特征映射到 256 维特征空间。
      输出维度128×256128 \times 256128×256(128 个候选框,每个候选框对应一个 L2 归一化的 256 维特征向量)。
  5. OIM Loss 使用上述提取的 128×256128 \times 256128×256的特征向量,进行特征匹配和分类。

【总结】各阶段的输入、输出维度变化:

  1. 输入图像H×W×3H \times W \times 3H×W×3
  2. Stem CNN 输出特征图H16×W16×1024\frac{H}{16} \times \frac{W}{16} \times 102416H×16W×1024
  3. Pedestrian Proposal Net:输出最多 128 个候选框。
  4. RoI Pooling 输出特征图128×1024×14×14128 \times 1024 \times 14 \times 14128×1024×14×14
  5. Identification Net 输出特征向量128×256128 \times 256128×256

整个过程中,提到的关键操作(如卷积、池化、候选框生成)都逐步减少特征图的空间分辨率,同时提取出更高层次的语义特征,最终将每个候选框映射到固定的 256 维特征空间,用于行人识别和匹配。

3.1. Model Structure

采用 ResNet-50 作为基础卷积神经网络模型,其前面有一个 7×7 的卷积层(名为 conv1),后面跟着四个分别包含 3、4、6、3 个残差单元的模块(名为 conv2x 到 conv5x)。将 conv1 到 conv4_3 作为主干部分,对于输入图像,主干部分会产生具有原始图像 1/16 分辨率的 1024 个通道的特征图。

  • 在这些特征图之上构建行人提议网络来检测行人候选。先添加一个 512×3×3 的卷积层专门为行人转换特征,然后按照文献[27]在每个特征图位置关联 9 个锚点,使用 Softmax 分类器预测每个锚点是否是行人,以及使用线性回归调整其位置。经过非极大值抑制后保留前 128 个调整后的边界框作为最终提议。【NMS后保留128个anchor box】

为了在这些提议中找到目标行人,构建一个识别网络【Id Net】来提取每个提议的特征,并与目标特征进行比较。首先使用 RoI-Pooling 层从主干特征图中为每个提议提取一个 1024×14×14 的区域,然后经过 ResNet50 的剩余部分 conv4_4 到 conv5_3,接着通过全局平均池化层总结为一个 2048 维的特征向量。

  • 一方面,由于行人提议不可避免地会包含一些误报和未对齐情况,再次使用 Softmax 分类器和线性回归来拒绝非行人并细化位置
  • 另一方面,将特征投影到 L2 归一化的 256 维子空间(id feat),在推理时用于计算与目标行人的余弦相似度

在训练阶段,使用提出的 OIM 损失函数监督 id-feat,与其他用于检测的损失函数一起,整个网络以多任务学习的方式联合训练,而不是使用Faster RCNN文献[27]中的替代优化方法。

Figure 3. Online Instance Matching. The left part shows the labeled (blue) and unlabeled (orange) identity proposals in an image. We maintain a lookup table (LUT) and a circular queue (CQ) to store the features. When forward, each labeled identity is matched with all the stored features. When backward, we update LUT according to the id, pushing new features to CQ, and pop out-of-date ones. Note that both data structures are external buffer, rather than the parameters of the CNN.

3.2. OIM Loss

There are three different types of proposals, labeled identities, unlabeled identities, and background clutter. Suppose there are (L) different target people in the training set, when a proposal matches a target person, we call it an instance of the labeled identity, and assign a class-id (from (1) to (L)) to it accordingly. There are also lots of proposals predicting pedestrians correctly, but do not belong to anyone of our tar- get people. We call them unlabeled identities in such cases. We demonstrate some examples of labeled and unlabeled identities in Figure 3 with blue and orange bounding boxes, respectively. Other proposals are just false alarms on other objects or background regions. In the proposed loss func- tion, we only consider the labeled and unlabeled identities, while leave the other proposals untouched.

有三种不同类型的提议,分别是标记身份、未标记身份和背景杂波。在训练集中假设有 L 个不同的目标人物,当一个提议与目标人物匹配时,称为标记身份,并相应地分配一个类别 ID(从1 到 L )。那些正确预测了行人但不属于目标人物的提议称为未标记身份。还展示了标记身份和未标记身份的示例分别用蓝色和橙色边框表示,其他提议是在其他对象或背景区域上的误报。在提出的损失函数中,只考虑标记身份和未标记身份

Notes:像标记身份、未标记身份和背景杂波。这种 2+1的类别是常用的分类模型的设置。

As our goal is to distinguish different people, a natural objective is to minimize the features discrepancy among the instances of the same person, while maximize the discrepancy among different people. To fulfill this goal, we need to memorize the features of all the people. This could be done offline by doing network forward on all the training images, but it is not practical when using stochastic gradient descent (SGD) for optimization. Thus in our approach, we choose an online approximation instead. Denote the features of a labeled identity inside a mini-batch by x∈RDx\in\mathbb{R}^{D}xRD, where (D) is the feature dimension, we maintain a lookup table (LUT) V∈RD×LV\in\mathbb{R}^{D\times L}VRD×L to store the features of all the labeled identities, as demonstrated in Figure 3. During the forward propaga- tion, we compute cosine similarities between the mini-batch sample and all the labeled identities by VTxV^{T}xVTx. During back- ward, if the target class-id is ttt, then we update the t−tht-thtth column of the LUT by vt←γvt+(1−γ)xv_{t}\leftarrow\gamma v_{t}+(1 - \gamma)xvtγvt+(1γ)x, where γ∈[0,1]\gamma\in[0,1]γ[0,1], and then scale vtv_{t}vt to have unit L2L_2L2 norm.

目标是区分不同的人,要最小化同一人的实例之间的特征差异,同时最大化不同人之间的差异。为实现这个目标,需要记住所有人的特征。可以通过对所有训练图像进行网络前向传播来离线完成,但在使用随机梯度下降(SGD)进行优化时不实际,所以采用在线近似方法。对于小批量中的标记身份特征x∈RDx\in\mathbb{R}^{D}xRDDDD是特征维度),维护一个查找表(LUT)V∈RD×LV\in\mathbb{R}^{D\times L}VRD×L来存储所有标记身份的特征。
在前向传播时,通过VTxV^{T}xVTx计算小批量样本与所有标记身份之间的余弦相似度。
在反向传播中,如果目标类别 ID 是ttt,则通过vt←γvt+(1−γ)xv_{t}\leftarrow\gamma v_{t}+(1-\gamma)xvtγvt+(1γ)x更新查找表的第ttt列,其中γ∈[0,1]\gamma\in[0,1]γ[0,1],然后将vtv_{t}vt缩放为具有单位L2L_2L2范数。

Notes:为什么使用SGD进行优化不实际,所以改为在线近似的方法?①数据量大和时间成本高(每次迭代都要等所有训练图像的前向传播完成);②违背SGD的两个核心思想(随机采样特性+动态更新特性)
SGD随机采样特性:随机梯度下降的核心优势在于每次迭代时,从训练数据集中随机采样一个小批量(mini - batch)的数据进行计算,而不是使用整个数据集。这样可以在每次迭代中快速获得一个近似的梯度方向来更新模型参数,从而在较少的计算量下达到较好的优化效果。如果对所有训练图像进行网络前向传播,就等同于使用了整个数据集来计算梯度,失去了 SGD 随机采样带来的计算效率提升和对大规模数据的适应性。
SGD动态更新特性:SGD 是基于每个小批量数据不断动态更新模型参数的过程。在这个过程中,模型参数随着每次小批量数据的输入而逐步调整,以适应数据的分布特点。而对所有训练图像进行离线前向传播,意味着在训练开始前就固定了所有特征信息,无法根据训练过程中模型参数的动态变化实时调整对特征的记忆和利用,无法充分发挥 SGD 在不断适应数据分布变化方面的优势。

Apart from labeled identities, many unlabeled identi- ties are also valuable for learning feature representations. They can be safely used as negative classes for all the labeled identities. We use a circular queue to store the features of these unlabeled identities that appear in recent mini-batches. Denote the features in this circular queue by U∈RD×QU\in\mathbb{R}^{D\times Q}URD×Q, where QQQ is the queue size, we can also com- pute the cosine similarities with the mini-batch sample by UTxU^{T}xUTx. After each iteration, we push the new feature vectors into the queue, while pop the out-of-date ones to keep the queue size unchanged.

Based on these two data structures, we define the probability of (x) being recognized as the identity with class-id (i) by a Softmax function
pi=exp⁡(viTx/τ)∑j=1Lexp⁡(vjTx/τ)+∑k=1Qexp⁡(ukTx/τ) p_{i}=\frac{\exp(v_{i}^{T}x/\tau)}{\sum_{j = 1}^{L}\exp(v_{j}^{T}x/\tau)+\sum_{k = 1}^{Q}\exp(u_{k}^{T}x/\tau)} pi=j=1Lexp(vjTx/τ)+k=1Qexp(ukTx/τ)exp(viTx/τ)
where higher temperature (\tau) leads to softer probability dis- tribution. Similarly, the probability of being recognized as the (i)-th unlabeled identity in the circular queue is
qi=exp⁡(uiTx/τ)∑j=1Lexp⁡(vjTx/τ)+∑k=1Qexp⁡(ukTx/τ) q_{i}=\frac{\exp(u_{i}^{T}x/\tau)}{\sum_{j = 1}^{L}\exp(v_{j}^{T}x/\tau)+\sum_{k = 1}^{Q}\exp(u_{k}^{T}x/\tau)} qi=j=1Lexp(vjTx/τ)+k=1Qexp(ukTx/τ)exp(uiTx/τ)
OIM objective is to maximize the expected log-likelihood
L=Ex[log⁡pi] \mathcal{L}=\mathbb{E}_{x}[\log p_{i}] L=Ex[logpi]
and its gradient with respect to (x) can be derived as
∂L∂x=1τ[(1−pi)vi−∑j=1,j≠iLpjvj−∑k=1Qqkuk] \frac{\partial\mathcal{L}}{\partial x}=\frac{1}{\tau}\left[(1 - p_{i})v_{i}-\sum_{j = 1,j\neq i}^{L}p_{j}v_{j}-\sum_{k = 1}^{Q}q_{k}u_{k}\right] xL=τ1(1pi)vij=1,j=iLpjvjk=1Qqkuk
It can be seen that our OIM loss effectively compares the mini-batch sample with all the labeled and unlabeled identities, driving the underlying feature vector to be similar with the target one, while pushing it away from the others.

除了标记身份,许多未标记身份对于学习特征表示也很有价值,可以作为所有标记身份的负类。使用循环队列存储最近小批量中出现的这些未标记身份的特征,记为U∈RD×QU\in\mathbb{R}^{D\times Q}URD×QQQQ是队列大小),通过UTxU^{T}xUTx计算与小批量样本的余弦相似度。每次迭代后,将新特征向量推入队列,同时弹出过时的向量以保持队列大小不变。

基于这两个数据结构,通过 Softmax 函数定义(x)被识别为类别 ID 为(i)的身份的概率(p_{i}),以及被识别为循环队列中第(i)个未标记身份的概率(q_{i})。OIM 目标是最大化期望对数似然(\mathcal{L}=\mathbb{E}{x}[\log p{i}]),并推导出其关于(x)的梯度。可以看出,OIM 损失有效地将小批量样本与所有标记和未标记身份进行比较,使基础特征向量与目标向量相似,同时远离其他向量。

Why not Softmax loss?
不使用Softmax损失主要基于以下两方面原因:

  1. 学习效率问题:大规模人员搜索数据集身份数量众多(训练集超5000个),但每个身份实例少,每张图像含身份有限。训练时需同时学习超5000个判别函数,然而每次SGD迭代仅几十类的正样本,导致分类器矩阵梯度方差大,即便有合适预训练和高动量,也难以有效学习。
  2. 未标记数据利用问题:Softmax损失无法利用未标记身份,因其无特定类别ID 。而与之不同,OIM损失虽公式类似,但是非参数的,可避免此问题,不过有易过拟合的潜在缺点,将特征投影到L2归一化低维子空间可缓解。

Scalability. 当身份数量增加时,计算等式(1)和等式(2)中的分区函数可能很耗时。为了克服这个问题,可以通过对有标签和无标签的身份进行子采样来近似分母,这导致优化等式(3)的下界。”

4. 数据集

收集并标注了一个大规模的行人搜索数据集,以评估提出的方法。利用两种数据源来使场景多样化
一方面,使用手持相机在城市周围拍摄街头照片。另一方面,从包含行人的电影快照中收集数据,因为它们可以丰富视角、光照和背景条件的变化。
在这里插入图片描述

4.1. Statistics

在收集完所有 18184 张图像后,首先对这些场景中的 96143 个行人边界框进行密集标注,然后关联出现在不同图像中的人,得到 8432 个有标签的身份。两个数据源的统计信息列在表 1 中。不标注那些只出现半个身体或处于不正常姿势(如坐着或蹲着)的人。此外,在不同视频帧中更换衣服和装饰的人在我们的数据集中不进行关联,因为行人搜索问题主要根据他们的衣服和体型而不是面部来识别身份。确保背景中的行人不包含有标签的身份,这样他们就可以安全地作为识别的负样本。注意,也忽略那些高度小于 50 像素的背景行人,因为即使对于人类标注者来说,他们也很难被识别。有标签和无标签身份的高度分布在图 4 中展示。

4.2. Evaluation Protocols and Metrics

数据集分为训练集和测试集,确保两者之间没有重叠的图像或标注的身份。然后将测试集中的身份实例分为查询集和图库集。对于 2900 个测试身份中的每一个,随机选择一个实例作为查询,相应的图库集由两部分组成——包含其他实例的所有图像和一些随机采样的不包含此人的图像。

不同的查询有不同的图库,它们共同覆盖了所有 6978 张测试图像。为了更好地理解图库大小对人员搜索性能的影响,定义了一组图库大小从 50 到 4000 的协议。以图库大小为 100 为例,由于每张图像大约包含 6 个行人,所以任务是在大约 600 人中找到目标人员。这种设置在图库行人数量方面与现有的人员重识别数据集(如 CUHK - 03、VIPeR)相当,并且由于可能有数千个背景杂乱的边界框分散注意力,所以更具挑战性。

使用两种评估指标——累积匹配特征(CMC top - K)和平均平均精度(mAP)。第一种继承自人员重识别问题,如果前 K 个预测边界框中至少有一个与真实边界框的交并比(IoU)大于或等于 0.5,则视为匹配。第二种受对象检测任务启发。遵循 ILSVRC 对象检测标准来判断预测边界框的正确性。根据精确率 - 召回率曲线为每个查询计算平均精度(AP),然后对所有查询的 AP 求平均得到最终结果。

5. 实验

5.1. Experiment Settings

5.1.1. 框架基础和参数初始化

  • 框架实现基础
    • 该框架是基于 Caffe [16, 32] 和 py-faster-rcnn [9, 27] 实现的。Caffe 是一个深度学习框架,常用于图像分类、目标检测等任务;py-faster-rcnn 是一个基于深度学习的目标检测算法的实现,它可能为这个框架提供了一些目标检测的基础架构和功能。
    • 利用 ImageNet 预训练的 ResNet50 [13] 进行参数初始化。ImageNet 是一个大规模的图像数据集,在其上预训练的 ResNet50 网络已经学习到了丰富的图像特征,将其作为参数初始化可以加速训练并提高性能,因为网络不需要从头开始学习基本的图像特征。
  • 参数设置
    • 在网络的 stem 部分,将第一个 7×7 的卷积层和批量归一化(BN)层固定为恒等仿射变换。这意味着在训练过程中这些层的参数不会更新,可能是为了保持网络初始阶段提取的一些基本特征不变。而在识别部分,其他的 BN 层正常使用,会在训练中更新参数。
    • 温度标量 τ 在公式(1)和公式(2)中被设置为 0.1,这个温度标量可能用于某些 softmax 变体或其他需要调节输出分布的操作中,影响最终的输出结果。
    • 循环队列的大小设置为 5000,循环队列可能用于存储一些历史信息,例如在训练过程中用于存储历史特征或中间结果,其大小决定了能存储信息的容量。
    • 所有的损失函数具有相同的损失权重,意味着各个损失函数对最终的总损失贡献程度相同,没有对某个损失函数进行特别的侧重。
    • 每个小批量(mini-batch)包含两个场景图像,小批量的大小会影响训练的速度和稳定性,较小的批量可以使训练过程更加精细,但可能会增加训练时间;较大的批量可以加快训练速度,但可能会占用更多的内存。

5.1.2.实验设置和比较

  • 学习率设置
    • 学习率初始化为 0.001,在 40K 次迭代后下降到 0.0001,并在 50K 次迭代直到模型收敛时保持不变。学习率的调整是为了在训练的不同阶段控制模型的更新速度,开始时使用较大的学习率可以使模型快速接近最优解,后期使用较小的学习率可以使模型更精确地收敛。
  • 与传统方法的比较
    • 将这个框架与传统方法进行比较,传统方法将问题拆分为行人检测和人员再识别两个独立任务。在实验中使用了多种方法进行比较,包括:
      • 行人检测方法
        • 直接使用现成的深度学习 CCF [37] 检测器。
        • 两种在该数据集上专门微调过的检测器:ACF [6] 和使用 ResNet-50 的 Faster-RCNN(CNN)[27],这里使用 ResNet-50 的 Faster-RCNN 相当于该框架去掉了识别任务,这样可以对比有识别任务和无识别任务的差异。
        • 对于每个检测器,在该数据集上的召回率 - 精度曲线会被绘制在图 5 中,还会使用真实边界框(GT)作为一个完美检测器的结果,用于对比评估不同检测器的性能。
      • 人员再识别方法
        • 使用了几种流行的再识别特征表示,如 DenseSIFT-ColorHist(DSIFT)[42]、Bag of Words(BoW)[43] 和 Local Maximal Occurrence(LOMO)[21]。这些特征表示是从图像中提取的不同特征,例如 DSIFT 是一种密集的 SIFT 特征与颜色直方图结合的特征表示,BoW 是将图像特征表示为词袋模型,LOMO 是另一种局部特征表示。
        • 每个特征表示与特定的距离度量一起使用,包括欧几里得距离、余弦相似度、KISSME [17] 和 XQDA [21]。其中 KISSME 和 XQDA 是在该数据集上训练的,距离度量用于衡量不同图像的特征之间的相似性,不同的度量可能适用于不同的特征表示和任务场景。

额外的基线再识别方法(IDNet):
通过丢弃该框架中的行人提议网络,并使用 Softmax 损失对裁剪后的行人图像进行身份分类训练,得到另一种基线再识别方法(IDNet)。这种训练方案在[35]中曾被使用过,用于学习有判别性的再识别特征表示。
在使用检测器框训练 IDNet 时,发现添加背景杂波作为一个独特的类别可以提高结果,而添加未标记的身份却没有帮助。这可能是因为背景杂波提供了额外的信息,帮助网络更好地区分不同的身份,而未标记的身份可能会引入噪声,导致性能下降。

实验结果报告协议:
除非特别说明,使用图库大小等于 100 的协议来报告实验结果。图库大小是指在人员再识别任务中,存储已知人员图像的集合大小,不同的图库大小会影响再识别的难度和最终的性能评估。

6.结论

In this paper, we propose a new deep learning framework for person search. It jointly handles detection and identification in a single CNN. An Online Instance Matching loss function is proposed to train the network effectively. Its non-parametric nature enables faster yet better convergence, which is validated through series of experiments.
在本文中,我们提出了一种新的深度学习框架——人物搜索框架。它在单个CNN中联合处理检测和识别。提出了一种在线实例匹配损失函数来有效地训练网络。它的非参数性质使收敛更快更好,并通过一系列实验得到验证。

补充:涉及损失示例代码

  • Pairwise loss:通过直接比较正样本和负样本之间的特征距离来优化模型。
import torch
import torch.nn as nn
import torch.nn.functional as F

class PairwiseLoss(nn.Module):
    def __init__(self, margin=2.0):
        super(PairwiseLoss, self).__init__()
        self.margin = margin
    
    def forward(self, feature1, feature2, label):
        """
        feature1, feature2: 成对样本的特征向量
        label: 1表示相同类别的对,0表示不同类别的对
        """
        # 计算欧氏距离(L2距离):distance = sqrt(Σ(xi - yi)^2)
        distance = F.pairwise_distance(feature1, feature2)
        
        # 对于相同类别的对(label=1),距离应该小;
        # 对于不同类别的对(label=0),距离应该大于margin
        loss = label * distance.pow(2) + \
               (1 - label) * torch.clamp(self.margin - distance, min=0).pow(2)
        
        return loss.mean()

batch_size = 32
feature_dim = 128
features1 = torch.randn(batch_size, feature_dim)
features2 = torch.randn(batch_size, feature_dim)
labels = torch.randint(0, 2, (batch_size,))  # 随机生成0/1标签

criterion = PairwiseLoss()
loss = criterion(features1, features2, labels)
  • Triplet Loss:比较三元组(anchor、positive、negative)之间的距离,优化特征空间,使正样本更靠近锚点,负样本更远离锚点。
class TripletLoss(nn.Module):
    def __init__(self, margin=1.0):
        super(TripletLoss, self).__init__()
        self.margin = margin
    
    def forward(self, anchor, positive, negative):
        """
        anchor: 锚点样本的特征
        positive: 与锚点同类的样本特征
        negative: 与锚点不同类的样本特征
        """
        # 计算正样本对距离
        pos_dist = torch.sum((anchor - positive) ** 2, dim=1)
        # 计算负样本对距离
        neg_dist = torch.sum((anchor - negative) ** 2, dim=1)
        
        # 计算triplet loss
        loss = torch.clamp(pos_dist - neg_dist + self.margin, min=0)
        return loss.mean()

batch_size = 32
feature_dim = 128
anchors = torch.randn(batch_size, feature_dim)
positives = torch.randn(batch_size, feature_dim)
negatives = torch.randn(batch_size, feature_dim)

criterion = TripletLoss()
loss = criterion(anchors, positives, negatives)
  • Softmax Loss:分类任务中常用的交叉熵损失,用于对样本进行类别分类。
class SoftmaxLoss(nn.Module):
    def __init__(self, feature_dim, num_classes):
        super(SoftmaxLoss, self).__init__()
        self.fc = nn.Linear(feature_dim, num_classes)
        self.criterion = nn.CrossEntropyLoss()
    
    def forward(self, features, labels):
        """
        features: 特征向量
        labels: 类别标签
        """
        # 通过全连接层得到类别预测
        logits = self.fc(features)
        # 计算交叉熵损失
        loss = self.criterion(logits, labels)
        return loss

batch_size = 32
feature_dim = 128
num_classes = 10
features = torch.randn(batch_size, feature_dim)
labels = torch.randint(0, num_classes, (batch_size,))

criterion = SoftmaxLoss(feature_dim, num_classes)
loss = criterion(features, labels)
  • OIM Loss:通过维护一个动态特征存储表来管理所有身份的特征向量。
class OIMLoss(nn.Module):
    def __init__(self, feature_dim, num_pids, momentum=0.5):
        super(OIMLoss, self).__init__()
        self.feature_dim = feature_dim
        self.num_pids = num_pids
        self.momentum = momentum
        
        # 初始化特征存储表
        self.lut = nn.Parameter(torch.zeros(num_pids, feature_dim))
        self.lut.data.uniform_(-1, 1)
        self.lut = F.normalize(self.lut, dim=1)
        
    def forward(self, features, labels):
        """
        features: 归一化的特征向量
        labels: 身份标签
        """
        # 计算特征与存储表中所有特征的相似度
        sim_mat = torch.mm(features, self.lut.t())
        
        # 计算交叉熵损失
        loss = F.cross_entropy(sim_mat, labels)
        
        # 更新特征存储表
        with torch.no_grad():
            for i, label in enumerate(labels):
                self.lut[label] = self.momentum * self.lut[label] + \
                                 (1 - self.momentum) * features[i]
                self.lut[label] = F.normalize(self.lut[label], dim=0)
                
        return loss

batch_size = 32
feature_dim = 128
num_pids = 1000  # 身份数量
features = F.normalize(torch.randn(batch_size, feature_dim), dim=1)
labels = torch.randint(0, num_pids, (batch_size,))

criterion = OIMLoss(feature_dim, num_pids)
loss = criterion(features, labels)

【总结】

  • Pairwise 和 Triplet loss:适合小规模数据集,计算简单,但随着样本数量增加效率显著降低。
  • Softmax loss:能同时比较所有样本,但在身份类别很多时,计算代价高。
  • OIM loss:高效管理大规模身份数据,通过动态特征存储表解决了 Softmax 损失扩展性差的问题,适合大规模 Re-ID 场景。
内容概要:本文档围绕“经济学期刊论文复现:数字化转型能否促进企业的高质量发展”这一核心命题,系统整合了MATLAB与Python编程实现的大量科研案例,聚焦于数字化转型对企业全要素生产率(TFP)及高质量发展影响的实证研究。文档不仅复现了高水平经济学期刊论文中的计量经济模型,如基于中国上市公司数据的数字化转型与生产率关系分析,还深度融合了工程领域的建模技术,涵盖微电网优化、负荷预测、风电光伏不确定性建模、电力系统故障仿真等。同时,提供了智能优化算法(如遗传算法、粒子群优化)、机器学习(LSTM、CNN-BiGRU-Attention)、信号处理、路径规划等多学科交叉的技术资源,构建了一个从理论推导到代码实现的完整科研支持体系,旨在帮助研究者系统掌握论文复现与实证分析的核心方法。; 适合人群:具备一定MATLAB或Python编程基础,从事经济学、管理学、能源系统、智能制造及相关交叉学科研究的研究生、科研人员及高校教师。; 使用场景及目标:①复现经济学顶刊中关于数字化转型与企业高质量发展的实证模型;②学习如何量化数字化转型并构建其对企业绩效的影响评估框架;③掌握基于真实数据的计量经济建模、场景生成与优化调度仿真技术,全面提升科研论文写作与实证研究能力。; 阅读建议:建议读者结合文中提供的代码与数据资源,重点研读“论文复现”与“创新未发表”模块,按照技术路径循序渐进地实现模型复现与拓展。推荐关注“荔枝科研社”公众号及百度网盘链接获取完整资料,系统性地开展学习与科研实践。
下载代码方式:https://pan.quark.cn/s/9de6a9d0b3d8 依据所提供的文件内容,能够推导出此段程序的核心任务在于对一个任意的三位数进行拆解,并且分别呈现该数值的百位、十位及个位部分。随后,我们将对该知识点进行进一步的深入研究。 ### 一、程序功能说明 #### 1. 接收任意一个三位数输入 程序起始阶段运用`scanf`函数来获取用户输入的一个整数。为确保输入内容确实为一个三位数,在实际应用场景中通常需要嵌入验证机制来保障输入的有效性。然而,在本示例情形下,该环节被简化处理,预设用户总会准确输入一个三位数。 #### 2. 实施数字的拆分并提取各位置数值 程序借助一系列数学计算来对三位数进行拆分,将其转化为百位、十位个位三个独立的构成部分。具体而言,通过除法取模运算完成了这一过程。 #### 3. 展示各位置上的数值 程序运用`printf`函数来输出原始数值以及各个位上的数值。需要留意的是,代码中的输出部分似乎存在一些混淆,存在语法上的错误,例如多余的`printf`语句乱码字符等问题。 ### 二、核心代码分析 #### 1. 数字拆分逻辑 ```c a[0] = n / 1000; // 提取千位数,但鉴于题目要求是三位数,此处应为百位数 a[1] = n % 1000 / 100; // 提取百位数 a[2] = n % 1000 % 100 / 10; // 提取十位数 a[3] = n % 1000 % 100 % 10; // 提取个位数 ``` 这段代码通过一连串的除法取模运算,成功地将输入的数字n拆分为百位、十位个位三个独立的构成部分,...
内容概要:本文提出了一种基于CNN-BiGRU-Attention混合神经网络模型的风电功率预测方法,采用多变量输入实现单步预测,并通过Matlab进行代码实现与验证。该模型融合卷积神经网络(CNN)以提取输入数据的局部时空特征,利用双向门控循环单元(BiGRU)充分捕捉风速、温度、湿度等多源气象与运行变量的时间序列前后依赖关系,并引入注意力机制(Attention)动态加权关键时间步的特征信息,有效提升模型对风电功率波动性不确定性的建模能力,显著增强了预测的准确性与鲁棒性。; 适合人群:具备一定机器学习与深度学习理论基础,熟悉Matlab编程环境,从事新能源发电预测、电力系统调度、智能电网优化等相关领域的科研人员、工程技术人员及高校研究生。; 使用场景及目标:①应用于实际风电场功率预测系统,为电网调度、电力市场交易与可再生能源消纳提供高精度数据支撑;②作为深度学习在能源时序预测领域的典型案例,用于科研项目开发、学术论文复现与技术创新;③深入理解多变量时间序列预测中特征融合、序列建模与注意力权重分配的协同机制,掌握先进神经网络架构的设计与优化方法。; 阅读建议:建议结合提供的Matlab代码进行实践操作,重点剖析数据预处理流程、模型网络结构搭建、训练参数调优及注意力权重可视化等关键环节,鼓励尝试替换不同特征输入、调整网络深度或引入其他优化算法(如贝叶斯优化、粒子群优化等)以进一步提升模型性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值