ドローン検出データセットガイド:小型UAVを対象にUltralytics YOLOをトレーニング
DUT Anti-UAV、Drone-vs-Bird、サーマルドローン検出データセットを比較し、Ultralytics YOLO26をトレーニングして小型ドローンを検出し、誤警報を減らしましょう。

UAV Detection and Tracking Benchmarkによると、Drone-vs-Birdのデータに含まれるドローンの平均サイズは34 x 23ピクセルです。仮に3840 x 2160のフレームにこのサイズのドローンが映っているとします。検出器のデフォルト値である640ピクセルにリサイズすると、約5.7 x 3.8ピクセルまで縮小されます。
対ドローンチームは、選択したデータセットからデプロイするモデルまで、対象物を確実に視認できる状態に保つ必要があります。このガイドでは、Ultralytics YOLO26を使ってその視認性を左右する4つの判断、つまりトレーニングに使うドローン検出データセット、使用する画像サイズ、SAHIタイル推論を追加するタイミング、そして総合mAPが良好でも遠方のドローンの見逃しが隠れないよう、対象物のサイズ別にモデルを評価する方法を解説します。

多くの「ドローン検出データセット」は、目的に合わない問いに答えています#
ドローン検出データセットを検索する人が求めているのは、通常、次の2種類の作業のいずれかです。
- ドローンの検出(対UAVまたは対ドローン):地上または空中のカメラで、空、木々、建物を背景に小型の航空機を探します。鳥などの類似物体も含め、できればドローンの画像が必要です。
- ドローンからの検出:ドローンに搭載したカメラで、人、車、建物を見下ろします。VisDroneは、この用途の標準的なベンチマークです。歩行者からバスまで10クラスの空撮画像を8,629枚含みますが、ドローンクラスはありません。
VisDroneは、物体が小さく密集しているため、対UAVチームにも役立ちます。自社データが準備できる前に、画像サイズやスライスなどの小物体設定をテストするための優れた公開データセットです。空撮アプリケーションについては、ドローン運用におけるコンピュータービジョンの概要をご覧ください。この記事の残りでは、最初の用途であるドローンの検出を扱います。
カメラと視点に合ったデータセットを選ぶ#
適切な公開データセットは、カメラが地上にあるか空中にあるか、可視光または熱赤外線を撮影するか、対象物がどれだけ遠くを飛ぶかによって異なります。
| データセット | 画像 | 規模 | 最適な用途 |
|---|---|---|---|
| Drone-vs-Bird | RGB動画、720 x 576~3840 x 2160 | アノテーション済みのトレーニング用シーケンス77件 | 地上カメラ、鳥が映り込むドローン映像 |
| DUT Anti-UAV | RGB画像、240 x 160~5616 x 3744 | 画像10,000枚(トレーニング5,200枚/検証2,600枚/テスト2,200枚)、追跡動画20本 | 可視光を使った最初のベースライン |
| Det-Fly | RGB、3840 x 2160 | 画像13,271枚 | DJI Mavicの空対空映像 |
| Anti-UAV | RGB動画とサーマル動画のペア | 動画ペア318組 | 両方のモダリティによる昼夜の追跡 |
| Anti-UAV410 | 熱赤外線動画 | 動画410本(トレーニング200本/検証90本/テスト120本) | サーマル検出と追跡 |
| LRDDv3 | 4K RGBおよび640 x 512 IR、距離ラベル付き | RGB画像102,532枚、ペアになったIR画像29,630枚 | 遠方のドローンを対象とした距離考慮型評価 |
Drone-vs-Birdの件数は、チャレンジの2021年版およびICASSP 2023版向けに配布された77シーケンスのトレーニングセットを指しており、その解像度はSynDroneVisionのサーベイに記載されています。同サーベイではDet-FlyとAnti-UAVも取り上げられており、LRDDv3の論文では独自のデータセットが説明されています。データセットごとにライセンスやアクセス条件が異なるため、商用利用の前に確認してください。
複数のデータセットでトレーニングし、1つはテスト用に分けておく#
トレーニングに使ったデータセットで良好な性能を示すモデルでも、別のデータセットでは苦戦することがあります。LRDDv3の著者らは、異なるデータセットでUltralytics YOLO11mモデルをトレーニングし、それぞれをDet-Flyでテストしました。Drone-vs-BirdでトレーニングしたモデルはmAP50 0.484、DUT Anti-UAVでトレーニングしたモデルは0.431を達成しました。
そのため、カメラと撮影距離に合う2つか3つのデータソースを組み合わせ、すべてをYOLO検出形式に変換します。続いて、クラスIDを一貫性を保って再割り当てし、欠けている鳥のアノテーションを補完したうえで、フレームやタイルを切り出す前にフライトまたは動画単位で分割します。フレーム単位で分割すると、同じフライトのほぼ同一のフレームがトレーニングとテストの両方に含まれ、スコアが水増しされます。テストセット用に、データセット全体を1つ、または自社サイトの映像をトレーニングから除外し、誤警報を測定できるよう鳥だけが映った映像や空だけの映像も含めてください。
ドローンだけでなく鳥にもラベルを付ける#
鳥は、ビジョンベースのドローン検出で誤警報のよくある原因です。Drone-vs-Birdには妨害対象として鳥が含まれていますが、クラスとしてラベル付けされていないため、2クラスのデータセットにするには鳥のボックスを追加する必要があります。2025年の小型ドローン研究では、YOLO11mをドローンと鳥のクラスでトレーニングし、推論時に鳥の予測を無視しました。この実験では、2クラスモデルのほうがドローンのみのモデルより、ドローンをわずかに高い精度で検出しました。
公開データでベースラインを構築し、自社の映像を使って本番運用に進みます。Ultralytics Platformのアノテーション機能を使うと、自社カメラのフレーム上でドローンと鳥のボックスにラベルを付けられます。また、合成データを使って、まれな背景や角度を追加できます。AVSS 2021 Drone-vs-Birdで1位となったソリューションでは、実画像と合成画像でファインチューニングしたUltralytics YOLOv5検出器にカルマンフィルタートラッカーを組み合わせ、かすかに映る遠方のドローンの信頼度を高めました。
画像サイズによって、リサイズ後にドローンが残るかどうかが決まる#
YOLO26は各画像の最長辺をimgszに合わせてリサイズします。デフォルトは640です。リサイズ後にピクセルがほとんど残らないドローンは、どの検出器にとっても扱いにくくなります。まずはimgszを大きくするのが有効です。トレーニングドキュメントとファインチューニングガイドはどちらも、小物体を含むデータセットにimgsz=1280を推奨しています。
コストはおおむねピクセル数に比例するため、1280では640の約4倍の計算量が必要です。参考として、YOLO26ドキュメントには、COCO val2017の640ピクセルで、TensorRT 10、バッチサイズ1、nms=Falseを使用した場合のNVIDIA T4上での推論速度として、YOLO26nは1.7 ms、YOLO26sは2.5 msと記載されています。これらはドローンや1280ピクセルでの測定値ではないため、独自の構成で計測してください。

