SegFormer
SegFormerは、階層型Mix Transformer(MiT)encoderと軽量なall-MLP decode headを組み合わせたセマンティックセグメンテーションTransformerです。以前のセグメンテーションTransformerで必要だった大規模なdecoderと固定位置encodingを避けています。LibreYOLOは6つのサイズで、セマンティックセグメンテーションという1つのタスクに対応します。
- タスク
- semantic
- サイズ
- インストール
pip install libreyolo- サポートティア
- サポート対象、v以降。補助的な学習可能モデル:CIで正常な状態を維持し、機能は機会に応じて追加されます。
- アップストリーム
- NVIDIAのSegFormer、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 は元画像サイズのクラスIDを持つ (H, W) テンソルで、.classes は実際に存在するクラスIDを列挙します。インスタンスごとの検出結果がないため、result.boxes は None です。conf と iou はAPIの一貫性のために受け付けますが、出力は変更しません。モデルは絞り込みや重複排除の対象となるインスタンスごとの検出結果ではなく、pixelごとに1つのクラスを返すためです。ソース、ストリーミング、結果の処理については推論を参照してください。
バリアント
b0からb5まで6つのサイズがあり、同じall-MLP decode head設計を維持しながら、段階ごとにMix Transformer encoderの幅と深さを増やします。
| ファイル | 入力(px) | 重みのライセンス |
|---|---|---|
| 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 orgにあり、初回使用時にダウンロードされます。
学習
train() はデフォルトで公開済みチェックポイントをファインチューニングします。代わりに LibreSegformer(...) へ model_path を渡さなければ、ランダム初期化されたencoderとヘッドを構築してスクラッチ学習します。これは、学習済みチェックポイントの非商用制限をまったく含まない重みを得る唯一の経路です(ライセンスを参照)。
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設定を変更しなければ、trainerはSegFormer論文のADE20K手順に従います。バックボーンの基本学習率でAdamWを使い、decode headはその10倍の学習率で学習します。LayerNormとMix-FFN positional convolution以外のすべてにweight decayを適用し、ウォームアップを伴うlinear decay scheduleを使います。b3からb5の大きなサイズについて、収束はエンドツーエンドで検証されていません。
データセット、データ拡張、マルチGPU、loggerについては学習を参照してください。
検証
val() は、学習に使った形式の任意のデータセットに対して測定したmIoUとpixel accuracyを含む metrics/ キーの辞書を返します。
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)チェックポイント
このファミリーで公開されているすべての重みファイルです。
| ファイル | 入力(px) | 重みのライセンス |
|---|---|---|
| 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 orgにあり、初回使用時にダウンロードされます。
ライセンス
ダウンロードする特定の重みについて、Hugging Faceリポジトリのライセンスを確認してください。LibreYOLO orgの各チェックポイントにはライセンスが付与されており、同じファミリー内でも常に同一とは限りません。そのリポジトリが正式な情報源です。以下の概要は、このページを最後に検証した時点で適用されていた内容を示します。
これは関連するライセンスの説明であり、法的助言ではありません。商用上重要な場合は、自分でライセンスを読み、専門家の助言を受けてください。
- 原著作物
- 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のencoderとdecode headは、NVlabs/SegFormerではなくHugging Face TransformersのApache-2.0 SegFormer実装をPyTorchへ移植したものです。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の引用ブロックからコピーしています。