KITTI Detection dataset whose format is letf_top_right_bottom to JDE normalied xc_yc_w_h

本文介绍了如何将KITTI Detection数据集转换为适用于JDE(一种注重精度与速度的跟踪算法)的标准化格式,包括筛选标签和调整图像尺寸,以适应JDE的标注需求。

Transform KITTI detection to normalized format which is adapt to JDE

  • 本质上就是 txt 版本的yolo 格式
  • JDE 方法是当前的主流,类似于SOT的Siamese,平衡精度与速度
  • 本代码是KITTIDetection数据集的转换,如要改成KITTI Tracking则需要改变图像尺寸以及筛选标签
from PIL import Image
from glob2 import glob
import os

# 测试数据集中某张图片的尺寸,KITTI的检测数据集尺寸为 1224x370
detection_kitti_imtemp = r"E:\8_DataSet\KITTI_detection\VOCKitti\JPEGImages\000000.png"

# 原始数据标签存放文件夹
'''
training/label_2
	- 000000.txt
		person x x x left top right bottom x ...
		car x x x left top right bottom x ...
		...
	- 000001.txt
	- ...
'''
label_path = r"E:\8_DataSet\KITTI_detection\KITTIObjectdata_object_label_2\training\label_2"

dst_label_path_human = r"E:\8_DataSet\KITTI_detection\KITTIObjectdata_object_label_2\training\label_2_jde_with_ids_human"
dst_label_path_car = r"E:\8_DataSet\KITTI_detection\KITTIObjectdata_object_label_2\training\label_2_jde_with_ids_car"
'''
training/label_2_jde_with_ids_car
	- 000000.txt
		0 -1 xc yc width height
		...
	- 000001.txt
	- ...
'''

# kitti_xywh = "{} {} {} {} {} {}".format(0, -1, x, )

# left_top right_bottom to normalized center x, y and width, height
def convert(size, box):
    dw = 1. / size[0]
    dh = 1. / size[1]
    for _, item in enumerate(box):
        box[_] = float(item)
    x = (box[0] + box[2]) / 2.0  # (x1+x2)/ 2
    y = (box[1] + box[3]) / 2.0  # (y1+y2)/ 2
    w = box[2] - box[0]  # x2 - x1 or l-r = w
    h = box[3] - box[1]  # y2 - y1 or b-t = h
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    kitti_xywh = "{} {} {} {} {} {}".format(0, -1, x, y, w, h)
    # xywh = (x, y, w, h)
    return kitti_xywh


def get_img_size(img_path):
    # img_path = detection_kitti_imtemp
    im = Image.open(img_path)
    w = int(im.size[0])
    h = int(im.size[1])
    image_size = (w, h)
    # print("Image Size: width->{}, height->{}".format(image_size[0], image_size[1]))
    return image_size

# 1223, 370
image_size_det = get_img_size(img_path=detection_kitti_imtemp)


def write_txt_file(xywh, dst_directory, file_name):
    path = os.path.join(dst_directory, file_name)
    with open(path, "a") as f:
        f.write(xywh)
        f.write("\n")


def get_txt_list(label_path):
    # label_list = os.listdir(label_path)

    label_list = glob(label_path + "/*.txt")
    for txt_file in label_list:
        txt_file_name = os.path.split(txt_file)[-1]
        with open(txt_file, "r") as f:
            lines = f.readlines()
            for line in lines:
                line = line.split(" ")
                if line[0] == "person": # 筛选出标签为 person的bbox并正则化
                    bbox = line[4:8]
                    n_xywh = convert(image_size_det, bbox)
                    write_txt_file(xywh=n_xywh, dst_directory=dst_label_path_human, file_name=txt_file_name)
                if line[0] == "car": # 筛选出标签为 car 的bbox并正则化
                    bbox = line[4:8]
                    n_xywh = convert(image_size_det, bbox)
                    write_txt_file(xywh=n_xywh, dst_directory=dst_label_path_car, file_name=txt_file_name)
                # print(line)
        # print 和 break 为测试专用
        # break

    return label_list


get_txt_list(label_path)
# label_list = get_txt_list(label_path=label_path)
# for txt_file in label_list:
#     pass

