今後の展開
検出とセグメンテーションの経路は、検証済みのコア機能です。このページでは、その上に現在構築している新しいタスクヘッドと学習手法(分類、回転ボックス、姿勢推定、パラメータ効率の高いファインチューニング)について説明します。
概要
LibreYOLOは、同じモデルファミリーに異なるヘッドを組み合わせられるマルチタスクフレームワークです。検証済みの検出・セグメンテーション経路に加え、2つのフラッグシップファミリーであるYOLO9とRF-DETRには、複数の新しいタスクが追加されつつあります。どれも同じLibreYOLO(...)ファクトリと同じResultsコンテナーに接続するため、コアAPIを理解していれば追加で覚えることはわずかです。
- YOLO9とRF-DETRの分類。画像全体のラベルとtop-1・top-5確率。
- YOLO9とRF-DETRの回転バウンディングボックス(OBB)。航空画像と文書画像向けの回転ボックス。
- YOLO9とRF-DETRのキーポイント・姿勢推定。COCO-17人物キーポイント。
- 微小物体検出に対応するYOLO9-P2。航空画像やドローン画像に多い4〜16 pxの物体向けにストライド4のスケールを備え、VisDrone研究プレビュー用チェックポイントも含むYOLOv9バリアント。
- LoRA / DoRAによるRF-DETRのファインチューニング。わずかなメモリでTransformerバックボーンを適応。
はじめにお読みください
このページの内容はすべて実験的で、一部はまだ機能ブランチで開発中です。API、デフォルト値、ラベル形式は、検証済みのコアへ昇格するまでに変更される場合があります。各機能の現在の状態は安定性セクションで正確に追跡しています。
タスクの選択
各ファミリーのデフォルトは検出です。別のタスクを選択する方法は3つあり、次の優先順位で解決されます:
| 優先順位 | 方法 | 例 |
|---|---|---|
| 1 | 明示的な引数 | task="obb" |
| 2 | チェックポイントのメタデータ | 学習済み.pt内に記録されたtask |
| 3 | ファイル名の接尾辞 | -cls, -obb, -pose |
| 4 | ファミリーのデフォルト | detect |
公開LibreYOLO(...)ファクトリには実在する重みファイルが必要なため、これらのタスクのいずれかをスクラッチで始める最も簡潔な方法は、ファミリークラスを直接構築してtask=を渡すことです。学習済みチェックポイントは統合ファクトリから再度読み込め、タスクが自動検出されます。
1 from libreyolo import LibreYOLO, LibreYOLO9, LibreRFDETR 2 3 # Start a task from scratch via the family class 4 m = LibreYOLO9(None, size="t", task="classify", nb_classes=10) 5 6 # Load a trained checkpoint via the unified factory (task auto-detected) 7 m = LibreYOLO("LibreYOLO9t-obb.pt")
画像分類
分類では、画像全体に1つのラベルを割り当てます。YOLO9はバックボーンを維持して軽量な分類ヘッドを追加し、RF-DETRはDINOv2エンコーダーを再利用してプーリングした線形ヘッドを追加します。どちらも224×224で動作します。
推論とProbs結果
推論はResultsオブジェクトを返し、そのprobsフィールドにはクラスに対するsoftmaxが格納されます。
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-cls.pt") 4 r = model.predict("cat.jpg") 5 6 print(r.probs.top1) # class id of the argmax 7 print(r.probs.top1conf) # its probability 8 print(r.probs.top5) # [id, id, id, id, id] 9 print(model.names[r.probs.top1]) # human-readable label
| フィールド | 型 | 意味 |
|---|---|---|
probs.top1 | int | 最大値を取るクラスID。 |
probs.top5 | list[int] | 確率の高い順に並んだ上位5件のクラスID。 |
probs.top1conf | float | top-1クラスの確率。 |
probs.top5conf | tensor | top-5クラスの確率。 |
probs.data | tensor | 完全なsoftmaxベクトル。 |
データセット形式と学習
分類にはYAMLではなく、ImageFolderレイアウトを使います。クラス名は、train分割のサブフォルダー名を並べ替えたものに固定されます。
1 dataset/ 2 train/ 3 cat/ img001.jpg ... 4 dog/ img104.jpg ... 5 val/ 6 cat/ ... 7 dog/ ...
data=引数には、フォルダー、.zipのURL、既知の自動ダウンロード名(imagenette160とimagenet10)を指定できます。ヘッドはデータセットのクラス数に合わせて自動的に再構築されます。
1 from libreyolo import LibreYOLO9 2 3 model = LibreYOLO9(None, size="t", task="classify", nb_classes=10) 4 result = model.train( 5 data="imagenette160", # folder, .zip URL, or known name 6 epochs=10, batch=64, imgsz=224, 7 optimizer="adamw", lr0=1e-3, 8 ) 9 # Validation reports metrics/accuracy_top1 and metrics/accuracy_top5
参考実行結果
開発中の簡易動作確認では、imagenette160でYOLO9-tがtop-1 0.79・top-5 0.975(10エポック)、RF-DETR-nがtop-1 0.69・top-5 0.96(6エポック)に達しました。RF-DETRは初回実行時にDINOv2バックボーンを取得するためインターネット接続があると有利ですが、オフラインではランダム初期化にフォールバックします。
回転バウンディングボックス(OBB)
回転ボックスには回転角度が含まれ、航空画像、文書、物体が密集したシーンで必要になります。YOLO9は検出ヘッドに角度ブランチを追加し、RF-DETRはデコーダーに学習可能な角度埋め込みベクトルを追加します。
推論とOBB結果
Resultsオブジェクトはobbフィールドを公開します。角度の単位はラジアンです。
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-obb.pt") 4 r = model.predict("aerial.jpg") 5 6 for i in range(len(r.obb.cls)): 7 cx, cy, w, h, angle = r.obb.xywhr[i] # angle in radians 8 corners = r.obb.xyxyxyxy[i] # 4 (x, y) corner points 9 conf, cls = r.obb.conf[i], r.obb.cls[i]
| フィールド | 形状 | 意味 |
|---|---|---|
obb.xywhr | N x 5 | [cx, cy, w, h, angle]。角度の単位はラジアン。 |
obb.xyxyxyxy | N x 4 x 2 | ボックスごとの4つの頂点。 |
obb.conf | N | ボックスごとの信頼度。 |
obb.cls | N | ボックスごとのクラスID。 |
データセット形式と学習
OBBでは標準の検出形式のデータYAMLを使いますが、ラベルは1行あたり正確に9個のフィールドを持つYOLO-OBBテキストファイルです:クラスIDに、正規化された4つの頂点が続きます。角度は頂点から導出され、保存はされません。
1 # class_id x1 y1 x2 y2 x3 y3 x4 y4 (all normalized to [0, 1]) 2 0 0.51 0.32 0.66 0.38 0.62 0.55 0.47 0.49 3 2 0.10 0.71 0.18 0.69 0.20 0.80 0.12 0.82
通常の検出チェックポイントをOBBモデルに直接読み込むことはできません。検出からOBBへの移行は学習のウォームスタートとしてのみ許可されるため、pretrained=True(YOLO9)、またはRF-DETRの明示的な転送フラグを渡してください。頂点に対応したデータ拡張が導入されるまで、OBBではmosaicとmixupが無効になり、タイル分割推論もサポートされません。
1 from libreyolo import LibreYOLO9 2 3 model = LibreYOLO9(None, size="t", task="obb") 4 # Warm-start the backbone from a same-family detect checkpoint 5 result = model.train(data="dota8.yaml", pretrained=True, epochs=100, imgsz=640) 6 7 # CLI equivalent 8 # libreyolo train model=LibreYOLO9t.pt data=dota8.yaml --task obb
検証では回転IoU APを使い、OBBメトリクスグループのmAP50とmAP50-95として報告します。
キーポイント・姿勢推定
姿勢推定では、検出されたインスタンスごとにキーポイントを予測します。デフォルトのレイアウトはCOCO-17人物キーポイントです。YOLO9とRF-DETRの姿勢推定は初期バージョンでは人物専用の単一クラスですが、YOLO-NASとEdgeCrafterの姿勢推定はすでにツリーで利用できます。
推論とKeypoints結果
Resultsオブジェクトは形状が(N, K, 3)のkeypointsフィールドを公開し、最後のチャンネルは可視性または信頼度を、座標は元画像のピクセル位置を表します。
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("LibreYOLO9t-pose.pt") 4 r = model.predict("athletes.jpg") 5 6 kp = r.keypoints 7 print(kp.xy.shape) # (N, 17, 2) pixel coordinates 8 print(kp.conf) # (N, 17) per-keypoint visibility / confidence 9 print(kp.xyn) # normalized coordinates 10 print(r.boxes.xyxy) # person boxes still come along
| フィールド | 形状 | 意味 |
|---|---|---|
keypoints.xy | N x K x 2 | ピクセル単位のキーポイント座標。 |
keypoints.xyn | N x K x 2 | 正規化されたキーポイント座標。 |
keypoints.conf | N x K | キーポイントごとの可視性・信頼度。 |
keypoints.has_visible | N x K | ブール値の可視マスク。 |
データセット形式と学習
姿勢推定では、kpt_shape: [K, 2|3]を宣言し、水平反転データ拡張用にflip_idxを指定したデータYAMLを使います。ラベルはYOLO-pose形式のテキスト行です:クラスID、正規化されたボックス、続いてK個のキーポイント3要素(x, y, v)を並べ、可視性vは{0, 1, 2}のいずれかです。
1 path: coco8-pose 2 train: images/train 3 val: images/val 4 nc: 1 5 names: 6 0: person 7 kpt_shape: [17, 3] 8 flip_idx: [0, 2, 1, 4, 3, 6, 5, 8, 7, 10, 9, 12, 11, 14, 13, 16, 15]
1 from libreyolo import LibreYOLO9 2 3 # Warm-start from a detection checkpoint; the keypoint head is reinitialized 4 model = LibreYOLO9("LibreYOLO9t.pt", size="t", task="pose") 5 model.train(data="coco8-pose.yaml", epochs=100, imgsz=640) 6 7 # Validation reports OKS-based AP via the pose validator
開発中
YOLO9とRF-DETRの姿勢推定は機能ブランチ上にあり、まだマージされていないため、上記のAPIは固定されたものではなく想定された仕様として扱ってください。YOLO-NASの姿勢推定用重みはミラーではなくアップストリームへのリンクで提供されるため、手動で配置する必要があります。
微小物体検出(YOLO9-P2)
YOLO9-P2は、ストライド4の4番目の検出スケールを備えたYOLOv9です。標準YOLOv9はストライド8/16/32で検出するため、約16 px未満の物体は最も細かいグリッドより小さくなりますが、P2ヘッドは航空・ドローン映像の大半を占める4〜16 pxの範囲を捉えます。
VisDroneで条件を揃えたA/B比較(同じレシピ、同じ解像度、同じ初期値で、変更点はP2ヘッドのみ)を行ったところ、微小物体APは同じサイズの標準YOLOv9より+49%向上しました。学習解像度を上げ、より大きなsサイズを使うと、プロジェクト全体で微小物体APはおよそ2倍になりました:
| モデル | AP | AP50 | AP_small |
|---|---|---|---|
| 標準YOLO9-t @640(対照) | 0.123 | 0.220 | 0.047 |
| YOLO9-P2-t @640(同一レシピのA/B) | 0.138 | 0.254 | 0.070 |
| YOLO9-P2-s @768(公開プレビュー) | 0.226 | 0.385 | 0.141 |
VisDrone2019-DET val(548枚)、pycocotools、単一シードでの結果(±1ポイントはノイズとして扱います)。
VisDrone研究プレビュー
学習済みチェックポイントはLibreYOLO9P2s-visdroneとして公開されています。このファミリーはdevにマージ済みですが、まだPyPIリリースには含まれていないため、次のリリースまではソースからインストールしてください。
1 from libreyolo import LibreYOLO 2 3 # Auto-downloads from the LibreYOLO Hugging Face org 4 model = LibreYOLO("LibreYOLO9P2s-visdrone.pt") 5 6 # Evaluate/predict at 768 - the resolution it was trained at 7 results = model.predict("aerial.jpg", imgsz=768, conf=0.25)
非商用ライセンス
プレビュー用チェックポイントはVisDrone2019-DET(AISKYEYE、Tianjin University)で学習され、CC BY-NC-SA 3.0のライセンスが適用されています:LibreYOLOのMITコードやCOCO標準の重みとは異なり、非商用利用のみです。検出対象はCOCOではなく、VisDroneの航空画像向け10クラスです。モデルカードには、正確な学習レシピ、エポックごとのメトリクス、クリーンルーム方式のデータセットコンバーターが含まれているため、再現したり独自データで再学習したりできます。
使用する場合と使用しない場合
用途に合ったアーキテクチャを選んでください。COCOに似たデータ(「small」は16〜32 pxを意味します)ではP2ヘッドは有効ではなく、標準YOLOv9の方が適しています。物体が約16 px未満になる場合(ドローン・航空映像、遠距離CCTV、衛星タイル)にはYOLO9-P2を選んでください。追加のスケールにより、計算量とアンカー数はおよそ2倍になります。これがストライド4グリッドの代償です。
独自モデルの学習
YOLO9-P2は、標準YOLOv9の検出チェックポイントから転移初期化します:バックボーン、共有ネック、既存のヘッドタワーを読み込み、新しいP2モジュールは新規に初期化します。以下のレシピには、微小物体データで試行錯誤して得た知見が反映されています:
1 from libreyolo import LibreYOLO9P2 2 3 model = LibreYOLO9P2(None, size="s") 4 model.train( 5 data="/abs/path/tiny_objects.yaml", 6 imgsz=768, # resolution is the biggest lever for tiny objects 7 lr0=0.005, # the family default 0.01 diverges on transfer init 8 mosaic_prob=0.0, # mosaic tiling shrinks tiny objects below detectability 9 mixup_prob=0.0, 10 hsv_prob=1.0, flip_prob=0.5, 11 max_labels=600, # dense aerial frames exceed the default 100-box cap 12 pretrained="LibreYOLO9s.pt", # transfer init from stock YOLOv9 13 epochs=60, 14 )
LoRA / DoRAファインチューニング
LoRA形式のアダプターを使うと、ベースの重みを凍結したまま少数の低ランク行列を学習し、RF-DETRのTransformerバックボーンをファインチューニングできます。これによりオプティマイザーと勾配のメモリが削減されるため、限られたハードウェアで強力なチェックポイントを新しいドメインに適応させるのに適しています。
有効化
公開API全体で必要なのはtrain()の1つのフラグだけです。調整するrank、alpha、対象モジュールの設定項目はなく、レシピは十分に検証された構成に固定されています。内部実装では、DINOv2アテンションのquery、key、value射影にDoRA(重み分解LoRA、rank 16)を適用します。
1 from libreyolo import LibreYOLO 2 3 model = LibreYOLO("rf-detr-nano.pth") # sizes n, s, m, l 4 result = model.train( 5 data="data.yaml", 6 lora=True, # DoRA on the frozen DINOv2 backbone 7 epochs=100, batch_size=4, lr=1e-4, 8 ) 9 10 # Resume: LoRA is auto-detected from the checkpoint, no need to repeat the flag 11 model.train(data="data.yaml", resume=True)
1 # CLI equivalent 2 libreyolo train --model rf-detr-nano.pth --data data.yaml --lora
チェックポイントとエクスポート
- 学習チェックポイントはアダプターテンソルを保持し、設定にはLoRAの使用が記録されるため、読み込みと再開の際にアダプターグラフが自動的に再構築されます。
- 検出ヘッドは常に学習可能なため、新しいクラス数にも引き続き適応できます。
export()はアダプターを密な重みにマージします。エクスポート済みモデルは通常のモデルであり、peft依存関係はありません。- LoRAはRF-DETR専用です。ほかのファミリーに
lora=Trueを渡すと、明確なエラーが発生します。
追加パッケージのインストール
LoRAの学習にはアダプターの依存関係であるpip install "libreyolo[lora]"が必要で、RF-DETRスタックとpeftがインストールされます。エクスポート済み(マージ済み)モデルでは、推論時にこの依存関係は不要です。
安定性
各機能の現在の状態を示します。ここにあるものはすべて実験的で、この表が現状を正確に表しています。
| 機能 | ファミリー | 状態 |
|---|---|---|
| 分類 | YOLO9, RF-DETR | PR公開中 |
| 回転ボックス(OBB) | YOLO9, RF-DETR | 実験的 |
| キーポイント・姿勢推定 | YOLO9, RF-DETR | 近日導入 |
| キーポイント・姿勢推定 | YOLO-NAS, EdgeCrafter | 利用可能 |
| 微小物体検出 | YOLO9-P2 | 研究プレビュー |
| LoRA / DoRA | RF-DETR | レビュー済み |