**本文恐怕不是完全的标题党**

视频多目标跟踪需要解决的关键点是前后两帧之间的Target Association,这是最难的环节(没有之一)。第T帧检测到M个目标,第T+S(S>=1)帧检测到N个目标,怎样将这M*N对目标正确地关联起来,是“跟踪算法”最难的环节。(注意这里提到的是多目标,单目标跟踪很简单)

通常的跟踪方式是根据目标中心点距离、IOU(目标区域的交并比)等这些纯物理指标进行关联,中心点距离越小、IOU越大(区域重合面积越大),则认为是同一个目标。这种方式优点就是简单、匹配速度快,而缺点就是当碰到目标被遮挡、目标过于密集、视频跳帧太大检测等情况时,跟踪就会失败。

高级的跟踪方式(本文主要讲述的方式)不仅会考虑上面提到的目标物理特性,还会计算前后两帧中目标的外观特征(Appearance Feature)相似度。这里的外观特征不是传统的提取图像特征,更不是通过比较两张图的颜色直方图来进行对比分析。而是需要训练单独的模型(区分于目标检测阶段),通过该模型计算每个目标的外观特征值,然后计算特征值之间的“余弦距离”来比较两个目标的相似度。这种方式可以有效地解决**目标被遮挡**、**目标过于密集**、**视频跳帧检测分析**等问题,缺点就是引入了另外一个特征提取模型,速度相对来说要慢一些。对于那些每秒处理帧数要求不高的场合,此种方式尤其有效。下图是通过该方法进行目标跟踪的效果(模型效果一般,目标容易跟丢):

可以看到,目标消失后再出现时,仍然能够准确跟踪到。目标非常密集,但是也并不影响最终跟踪效果。

多目标跟踪一般流程

在**Tracking By Detecting**的模式下,要想跟踪目标,先要将视频中的目标检测出来,这一步称为“目标检测”,然后根据检测得到的结果,将每帧中的目标关联起来。目标检测算法很多,SSD和YOLO等,网上开源实现版本也有很多。

如上图,经过检测算法处理之后得到的结果只有物理上的特性,帧与帧之间不存在任何关联,只有通过跟踪算法处理之后,才能加入时序的特性。

跟踪算法初级版本

该方式只考虑前后两帧中每个目标的物理特性,中心点位置以及IOU,通过分析这两个特性来关联前后帧中的目标。

如上图所示,实线方框代表目标在前一帧中的实际位置和下一帧中的预测位置,虚线框代表目标在下一帧中的实际位置,通过计算下一帧实际位置与前一帧的预测位置的IOU,来关联目标。IOU越到,代表重合度越高,越高则代表为同一目标,赋予唯一TrackId。关于该部分的详细内容,可以参见上一篇博客

跟踪算法高级版本

该方式会引入另外一个外观特征提取模型(网上搜Person Re-Id,或参见本文末尾),对于每个检测到的目标,先利用该模型计算它的特征(可以理解为该目标的一种特征编码),然后计算每个目标特征之间的余弦距离。余弦距离越小(注意:这里指1-余弦距离,参见后面关于距离的说明),代表目标越相似,通过它可以作为关联目标的一种指标。

如上图,除了在目标检测环节需要提前训练模型之外,跟踪环节也需要训练相应的模型。因此,该方式不但会增加前期准备工作,还会增加算法运行时间。

该方式的详细执行流程如下:

逻辑相当简单,难的是找到计算Appearance Feature的模型,github上有相应的算法实现:https://github.com/nwojke/cosine_metric_learning,该算法可以训练提取特征的模型。注意,如果训练数据只包含行人,那么训练出来的模型只适合计算行人的Appearance Feature(其他物体也能计算,但是不准确)。

该仓库中给出的示例代码是用来训练行人数据集的,所以对于行人特别有效。目前我正尝试训练车辆的数据集,待结果出来之后再更新此博客。

关于机器学习中的各种距离

欧几里得距离(欧氏距离)

该距离很简单,就是我们从小到大接触到的N维空间中两点的直线距离,对于最常见的2/3维空间两点的距离计算公式为:

Distance = numpy.sqrt((x1-x2)**2 + (y1-y2)**2 + (z1-z2)**2)  (三维空间两点距离)

欧式距离越小,代表两者越接近相同,当距离为零时,代表两者完全相同

余弦距离

余弦距离表示N维空间中两点与原点连接线段之间夹角的余弦值。余弦距离越大,表示夹角越小,那么两点越相似。如果余弦距离为1(最大值),那么表示两者非常相似。注意这里只能说明两点非常相似,并不一定相同。摘自网上的一幅图:

余弦距离的意义:

当两点夹角为零时,表示两点的各个维度的值所占的比例相同。比如(2,2,2)和(6,6,6),(1,2,3)和(3,6,9)。对应本文中计算Appearance Feature特征值之间的余弦距离,实际意义就是比较特征值(比如128维)中每一个维度值所占的比例是否相等,越接近相等,说明特征值对应的图片越相似。

Person Re-Id/ Vehicle Re-Id也是一个值得研究的方向,通过给定query target,可以在多个视频中搜索该目标,一般可以用于公安罪犯抓捕、违法车辆搜索等领域。虽然传统的人脸识别方式已经很成熟了,用人脸识别技术可以在城市监控摄像头中准确定位犯罪分子,但是通常情况下,监控摄像机拍摄到的人脸并不清晰,所以人脸识别准确率不高。而Person Re-Id(或者Vehicle Re-Id或者其他什么ReId)是基于整体轮廓进行特征提取的,它不要求看到犯罪份子详细的脸部图片,只需要全身轮廓图片(同时也忽略衣着、拍摄方位、光线、姿态等因素)就可以定位该目标。

