基于视频的行人再识别(4)----经典论文之CNN-RNN架构

如果觉得本文对您有所帮助的话,可以给我的github点个赞呀~本人有空会更新一些视频行人再识别的相关资料,比如代码注释、论文翻译等等。
github:https://github.com/AsuradaYuci/awesome_video_person_reid

1.Recurrent Convolutional Network for Video-based Person Re-Identification

   本文介绍这篇经典的16年reid文章[论文链接],论文中提出了一个非常经典的CNN-RNN神经网络架构。给定一个行人的视频序列,首先使用卷积神经网络提取空间特征;在卷积层后面跟着RNN(递归循环神经网络),其允许时间信息在时间步中流动;然后使用时间池化来聚合所有时间步的特征,形成视频序列特征。采用Siamese网络架构作为特征提取器,输入除了RGB图像,还额外获取了相应的光流图,一起作为输入。文章在iLIDS-VID和PRID2011数据集上进行了实验,获得了当时最好结果。

2.创新点

  1. 第一次将深度学习应用于视频行人再识别,提出的方法与基于人工特征的方法显著不同
  2. 使用颜色信息和光流信息作为输入,允许记录短时间的时空信息
  3. 利用RNN来捕获更丰富的时间信息
  4. 使用时间池化方法来汇总不同序列长度的(长期)序列信息

3.网络整体架构

   网络的Siamese架构如图所示。具体的:
   每个帧首先由卷积神经网络处理,以产生表示人在特定时刻的外观特征向量。
   然后在使用时间池化汇总所有时间步的输出之前,在时间步之间通过使用RNN循环层来流动时间信息。
   时间池化允许网络将任意长的视频序列聚合为单个特征向量,而循环层可以允许网络在组合所有时间步长的输出之前,更好地利用序列内的时间信息。
Siamese结构特点:
给定来自同一个人的一对序列,训练Siamese结构以产生在特征空间中接近的序列特征向量,同时给出来自不同人的一对序列,训练网络以产生由一个余量(margin)分隔开的序列特征向量。


基于视频的行人再识别(4)----经典论文之CNN-RNN架构_第1张图片

4.网络具体细节

  1. 输入
    输入不仅仅是RGB图像(RGB通道),还包括2个光流通道。文章认为,RGB通道编码了行人的外观和衣服细节等信息,而光流通道能直接编码短时运动信息(如行人的步态及其他运动线索)。同时使用RGB信息和光流信息,应该比仅使用RGB信息的效果要好。

  2. 卷积神经网络
    本文采用了一个三层卷积神经网络来处理每个时步的图像,每一层的网络由卷积、池化(Max pooling)以及非线性激活函数(Tanh)等组成。卷积网络的每一层输出记为 C ′ ( s ( t ) ) C^{'}(s^{(t)}) C(s(t)): C ′ ( s ( t ) ) = T a n h ( M a x p o o l ( C o n v ( s ( t ) ) ) ) C^{'}(s^{(t)})=Tanh(Maxpool(Conv(s^{(t)}))) C(s(t))=Tanh(Maxpool(Conv(s(t))))在第一层网络中,输入 s ( t ) s^{(t)} s(t)是原始图像;在更深的层中,输入是来自CNN的前一层的输出特征映射。简单起见将整个CNN看作函数 f : f: f: f = C ( x ) f=C(x) f=C(x)它将图像 x x x作为输入,并输出向量 f f f。假设输入长度为 T T T的视频序列为 S S S: S = s ( 1 ) . . . s ( T ) S=s^{(1)}...s^{(T)} S=s(1)...s(T)   式中, s ( t ) s^{(t)} s(t)表示时间步为 t t t时的图像。每个图像 s ( t ) s^{(t)} s(t)经过CNN处理得到特征向量 f ( t ) = C ( s ( t ) ) f^{(t)}=C(s^{(t)}) f(t)=C(s(t)),然后这个向量 f ( t ) f^{(t)} f(t)被送到RNN中处理,将其投影到一个低维特征空间并与之前时间步信息相结合。


    基于视频的行人再识别(4)----经典论文之CNN-RNN架构_第2张图片

  3. 循环层RNN
    理论上来说,递归神经网络RNN解决了使用神经网络处理任意长时间序列的问题(实际上随着序列的增长,RNN存在梯度消失/爆炸问题)。RNN具有反馈连接,允许网络随时间记住信息;在每个时间步,RNN接收新输入并基于当前输入和来自先前时间步的信息产生输出。由于视频reid涉及从时间序列图像中识别行人,因此使用RNN可以通过允许信息在时间步之间传递来帮助改善reid性能。通过利用CNN和时间池层之间的RNN层,我们的目的是更好地捕获视频序列中存在的时间信息
    已知 t t t时步的图像 s ( t ) s^{(t)} s(t)经过CNN的输出为 f ( t ) f^{(t)} f(t),则这一时步的RNN输出 o ( t ) o^{(t)} o(t)为: o ( t ) = W ( i ) f ( t ) + W ( s ) r ( t − 1 ) o^{(t)}=W_{(i)}f^{(t)}+W_{(s)}r^{(t-1)} o(t)=W(i)f(t)+W(s)r(t1) r ( t ) = T a n h ( o ( t ) ) r^{(t)}=Tanh(o^{(t)}) r(t)=Tanh(o(t))
    这里,每个时步的输出 o ( t ) ∈ R e ∗ 1 o^{(t)}\in R^{e*1} o(t)Re1是向量的线性组合; f ( t ) ∈ R N ∗ 1 f^{(t)}\in R^{N*1} f(t)RN1包含当前时步的输入图像信息; r ( t − 1 ) ∈ R e ∗ 1 r^{(t-1)}\in R^{e*1} r(t1)Re1包含前一个时步的RNN状态的信息。通过两个权重矩阵 W i ∈ R e ∗ N W_{i}\in R^{e*N} WiReN W s ∈ R e ∗ e W^{s}\in R^{e*e} WsRee来计算输出,其中 e e e是特征嵌入空间的维度, N N N是CNN输出的特征向量维度。RNN层的状态 r ( t ) r^{(t)} r(t)在第一个时步 r ( 0 ) r^{(0)} r(0)时初始化为零向量,在时间步间先经过一个Tanh函数再传递。

  4. 时间池化Temporal Pooling
    目的:跨越所有时间步汇总信息,从而捕获序列中存在的长期信息。
    图像序列经过CNN-RNN后变为 { o ( 1 ) . . . o ( T ) } \left\{o^{(1)}...o^{(T)}\right\} {o(1)...o(T)},为了将这些图像特征聚合为序列特征,提出了两种时间池化方法。首先是平均池化,在时间维度上使用平均池化来生成单个特征向量 v v v: v s = 1 T ∑ t = 1 T o ( t ) v_{s}=\frac{1}{T}\sum_{t=1}^{T}o^{(t)} vs=T1t=1To(t)或者最大池化,在时间维度上选择外观特征向量中的每个元素的最大激活值: v s i = m a x ( [ o ( 1 ) , i , o ( 2 ) , i , . . . , o ( T ) , i ] ) v_{s}^{i}=max([o^{(1),i},o^{(2),i},...,o^{(T),i}]) vsi=max([o(1),i,o(2),i,...,o(T),i])式中, v s i v_{s}^{i} vsi是向量 v s v_{s} vs的第i个元素。
    这样,整个特征提取网络就是将行人的图像序列S作为输入,输出其序列特征向量 R ( S ) R(S) R(S): R ( S ) = v s R(S)=v_{s} R(S)=vs

