多目标追踪实验学习报告

一、目标任务

(1)了解目标检测和跟踪原理。

(2)分析源码,研究DeepSort的原理。

(3)运行程序,分析影响识别速度与精度的因素。

二、实验要求:

(1)掌握框架搭建过程,学会自行配置环境。

(2)针对自己的研究需求,找到对应数据集。

(3)理解目标检测与追踪过程。

(4)阅读DeepSort源码,掌握算法原理。

三、实验原理(概括实验算法):

多目标跟踪算法DeepSort是在Sort目标跟踪的基础上改进的,其在YOLO_v3目标检测器与卡尔曼滤波跟踪结合的基础上,引入在行人重识别数据集上离线训练的深度学习模型,在实时目标追踪过程中提取目标的表观特征并进行最近邻匹配。在介绍YOLO_v3目标检测器的原理前,先介绍一下残差网络。深度学习网络的深度对最后的分类和识别效果有很大影响,但并不是把网络设计得越深越好。常规的网络堆叠到网络较深时效果通常较差。网络层数与错误率的关系如图1所示。

多目标追踪实验学习报告_第1张图片

图表 1网络层数与错误率的关系

 在图1中,纵坐标为错误率,横坐标为迭代次数。从图中可以看出,当网络层数从20层增加至56层时,错误率没有降低,反而明显升高。其中的原因之一是网络越深,梯度消失的现象就越明显,导致网络的训练效果不太好。由于现在浅层的网络无法明显提升网络的识别效果,因此现在要解决的问题就是怎么在加深网络的情况下解决梯度消失的问题。通过在输出和输入之间引入一个跳跃式传递(Shortcut Connection),而不是简单地串联堆叠网络,可以解决随着网络层数的加深,计算梯度更新时梯度消失的问题,从而将网络层数进一步加深,提高检测精度。

残差网络基本结构如图2所示。

多目标追踪实验学习报告_第2张图片

图表 2残差网络基本结构

由于引入了残差层,因此YOLO_v3目标检测器的网络可以达到53层。将输入图片经过逐层卷积并通过残差层处理,使用步长为2的卷积来进行降采样,使图像逐渐缩小。在不同尺度特征图上做目标的位置预测,如Scale3是在32×32的特征图上做一次目标位置预测,YOLO_v3目标检测器在3个不同的特征图尺寸上做目标位置预测,最终得到目标的位置输出。由于融合了不同尺度的目标位置预测,因此YOLO_v3目标检测器增强了小目标检测能力。图3所示为YOLO_v3目标检测器的网络结构。

多目标追踪实验学习报告_第3张图片 

图表 3YOLO_v3目标检测器的网络结构

当检测与目标相关联时,检测到的边界框用于更新目标状态。在融合运动信息与表观信息后,可通过卡尔曼滤波器预测更新轨迹。

实验过程:

  1. 数据准备

MOT16数据集是2016年提出的多目标跟踪MOT Challenge系列的一个衡量多目标检测跟踪算法的标准数据集,主要标注目标为移动的行人与车辆。MOT16数据集包含了不同拍摄视角和相机运动方式下的数据,同时包含了不同天气状况下的数据。MOT16数据集共有14个视频序列,其中7个为带有标注信息的训练集,另外7个为测试集。所有视频按帧拆分为图像数据,图像统一采用JPG格式,命名方式为6位数字,如000001.jpg,目标信息文件和轨迹信息文件为CSV格式,目标信息文件和轨迹信息文件每行都代表一个目标的相关信息,每行都包含9个数值。目标检测文件内容如图4所示。

图表 4目标检测文件内容

图4中每行的第1个值表示目标出现在第几帧,第2个值表示目标运动轨迹的ID号,在目标信息文件中都为1,第3~6个值为标注边界框(Bounding Box)的坐标尺寸值,第7个值为目标检测表示的置信度(Confidence Score),第8~9个值在目标信息文件中不做标注(都设为1)。图5所示为目标的轨迹标注文件内容。

图表 5目标的轨迹标注文件内容

图5中每行的第1个值表示目标出现在第几帧,第2个值表示目标运动轨迹的ID号,第3~6个值为标注边界框的坐标尺寸值,第7个值为目标轨迹是否进入考虑范围的标志,0表示忽略,1表示active,第8个值为该轨迹对应的目标种类,第9个值为框的visibility ratio,表示目标运动时被其他目标框包含/覆盖或目标之间框边缘裁剪的情况。MOT16数据集在行人检测与跟踪、车辆检测与跟踪等方面均有应用。如图6所示为MOT16数据集的典型样本。