本文没有源代码。有问题可以留言。

[AI开发]视频多目标跟踪高级版(离自动驾驶又‘近’了一点点)的更多相关文章

  1. [AI开发]视频结构化类应用的局限性

    算法不是通用的,基于深度学习的应用系统不但做不到通用,即使对于同一类业务场景,还需要为每个场景做定制.特殊处理,这样才能有可能到达实用标准.这种局限性在计算机视觉领域的应用中表现得尤其突出,本文介绍基 ...

  2. [AI开发]将深度学习技术应用到实际项目

    本文介绍如何将基于深度学习的目标检测算法应用到具体的项目开发中,体现深度学习技术在实际生产中的价值,算是AI算法的一个落地实现.本文算法部分可以参见前面几篇博客: [AI开发]Python+Tenso ...

  3. [AI开发]centOS7.5上基于keras/tensorflow深度学习环境搭建

    这篇文章详细介绍在centOS7.5上搭建基于keras/tensorflow的深度学习环境,该环境可用于实际生产.本人现在非常熟练linux(Ubuntu/centOS/openSUSE).wind ...

  4. 自动驾驶轻松开发?华为云ModelArts赋能智慧出行

    作为战略新兴产业,人工智能已经开始广泛应用于多个领域.近几年,科技公司.互联网公司等各领域的企业纷纷布局自动驾驶.那么,自动驾驶技术究竟发展得如何了?日前,华为云携手上海交通大学创新中心举办的华为云人 ...

  5. 本科阶段就挑战自动驾驶开发?华为云ModelArts帮你轻松实现!

    欢迎添加华为云小助手微信(微信号:HWCloud002 或 HWCloud003),输入关键字"加群",加入华为云线上技术讨论群:输入关键字"最新活动",获取华 ...

  6. 自动驾驶缺人才?听听David Silver怎么说!

    如今自动驾驶在全球范围内的发展势头愈发“凶猛”,该领域人才也一度被视为“香饽饽”. 即使在美国,自动驾驶工程师的起薪也已经突破了25万美元,我国‘“开价”之高更是令人咋舌. 人才.人才.还是人才!重要 ...

  7. [转]自动驾驶平台Apollo 2.5环境搭建

    原文地址:https://blog.csdn.net/jinzhuojun/article/details/80210180,转载主要方便随时查阅,如有版权要求,请及时联系. 我们知道,自动驾驶在学界 ...

  8. [AI开发]基于DeepStream的视频结构化解决方案

    视频结构化的定义 利用深度学习技术实时分析视频中有价值的内容,并输出结构化数据.相比数据库中每条结构化数据记录,视频.图片.音频等属于非结构化数据,计算机程序不能直接识别非结构化数据,因此需要先将这些 ...

  9. 微软Connect(); 2017大会梳理:Azure、数据、AI开发工具

    在今天召开的 Connect(); 2017 开发者大会上,微软宣布了 Azure.数据.AI 开发工具的内容.这是第一天的 Connect(); 2017 的主题演讲. 在开场视频中霍金又来了.你记 ...

随机推荐

  1. linux 安装 PHP fileinfo 扩展

    将windows解压Linux服务器 1.错误: PHP Fileinfo extension must be installed/enabled to use Intervention Image. ...

  2. python3中用HTMLTestRunner.py报ImportError: No module named 'StringIO'解决办法

    .原因是官网的是python2语法写的,看官手动把官网的HTMLTestRunner.py改成python3的语法: 参考:http://bbs.chinaunix.net/thread-415474 ...

  3. 用react重构个人网站 3-22

    问题一:import React from 'react'这个写法是怎么回事? 答案:require是common.js的写法,import是ES6的写法,主要功能都是引入模块,写法上: var mo ...

  4. 从零开始学习 Docker

      这篇文章是我学习 Docker 的记录,大部分内容摘抄自 <<Docker - 从入门到实践>> 一书,并非本人原创.学习过程中整理成适合我自己的笔记,其中也包含了我自己的 ...

  5. Maven常识

    maven下面通常有四个文件夹: src/main/java -- 用来存放业务代码 src/test/java -- 用来存放测试代码 另有两个名为resource的文件夹,通常用来放置前两个文件夹 ...

  6. &,|,^的用法

    &,|,~,^的用法 &按位与 |按位或 ~按位非 ^按位异或 举例: int x = 5; int y = 11; System.out.println(x|y); System.o ...

  7. MyBatis 中一对一和一对多的映射关系

    1 一对一映射 比如每位学生有一个地址. public class Address { private Integer addrId; private String street; private S ...

  8. procotol.go 源码阅读

    )         return     }     bufferOver = buffer[i:]     return } //整形转换成字节 // func IntToBytes(n int) ...

  9. 【链表+启发式合并】Bzoj1483 [HNOI2009] 梦幻布丁

    Description N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. Input 第 ...

  10. BZOJ_2764_[JLOI2011]基因补全_DP_高精度

    BZOJ_2764_[JLOI2011]基因补全_DP_高精度 Description 在生物课中我们学过,碱基组成了DNA(脱氧核糖核酸),他们分别可以用大写字母A,C,T,G表示,其中A总与T配对 ...