首先介绍一下JSON格式和MOT17数据格式:
- JSON格式:一种轻量级的数据交换格式,具有易读、易解析、易编写等特点。
- MOT17数据格式:用于多目标追踪的数据集文件格式,数据集包括MOT16、MOT17、MOTChallenge等。
接下来是JSON转MOT17的实现代码攻略:
步骤一:Python代码导入
import json
import os
import argparse
import numpy as np
首先,通过import
语句导入json
、os
、argparse
和numpy
这些模块。这些工具将会被用于json文件处理、命令行参数解析和数学计算等操作。
步骤二:命令行参数解析
parser = argparse.ArgumentParser(description='Convert json to MOT17 format')
parser.add_argument('--input_path', type=str, required=True, help='path to input json file')
parser.add_argument('--output_path', type=str, required=True, help='path to output txt file')
args = parser.parse_args()
使用argparse
模块来解析命令行参数。--input_path
和--output_path
参数用于指定输入json文件和输出MOT17格式文件的路径。
步骤三:打开JSON格式文件并读取数据
json_file = open(args.input_path)
data = json.load(json_file)
该代码段打开指定的JSON格式文件,并使用json.load()
函数读取数据,并将数据存储在data
变量中。
步骤四:按照MOT17数据格式,将JSON数据转换为文本文件
with open(args.output_path, 'w') as f:
for i, frame in enumerate(data['data']['frames']):
frame_id = frame['frame_index']
for obj in frame['objects']:
if 'bbox' in obj:
bbox = obj['bbox']
bbox[:2] += np.array(bbox[2:]) / 2
f.write('{},{},{},{},{},{},-1,-1,-1,-1\n'.format(frame_id, obj['track_id'], bbox[0], bbox[1], bbox[2], bbox[3]))
该代码段按照MOT17数据格式将JSON格式数据转换为文本格式。这段代码遍历json数据,对于json中的每一帧数据,遍历该帧中所有的目标对象信息,并把帧编号、目标编号、目标位置信息写入到输出文本文件中。其中的bbox指代目标包围盒的位置信息,这里把bbox的位置信息从左上角转化为中心位置。
步骤五:关闭所有打开的文件
json_file.close()
f.close()
最后在脚本执行结束前关闭所有打开的文件。
示例1:
假如你要将名为'example.json'的JSON格式文件转换为MOT17格式的文本文件,且该文件的帧数为20,每一帧有两个目标。
- 执行代码
python json2mot17.py --input_path ./example.json --output_path ./example.txt
- 输出文件
在脚本执行完成后得到输出文件example.txt,其内容如下:
1,1,508.0,94.0,34.0,65.0,-1,-1,-1,-1
1,2,878.0,87.0,25.0,52.0,-1,-1,-1,-1
2,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
2,2,876.0,88.0,28.0,54.0,-1,-1,-1,-1
3,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
3,2,874.0,90.0,28.5,56.0,-1,-1,-1,-1
4,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
4,2,872.0,92.0,30.0,56.0,-1,-1,-1,-1
5,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
5,2,871.5,95.0,32.5,57.0,-1,-1,-1,-1
6,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
6,2,870.0,97.0,35.5,60.5,-1,-1,-1,-1
7,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
7,2,868.5,100.0,37.5,62.5,-1,-1,-1,-1
8,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
8,2,865.0,100.5,42.5,68.0,-1,-1,-1,-1
9,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
9,2,861.0,102.5,47.0,71.0,-1,-1,-1,-1
10,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
10,2,857.5,106.0,52.5,77.5,-1,-1,-1,-1
11,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
11,2,852.5,109.0,58.0,82.5,-1,-1,-1,-1
12,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
12,2,845.5,111.0,63.0,91.5,-1,-1,-1,-1
13,1,509.0,93.5,33.5,65.0,-1,-1,-1,-1
13,2,838.5,112.0,67.5,100.5,-1,-1,-1,-1
14,1,508.5,93.5,34.0,65.0,-1,-1,-1,-1
14,2,831.0,112.5,74.0,108.5,-1,-1,-1,-1
15,1,508.5,93.5,34.0,65.0,-1,-1,-1,-1
15,2,823.5,112.0,80.0,111.5,-1,-1,-1,-1
16,1,508.5,93.5,34.0,65.0,-1,-1,-1,-1
16,2,814.5,110.0,87.5,111.0,-1,-1,-1,-1
17,1,508.5,93.5,34.0,65.0,-1,-1,-1,-1
17,2,805.5,108.5,94.5,107.5,-1,-1,-1,-1
18,1,508.5,93.5,34.0,65.0,-1,-1,-1,-1
18,2,795.5,105.5,102.5,103.5,-1,-1,-1,-1
19,1,508.5,93.5,34.0,65.0,-1,-1,-1,-1
19,2,787.5,102.0,110.5,97.0,-1,-1,-1,-1
20,1,508.5,93.5,34.0,65.0,-1,-1,-1,-1
20,2,780.0,99.0,117.0,89.5,-1,-1,-1,-1
示例2:
重复执行demo1,将输出文件example.txt作为输入文件,把其转换为MOT格式文件example_mot.txt
- 执行代码
python json2mot17.py --input_path ./example.txt --output_path ./example_mot.txt
- 输出文件
在脚本执行完成后得到输出文件example_mot.txt,其内容与example.txt一模一样,如示例1中所示。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:json 转 mot17数据格式的实现代码 (亲测有效) - Python技术站