# LuxonisParser

## 概述

LuxonisParser 提供了一个简单的 API，用于从几种常见数据集格式创建数据集。这些格式包括流行的 Roboflow 导出版本、Ultralytics 风格数据集、Luxonis 原生 LDF 数据集，以及一些专用格式（如 SOLO）：

> 注意：解析 ZIP 文件时，请勿在归档中包含顶级的
> `dataset_dir`
> 文件夹。根据所选格式，train、validation 和 test 目录应直接放置在 ZIP 归档的
> **根目录**
> 下。

#### - COCO

我们支持两种变体的 COCO JSON 格式：

 * [FiftyOne layout](https://docs.voxel51.com/user_guide/export_datasets.html#cocodetectiondataset-export)（FiftyOne 布局）

```plaintext
dataset_dir/
    ├── train/
    │   ├── data/
    │   │   ├── img1.jpg
    │   │   ├── img2.jpg
    │   │   └── ...
    │   └── labels.json
    ├── validation/
    │   ├── data/
    │   └── labels.json
    └── test/
        ├── data/
        └── labels.json
```

 * [Roboflow](https://roboflow.com/formats/coco-json)

```plaintext
dataset_dir/
    ├── train/
    │   ├── img1.jpg
    │   ├── img2.jpg
    │   └── ...
    │   └── _annotations.coco.json
    ├── valid/
    └── test/
```

#### - [YOLOv8-v12](https://roboflow.com/formats/yolov8-pytorch-txt) 和 [Ultralytics](https://docs.ultralytics.com/datasets/)

 * Roboflow 格式（支持 YOLOv8-v12）

```plaintext
dataset_dir/
    ├── train/
    │   ├── images/
    │   │   ├── img1.jpg
    │   │   ├── img2.jpg
    │   │   └── ...
    │   ├── labels/
    │   │   ├── img1.txt
    │   │   ├── img2.txt
    │   │   └── ...
    ├── valid/
    ├── test/
    └── *.yaml
```

 * Ultralytics 格式

```plaintext
dataset_dir/
    ├── images/
    │   ├── train/
    │   │   ├── img1.jpg
    │   │   ├── img2.jpg
    │   │   └── ...
    │   ├── val/
    │   └── test/
    ├── labels/
    │   ├── train/
    │   │   ├── img1.txt
    │   │   ├── img2.txt
    │   │   └── ...
    │   ├── val/
    │   └── test/
    └── *.yaml
```

#### - [Pascal VOC XML](https://roboflow.com/formats/pascal-voc-xml)

```plaintext
dataset_dir/
    ├── train/
    │   ├── img1.jpg
    │   ├── img1.xml
    │   └── ...
    ├── valid/
    └── test/
```

#### - [YOLO Darknet TXT](https://roboflow.com/formats/yolo-darknet-txt)

```plaintext
dataset_dir/
    ├── train/
    │   ├── img1.jpg
    │   ├── img1.txt
    │   ├── ...
    │   └── _darknet.labels
    ├── valid/
    └── test/
```

#### - [YOLOv4 PyTorch TXT](https://roboflow.com/formats/yolov4-pytorch-txt)

```plaintext
dataset_dir/
    ├── train/
    │   ├── img1.jpg
    │   ├── img2.jpg
    │   ├── ...
    │   ├── _annotations.txt
    │   └── _classes.txt
    ├── valid/
    └── test/
```

#### - [MT YOLOv6](https://roboflow.com/formats/mt-yolov6)

```plaintext
dataset_dir/
    ├── images/
    │   ├── train/
    │   │   ├── img1.jpg
    │   │   ├── img2.jpg
    │   │   └── ...
    │   ├── valid/
    │   └── test/
    ├── labels/
    │   ├── train/
    │   │   ├── img1.txt
    │   │   ├── img2.txt
    │   │   └── ...
    │   ├── valid/
    │   └── test/
    └── data.yaml
```

#### - [CreateML JSON](https://roboflow.com/formats/createml-json)

```plaintext
dataset_dir/
    ├── train/
    │   ├── img1.jpg
    │   ├── img2.jpg
    │   └── ...
    │   └── _annotations.createml.json
    ├── valid/
    └── test/
```

#### - [TensorFlow Object Detection CSV](https://roboflow.com/formats/tensorflow-object-detection-csv)

```plaintext
dataset_dir/
    ├── train/
    │   ├── img1.jpg
    │   ├── img2.jpg
    │   ├── ...
    │   └── _annotations.csv
    ├── valid/
    └── test/
```

#### - [SOLO](https://docs.unity3d.com/Packages/com.unity.perception@1.0/manual/Schema/SoloSchema.html)

```plaintext
dataset_dir/
    ├── train/
    │   ├── metadata.json
    │   ├── sensor_definitions.json
    │   ├── annotation_definitions.json
    │   ├── metric_definitions.json
    │   └── sequence.<SequenceNUM>/
    │       ├── step<StepNUM>.camera.jpg
    │       ├── step<StepNUM>.frame_data.json
    │       └── (可选: step<StepNUM>.camera.semantic segmentation.jpg)
    ├── valid/
    └── test/
```

#### - 分类目录

一个包含每个类别子目录的目录。支持两种结构：

 * 带 train/valid/test 子目录的分割结构：

```plaintext
dataset_dir/
    ├── train/
    │   ├── class1/
    │   │   ├── img1.jpg
    │   │   ├── img2.jpg
    │   │   └── ...
    │   ├── class2/
    │   └── ...
    ├── valid/
    └── test/
```

 * 扁平结构（类别子目录直接位于根目录，解析时随机划分）：

```plaintext
dataset_dir/
    ├── class1/
    │   ├── img1.jpg
    │   └── ...
    ├── class2/
    │   └── ...
    └── info.json  （可选的元数据文件）
```

#### - [FiftyOne 分类](https://docs.voxel51.com/user_guide/export_datasets.html#fiftyone-image-classification-dataset)

FiftyOneImageClassificationDataset 格式，图像位于 data/ 文件夹中，标签位于 labels.json 中。支持两种结构：

 * 带训练/验证/测试子目录的分割结构：

```plaintext
dataset_dir/
    ├── train/
    │   ├── data/
    │   │   ├── img1.jpg
    │   │   └── ...
    │   └── labels.json
    ├── validation/
    │   ├── data/
    │   └── labels.json
    └── test/
        ├── data/
        └── labels.json
```

 * 扁平结构（在解析时应用随机分割）：

```plaintext
dataset_dir/
    ├── data/
    │   ├── img1.jpg
    │   └── ...
    └── labels.json
```

labels.json 格式：

```json
{
    "classes": ["class1", "class2", ...],
    "labels": {
        "image_stem": class_index,
        ...
    }
}
```

#### - 原生 LDF

原生 Luxonis 数据集导出，带有分割级别的 annotations.json 文件。

```plaintext
dataset_dir/
    ├── train/
    │   └── annotations.json
    ├── valid/
    └── test/
```

#### - 分割掩码目录

包含图像及对应掩码的目录。

```plaintext
dataset_dir/
    ├── train/
    │   ├── img1.jpg
    │   ├── img1_mask.png
    │   ├── ...
    │   └── _classes.csv
    ├── valid/
    └── test/
```

掩码存储为灰度 PNG 图像，每个像素值对应一个类别。像素值到类别的映射在 _classes.csv 文件中定义。

```csv
像素值, 类别
0, background
1, class1
2, class2
3, class3
```

## 数据集解析

解析从初始化 LuxonisParser
对象并传入数据集目录路径开始。可选地，可以指定数据集名称、任务名称和类型（即格式）（默认情况下，名称设置为提供的数据集目录名称，类型根据数据集目录结构推断）。数据集目录可以是本地目录路径，也可以是远程数据集标识符。解析器目前接受本地路径、.zip
压缩包、gcs://...、s3://... 和 roboflow://workspace/project/version/format 数据集标识符。也可以将数据集目录作为 .zip 文件提供。

```python
from luxonis_ml.data.parsers import LuxonisParser
from luxonis_ml.enums import DatasetType

dataset_dir = "roboflow://workspace/project/version/coco"

parser = LuxonisParser(
    dataset_dir=dataset_dir,
    dataset_name="my_dataset",
    dataset_type=DatasetType.COCO,
    task_name="detection",
)
```

初始化 LuxonisParser 对象后，可以通过调用其 .parse() 方法运行解析：

```python
dataset = parser.parse()
```

这将创建一个包含所提供数据集数据的 LuxonisDataset 实例，并在源格式定义分割时保持原始分割。如果数据集已以 Luxonis 格式存在，则跳过解析并返回现有数据集。

## CLI 参考

可以通过使用 luxonis_ml data parse 命令调用解析功能。

```bash
luxonis_ml data parse path/to/dataset --name my_dataset --type coco
```

有关更多详细信息，请运行 luxonis_ml data parse --help。