<think>好的,我需要回答用户关于运行`python -m pcdet.datasets.kitti.kitti_dataset create_kini_infos tools/cfgs/dataset_configs/kitti_dataset.yaml`这个命令所涉及的文件的问题。首先,我得分解这个命令的各个部分,理解每个部分的作用,然后确定相关的文件。 首先,用户运行的是一个Python模块,路径是`pcdet.datasets.kitti.kitti_dataset`,调用了`create_kitti_infos`函数,并传入了一个配置文件`kitti_dataset.yaml`。这说明该命令主要用于生成KITTI数据集的信息文件,可能用于3D目标检测任务,比如PointPillars或SECOND等模型的数据预处理。 接下来,我需要考虑这个命令执行过程中会涉及哪些文件。首先,配置文件`kitti_dataset.yaml`肯定是关键,因为它通常包含数据集的路径、类别、训练验证拆分等信息。然后,KITTI数据集本身的原始数据文件,比如图像、点云、标签等,这些通常在配置文件中指定的路径下。 然后,生成的infos文件,比如`kitti_infos_train.pkl`、`kitti_infos_val.pkl`和`kitti_infos_test.pkl`,这些文件保存了数据集的元信息,比如每个样本的路径、标注、校准参数等。此外,可能还有`kitti_dbinfos_train.pkl`,用于数据库增强的数据。 还有,`kitti_dataset.py`这个Python文件本身,里面定义了数据集类以及`create_kitti_infos`函数,负责处理原始数据并生成infos文件。可能还有相关的工具函数或类,比如数据预处理、数据增强的代码,或者与点云处理相关的模块。 另外,可能需要检查数据集目录结构是否正确,比如KITTI的标准目录结构是否包含`training`和`testing`子目录,里面分别有`image_2`、`velodyne`、`label_2`等文件夹。配置文件中的路径是否正确指向这些目录,否则会导致程序无法找到数据文件。 还可能涉及一些工具脚本或工具函数,比如数据预处理中的点云转换、标注解析等代码,这些可能在`pcdet.datasets`的其他模块中,比如`common_utils.py`或者`kitti_utils.py`等。 另外,生成infos的过程中可能需要读取校准文件(calib),比如每个帧的校准参数,这些通常位于`calib`文件夹中。标签文件(label)中的标注信息也需要被正确解析。 总结一下,涉及的文件主要包括: 1. 配置文件`kitti_dataset.yaml`:指定数据集路径、参数等。 2. KITTI原始数据集文件:图像、点云、标签、校准文件。 3. 生成的infos文件:保存处理后的元信息。 4. 数据集处理代码`kitti_dataset.py`中的`create_kitti_infos`函数。 5. 可能的工具脚本或辅助函数。 需要验证这些文件的存在和正确性,特别是配置文件中路径是否正确,原始数据是否按KITTI结构存放,是否有权限访问这些文件,以及Python代码是否正确安装或导入。 如果用户遇到问题,比如命令运行失败,可能的原因包括配置文件路径错误、数据集路径配置错误、缺少必要的依赖库或数据文件,或者代码中存在bug。需要根据错误提示具体分析,比如文件未找到、解析错误等,逐步排查。</think>运行命令 `python -m pcdet.datasets.kitti.kitti_dataset create_kitti_infos tools/cfgs/dataset_configs/kitti_dataset.yaml` 主要用于生成 KITTI 数据集的信息文件(如训练/验证/测试集的元数据),其执行过程依赖以下关键文件: --- ### **1. 配置文件** - **`kitti_dataset.yaml`** - **路径**: `tools/cfgs/dataset_configs/kitti_dataset.yaml` - **作用**: 定义数据集路径、类别名称、训练/验证/测试集划分规则等参数。 - **关键配置项**: ```yaml DATA_PATH: 'data/kitti' # KITTI数据集根目录 CLASS_NAMES: ['Car', 'Pedestrian', 'Cyclist'] # 目标类别 SPLIT: { # 数据划分规则 train: 'train', val: 'val', test: 'test' } ``` --- ### **2. KITTI 原始数据集文件** 需确保 KITTI 数据集按标准结构存放,路径需与 `kitti_dataset.yaml` 中的 `DATA_PATH` 一致: ``` data/kitti/ ├── training/ │ ├── image_2/ # 左视图RGB图像(.png) │ ├── velodyne/ # 点云数据(.bin) │ ├── label_2/ # 标注文件(.txt) │ └── calib/ # 标定参数(.txt) └── testing/ # 测试集(结构类似training) ``` --- ### **3. 生成的 Infos 文件** 命令执行后会在 `DATA_PATH` 下生成以下文件: - **`kitti_infos_train.pkl`**: 训练集的元数据(样本路径、标注、标定参数等) - **`kitti_infos_val.pkl`**: 验证集的元数据 - **`kitti_infos_test.pkl`**: 测试集的元数据(若测试集存在) - **`kitti_dbinfos_train.pkl`**: 用于数据增强的数据库信息(如目标物体的点云片段) --- ### **4. 代码文件** - **`kitti_dataset.py`** - **路径**: `pcdet/datasets/kitti/kitti_dataset.py` - **作用**: 包含 `create_kitti_infos` 函数,负责解析原始数据并生成 `.pkl` 文件。 - **关键流程**: 1. 按 `SPLIT` 配置读取训练/验证/测试集的文件列表。 2. 解析每帧的点云、图像、标注和标定参数。 3. 将元数据序列化保存为 `.pkl` 文件。 --- ### **5. 依赖工具函数** - **`data_utils.py`** 或 **`kitti_utils.py`** - **路径**: 通常位于 `pcdet/datasets/kitti/` 或 `pcdet/utils/` - **作用**: 提供点云读取、标注解析、坐标转换等底层函数,供 `kitti_dataset.py` 调用。 --- ### **执行流程总结** 1. **读取配置**: 从 `kitti_dataset.yaml` 加载数据集路径和参数。 2. **遍历数据**: 根据 `DATA_PATH` 和 `SPLIT` 配置找到所有训练/验证/测试样本。 3. **解析数据**: 对每个样本解析点云、标注、标定参数,生成结构化元数据。 4. **保存信息**: 将元数据序列化为 `.pkl` 文件,供后续训练/测试直接加载。 --- ### **常见问题排查** - **报错 `DATA_PATH not found`**: 检查 `kitti_dataset.yaml` 中的路径是否与实际数据集路径一致。 - **标注解析失败**: 确认 `label_2/` 文件格式符合 KITTI 标准(每行包含类别、位置、尺寸等)。 - **依赖缺失**: 确保已安装 `pypcd`(点云处理)和 `pickle5`(序列化)等库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值