本文介绍: 雷达目标跟踪标注数据格式转换为MOT格式

1. 点云标注

标注软件我用的是annotate软件

GitHub – Earthwings/annotate: Create 3D labelled bounding boxes in RViz

标注软件使用教程这名博主讲的很详细:

3D目标检测(1):点云标注工具之annotate – 知乎

2. 目标跟踪MOT数据标注格式

MOT的数据一般的标注格式是:

frame, id, x, y, width, height, conf(置信度), -1, -1, -1

这些坐标都是在二维图像上的坐标,因此需要annotate.yaml标注数据提取然后转换图像坐标系

雷达坐标系一般是:

      x
      |
      |
y—— ——z(朝向外)

图像坐标系一般是指:

o —— ——> x(width)
|
|
y(height)

还是比较转换的,这里给出代码

import yaml
import numpy as np


def quaternion_to_rotation_matrix(quaternion):
    q = np.array(quaternion)
    q /= np.linalg.norm(q)
    rotation_matrix = np.array([
        [1 - 2*q[2]**2 - 2*q[3]**2, 2*q[1]*q[2] - 2*q[0]*q[3], 2*q[1]*q[3] + 2*q[0]*q[2]],
        [2*q[1]*q[2] + 2*q[0]*q[3], 1 - 2*q[1]**2 - 2*q[3]**2, 2*q[2]*q[3] - 2*q[0]*q[1]],
        [2*q[1]*q[3] - 2*q[0]*q[2], 2*q[2]*q[3] + 2*q[0]*q[1], 1 - 2*q[1]**2 - 2*q[2]**2]
    ])
    return rotation_matrix

# 读取 YAML 文件
with open("annotate_all.yaml", "r") as file:
    yaml_data = yaml.safe_load(file)

# 提取并按照 frame_id 排列
entries = {}
for track_data in yaml_data["tracks"]:
    for entry in track_data["track"]:
        timestamp = entry["header"]["stamp"]["secs"] + entry["header"]["stamp"]["nsecs"] / 1e9
        if timestamp not in entries:
            entries[timestamp] = []
           
        #雷达坐标系下 
        # length, width, and height
        quaternion = np.array([
            entry["rotation"]["x"],
            entry["rotation"]["y"],
            entry["rotation"]["z"],
            entry["rotation"]["w"]
        ])
        
        translation = np.array([
            entry["translation"]["x"],
            entry["translation"]["y"],
            entry["translation"]["z"]
        ])
          
        w = entry["box"]["width"]
        h = entry["box"]["height"]
        l = entry["box"]["length"]
        label = entry["label"]
        
        rotation_matrix = quaternion_to_rotation_matrix(quaternion)
        
        corner1 = np.dot(rotation_matrix, np.array([translation[0] - l / 2.0, translation[1] - w / 2.0, 0]))
        
        ##图像坐标系x = -corner1[1] #(-y1, -x1)
        y = -corner1[0]
        
        width = w
        height = l
        
        track_id = track_data["id"]

        entries[timestamp].append({
            "id": track_id,
            "label": label,
            "x": x,
            "y": y,
            "width": width,
            "height": height
        })

# 将提取数据按照 frame_id 排序写入本文output_file_path = "gtbox.txt"
timestamp_counter = 0
with open(output_file_path, "w") as output_file:
    for timestamp, data_list in sorted(entries.items()):
        timestamp_counter += 1
        for entry in data_list:
            output_file.write(f"{timestamp_counter},{entry['id']},{entry['x']},{entry['y']},{entry['width']},{entry['height']},-1,-1,-1,-1n")

print(f"提取的数据已按照时间写入到 {output_file_path}")

生成你的gtbox真值gtbox.txt,然后利用的跟踪代码生成track.txt,接着进行代码评估

3. 数据评估

这里我沿用的是这个博主代码

MOT多目标跟踪评价指标及计算代码(持续更新) – 知乎

将你的gtbox.txt和track.txt分别放到相应的路径,就可以运行了,生成最终的跟踪评估结果

原文地址:https://blog.csdn.net/qq_42373896/article/details/134698965

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_9517.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注