# U-Net
U-Net performs semantic segmentation with an encoder, skip connections and an upsampling decoder.
Tasks: Semantic segmentation. Install: pip install libreyolo.
Verified against LibreYOLO v1.6.0.

## Install

```bash
pip install "libreyolo"
```

## Predict

**Python**

```python
from libreyolo import LibreYOLO, SAMPLE_IMAGE

model = LibreYOLO("LibreUNets-sem.pt", device="cpu")
result = model(SAMPLE_IMAGE)

mask = result.semantic_mask
print(mask.data.shape)   # (H, W) class ids
print(mask.classes)      # sorted class ids present in the image
```

Weights download from Hugging Face on first use and are cached locally. `LibreUNets-sem.pt` is a conversion of the Cityscapes UNet-S5-D16 checkpoint from mmsegmentation: the same-padded S5-D16 graph with an FCN head, predicting the 19 Cityscapes classes. Prediction runs the whole frame on the 1024x2048 evaluation canvas.

## Train

Use a semantic dataset with image/mask pairs. Training defaults to 160 epochs, batch 4 and `amp=False`, with a `(512, 1024)` crop and `(1024, 2048)` evaluation canvas. The loss includes an auxiliary head. Export is not supported.

[Dataset setup](/docs/train/datasets) describes the required training data.

**Python**

```python
from libreyolo import LibreUNet

# Random initialization: this trains from scratch.
model = LibreUNet(size="s", device="cpu")
# Replace with your semantic segmentation dataset YAML (image/mask pairs).
model.train(data="path/to/your/semantic_dataset.yaml", pretrained=False, epochs=1, device="cpu", workers=0)
```


## Validate

**Python**

```python
from libreyolo import LibreYOLO

# Or a U-Net checkpoint you trained with model.train().
model = LibreYOLO("LibreUNets-sem.pt", device="cpu")
# Replace with your semantic segmentation dataset YAML (image/mask pairs).
metrics = model.val(data="path/to/your/semantic_dataset.yaml", workers=0)
print(metrics)
```

Use the dataset format for this task. [Validation](/docs/train/validation) explains the dataset requirements and returned metrics.

## Checkpoints

| File | Input (px) | Task | Weights license |
| --- | --- | --- | --- |
| `LibreUNets-sem.pt` |  | Semantic segmentation | apache-2.0 |

## Licensing

Check the license on the Hugging Face repository of the specific weights you download. That repository is authoritative and licenses are not always uniform across a family. This is a description of the licenses involved, not legal advice.

- Original work: U-Net, U-Net authors
- Upstream license: Apache-2.0
- Upstream source: https://github.com/open-mmlab/mmsegmentation
- LibreYOLO code: MIT
- Weights: Apache-2.0, republished at https://huggingface.co/LibreYOLO
- Interpretation: Apache-2.0 is a permissive license, so this code and these weights can be used in commercial and closed-source products. It asks you to keep its license text and attribution notices with any copy you redistribute, and it grants a patent license. LibreYOLO's port follows mmsegmentation's Apache-2.0 UNet-S5-D16 implementation with an FCN head, and LibreUNets-sem.pt is a conversion of mmsegmentation's Cityscapes checkpoint, which upstream releases under Apache-2.0.
