SegFormer

SegFormer — трансформер для семантической сегментации, который сочетает иерархический энкодер Mix Transformer (MiT) с лёгкой декодирующей головой из одних только MLP и обходится без тяжёлых декодеров и фиксированных позиционных кодировок, нужных более ранним трансформерам для сегментации. LibreYOLO поддерживает его для одной задачи — семантической сегментации — в шести размерах.

Задачи
semantic
Размеры
Установка
pip install libreyolo
Уровень поддержки
Поддерживаемый, начиная с v. Дополнительные обучаемые модели: тесты CI поддерживаются в рабочем состоянии, а функции добавляются по возможности.
Исходный проект
SegFormer от NVIDIA, NVIDIA Source Code License (non-commercial, research or evaluation only). Статья, исходный код
Лицензии
Код: Apache-2.0, веса: NVIDIA Source Code License (non-commercial, research or evaluation only). Коммерческое использование

Установка

SegFormer не требует опциональных extra. Всё, что он импортирует, входит в базовую установку.

bash
pip install libreyolo

Предсказание

Веса скачиваются с Hugging Face при первом запуске и кэшируются локально.

Python
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreSegformerb0-sem.pt")result = model(SAMPLE_IMAGE, save=True) mask = result.semantic_maskprint(mask.data.shape, mask.classes)
CLI
libreyolo predict model=LibreSegformerb0-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=True

result.semantic_mask хранит плотную карту классов: .data — это тензор (H, W) с id классов в исходном размере изображения, а .classes перечисляет id классов, которые реально присутствуют. result.boxes равен None, потому что отдельных детекций по экземплярам здесь нет. conf и iou принимаются ради совместимости API, но на вывод не влияют: модель возвращает по одному классу на пиксель, а не детекции по экземплярам, которые нужно фильтровать или очищать от дубликатов. Про источники, стриминг и обработку результатов см. предсказание.

Варианты

Шесть размеров, от b0 до b5: на каждом шаге энкодер Mix Transformer становится шире и глубже, а устройство декодирующей головы из одних MLP остаётся тем же.

ФайлВход (пикс.)Лицензия весов
semantic
LibreSegformerb0-sem.ptother
LibreSegformerb1-sem.ptother
LibreSegformerb2-sem.ptother
LibreSegformerb3-sem.ptother
LibreSegformerb4-sem.ptother
LibreSegformerb5-sem.ptother

Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.

Обучение

По умолчанию train() дообучает опубликованный чекпойнт. Если же не передавать model_path в LibreSegformer(...), модель собирается со случайно инициализированными энкодером и головой и обучается с нуля — это единственный способ получить веса, на которые не распространяется некоммерческое ограничение предобученных чекпойнтов (см. Лицензирование).

Python (дообучение)
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.train(data="my-dataset.yaml", epochs=160, imgsz=512, batch=8)
CLI
libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \  epochs=160 imgsz=512 batch=8
С нуля
from libreyolo.models.segformer.model import LibreSegformer # Без model_path: случайная инициализация, ничего не скачивается.# Единственный способ получить веса без некоммерческого условия# предобученных чекпойнтов.model = LibreSegformer(size="b0", nb_classes=150)model.train(data="my-dataset.yaml", epochs=160, imgsz=512, batch=8)
Multi-GPU
libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \  epochs=160 device=0,1 batch=16

Если ничего не менять, обучение идёт по рецепту ADE20K из статьи о SegFormer: AdamW с базовой скоростью обучения для бэкбона и в 10 раз большей для декодирующей головы, weight decay везде, кроме LayerNorm и позиционной свёртки Mix-FFN, и линейно затухающий планировщик с прогревом. Сходимость для больших размеров, от b3 до b5, не проверялась от начала до конца.

Про датасеты, аугментацию, multi-GPU и логгеры см. обучение.

Валидация

val() возвращает словарь с ключами metrics/: mIoU и pixel accuracy, измеренные на любом датасете в том формате, в котором вы обучали.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mIoU"])print(metrics["metrics/pixel_accuracy"])
CLI
libreyolo val model=LibreSegformerb0-sem.pt data=my-dataset.yaml

Экспорт

