• 学习笔记: Top-push Video-based Person Re-identification


    简介

    Top-push Video-based Person Re-identification[1]这篇论文是 CVPR 2016 上关于行人再识别(Person Re-identification)的一篇论文,文中针对图片序列(视频)提取 HOG3D 等特征,并提出 TDL(Top-push Distance Learning) 的距离度量学习方法。
    TDL 跟近年来的很多方法(如 KISSME[2] )一样,也是基于马氏距离(Mahalanobis distance)进行学习。
    马氏距离是这样的:

    $$ D(vec{x}_i, vec{x}_j) = (vec{x}_i- vec{x}_j)^mathrm{T} mathbf{M} (vec{x}_i- vec{x}_j) ag{1} $$

    上式中 $vec{x}_i$ 和 $vec{x}_j$ 代表两个特征向量。当 $mathbf{M}$ 为单位矩阵时,上式计算的就是欧式距离。 文中对该式做了一些简化/优化,使用 $mathbf{X}_{i,j}$ 来表示两个向量的外积:

    $$ mathbf{X}_{i,j} = (vec{x}_i- vec{x}_j) (vec{x}_i- vec{x}_j)^mathrm{T} ag{2} $$

    这样距离就能表示成:

    $$ D(vec{x}_i, vec{x}_j) = tr(mathbf{M} mathbf{X}_{i,j}) ag{3} $$


    TDL 目标

    一是最小化类内距离:

    $$ min sum_{vec{x}_i,vec{x}_i,y_i=y_j} D(vec{x}_i, vec{x}_j) ag{4} $$

    二是使最小类间距离小于类内距离

    $$ D(vec{x}_i, vec{x}_j) + ho < minlimits_{y_k e y_i}D(vec{x}_i, vec{x}_j),y_i = y_j ag{5} $$

    将上式写成式(5)的形式:

    $$ min sum_{vec{x}_i,vec{x}_i,y_i=y_j} max{ D(vec{x}_i, vec{x}_j) - minlimits_{y_k e y_i}D(vec{x}_i, vec{x}_k) + ho, 0 } ag{6} $$

    目标二在具体操作时,是去寻找与(vec{x}_i)距离最小的类间特征向量,这样做能减少一些计算量,但效果会不会受到影响就不得而知了。


    TDL 损失函数

    根据式(4)和式(6),构建 TDL 的损失函数:

    $$ f(mathbf{M}) = (1-alpha)sum_{vec{x}_i,vec{x}_i,y_i=y_j}tr(mathbf{M} mathbf{X}_{i,j}) + alphasum_{vec{x}_i,vec{x}_i,y_i=y_j}max{ D(vec{x}_i, vec{x}_j) - minlimits_{y_k e y_i}D(vec{x}_i, vec{x}_k) + ho, 0 } ag{7} $$

    对 $mathbf{M}$ 求偏导,得到梯度函数:

    $$ mathbf{G}_t = frac{partial f}{mathbf{M}}|_{mathbf{M}=mathbf{M}_t} = (1-alpha)sum_{i,j} mathbf{X}_{i,j} + alphasum_{(i,j,k) in mathcal{N}(mathbf{M}_t)}(mathbf{X}_{i,j}-mathbf{X}_{i,k}) ag{8} $$


    算法流程

    TDL 也使用梯度下降法,通过不断的迭代更新来优化 (mathbf{M})。这是我自己总结的 TDL 算法流程:

    • 初始化:令 (mathbf{M}) 为单位矩阵;
    • 迭代:直至收敛或达到最大迭代次数:
      1. 寻找最小类内距离 (D(vec{x}_i, vec{x}_j))
      2. 寻找与 xi 对应的最小类间距离 (D(vec{x}_k, vec{x}_i)) ,构建 triggered set ({i,j,k})
      3. 计算梯度 (mathbf{G})
      4. 更新 (mathbf{M}_{t+1} = mathbf{M}_{t} - lambda mathbf{G}_{t})
      5. (mathbf{M}) 保持正半定

    算法实现

    原作者的主页给出了 Demo,但是关键部分是加密的。不过算法不算复杂,自己实现起来也很方便。
    迭代中的第5步,我在实现的时候直接用了网上找的一个叫做 nearestPSD 的函数。
    原作者为了方便起见,实现的是 single-shot 版本的 TDL,我实现的是 multi-shot,不过速度上不及原版。
    (这里更正一下,原作者给的 Demo 应该是 multi-shot 的,只是在这篇文章中,使用了 single-shot 的实验配置。这一点原文中有说明。2017-07-17)
    我用自己实现的 TDL 替换掉了 Demo 中的加密部分,实验结果和原结果相差不大。

    之后我将自己写的 TDL 放入了 KISSME 作者提供的测试框架里,使用 LFW 数据库来测试,结果很尴尬……还不如欧式距离。
    我又把原版 TDL 放入 KISSME 的 learnPairwise 方法里面,同样使用 LFW 测试,结果内存开销巨大(几十G),跑了一天没结果,遂放弃。
    猜测可能要搭配 TDL 原文中的特征一起使用才能发挥作用。

    我的实现的 TDL:
    https://github.com/tyusr/CodeImplement/tree/master/TDL


    参考文献

    [1] You J, Wu A, Li X, et al. Top-push video-based person re-identification[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 1345-1353.
    [2] Koestinger M, Hirzer M, Wohlhart P, et al. Large scale metric learning from equivalence constraints[C]//Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on. IEEE, 2012: 2288-2295.


    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

  • 相关阅读:
    Docker的load,save和import,export的区别
    LeetCode 146. LRU 缓存机制
    mongoTemplate怎么获取MongoDB自动生成的主键_id
    $ajax()或$.get()中的请求成功时运行的函数success无法执行的解决办法
    使用$.get()请求controller出现 http://localhost:8080/../[object%20Object] 错误的问题解决
    Java利用Runtime调用Python脚本
    SpringMVC返回对象类型报错HttpMessageNotWritableException: No converter found for return value of type
    「题解」洛谷 P1801 黑匣子
    「题解」洛谷 P1717 钓鱼
    「题解」洛谷 P2571 [SCOI2010]传送带
  • 原文地址:https://www.cnblogs.com/fourseas/p/6659423.html
Copyright © 2020-2023  润新知