如今咱们有一个视频流,能够拆解出 N 个帧出来,这时候初始帧/某一帧中出现了一个咱们感兴趣目标,咱们但愿在后续帧中对这个目标进行追踪,这时候就须要 CV 中的目标追踪;git
目标追踪的效果以下:github
虽然效果看起来和实时人脸检测识别效果同样,可是其实只对初始帧进行了人脸检测和识别,后续帧只须要进行检测,不须要再进行识别;算法
Q: 那么问题来了,为何不直接对每一帧进行检测+识别?3d
A: 由于识别所占用的资源要远远大于检测;能够看到下图中,左边进行实时的检测+识别,在无 GPU,CPU=i7-8700K 的状况下,FPS 只有 1.8;视频
而右图中若是换成目标追踪的方法(只对初始帧作识别,后续帧只作跟踪),FPS 能够达到了 28,得到了差很少 15 倍的提高;对象
左图:检测 + 识别,https://github.com/coneypo/Dlib_face_recognition_from_camera/blob/master/face_descriptor_from_camera.pyblog
右图:检测 + OT,https://github.com/coneypo/Dlib_face_recognition_from_camera/blob/master/face_reco_from_camera_ot_single_person.pyip
为了实现目标追踪,咱们按照如下步骤进行:资源
目标跟踪可让咱们对于每个追踪的目标指定一个惟一的 ID,因此让咱们能够对视频中的跟踪物体进行计数,应用于计算人数的场景;部署
一个理想化的目标追踪算法可以实现:
上图 gif 中只有一个目标,因此其实后续帧中的检测出来的目标,若是仍是一个,确定就是咱们第一帧中识别出来的 person_X;
可是每每是一帧中出现多目标,咱们就须要对于先后帧中的多目标进行比对匹配;
如下图为例,好比左边是第 N 帧 ,有两个目标,咱们检测识别出来是 ID#1 和 ID#2,在 N+1 帧中,也检查出来两个目标,咱们知道这两个目标就是 ID#1 和 ID#2,可是不知道到底哪一个是 ID#1 哪一个是 ID#2;
因此就须要 质心追踪算法(Centroid Tracking)来进行断定后续帧中的 ID:
质心追踪算法(Centroid Tracking),依赖于在视频流的连续帧中,比较已知目标和新出现目标之间质心的欧氏距离;
总体的处理逻辑流程以下,但愿可以只在第一帧/初始帧进行检测识别,并试图将第 N+1 帧中的目标,与第 N 帧的目标关联起来,这样对于后续帧,再也不须要进行识别,只须要进行检测就能够获得目标的 ID 了;
步骤一:对于某帧取特征框并计算质心
对于视频流,经过检测算法对于每帧图像进行检测;
好比上图中有两个特征框 / 或者咱们假定两个特征框给它,分别为 ID #1 和 ID #2,能够计算出两个特征框的质心,分别获得位置坐标 (x,y);
以实际视频流为例:
步骤二:计算新旧目标特征框质心的欧氏距离
对于视频流中的后续帧,咱们利用检测算法来计算特征框,可是咱们不会再去给对于每个检测到的物体添加新的 ID 或者标记什么的(只作检测,不作识别),而是但愿将新的目标可以和旧目标联系起来;
咱们经过计算每对新旧目标的欧式距离来获得这些目标之间的关系;
以下图所示,好比帧 N 时候有两个目标(绿色),帧 N+1 时候有三个目标(红色),因此对于咱们但愿知道,这两个旧目标(绿色),在后续帧中变成了哪个新目标(红色);
因此咱们想知道以下质心之间的关系:
步骤三:更新已知目标的质心坐标
质心追踪算法的前提是:对于一个给定目标,将会在后续帧中都出现,并且在第 N 帧和 N+1 帧中的质心欧氏距离,要小于不一样目标之间的欧式距离;
所以咱们在视频流的连续帧之间,根据欧氏距离最小原则,将这些帧中特征框的质心联系起来,能够获得一个目标 X 在这些连续帧中的变化联系,就达到了咱们目标追踪的目的;
步骤四:注册新目标
有时候会有新目标的加入,好比帧 N 的时候有 x 个目标,而帧 N+1 的时候有 x+1 个目标,增长了一个目标;
因此对于这个新增的目标,咱们按照如下顺序进行注册:
而后从步骤二开始,对于视频流中的每一帧进行计算欧氏距离,更新坐标等步骤;
步骤五:注销旧目标
一个目标在后续帧中可能会消失,咱们的目标追踪算法也要可以处理这种状况;
可是对于消失目标的处理方法,要根据于你实际部署应用的场景;
由于每次从新注册的成本(进行检测/识别)的成本要大于欧氏距离比对进行目标追踪的成本;
这篇介绍 OT 的理论部分,接下来会介绍如何用 Python + OpenCV 去实现 OT;
# 请尊重他人劳动成果,转载或者使用源码请注明出处:http://www.cnblogs.com/AdaminXie
# 欢迎关注个人 Github:https://github.com/coneypo/
# 若有问题请留言或者联系邮箱: coneypo@foxmail.com