目安として、Ultralytics Academyのレイテンシーレッスンでは、最も小さい重要な対象物がそのサイズで約10ピクセルに達する場合、そのサイズを試す価値があるとしています。計算予算が限られている場合は、同じドローン検証セットを使い、高解像度の小型モデルと低解像度の大型モデルを比較し、目標レイテンシーの範囲内で小型ドローンをより多く検出できる方を選んでください。
YOLO26は候補選択で小物体を維持します#
十分な画像サイズを確保しても、モデルが小さなボックスから学習できる必要があります。YOLO26の小型ターゲット対応ラベル割り当て(STAL)は、この点に役立ちます。v8.4.199の標準的なP3~P5 YOLO26モデルでは、STALは元の回帰ターゲットを維持しながら、16ピクセル未満の候補選択ボックスの辺を16ピクセルに拡張するため、小型ドローンに候補アンカーが割り当てられない可能性を低減します。
最も小さな対象物については、アーキテクチャを変更することもできます。YOLO26には、P3~P5に加えて特徴ピラミッドにストライド4の出力レベルを追加するyolo26-p2.yamlバリアントが用意されています。640 x 640の入力では、YOLO26nの未融合時の計算量が6.1 GFLOPsから9.5 GFLOPsに増加します。P2は事前学習済みP2重みを含まないYAMLアーキテクチャとして提供されるため、YOLO("yolo26n-p2.yaml")で構築し、自分のデータでトレーニングしてください。
SAHIのタイル推論で4Kフレームの詳細を維持する#
1280ピクセルでも、4Kフレームはモデルに渡す前に幅の3分の2が失われます。SAHI(スライス支援型ハイパー推論)はUltralytics YOLO26と連携し、この情報損失を防ぎます。フレームを重なり合うスライスに分割し、各スライスでモデルを実行してから、ボックスを元のフル画像上に統合します。そのため、隣り合うスライスにまたがるドローンも1回だけカウントされます。SAHIの論文では、この手法とスライス支援型ファインチューニングの方法が説明されています。

