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で正常な状態を維持し、機能は機会に応じて追加されます。
アップストリーム
Meta AI (FAIR)のDINOv2、Apache-2.0。論文ソース
ライセンス
コード:MIT、重み:Apache-2.0。商用利用

インストール

LibreDINOv2が登録されるのはtransformersがインストールされている場合だけです。これはRF-DETRがDINOv2バックボーンに必要とするものと同じ任意依存関係なので、同じ追加パッケージが必要です。

bash
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)
マルチGPU
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",)

ここで主に使用するキーワード引数は、多くの他ファミリーで使うbatchlr0ではなく、batch_sizelrです。batchlr0も引き続き受け付け、対応する引数にマッピングされますが、両方を渡すと競合エラーになります。実行結果を配置する主な方法として、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"])

エクスポート

タスク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:非対応
classifyclassify 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:対応
embedembed 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の引用ブロックからコピーしています。

LibreYOLO v1.5.0で検証済みです。このページのサポート表、チェックポイント、ベンチマーク値は手作業で記述したものではなく、リリース済みライブラリと公開済みの重みから生成されています。