多目标追踪实验学习报告_第4张图片

图表 6MOT16数据集的典型样本

  1. 特征工程

frame: 第几帧图片

ID:也就是轨迹的ID,可以看出gt里边是按照轨迹的ID号进行排序的

Bbox(四位): 分别是左上角坐标和长宽

是否忽略:0代表忽略

conf:这个bbox包含物体的置信度,可以看到并不是传统意义的0-1,分数越高代表置信度越高

MOT3D(x,y,z): 是在MOT3D中使用到的内容,这里关心的是MOT2D,所以都设置为-1

classes:目标的类别个数(这里是驾驶场景包括12个类别),7代表的是静止的人。

第8个类代表错检,9-11代表被遮挡的类别

最后一个代表目标运动时被其他目标包含、覆盖、边缘裁剪的情况。

多目标追踪实验学习报告_第5张图片

  1. 函数集合

YOLOv3的损失函数是在yolov2基础上改动的,最大的变动是分类损失换成了二分交叉熵,这是由于yolov3中剔除了softmax改用logistic。

  1. 实验步骤

配置环境安装tensorflow、Keras、pillow

由于该算法检测器采用YOLO_v3目检测器,因此需要下载YOLO的权重模型文件,输入:

  https://pjreddie.com/media/files/yolov3.weights

 并将yolov3.weights复制到deep_sort_yolov3-master文件夹中。其次,将YOLO_v3的模型转换成Keras模型格式:

python convert.py yolov3.cfg yolov3.weights model_data/yolo.h5 

 转换完毕后,修改demo.py文件(第39行处):

video_capture = cv2.VideoCapture("./input/person.mp4")

 该语句是利用OpenCV读取视频文件,可以到MOT16官网下载行人数据,若加载自己的视频测试文件,则需要将person.mp4修改为自己的视频文件。默认源码中此处为0,即从计算机摄像头读取视频。代码片段如下:

if writeVideo_flag:

    # Define the codec and create VideoWriter object

        w = int(video_capture.get(3))

        h = int(video_capture.get(4))

        w1=1280

        h1=720

        #fourcc = cv2.VideoWriter_fourcc(*'MJPG')#avi格式

        fourcc = cv2.VideoWriter_fourcc(*'mp4v')#mp4格式

        #out = cv2.VideoWriter('./output/'+args["input"][43:57]+ "_" + args["class"] + '_output.avi', fourcc, 15, (w, h))

        out = cv2.VideoWriter('./output/' + "person" + '_output.mp4', fourcc, 15, (w1, h1))

        list_file = open('detection.txt', 'w')

        frame_index = -1

 修改后保存文件,然后输入:

Python demo.py

 最后,执行例程demo,载入模型文件后进行行人检测与追踪,ourput.avi为输出视频文件。

6.模型评估

YOLO V3是第三代的YOLO目标检测算法,是对于前两代YOLO算法的革新。针对YOLO V1与V2的对于小目标物体检测识别率低的问题,YOLO V3以牺牲小部分的运行时间为代价,换来了检测准确率很大的提升。在YOLO V3中主要采用了三个改进:

1)使用多级预测解决颗粒度粗,对小目标无力的问题。YOLO V3具有3个detection,分别是1个下采样的、feature map为13 * 13的,还有2个上采样的eltwise sum,feature map为26*26,52*52的。

2)使用了logistic loss函数作为新的损失函数,使得YOLO V3可以对重叠区域进行分类和框选。

3)网络结构进行了加深,使用简化的residual block 取代了原来 1×1 和 3×3的blockblock,并将原来的darknet-19变成了darknet-53。本次也是采用了这样的模型结构。

五、数据实验结果:

本次实验用的是CPU版本,但运行速度较慢,平均帧率只有1~2fps。通过电脑自带的摄像头实现了多目标的追踪。

  • 遇到的问题
  1. tensorflow的版本问题多目标追踪实验学习报告_第6张图片

由于书中给的源代码有点久远,有些模块的名字已更新,无法调用

多目标追踪实验学习报告_第7张图片

解决方法:(1)降低tensorflow版本为1.14.0;

         (2)将模块的名字一项一项更改。

  1. 不能完整的读取数据集,报错

修改:

多目标追踪实验学习报告_第8张图片

 

继续报错:

 

但没能找到一个合适的修改方法。

所以舍弃了用数据集的方法,将

video_capture = cv2.VideoCapture('./input/person.mp4')改成了:

video_capture = cv2.VideoCapture(0)用摄像头实现多目标追踪。

你可能感兴趣的:(学习笔记,计算机视觉)