DINOv2
DINOv2はMeta AIがラベルなしで汎用的な画像特徴量を生成できるよう自己教師あり学習したVision Transformerです。LibreYOLOはDINOv2-with-Registersバックボーンをラップし、セマンティックセグメンテーション、画像分類、画像全体の埋め込みベクトルという3つのタスクに対応します。
- タスク
- semantic, classify, embed
- サイズ
- n, s, m, l at 518 px
- インストール
pip install libreyolo- サポートティア
- サポート対象、v以降。補助的な学習可能モデル:CIで正常な状態を維持し、機能は機会に応じて追加されます。
- ライセンス
- コード:MIT、重み:Apache-2.0。商用利用
インストール
LibreDINOv2が登録されるのはtransformersがインストールされている場合だけです。これはRF-DETRがDINOv2バックボーンに必要とするものと同じ任意依存関係なので、同じ追加パッケージが必要です。
pip install "libreyolo[rfdetr]"推論
LibreYOLOはLibreDINOv2のチェックポイントを公開していません。ファイルを読み込む代わりにラッパーを直接構築してください。model_path=None(デフォルト)では、初回使用時にMetaのApache-2.0ライセンスのfacebook/dinov2-with-registers-smallバックボーンをHugging Faceからダウンロードします。task=で、その上で実行する処理を選択します。
from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # このファミリーにはLibreYOLOがホストするチェックポイントがないため# MetaのHugging Face組織からApache-2.0のDINOv2-with-Registers-small# バックボーンをダウンロードする 密なヘッドは学習するまでランダム初期化となる# 下記の学習を参照model = LibreDINOv2(size="s", task="semantic", nb_classes=19)result = model(SAMPLE_IMAGE) mask = result.semantic_maskprint(mask.data.shape, mask.classes)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # nb_classes=にはデータセットのクラス数を指定する 線形ヘッドは# 学習するまでランダム初期化となるmodel = LibreDINOv2(size="s", task="classify", nb_classes=10)result = model(SAMPLE_IMAGE) print(result.probs.top1, result.probs.top1conf)from libreyolo import SAMPLE_IMAGEfrom libreyolo.models.dinov2.model import LibreDINOv2 # すべてのタスクヘッドを迂回する バックボーンだけで十分なので# 有用性を得るためのファインチューニングは不要model = LibreDINOv2(size="s", task="embed")result = model(SAMPLE_IMAGE) print(result.embeddings.data.shape) # (1, D) L2正規化済みfrom libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed") # 便利なラッパー predict()を実行して各行を1つの# (N, D)テンソルに積み重ねるfeatures = model.embed(["a.jpg", "b.jpg", "c.jpg"])print(features.shape)task="semantic"とtask="classify"は、バックボーンの上に密なヘッドまたは線形ヘッドを追加します。このヘッドはランダムに初期化され、学習するまで実用になりません。task="embed"はすべてのヘッドを省略し、バックボーンの最終的な正規化済みCLSトークンを画像全体の1行としてresult.embeddingsに返すため、学習は一切不要です。3つのタスクはいずれもインスタンス単位の検出を生成しないので、result.boxesは常にNoneです。入力ソース、ストリーミング、結果の処理については推論を参照してください。
バリアント
sizeで選択するのはバックボーン自体ではなく、バックボーンの上に重ねるRF-DETR形式のプロジェクター幅です。すべてのサイズで同じDINOv2-S(small)エンコーダーを共有します。セマンティックセグメンテーションはDINOv2本来の正方形パッチグリッドで実行され、画像分類と埋め込みは線形プローブの学習に使用した、より小さい分類用解像度で実行されます。
学習
task="semantic"とtask="classify"はどちらも学習できます。task="embed"には適合させるクラス依存のヘッドがないため、train()を呼び出すとNotImplementedErrorを送出します。
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.train(data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4)from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.train( data="my-dataset.yaml", epochs=100, batch_size=4, lr=1e-4, device="0,1",)ここで主に使用するキーワード引数は、多くの他ファミリーで使うbatchとlr0ではなく、batch_sizeとlrです。batchとlr0も引き続き受け付け、対応する引数にマッピングされますが、両方を渡すと競合エラーになります。実行結果を配置する主な方法として、project=とname=の代わりにoutput_dir=(デフォルトは"runs/train")を使用します。ただし、project=とname=を直接渡す方法も引き続き機能します。データセット、データ拡張、マルチGPU、ロガーについては学習を参照してください。
検証
val()はmetrics/キーを持つ辞書を返します。task="semantic"ではmIoUとピクセル精度、task="classify"ではtop-1精度とtop-5精度が含まれます。task="embed"には評価対象となる正解データがないため、val()を呼び出すとNotImplementedErrorを送出します。
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mIoU"])print(metrics["metrics/pixel_accuracy"])from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/accuracy_top1"])print(metrics["metrics/accuracy_top5"])エクスポート
| タスク | 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:非対応 |
| classify | classify to ONNX:対応 | classify to TorchScript:対応 | classify to ExecuTorch:対応 | classify to TensorRT:対応 | classify to OpenVINO:対応 | classify to Paddle:非対応 | classify to MNN:非対応 | classify to RKNN:非対応 | classify to ncnn:非対応 | classify to TFLite:非対応 | classify to CoreML:非対応 | classify to Core AI:対応 |
| embed | embed to ONNX:対応 | embed to TorchScript:対応 | embed to ExecuTorch:対応 | embed to TensorRT:対応 | embed to OpenVINO:対応 | embed to Paddle:非対応 | embed to MNN:非対応 | embed to RKNN:非対応 | embed to ncnn:非対応 | embed to TFLite:対応 | embed to CoreML:非対応 | embed to Core AI:非対応 |
各タスクは上記に示す異なる形式のサブセットに対応します。エクスポートしたアーティファクトはファイルの拡張子に基づいてLibreYOLO()で読み込めるため、.onnxや.engineファイルもチェックポイントと同様に動作し、同じResultsを返します。エクスポートには各形式で受け付ける引数が記載されています。
from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="semantic", nb_classes=19)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="classify", nb_classes=10)model.export(format="onnx")from libreyolo.models.dinov2.model import LibreDINOv2 model = LibreDINOv2(size="s", task="embed")model.export(format="tflite")from libreyolo import LibreYOLO, SAMPLE_IMAGE # ファクトリはファイルの拡張子に応じて振り分けるためエクスポートした# アーティファクトもチェックポイントと同様に読み込まれ同じResultsオブジェクトを返す# エクスポート時はタスクからファイル名を付ける ここではLibreDINOv2s-sem.onnxmodel = LibreYOLO("LibreDINOv2s-sem.onnx")result = model(SAMPLE_IMAGE)ライセンス
ダウンロードする特定の重みについて、Hugging Faceリポジトリのライセンスを確認してください。LibreYOLO orgの各チェックポイントにはライセンスが付与されており、同じファミリー内でも常に同一とは限りません。そのリポジトリが正式な情報源です。以下の概要は、このページを最後に検証した時点で適用されていた内容を示します。
これは関連するライセンスの説明であり、法的助言ではありません。商用上重要な場合は、自分でライセンスを読み、専門家の助言を受けてください。
- 原著作物
- DINOv2, Meta AI (FAIR)
- アップストリームのライセンス
- Apache-2.0
- アップストリームのソース
- github.com/facebookresearch/dinov2
- LibreYOLOのコード
- MIT
- 重み
- Apache-2.0、著者が配布。LibreYOLOではホストもミラーもしていません。
- 解釈
- Apache-2.0 is a permissive license, so 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 of the weights you redistribute, and it grants a patent license. LibreYOLO does not host or republish a DINOv2 checkpoint of its own: LibreDINOv2 downloads the pretrained backbone directly from Meta's facebook/dinov2-with-registers-small repository on Hugging Face the first time it runs, unmodified. The semantic and classification heads start at random initialization until you train them, since LibreYOLO does not publish a trained head for this family.
上記の「Weights」行には適用されるライセンスとしてApache-2.0が記載されていますが、このファミリーについてLibreYOLOのHugging Face組織で実際に再公開されているものはありません。LibreYOLOは独自のLibreDINOv2チェックポイントをホストしていません。LibreDINOv2(model_path=None)がダウンロードするのは、変更を加えていないMeta自身のfacebook/dinov2-with-registers-smallリポジトリです。
引用
@misc{oquab2023dinov2,
title={DINOv2: Learning Robust Visual Features without Supervision},
author={Oquab, Maxime and Darcet, Timothée and Moutakanni, Theo and Vo, Huy V. and Szafraniec, Marc and Khalidov, Vasil and Fernandez, Pierre and Haziza, Daniel and Massa, Francisco and El-Nouby, Alaaeldin and Howes, Russell and Huang, Po-Yao and Xu, Hu and Sharma, Vasu and Li, Shang-Wen and Galuba, Wojciech and Rabbat, Mike and Assran, Mido and Ballas, Nicolas and Synnaeve, Gabriel and Misra, Ishan and Jegou, Herve and Mairal, Julien and Labatut, Patrick and Joulin, Armand and Bojanowski, Piotr},
journal={arXiv:2304.07193},
year={2023}
}著者によるgithub.com/facebookresearch/dinov2#citing-dinov2の引用ブロックからコピーしています。