スライスサイズとモデルの入力サイズを個別に設定し、保留した映像でドローンの見かけのサイズを検証してください。1280にリサイズしたフル4Kフレームでトレーニングしたモデルは、ネイティブ解像度の1280ピクセルスライスでの見かけと比べて、3分の1のサイズのドローンを学習しています。このサイズ差が性能に悪影響を与える場合は、SAHIの論文のようにフル解像度のトレーニングフレームから切り出したクロップでファインチューニングし、同じテストセットでフルフレームモデルと比較してください。まずは隣り合うスライス間のオーバーラップを20%に設定し、スライス境界での見逃しを確認します。
処理負荷は予測できます。オーバーラップ0.2の1280 x 1280では、3840 x 2160のフレームは横4列、縦2行に分割されるため、SAHIの追加フル画像予測を無効にすれば、前方パスは1回ではなく8回です。この方法は、録画映像、アラームの確認、高性能なエッジGPUに適しています。全フレームをフルレートで処理する必要があるカメラでは、空の領域だけをスライスするか、定期的にスライススキャンを実行するか、レーダーなど別のセンサーをトリガーにしてスキャンしてください。
サイズ別・クラス別に検出器を評価する#
全体の平均適合率(mAP)は、クラスごとのAPを平均した値です。この2クラスデータセットでは、鳥の性能によってドローン検出の弱さが隠れることがあります。また、ドローンクラス内でも、総合スコアが高いと最小サイズの区分での低い再現率が見えなくなることがあります。スコアを信頼する前に、クラス別・サイズ別に内訳を確認してください。
検出データセットでsave_json=Trueを指定して検証すると、COCOの区分(ボックス面積が32 x 32ピクセル未満、96 x 96ピクセル以下、それより大きいもの)に基づき、高速化されたcoco評価器で算出した小・中・大物体のAPが追加されます。これらの数値は両方のクラスを合わせたものです。SynDroneVisionのサーベイによると、Drone-vs-Birdでアノテーションされたドローンの多くは32 x 32ピクセル未満です。そのため、ドローンのみのAP_smallと再現率を確認してください。
これらを得るには、元画像のピクセル単位のボックス面積を使い、predictions.jsonを対応する正解アノテーションと照合して評価します。Ultralyticsは元画像座標でボックスを書き出し、画像ファイル名(拡張子を除く)を画像IDとして使用します。カスタムクラスの番号は1から始まるため、ここではドローンがカテゴリ1、鳥がカテゴリ2です。テストラベルを同じ画像IDとカテゴリIDを使ったCOCO形式のJSONに変換し、評価対象をcatIds=[1]に限定してください。
COCOの小物体区分は長距離の用途には粗すぎます。12ピクセルのドローンと30 x 30ピクセルのドローンが同じ区分になるためです。同じ方法で、面積64ピクセル未満(8 x 8)、64~256(16 x 16)、256~1,024(32 x 32)など、より細かい面積範囲を定義し、それぞれについてドローンのAPと再現率を確認してください。LRDDv3のようにラベルに距離が含まれている場合は、距離別の再現率も報告してください。適合率も併せて示し、鳥だけが映ったフレームや空だけのフレームでのドローン予測数は別途集計します。

