Rethinking the Distribution Gap of Person Re-identi cation with Camera-based Batch Normalization论文笔记

1. 摘要

所解决的问题:行人重识别一大难点就是难以处理多摄像头下特征的差异问题。
创新点:提出基于摄像头的BN层(Camera-based Batch Normalization), 通过计算每一个摄像头下图像的均值和方差来分别对各个摄像头下的图像特征进行标准化,从而消除不同摄像头下的域差异。

2. 基础知识

BN层(Batch Normalization)

  • 机器学习基本假设:独立同分布假设,就是假设训练数据和测试数据是满足相同分布的。
  • 神经网络学习本质: 学习数据的分布。
    如果不是独立同分布会造成:
    • 训练数据与测试数据的分布不同,那么网络的性能和泛化能力也大大降低。
    • 不同batch之间的分布不同,那么网络就要在每次迭代的时候去学习以适应不同的分布,这样将会大大降低网络的训练速度,所以需要transform时进行Normalization预处理

BN层:就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

内部相关性变换:在网络的前向传播过程中,每一层输出的分布在不断地改变。如果分布不能固定下来,网络就在不停地去学习变换的分布,所以网络训练缓慢。且难以收敛。
通过BN层,将每一层的输出固定下来,从而避免相关性变换问题,从而也解决了sigmoid函数的梯度消失和梯度爆炸情况(BN放在sigmoid前,将数据拉到非饱和区,提高梯度大小加快收敛)

如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了?这意味着什么?
BN为了保证非线性的获得,对变换后的满足均值为0方差为1分部的x又进行了scale加上shift操作(y=scale*x+shift),每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。
核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
在这里插入图片描述
训练过程BN层
由于在训练过程中无法获得全局的均值和方差(计算量太大等原因),所以只求一个batch的均值和方差,用其进行标准化操作。
在这里插入图片描述

在这里插入图片描述
测试/推理过程BN层
在推理过程中,使用training过程中得到的全局统计量(running mean和running var)。每次做Mini-Batch训练时,都会有那个Mini-Batch里m个训练实例获得的均值和方差,全局统计量就是把每个Mini-Batch的均值和方差统计量记住,然后对这些均值和方差求其对应的数学期望即可得出全局统计量。

3. 方法

3.1 CBN

如2中提到的,机器学习基本假设是数据独立同分布,深度学习作为机器学习的子类,自然也不例外。
在ReID任务中,不同摄像头下,不同数据集之间都存在着域间差异,但可以通过CBN来将特征分布统一。
作者做实验发现经过CBN标准化之后,特征都趋近于同一个分布。
在这里插入图片描述
xmc代表摄像头c下的图像,uc为摄像头c下的均值,σc为摄像头c下的方差。
在这里插入图片描述
在训练过程中,我们将拆解每个batch,并为每个涉及的相机计算与相机相关的均值和方差。 仅带有一个采样图像的相机将被忽略。
在测试阶段,抛弃在训练阶段计算的所有均值和方差,并对所有testcamera采样一部分图片,计算其均值方差作为最终该testcamera的BN参数。

3.2 CBN在ReID的应用

在这里插入图片描述
只需要简单把BN层换成CBN层。

4. 效果

有监督
在这里插入图片描述

5. 实现细节

首先:我们避免自定义BatchNorm层。 否则,前向传播过程将需要其他输入来标识摄像机ID。 鉴于nn.Sequential模块已在PyTorch中广泛使用,自定义的BatchNorm层将导致网络定义发生重大变化。 相反,我们转向使用官方的BatchNorm层。 在培训过程中,我们可以简单地使用官方的BatchNorm实施,并使用同一台摄像机的图像向网络提供数据。 在此阶段,收集的r​​unning_mean和running_var被直接忽略,因为它们在测试阶段将始终被覆盖。 因此,可以将BN参数动量设置为任何值。 对于测试过程,我们将BatchNorm层的默认定义从以下更改:

nn.BatchNorm2d(planes, momentum=0.1)
to
nn.BatchNorm2d(planes, momentum=None)

设为None是为了不使用train过程时积累的mean和var。
测试阶段: 给定特定摄像机的几个采样的小batch(随机采样一小部分,计算均值和方差作为这个摄像头的整体统计数据),我们只需将网络设置为“train”模式并前向传播所有这些Batch。前向传播后,每个BatchNorm层中的running_mean和running_var就是该确切摄像机的统计信息。 然后,我们只需将网络设置为评估模式并处理来自此特定摄像机的所有图像。

  • 注释:BN层有两套统计数据 一套是batch mean/var(batch的) 一套是running mean/var(全局的)。

训练阶段: 我们需要重新排列batch。 通过由任意采样器采样的batch张量,我们将该张量中的图像张量按照相应的摄像机ID,然后将它们重新组织为张量列表。 这是通过我们定制的trainer函数来实现的。 然后,通过我们自定义的DataParallel依次转发这些张量(可以理解为多线程,第i个线程对应一个batch内第i摄像头的BN,每个BN数据相互独立),然后组装所有输出,然后以与传统DataParallel相同的方式将它们馈送到损失函数。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值