5.损失函数

根据Siamese网络的特点,给定一对图像序列 ( s i , s j ) (s_{i},s_{j}) (si,sj),每个序列经过网络处理后得到序列特征向量为 v i = R ( s i ) v_{i}=R(s_{i}) vi=R(si) v j = R ( s j ) v_{j}=R(s_{j}) vj=R(sj),则对比损失定义如下:


在这里插入图片描述

身份损失:


在这里插入图片描述

最终损失:


在这里插入图片描述

6.网络训练与结果

由于复现网络的需要,介绍下在prid2011数据集上的一些处理方法:
1.Prid2011数据集包含749个行人id,只选择同时出现在2个摄像头下的200个行人id用于训练和测试。
2.所有实验重复10次,每次采用不同的train/test行人id分割(split文件决定),最后取结果的平均值以确保获得稳定的结果。每次实验,数据集被随机分成50%用于训练,50%用于测试。
3.Siamese损失中的超参数m设置为2,输出的特征维度为128.
4.一些超参数设置:采用SGD优化方法,初始学习率为1e-3,训练500个epoch;batch为1,交替输入正序列对和负序列对给Siamese网络。正序列对和负序列对由来自两个不同摄像机拍摄的任意长度的完整序列组成,分别表示同一个人和不同的人身份。出于计算考虑,在训练期间没有采用整个序列,而是随机从序列中采样16个连续的视频帧,用于训练(k=16)。在测试时,将cam0的数据看作为Probe,将cam1的数据看作为gallery。
5.在训练和测试的数据集上,采用了同样的数据增强策略:crop和mirror。
6.图像进入网络之前,由RGB图像转换为YUV图像,并且每个颜色通道进行归一化操作(0均值,1方差)。使用Lucas-Kanade算法计算视频帧之间的水平和垂直光流信息,同样对光流信息进行归一化处理。
在两个数据集上的实验结果如图所示。


基于视频的行人再识别(4)----经典论文之CNN-RNN架构_第3张图片

结语

CNN-RNN结构是视频reid解决方案中非常经典的架构,目前很多工作都是基于这篇文章提出的架构上的改进,比如采用更好的光流,更深的CNN网络,lstm代替RNN,注意力池化代替平均池化或最大池化,更适合的损失函数等。接下来有空会介绍更多的视频reid中的相关论文解读,如有需要也会基于pytorch框架复现一些经典论文。最后打个广告,我收集了近几年的一些视频reid论文以及相应的代码,放在我的github中:[链接],欢迎大家star和fork,有空会继续更新的, 谢谢啦。

你可能感兴趣的:(VIdeo,ReID,人工智能,行人再识别,reid)