项目地址: ByteTrack
MOT数据集
关于MOT数据集的格式可以参考我的另一篇文章:【2024最新】多目标跟踪MOTchallenge数据集格式介绍
COCO格式
在训练ByteTrack之前,所有数据集都要转为COCO格式,这也是多目标跟踪数据集预处理中常见的做法。
cd <ByteTrack_HOME>
python3 tools/convert_mot17_to_coco.py
python3 tools/convert_mot20_to_coco.py
python3 tools/convert_crowdhuman_to_coco.py
python3 tools/convert_cityperson_to_coco.py
python3 tools/convert_ethz_to_coco.py
那么coco格式到底是怎样的呢?我们以
convert_mot17_to_coco.py
为例介绍。
train
首先是将训练集分为 train_half 和 val_half
SPLITS = ['train_half', 'val_half', 'train', 'test']
Train_half
输出为包含四个列表的字典
{'images': [], 'annotations': [], 'videos': [], 'categories': [{'id': 1, 'name': 'pedestrian'}]}
Videos
先把视频文件夹放入 videos[],这里视频一共 30 个,就是视频的序号和名字
out['videos'].append({'id': video_cnt, 'file_name': seq})
Out: “videos”: [{“id”: 1, “file_name”: “MOT17-01”}, {“id”: 2, “file_name”: “MOT17-03”},…
Images
把每个视频下图像进行编号
将所有图片一分为二:依次读取图片,获取 image_info,并且加到 images 列表中。
image_info = {'file_name': '{}/img1/{:06d}.jpg'.format(seq, i + 1),
'id': image_cnt + i + 1,
'frame_id': i + 1 - image_range[0],
'prev_image_id': image_cnt + i if i > 0 else -1,
'next_image_id': image_cnt + i + 2 if i < num_images - 1 else -1,
'video_id': video_cnt,
'height': height, 'width': width}
out['images'].append(image_info)
其中,id
为整个训练集中的图片编号,从 1 开始,frame_id
为当前视频序列中的图片编号,从 1 开始,prev_image_id
和 next_image_id
整个训练集的前一个和后一个图片序号,video_id
为视频序号,结果如下:
{“images”: [{“file_name”: “MOT17-01/img 1/000001. Jpg”, “id”: 1, “frame_id”: 1, “prev_image_id”: -1, “next_image_id”: 2, “video_id”: 1, “height”: 1080, “width”: 1920}, {“file_name”: “MOT17-01/img 1/000002. Jpg”, “id”: 2, “frame_id”: 2, “prev_image_id”: 1, “next_image_id”: 3, “video_id”: 1, “height”: 1080, “width”: 1920}, …]
Annotations
根据 gt.txt 和 det.txt 中第一列 (帧数),选取一半图片,即第一列在 0-一半图片 之间的图片注释,将数据写入 gt 文件夹下的新建的 gt_train_half.txt 和 det 文件夹下的 det_train_half.tx 中。
依次读取 gt 中每一行,只读取那些第一列在前半部分的
track_id = int(anns[i][1]),cat_id = int(anns[i][7]),ann_cnt += 1
ann = {'id': ann_cnt,
'category_id': category_id,
'image_id': image_cnt + frame_id,
'track_id': tid_curr,
'bbox': anns[i][2:6].tolist(),
'conf': float(anns[i][6]),
'iscrowd': 0,
'area': float(anns[i][4] * anns[i][5])}
out['annotations'].append(ann)
id
为所有图片编号,category_id
这里均为 1,image_id
与 images 中的 id 是对应的,track_id
即为轨迹编号,这里的 track_id 并不是 global ID。
Test
Test 中 annotations 为空,其他和上述一样
需要注意的是,计算评价指标时 test 是需要 gt 的。