数値の信頼性を保つために、次の2点を徹底してください。
- デプロイ時のサイズで検証します。1280でトレーニングし640で検証すると、モデルはトレーニング時の半分のサイズでドローンを認識するため、モデル自体とは関係のない理由でスコアが低下します。
- mAP50-95は慎重に解釈します。10ピクセルのボックスが2ピクセルずれるだけで、IoUの大部分が失われるため、厳しいしきい値は小さな対象物に不利です。見逃したドローンの再現率と、IoU 0.5を満たし正しく分類された検出のAP50を追跡してください。
YOLO26のドローン検出器をトレーニング、スライス、評価する#
次の手順では、統合したドローンと鳥のデータセットから、同じ保留テストセットを使ったフル画像推論とスライス推論の比較までを行います。
-
パッケージをインストールするには、
pip install -U ultralytics sahiを使用します。 -
鳥を2つ目のクラスとして含め、保留テストスプリットを指定したデータセットYAMLを作成します。
path: datasets/drones
train: images/train
val: images/val
test: images/test
names:
0: drone
1: bird- 事前学習済みの重みを使い、1280でトレーニングします。
batch=-1を指定すると、AutoBatchがGPUメモリの約60%を使用するバッチサイズを選択します。
from ultralytics import YOLO
model = YOLO("yolo26s.pt")
model.train(data="drones.yaml", epochs=100, imgsz=1280, batch=-1, name="drone_1280")- 同じ解像度でテストスプリットを使い、フル画像ベースラインを評価します。実行フォルダーに
predictions.jsonが書き出されます。
best = YOLO("runs/detect/drone_1280/weights/best.pt")
metrics = best.val(data="drones.yaml", split="test", imgsz=1280, save_json=True)- SAHIの追加フル画像パスを無効にし、同じテスト画像に対する予測を元画像座標でスライスして書き出します。
import json
from pathlib import Path
from sahi import AutoDetectionModel
from sahi.predict import get_sliced_prediction
detector = AutoDetectionModel.from_pretrained(
model_type="ultralytics",
model_path="runs/detect/drone_1280/weights/best.pt",
confidence_threshold=0.001,
image_size=1280,
device="cuda:0",
)
preds = []
for img in sorted(Path("datasets/drones/images/test").glob("*.jpg")):
result = get_sliced_prediction(
str(img),
detector,
slice_height=1280,
slice_width=1280,
overlap_height_ratio=0.2,
overlap_width_ratio=0.2,
perform_standard_pred=False,
)
image_id = int(img.stem) if img.stem.isnumeric() else img.stem
for p in result.to_coco_predictions(image_id=image_id):
p["category_id"] += 1 # predictions.jsonの1始まりのIDと一致させる
preds.append(p)
Path("sahi_predictions.json").write_text(json.dumps(preds))- 同じ正解データを使い、ドローンクラスのみを対象として両方の予測ファイルを評価します。
from faster_coco_eval import COCO, COCOeval_faster
gt = COCO("test_coco.json") # テストラベルをCOCO形式にしたもの
for name in ["runs/detect/val/predictions.json", "sahi_predictions.json"]:
ev = COCOeval_faster(gt, gt.loadRes(name), "bbox")
ev.params.catIds = [1] # drone
ev.evaluate()
ev.accumulate()
ev.summarize()ドローンのサイズ別AP、鳥だけが映ったフレームや空だけのフレームでのドローン予測数、デプロイ用ハードウェアでのフレームあたりのエンドツーエンドレイテンシーを比較します。小型ドローンでの性能向上が追加パスに見合う場合に限り、スライスを採用してください。
-
フレーム間の追跡は、独立したフル画像の例として実行します。
best.track(source="perimeter.mp4", imgsz=1280, tracker="bytetrack.yaml")はトラックモードを使用し、上記のSAHI予測は使用しません。ByteTrackは、トラックの有効期限が切れる前に後続の検出が一致すると、失われたトラックを再有効化できます。 -
エッジ向けにエクスポートします。カメラに接続したNVIDIA Jetsonでは、
best.export(format="engine", imgsz=1280, half=True)を使ってTensorRTにエクスポートし、Jetsonガイドに従ってください。デプロイ解像度でデバイス上のレイテンシーを測定します。
GPUで1280ピクセルのトレーニングを処理できない場合も、同じデータセットと引数を使ってUltralytics Platformでクラウドトレーニングを実行できます。
この方法でドローン検出器を構築するのに適したチーム#
このワークフローは、空港の周囲、刑務所、スタジアム、重要インフラなどの固定施設を、空を監視するRGBカメラまたはサーマルカメラで保護するチームに適しています。また、セキュリティ導入でレーダーやRFセンサーにビジョン機能を追加するインテグレーターにも適しています。いずれの場合も、カメラは数十ピクセルしかない距離にあるドローンを認識する必要があります。
まずDUT Anti-UAVとDrone-vs-Birdでベースラインを構築し、鳥のラベルと自社の映像を追加して、YOLO26を1280でトレーニングします。変更の評価には、ドローンのみのAP_small、再現率、鳥による誤警報を使ってください。フレームが4K以上で、スライス評価によって小型ドローンでの改善が確認できたら、SAHIを追加します。より広い課題については、小物体検出ガイドと小物体mAPチェックリストをご覧ください。
よくある質問
カメラと視点によって異なります。RGB画像10,000枚を含むDUT Anti-UAVは、可視光を使う際の実用的な最初のベースラインです。Drone-vs-Birdは鳥が映り込む地上カメラの動画を追加し、Det-Flyは3840 x 2160の空対空映像を扱い、Anti-UAV410は熱赤外線を扱い、LRDDv3は距離ラベルを追加します。複数のデータセットでトレーニングし、1つはテスト用に分けてください。
いいえ。VisDroneにはドローンから撮影された画像が含まれ、歩行者、車、バスなどの10クラスがラベル付けされていますが、ドローンクラスはありません。画像サイズやSAHIのスライスなど、小物体の設定をテストするには役立ちますが、ドローンを検出するにはDUT Anti-UAVやDrone-vs-Birdなどの対UAVデータセットが必要です。
デフォルトの640ではドローンが約10ピクセル未満になる場合は、
imgsz=1280を試してください。YOLO26は各画像の最長辺をimgszに合わせてリサイズするため、値を大きくするとドローンのピクセルをより多く残せますが、640の約4倍の計算量が必要です。トレーニング時と同じサイズで検証し、デプロイしてください。はい。SAHIは
AutoDetectionModel.from_pretrained(model_type="ultralytics", image_size=1280, ...)を通じてYOLO26の重みを読み込み、重なり合うスライスでモデルを実行してからボックスを統合します。perform_standard_pred=Falseでは、3840 x 2160のフレームをオーバーラップ0.2の1280ピクセルスライスに分割すると、前方パスは8回になります。同じテストセットでスライス出力とフル画像ベースラインを評価してください。検出データセットで
save_json=Trueを指定して検証を実行すると、全クラスを合わせた小・中・大物体のAPが得られます。ドローンのみの結果を得るには、保存されたpredictions.jsonを、画像IDとカテゴリIDが一致するCOCO形式の正解データと照合して評価し、評価対象をドローンカテゴリに限定します。より細かい区分を使う場合は、元画像のピクセル単位のボックス面積を使用してください。はい。ラベル付きクラスとして含め、誤警報テストにも加えてください。鳥は誤警報のよくある原因です。2025年のYOLO11m実験では、ドローンと鳥のモデルのほうが、ドローンのみのモデルよりドローンをわずかに高い精度で検出しました。Drone-vs-Birdの鳥にはラベルが付いていないため、自分でボックスを追加してください。ドローンのアラートだけが必要な場合は、推論時に鳥の予測を無視します。
執筆者
コメント
質問したり、結果を共有したり、ほかの人をサポートしたりできます。










