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 не потребує додаткових компонентів. Усе, що він імпортує, входить до базового встановлення.
pip install libreyoloПередбачення
Під час першого використання ваги завантажуються з Hugging Face і кешуються локально.
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)libreyolo predict model=LibreSegformerb0-sem.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Trueresult.semantic_mask містить щільну карту класів: .data є тензором (H, W)
з ідентифікаторами класів у початковому розмірі зображення, а .classes перелічує
ідентифікатори класів, які фактично присутні. Значення result.boxes дорівнює
None, оскільки виявлень для окремих екземплярів немає. Аргументи conf та iou
приймаються задля узгодженості API, але не змінюють вивід: модель повертає один
клас на піксель, а не виявлення окремих екземплярів, які потрібно фільтрувати чи
дедуплікувати. Докладніше про джерела, потокове оброблення та роботу з результатами
дивіться в розділі передбачення.
Варіанти
Шість розмірів, від b0 до b5, на кожному кроці розширюють і поглиблюють кодувальник Mix Transformer, зберігаючи однакову конструкцію all-MLP голови декодування.
| Файл | Вхід (пікс.) | Ліцензія ваг |
|---|---|---|
| semantic | ||
| LibreSegformerb0-sem.pt | other | |
| LibreSegformerb1-sem.pt | other | |
| LibreSegformerb2-sem.pt | other | |
| LibreSegformerb3-sem.pt | other | |
| LibreSegformerb4-sem.pt | other | |
| LibreSegformerb5-sem.pt | other | |
Кожен наведений вище файл уже доступний у організації LibreYOLO і завантажується під час першого використання.
Навчання
Типово train() донавчає опубліковану контрольну точку. Натомість не передавайте
model_path до LibreSegformer(...), щоб створити модель із випадково
ініціалізованими кодувальником і головою та навчати її з нуля. Це єдиний спосіб
отримати ваги без обмеження некомерційного використання попередньо навчених
контрольних точок (дивіться Ліцензування).
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.train(data="my-dataset.yaml", epochs=160, imgsz=512, batch=8)libreyolo train model=LibreSegformerb0-sem.pt data=my-dataset.yaml \ epochs=160 imgsz=512 batch=8from 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)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 та правильність за пікселями,
виміряні на будь-якому датасеті у форматі, на якому проводилося навчання.
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"])libreyolo val model=LibreSegformerb0-sem.pt data=my-dataset.yamlЕкспорт
| Задача | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| semantic | semantic 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. У розділі Експорт наведено аргументи,
які приймає кожен формат.
from libreyolo import LibreYOLO model = LibreYOLO("LibreSegformerb0-sem.pt")model.export(format="onnx", imgsz=512)model.export(format="tensorrt", imgsz=512, half=True)libreyolo export model=LibreSegformerb0-sem.pt format=onnx imgsz=512libreyolo export model=LibreSegformerb0-sem.pt format=tensorrt imgsz=512 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # Фабрика визначає маршрут за суфіксом файла, тому експортований артефакт# завантажується як будь-яка контрольна точка й повертає той самий об'єкт Results.model = LibreYOLO("LibreSegformerb0-sem.onnx")result = model(SAMPLE_IMAGE) print(result.semantic_mask.data.shape)Контрольні точки
Усі опубліковані файли ваг цього сімейства.
| Файл | Вхід (пікс.) | Ліцензія ваг |
|---|---|---|
| semantic | ||
| LibreSegformerb0-sem.pt | other | |
| LibreSegformerb1-sem.pt | other | |
| LibreSegformerb2-sem.pt | other | |
| LibreSegformerb3-sem.pt | other | |
| LibreSegformerb4-sem.pt | other | |
| LibreSegformerb5-sem.pt | other | |
Кожен наведений вище файл уже доступний у організації 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.