ЗадачаONNXTorchScriptExecuTorchTensorRTOpenVINOPaddleMNNRKNNncnnTFLiteCoreMLCore AI
semanticsemantic to ONNX: поддерживаетсяsemantic to TorchScript: поддерживаетсяsemantic to ExecuTorch: поддерживаетсяsemantic to TensorRT: поддерживаетсяsemantic to OpenVINO: поддерживаетсяsemantic to Paddle: не поддерживаетсяsemantic to MNN: не поддерживаетсяsemantic to RKNN: не поддерживаетсяsemantic to ncnn: не поддерживаетсяsemantic to TFLite: не поддерживаетсяsemantic to CoreML: не поддерживаетсяsemantic to Core AI: не поддерживается

Экспортированный артефакт загружается обратно через LibreYOLO() по расширению файла, поэтому файл .onnx или .engine ведёт себя как чекпойнт и возвращает тот же Results. Экспорт перечисляет аргументы, которые принимает каждый формат.

Python
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.export(format="onnx", imgsz=512)model.export(format="tensorrt", imgsz=512, half=True)
CLI
libreyolo export model=LibreSegformerb0-sem.pt format=onnx imgsz=512libreyolo export model=LibreSegformerb0-sem.pt format=tensorrt imgsz=512 half=True
Использование экспортированного файла
from libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика выбирает загрузчик по расширению файла, поэтому# экспортированный артефакт загружается как любой чекпойнт и# возвращает тот же объект Results.model = LibreYOLO("LibreSegformerb0-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)

Чекпойнты

Все опубликованные файлы весов этого семейства.

ФайлВход (пикс.)Лицензия весов
semantic
LibreSegformerb0-sem.ptother
LibreSegformerb1-sem.ptother
LibreSegformerb2-sem.ptother
LibreSegformerb3-sem.ptother
LibreSegformerb4-sem.ptother
LibreSegformerb5-sem.ptother

Все перечисленные выше файлы уже доступны в организации LibreYOLO и скачиваются при первом использовании.

Лицензирование

Проверяйте лицензию в репозитории конкретных весов на Hugging Face. Она указана для каждого чекпойнта в организации LibreYOLO и может различаться даже внутри одного семейства. Этот репозиторий считается авторитетным источником, а сводка ниже описывает условия на момент последней проверки страницы.

Это описание соответствующих лицензий, а не юридическая консультация. Если ответ важен для коммерческого использования, прочитайте лицензии самостоятельно и проконсультируйтесь с юристом.

Оригинальная работа
SegFormer, NVIDIA
Лицензия исходного проекта
NVIDIA Source Code License (non-commercial, research or evaluation only)
Исходный код проекта
github.com/NVlabs/SegFormer
Код LibreYOLO
MIT
Веса
NVIDIA Source Code License (non-commercial, research or evaluation only), повторно опубликованы на huggingface.co/LibreYOLO
Толкование
The pretrained ADE20K checkpoints LibreYOLO hosts for this family are converted from NVIDIA's official SegFormer release under the NVIDIA Source Code License. That license permits redistributing the weights and derivative works, provided the license text and attribution notices travel with them, but it limits USE to non-commercial research or evaluation, a restriction its Section 3.2 carries forward into every derivative and that cannot be relicensed away: these weights are NOT covered by LibreYOLO's normal permissive terms, and that limitation binds you, not just LibreYOLO. LibreYOLO's own SegFormer implementation is a separate Apache-2.0 port of Hugging Face Transformers' code, unrelated to NVIDIA's repository, so a model you train from scratch with LibreSegformer(...).train(...) carries none of this restriction.

Энкодер и декодирующая голова LibreSegformer — это PyTorch-порт реализации SegFormer из Hugging Face Transformers под Apache-2.0, а не из NVlabs/SegFormer: исходный репозиторий NVIDIA не читали и не копировали, он упомянут здесь только ради указания авторства статьи. Некоммерческое ограничение NVIDIA распространяется только на предобученные чекпойнты выше; сама архитектура и собственный код LibreYOLO остаются под MIT.

Цитирование

@inproceedings{xie2021segformer,
  title={SegFormer: Simple and Efficient Design for Semantic Segmentation with Transformers},
  author={Xie, Enze and Wang, Wenhai and Yu, Zhiding and Anandkumar, Anima and Alvarez, Jose M and Luo, Ping},
  booktitle={Neural Information Processing Systems (NeurIPS)},
  year={2021}
}

Скопировано из блока цитирования авторов на странице github.com/NVlabs/SegFormer#citation.

Проверено с LibreYOLO v1.5.0. Таблицы поддержки, чекпойнты и результаты бенчмарков на этой странице сгенерированы из выпущенной библиотеки и опубликованных весов, а не написаны вручную.