SegFormer

SegFormer є трансформером семантичної сегментації, що поєднує ієрархічний кодувальник Mix Transformer (MiT) з легкою all-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 не потребує додаткових компонентів. Усе, що він імпортує, входить до базового встановлення.

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) з ідентифікаторами класів у початковому розмірі зображення, а .classes перелічує ідентифікатори класів, які фактично присутні. Значення result.boxes дорівнює None, оскільки виявлень для окремих екземплярів немає. Аргументи conf та iou приймаються задля узгодженості API, але не змінюють вивід: модель повертає один клас на піксель, а не виявлення окремих екземплярів, які потрібно фільтрувати чи дедуплікувати. Докладніше про джерела, потокове оброблення та роботу з результатами дивіться в розділі передбачення.

Варіанти

Шість розмірів, від b0 до b5, на кожному кроці розширюють і поглиблюють кодувальник Mix Transformer, зберігаючи однакову конструкцію all-MLP голови декодування.

Кожен наведений вище файл уже доступний у організації 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)
Кілька GPU
libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \  epochs=160 device=0,1 batch=16

Якщо параметри не змінювати, засіб навчання дотримується рецепта ADE20K зі статті про SegFormer: AdamW із базовою швидкістю навчання для бекбона, голова декодування навчається зі швидкістю, більшою в 10 разів, спад ваг застосовується всюди, крім LayerNorm і позиційної згортки Mix-FFN, а також використовується лінійний розклад спаду з прогріванням. Збіжність для більших розмірів, від b3 до b5, не валідовано від початку до кінця.

Докладніше про датасети, аугментацію, кілька GPU та засоби журналювання дивіться в розділі навчання.

Валідація

val() повертає словник ключів metrics/: mIoU та правильність за пікселями, виміряні на будь-якому датасеті у форматі, на якому проводилося навчання.

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)

Контрольні точки

Усі опубліковані файли ваг цього сімейства.

Кожен наведений вище файл уже доступний у організації 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. Таблиці підтримки, контрольні точки й результати бенчмарків на цій сторінці згенеровано з випущеної бібліотеки та опублікованих ваг, а не написано вручну.