# yolov8_parser

Python API: `luxonis_ml.data.parsers.yolov8_parser`

## Classes

### Format

YOLOv8 directory layout variant.

#### Attributes

##### ROBOFLOW

Roboflow split layout.

##### ULTRALYTICS

Ultralytics `images`/`labels` layout.

### YOLOv8Parser

Parse YOLOv8 and Ultralytics annotations into LDF.

Expected format:

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

OR::

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

`*.yaml` contains all class names.

This is one of the formats that Roboflow can generate.

#### Methods

##### discover_dir_splits

```python
def discover_dir_splits(dataset_dir: Path) -> dict[str, dict[str, Any]]:
```

Return present and valid split directories keyed by their canonical split names.

##### fit_boundingbox

```python
def fit_boundingbox(points: np.ndarray) -> dict[str, float]:
```

Fit a bounding box around a polygon mask.

##### from_dir

```python
def from_dir(dataset_dir: Path) -> tuple[list[Path], list[Path], list[Path]]:
```

Parse all YOLOv8 splits in a source dataset directory.

Parameters

 * `dataset_dir` (`Path`): Source dataset directory containing split folders and one class YAML file.

Returns

 * `tuple[list[Path], list[Path], list[Path]]`: Added images for the train, validation, and test splits.

Raises

 * `ValueError`: If the dataset directory does not contain a class YAML file.

##### from_split

```python
def from_split(image_dir: Path, annotation_dir: Path, classes_path: Path) -> ParserOutput:
```

Parse YOLOv8 or Ultralytics annotations into LDF records.

Annotations include object detection, instance segmentation and keypoints.

Parameters

 * `image_dir` (`Path`): Directory with images.
 * `annotation_dir` (`Path`): Directory with annotations.
 * `classes_path` (`Path`): YAML file with class names.

Returns

 * `ParserOutput`: Parser output containing annotation records, skeleton metadata, and added images.

##### validate

```python
def validate(dataset_dir: Path) -> bool:
```

Validate whether the dataset directory has the expected format.

Parameters

 * `dataset_dir` (`Path`): Source dataset directory.

Returns

 * `bool`: Whether the dataset is in the expected format.

##### validate_split

```python
def validate_split(split_path: Path) -> dict[str, Any] | None:
```

Validate whether a split directory has the expected format.

Parameters

 * `split_path` (`Path`): Path to a split directory.

Returns

 * `dict[str, Any] | None`: Keyword arguments for `from_split`, or `None` if the split is not in the expected format.
