RTMDet
RTMDetは、グリッド位置ごとにアンカーなしの点ベース事前分布を1つ使い、特徴レベル間で畳み込みを共有するヘッドから予測する1段検出器です。LibreYOLOは物体検出とRTMDet-InsのインスタンスセグメンテーションでRTMDetをサポートします。
- タスク
- detection, instance segmentation
- サイズ
- t, s, m, l, x at 640 px
- インストール
pip install libreyolo- サポートティア
- サポート対象、v以降。補助的な学習可能モデル:CIで正常な状態を維持し、機能は機会に応じて追加されます。
- ライセンス
- コード:Apache-2.0、重み:Apache-2.0。商用利用
インストール
RTMDetには基本パッケージ以外の追加パッケージは不要です。
pip install libreyolo推論
重みは初回使用時にHugging Faceからダウンロードされ、ローカルにキャッシュされます。
from libreyolo import LibreYOLO, SAMPLE_IMAGE model = LibreYOLO("LibreRTMDets.pt")result = model(SAMPLE_IMAGE, save=True) for box in result.boxes: print(box.cls, box.conf, box.xyxy)libreyolo predict model=LibreRTMDets.pt source=https://raw.githubusercontent.com/LibreYOLO/libreyolo/release/libreyolo/assets/parkour.jpg save=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # ファイル名の -seg サフィックスで RTMDet-Ins マスクヘッドを選択するため# task 引数は不要model = LibreYOLO("LibreRTMDets-seg.pt")result = model(SAMPLE_IMAGE, save=True) print(result.masks.data.shape)返されるResultsオブジェクトはすべてのファミリーに共通するため、別の検出器への切り替えは1行の変更で済みます。ファイル名に-segがあるとRTMDet-Insタスクとして自動的に解決され、result.masksにはボックスとともにインスタンスマスクが格納されます。confは信頼度のしきい値、iouはNMSのしきい値を設定します。ソース、ストリーミング、結果の処理については推論を参照してください。
バリアント
tからxまでの5つのサイズが、共通の入力解像度で1つのアーキテクチャを共有します。このファミリーにはベンチマーク表がありません。下の表にあるチェックポイントのファイルサイズで各サイズを比較してください。
学習
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.train( data="my-dataset.yaml", epochs=300, imgsz=640, batch=16, lr0=0.004,)libreyolo train model=LibreRTMDets.pt data=my-dataset.yaml imgsz=640 epochs=300 batch=16 lr0=0.004検出はtrain()で学習します。QualityFocalLoss、GIoU、DynamicSoftLabelAssignerの各コンポーネントはアップストリームのmmdetectionから移植されています。順伝播とONNXエクスポートはビット単位で同等で、後処理はval2017のサブセット上でmmdetの出力と0.001 mAP以内で一致します。
train()自体のdocstringによると、小規模データセットでのファインチューニング収束、ゼロからの学習による論文との一致、マルチGPUの動作、キャッシュされたMosaicとMixUpのスループット、アップストリームの厳密な2段パイプライン切り替え、正規化パラメータとバイアスパラメータの減衰をゼロにするパラメータ別weight decay上書きは未検証です。
RTMDet-Insには学習経路がありません。-segチェックポイントで、またはtask="segment"を指定してtrain()を呼び出すとNotImplementedErrorが発生します。インスタンスセグメンテーションは推論と検証だけをサポートします。
train()はpretrained引数も受け付けますが、その値がメソッド内で読み取られることはありません。学習は常にモデルの構築時に使った重みから続行されるため、pretrained=Falseを指定してもネットワークは再初期化されません。
そのほかを変更しなければ、トレーナーはAdamW、lr0=0.004、weight_decay=0.05で300エポック実行します。コサインスケジュール上で1エポックのウォームアップを行い、最後の20エポックではMosaicとMixUpを無効にします。
データセット、データ拡張、マルチGPU、ロガーについては学習を参照してください。
検証
val()は、学習に使用した形式の任意のデータセットで測定した適合率、再現率、mAP 50、mAP 50-95を含むmetrics/キーの辞書を返します。
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95"])print(metrics["metrics/mAP50"])libreyolo val model=LibreRTMDets.pt data=my-dataset.yamlfrom libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets-seg.pt")metrics = model.val(data="my-dataset.yaml") print(metrics["metrics/mAP50-95(M)"]) # マスクprint(metrics["metrics/mAP50-95(B)"]) # ボックス-segチェックポイントを対象にすると、通常のmetrics/mAP50-95キーにはマスクのスコアが格納されます。同じ実行で(B)のボックスと(M)のマスクも報告されるため、1回の処理で両方を取得できます。
エクスポート
| タスク | ONNX | TorchScript | ExecuTorch | TensorRT | OpenVINO | Paddle | MNN | RKNN | ncnn | TFLite | CoreML | Core AI |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Detection | Detection to ONNX:対応 | Detection to TorchScript:対応 | Detection to ExecuTorch:対応 | Detection to TensorRT:対応 | Detection to OpenVINO:対応 | Detection to Paddle:非対応 | Detection to MNN:非対応 | Detection to RKNN:非対応 | Detection to ncnn:非対応 | Detection to TFLite:非対応 | Detection to CoreML:非対応 | Detection to Core AI:対応 |
| Instance segmentation | Instance segmentation to ONNX:非対応 | Instance segmentation to TorchScript:非対応 | Instance segmentation to ExecuTorch:非対応 | Instance segmentation to TensorRT:非対応 | Instance segmentation to OpenVINO:非対応 | Instance segmentation to Paddle:非対応 | Instance segmentation to MNN:非対応 | Instance segmentation to RKNN:非対応 | Instance segmentation to ncnn:非対応 | Instance segmentation to TFLite:非対応 | Instance segmentation to CoreML:非対応 | Instance segmentation to Core AI:非対応 |
検出はほとんどの形式にエクスポートできますが、インスタンスセグメンテーションは現在どの形式にもエクスポートできません。上のマトリクスはこの違いを反映しています。エクスポートした検出成果物は、ファイルサフィックスに基づいてLibreYOLO()から再度読み込めます。そのため、.onnxまたは.engineファイルはチェックポイントと同様に動作し、同じResultsを返します。LibreYOLOをインストールせず、単独のランタイムでグラフを実行することもサポートされますが、その場合は前処理と後処理を自分で実装する必要があります。
from libreyolo import LibreYOLO model = LibreYOLO("LibreRTMDets.pt")model.export(format="onnx", imgsz=640)model.export(format="tensorrt", imgsz=640, half=True)libreyolo export model=LibreRTMDets.pt format=onnx imgsz=640libreyolo export model=LibreRTMDets.pt format=tensorrt imgsz=640 half=Truefrom libreyolo import LibreYOLO, SAMPLE_IMAGE # ファクトリーはファイルサフィックスで振り分けるためエクスポート成果物も# 任意のチェックポイントと同様に読み込まれ同じ Results オブジェクトを返すmodel = LibreYOLO("LibreRTMDets.onnx")result = model(SAMPLE_IMAGE) print(result.boxes.xyxy)チェックポイント
このファミリーで公開されているすべての重みファイルです。
| ファイル | 入力(px) | 重みのライセンス |
|---|---|---|
| Detection | ||
| LibreRTMDett.pt | 640 | apache-2.0 |
| LibreRTMDets.pt | 640 | apache-2.0 |
| LibreRTMDetm.pt | 640 | apache-2.0 |
| LibreRTMDetl.pt | 640 | apache-2.0 |
| LibreRTMDetx.pt | 640 | apache-2.0 |
| Instance segmentation | ||
| LibreRTMDett-seg.pt | 640 | apache-2.0 |
| LibreRTMDets-seg.pt | 640 | apache-2.0 |
| LibreRTMDetm-seg.pt | 640 | apache-2.0 |
| LibreRTMDetl-seg.pt | 640 | apache-2.0 |
| LibreRTMDetx-seg.pt | 640 | apache-2.0 |
上記のすべてのファイルは現在LibreYOLO orgにあり、初回使用時にダウンロードされます。
ライセンス
ダウンロードする特定の重みについて、Hugging Faceリポジトリのライセンスを確認してください。LibreYOLO orgの各チェックポイントにはライセンスが付与されており、同じファミリー内でも常に同一とは限りません。そのリポジトリが正式な情報源です。以下の概要は、このページを最後に検証した時点で適用されていた内容を示します。
これは関連するライセンスの説明であり、法的助言ではありません。商用上重要な場合は、自分でライセンスを読み、専門家の助言を受けてください。
- 原著作物
- RTMDet, OpenMMLab
- アップストリームのライセンス
- Apache-2.0
- アップストリームのソース
- github.com/open-mmlab/mmdetection
- LibreYOLOのコード
- MIT
- 重み
- Apache-2.0、huggingface.co/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. It places no obligation on your own application code, and weights you train yourself on your own data are yours. The published RTMDet and RTMDet-Ins checkpoints are converted from mmdetection's own COCO weights, trained by OpenMMLab under the same license.
引用
@misc{lyu2022rtmdet,
title={RTMDet: An Empirical Study of Designing Real-Time Object Detectors},
author={Chengqi Lyu and Wenwei Zhang and Haian Huang and Yue Zhou and Yudong Wang and Yanyi Liu and Shilong Zhang and Kai Chen},
year={2022},
eprint={2212.07784},
archivePrefix={arXiv},
primaryClass={cs.CV}
}著者によるgithub.com/open-mmlab/mmdetection/tree/main/configs/rtmdet#citationの引用ブロックからコピーしています。