1. MOT16与MOT17数据集详解
多目标跟踪(MOT)是计算机视觉领域的重要研究方向,而MOT16和MOT17数据集则是该领域的基准测试集。这两个数据集都包含了在复杂场景下拍摄的行人视频,涵盖了拥挤、遮挡、光照变化等多种挑战。
MOT16数据集发布于2016年,包含7个训练序列和7个测试序列,总计超过11,000帧图像。每个序列都提供了高质量的标注信息,包括行人边界框、ID号以及各种属性标签。数据集中的视频分辨率从640x480到1920x1080不等,帧率在14-30fps之间。
MOT17数据集在MOT16的基础上进行了扩展和改进,最大的特点是提供了三种不同检测器(DPM、FRCNN和SDP)生成的检测结果。这使得研究者可以专注于跟踪算法的开发,而不必担心检测质量的影响。数据集包含相同的视频序列,但标注更加精细,检测框也更加准确。
数据集目录结构通常如下:
MOT16/ ├── train/ │ ├── MOT16-02/ │ │ ├── det/ # 检测结果 │ │ ├── gt/ # 真实标注 │ │ ├── img1/ # 视频帧图像 │ │ └── seqinfo.ini # 序列信息 │ └── ...其他序列 └── test/ └── ...类似结构2. 数据集文件格式解析
理解数据集的文件格式是进行多目标跟踪研究的第一步。让我们深入看看这些文件的具体内容和含义。
det.txt文件包含了每帧中的检测结果,每行格式为:
<frame>, <id>, <bb_left>, <bb_top>, <bb_width>, <bb_height>, <conf>, <x>, <y>, <z>其中id在检测文件中总是-1,因为还没有进行跟踪关联。bb开头的四个参数定义了边界框的位置和大小,conf表示检测置信度,最后三个参数在2D跟踪中通常为-1。
gt.txt文件则包含了真实的跟踪标注,格式为:
<frame>, <id>, <bb_left>, <bb_top>, <bb_width>, <bb_height>, <flag>, <label>, <vis>这里的id是真实轨迹ID,flag表示该标注是否应该被考虑(1表示active,0表示忽略),label表示目标类别(1表示行人),vis表示目标可见比例。
seqinfo.ini文件记录了视频序列的基本信息:
[Sequence] name=MOT16-02 imDir=img1 frameRate=30 seqLength=600 imWidth=1920 imHeight=1080 imExt=.jpg3. 多目标跟踪核心指标解析
评估多目标跟踪算法的性能需要一套全面的指标体系。这些指标从不同角度衡量跟踪器的表现,我们需要深入理解每个指标的含义和计算方法。
3.1 基础评测指标
ID Switches (ID Sw.):当跟踪器错误地改变目标的ID时就会发生ID跳变。这个指标统计整个视频序列中所有身份交换的次数。理想情况下应该为0,但在拥挤场景中很难避免。
Mostly Tracked (MT):统计那些在80%以上的帧中都被正确跟踪的目标数量。这个指标反映了跟踪器对稳定目标的跟踪能力。
Mostly Lost (ML):与MT相反,统计那些在超过80%的帧中都丢失的目标数量。这个指标越小越好,说明跟踪器不容易完全丢失目标。
Fragments (Frag):当一个目标被跟踪、丢失、然后又被重新跟踪时,就会产生一个片段。这个指标统计整个序列中这样的片段数量。
3.2 MOTA与MOTP指标
MOTA (Multiple Object Tracking Accuracy):这是最常用的综合指标,计算公式为:
MOTA = 1 - (FN + FP + IDSW) / GT其中FN是漏检数,FP是误检数,IDSW是ID跳变数,GT是真实目标总数。MOTA可以超过100%,当错误很多时甚至可能为负值。
MOTP (Multiple Object Tracking Precision):这个指标衡量检测框的定位精度,计算预测框与真实框之间的重叠率:
MOTP = ∑ overlap(dt_i, gt_i) / N其中N是匹配的总数。MOTP主要反映检测器的性能,而不是跟踪器本身。
3.3 身份相关指标
IDF1:这是身份F1分数,计算正确预测的ID比例:
IDF1 = 2 * IDTP / (2 * IDTP + IDFP + IDFN)其中IDTP是正确匹配的ID数,IDFP是错误分配的ID数,IDFN是漏分配的ID数。
IDP (Identity Precision):计算预测ID中正确的比例:
IDP = IDTP / (IDTP + IDFP)IDR (Identity Recall):计算真实ID中被正确预测的比例:
IDR = IDTP / (IDTP + IDFN)4. 实战评测流程
现在让我们通过一个完整的例子,展示如何使用MOT16数据集评测一个跟踪算法(以DeepSORT为例)。
4.1 数据准备
首先下载MOT16数据集并解压。假设我们要评测MOT16-02序列,目录结构如下:
MOT16-02/ ├── det/ │ └── det.txt ├── gt/ │ └── gt.txt ├── img1/ │ ├── 000001.jpg │ ├── ... │ └── 000600.jpg └── seqinfo.ini4.2 运行跟踪算法
使用DeepSORT算法处理视频序列。这里我们需要先将图像序列转换为视频:
import cv2 import os image_folder = 'MOT16-02/img1' video_name = 'MOT16-02.mp4' images = [img for img in os.listdir(image_folder) if img.endswith(".jpg")] frame = cv2.imread(os.path.join(image_folder, images[0])) height, width, layers = frame.shape video = cv2.VideoWriter(video_name, cv2.VideoWriter_fourcc(*'mp4v'), 30, (width,height)) for image in sorted(images): video.write(cv2.imread(os.path.join(image_folder, image))) video.release()然后使用DeepSORT处理生成的视频,得到跟踪结果文件deep_ts.txt。
4.3 指标计算
使用motmetrics库计算各项指标:
import motmetrics as mm import pandas as pd # 加载真实值和跟踪结果 gt = mm.io.loadtxt('MOT16-02/gt/gt.txt', fmt='mot16') ts = mm.io.loadtxt('deep_ts.txt', fmt='mot16') # 计算匹配 acc = mm.utils.compare_to_groundtruth(gt, ts, 'iou', distth=0.5) # 创建指标计算器 mh = mm.metrics.create() # 定义要计算的指标 metrics = ['num_frames', 'num_matches', 'num_switches', 'num_false_positives', 'num_misses', 'num_detections', 'mota', 'motp', 'idf1', 'idp', 'idr'] # 计算指标 summary = mh.compute(acc, metrics=metrics, name='DeepSORT') # 打印结果 print(mm.io.render_summary(summary, formatters=mh.formatters, namemap=mm.io.motchallenge_metric_names))4.4 结果分析
典型的输出结果可能如下:
IDF1 IDP IDR MOTA MOTP DeepSORT 68.2% 72.1% 64.8% 62.3% 78.5%这表示:
- IDF1分数为68.2%,说明身份保持能力较好
- MOTA为62.3%,属于中等水平
- MOTP为78.5%,说明检测框定位精度不错
通过这些指标,我们可以全面评估跟踪算法在不同方面的表现,找出需要改进的地方。例如,如果ID Switches较高,可能需要改进关联算法;如果MOTA较低,可能需要优化检测环节。