Hướng dẫn về bộ dữ liệu phát hiện drone: huấn luyện Ultralytics YOLO trên UAV kích thước rất nhỏ
So sánh các bộ dữ liệu DUT Anti-UAV, Drone-vs-Bird và phát hiện drone bằng ảnh nhiệt, sau đó huấn luyện Ultralytics YOLO26 để tìm drone kích thước rất nhỏ và giảm cảnh báo giả.

UAV Detection and Tracking Benchmark báo cáo kích thước trung bình của drone trong dữ liệu Drone-vs-Bird là 34 x 23 pixel. Hãy hình dung một drone có kích thước đó trong khung hình giả định 3840 x 2160: khi giảm kích thước xuống còn 640 pixel mà detector sử dụng theo mặc định, drone sẽ thu nhỏ còn khoảng 5.7 x 3.8 pixel.
Các nhóm chống drone phải duy trì khả năng nhìn thấy vật thể đó từ bộ dữ liệu được chọn cho đến model được triển khai. Hướng dẫn này trình bày bốn quyết định then chốt với Ultralytics YOLO26: nên huấn luyện trên bộ dữ liệu phát hiện drone nào, nên dùng kích thước ảnh nào, khi nào cần thêm suy luận chia lát SAHI và cách đánh giá model theo kích thước vật thể để mAP tổng thể tốt không che khuất việc bỏ sót drone ở xa.

Hầu hết “bộ dữ liệu phát hiện drone” đều trả lời sai câu hỏi#
Người tìm kiếm bộ dữ liệu phát hiện drone thường muốn giải quyết một trong hai bài toán:
- Phát hiện drone (anti-UAV hoặc counter-UAV): camera mặt đất hoặc trên không tìm một máy bay nhỏ trên nền trời, cây cối hoặc tòa nhà. Bạn cần ảnh drone, lý tưởng nhất là có cả chim và các vật thể dễ nhầm lẫn khác.
- Phát hiện bằng drone: camera gắn trên drone hướng xuống người, ô tô và tòa nhà. VisDrone là benchmark tiêu chuẩn cho bài toán này. Bộ dữ liệu có 8,629 ảnh trên không thuộc 10 lớp, từ người đi bộ đến xe buýt, và không có lớp drone.
VisDrone vẫn hữu ích cho các nhóm chống UAV vì các vật thể trong ảnh rất nhỏ và chen chúc. Do đó, đây là bộ dữ liệu công khai phù hợp để thử nghiệm các thiết lập phát hiện vật thể nhỏ như kích thước ảnh và chia lát trước khi dữ liệu của bạn sẵn sàng. Để tìm hiểu về các ứng dụng trên không, xem tổng quan của chúng tôi về thị giác máy tính trong hoạt động drone. Phần còn lại của bài viết tập trung vào bài toán thứ nhất: phát hiện drone.
Chọn bộ dữ liệu phù hợp với camera và góc nhìn của bạn#
Bộ dữ liệu công khai phù hợp phụ thuộc vào việc camera được đặt trên mặt đất hay trên không, ghi hình bằng ánh sáng nhìn thấy hay hồng ngoại nhiệt, và vật thể của bạn bay ở khoảng cách nào:
| Bộ dữ liệu | Hình ảnh | Quy mô | Phù hợp nhất cho |
|---|---|---|---|
| Drone-vs-Bird | Video RGB, từ 720 x 576 đến 3840 x 2160 | 77 chuỗi huấn luyện đã gán nhãn | Camera mặt đất, drone cùng chim xuất hiện trong cảnh |
| DUT Anti-UAV | Ảnh RGB, từ 240 x 160 đến 5616 x 3744 | 10,000 ảnh (5,200 huấn luyện / 2,600 xác thực / 2,200 kiểm thử), cùng 20 video tracking | Baseline đầu tiên với ánh sáng nhìn thấy |
| Det-Fly | RGB, 3840 x 2160 | 13,271 ảnh | Góc nhìn không đối không của một chiếc DJI Mavic |
| Anti-UAV | Video RGB và nhiệt được ghép cặp | 318 cặp video | Tracking ban ngày và ban đêm với cả hai phương thức |
| Anti-UAV410 | Video hồng ngoại nhiệt | 410 video (200 huấn luyện / 90 xác thực / 120 kiểm thử) | Phát hiện và tracking bằng ảnh nhiệt |
| LRDDv3 | RGB 4K và IR 640 x 512, kèm nhãn khoảng cách | 102,532 ảnh RGB; 29,630 ảnh IR được ghép cặp | Đánh giá có xét đến khoảng cách của drone ở xa |
Số lượng Drone-vs-Bird đề cập đến tập huấn luyện gồm 77 chuỗi được phân phối cho các phiên bản thử thách năm 2021 và ICASSP 2023, với độ phân giải được báo cáo trong khảo sát SynDroneVision. Khảo sát đó cũng đề cập đến Det-Fly và Anti-UAV, còn bài báo LRDDv3 mô tả bộ dữ liệu riêng. Giấy phép và điều khoản truy cập khác nhau giữa các bộ dữ liệu, vì vậy hãy kiểm tra trước khi sử dụng cho mục đích thương mại.
Huấn luyện trên nhiều bộ dữ liệu và giữ riêng một bộ để kiểm thử#
Một model hoạt động tốt trên bộ dữ liệu dùng để huấn luyện vẫn có thể gặp khó khăn trên bộ dữ liệu khác. Các tác giả LRDDv3 huấn luyện các model Ultralytics YOLO11m trên nhiều bộ dữ liệu khác nhau và kiểm thử từng model trên Det-Fly. Model huấn luyện trên Drone-vs-Bird đạt mAP50 0.484 trên bộ dữ liệu đó, còn model huấn luyện trên DUT Anti-UAV đạt 0.431.
Vì vậy, hãy kết hợp hai hoặc ba nguồn phù hợp với camera và khoảng cách của bạn, rồi chuyển đổi tất cả sang định dạng phát hiện YOLO. Sau đó, ánh xạ lại ID lớp một cách nhất quán, bổ sung các annotation còn thiếu cho chim, rồi chia tập theo chuyến bay hoặc video trước khi trích xuất khung hình hay lát ảnh. Chia theo khung hình có thể khiến các khung gần như giống hệt nhau trong cùng một chuyến bay xuất hiện ở cả tập huấn luyện lẫn kiểm thử, làm điểm số tăng cao giả tạo. Giữ nguyên một bộ dữ liệu hoàn chỉnh hoặc cảnh quay từ địa điểm của bạn để làm tập kiểm thử, đồng thời đưa vào cảnh chỉ có chim và bầu trời trống để đo cảnh báo giả.
Gán nhãn chim cũng như drone#
Chim là nguồn cảnh báo giả phổ biến trong phát hiện drone bằng thị giác máy tính. Drone-vs-Bird có chim làm đối tượng gây nhiễu nhưng không gán nhãn chúng thành một lớp, vì vậy cần bổ sung các box đó vào bộ dữ liệu hai lớp. Một nghiên cứu về drone cỡ nhỏ năm 2025 đã huấn luyện YOLO11m với các lớp drone và chim, rồi bỏ qua các dự đoán chim khi inference. Trong thử nghiệm đó, model hai lớp phát hiện drone tốt hơn đôi chút so với model chỉ có lớp drone.
Dữ liệu công khai giúp bạn thiết lập baseline, còn cảnh quay của chính bạn giúp đưa hệ thống vào production. Tính năng gán nhãn trên Ultralytics Platform cho phép bạn gán nhãn box drone và chim trên các khung hình từ camera của mình, còn dữ liệu tổng hợp có thể bổ sung các phông nền và góc nhìn hiếm gặp. Giải pháp đứng đầu AVSS 2021 Drone-vs-Bird sử dụng detector Ultralytics YOLOv5 được fine-tune trên ảnh thực và ảnh tổng hợp, cùng tracker dùng bộ lọc Kalman để tăng độ tin cậy của các drone mờ ở xa.
Kích thước ảnh quyết định drone có còn nhận diện được sau khi resize hay không#
YOLO26 resize mỗi ảnh sao cho cạnh dài nhất khớp với imgsz, mặc định là 640. Drone chỉ còn rất ít pixel sau khi resize sẽ khiến mọi detector khó xử lý. Tăng imgsz là cách khắc phục đầu tiên; cả tài liệu huấn luyện và hướng dẫn fine-tune đều đề xuất imgsz=1280 cho các bộ dữ liệu có vật thể nhỏ.
Chi phí tính toán tăng gần tương ứng với số pixel, vì vậy 1280 cần lượng tính toán gấp khoảng bốn lần 640. Để tham khảo, tài liệu YOLO26 ghi nhận YOLO26n đạt 1.7 ms và YOLO26s đạt 2.5 ms trên NVIDIA T4, với TensorRT 10, batch 1 và nms=False, ở độ phân giải 640 pixel trên COCO val2017. Đây không phải số đo cho drone hoặc ảnh 1280 pixel, vì vậy hãy đo thời gian trên cấu hình của riêng bạn.

Một quy tắc khởi đầu hữu ích được nêu trong bài học về độ trễ của Ultralytics Academy: nên thử một kích thước nếu vật thể quan trọng nhỏ nhất vẫn chiếm khoảng 10 pixel ở kích thước đó. Khi ngân sách hạn chế, hãy so sánh model nhỏ hơn ở độ phân giải cao với model lớn hơn ở độ phân giải thấp trên cùng tập xác thực drone, rồi chọn model phát hiện được nhiều drone nhỏ hơn ở mức độ trễ mục tiêu.
YOLO26 duy trì các vật thể nhỏ trong quá trình chọn ứng viên#
Ngay cả khi kích thước ảnh đủ lớn, model vẫn phải học từ các box nhỏ. Small-Target-Aware Label Assignment (STAL) của YOLO26 hữu ích trong trường hợp này. Trong các model YOLO26 P3 đến P5 tiêu chuẩn của v8.4.199, STAL mở rộng các cạnh box dùng để chọn ứng viên nếu nhỏ hơn 16 pixel thành 16 pixel, đồng thời giữ nguyên các target hồi quy ban đầu, nhờ đó drone nhỏ ít có nguy cơ bị bỏ lại mà không có anchor ứng viên.
Bạn cũng có thể thay đổi kiến trúc để xử lý các vật thể nhỏ nhất. YOLO26 có biến thể yolo26-p2.yaml bổ sung một mức đầu ra stride-4 vào feature pyramid bên cạnh P3 đến P5. Với đầu vào 640 x 640, biến thể này tăng lượng tính toán chưa hợp nhất của YOLO26n từ 6.1 lên 9.5 GFLOPs. P2 được phát hành dưới dạng kiến trúc YAML không có trọng số P2 pretrained, vì vậy bạn cần tạo model bằng YOLO("yolo26n-p2.yaml") và huấn luyện trên dữ liệu của mình.
Suy luận chia lát SAHI giữ nguyên chi tiết của khung hình 4K#
Ngay cả ở 1280 pixel, khung hình 4K cũng mất hai phần ba chiều rộng trước khi model xử lý. SAHI (Slicing Aided Hyper Inference, suy luận siêu cấp được hỗ trợ bằng cách chia lát) tích hợp với Ultralytics YOLO26 để tránh mất mát đó. SAHI chia khung hình thành các lát chồng lấn, chạy model trên từng lát rồi gộp các box trở lại ảnh đầy đủ, nhờ đó drone nằm giữa các lát liền kề chỉ được tính một lần. Bài báo SAHI mô tả phương pháp này và biến thể fine-tune có hỗ trợ chia lát.

Thiết lập riêng kích thước lát và kích thước đầu vào của model, rồi kiểm thử tỷ lệ drone thu được trên cảnh quay giữ lại. Model được huấn luyện trên khung hình 4K đầy đủ rồi resize xuống 1280 đã học drone nhỏ hơn ba lần so với drone trong các lát 1280 pixel ở độ phân giải gốc. Nếu chênh lệch tỷ lệ này làm giảm kết quả, hãy thử fine-tune trên các crop cắt từ khung hình huấn luyện độ phân giải đầy đủ, như trong bài báo SAHI, rồi so sánh với model dùng khung hình đầy đủ trên cùng tập kiểm thử. Bắt đầu với độ chồng lấn 20% giữa các lát liền kề và kiểm tra các trường hợp bỏ sót ở mép lát.
Khối lượng xử lý có thể dự đoán được. Với kích thước 1280 x 1280 và độ chồng lấn 0.2, khung hình 3840 x 2160 cần bốn cột và hai hàng, tức tám lượt chạy forward thay vì một, miễn là tắt bước dự đoán toàn ảnh bổ sung của SAHI. Cách này phù hợp với cảnh quay đã ghi, rà soát cảnh báo và edge GPU mạnh. Với camera cần xử lý mọi khung hình ở tốc độ tối đa, chỉ chia lát vùng trời, hoặc chạy quét chia lát định kỳ hay kích hoạt quét bằng cảm biến khác như radar.
Đánh giá detector theo kích thước và lớp#
Mean Average Precision (mAP) tổng thể là trung bình AP của các lớp. Trong bộ dữ liệu hai lớp này, kết quả của lớp chim có thể che khuất khả năng phát hiện drone yếu; ngay trong lớp drone, điểm số tổng thể tốt vẫn có thể che giấu recall kém ở các nhóm kích thước nhỏ nhất. Hãy phân tích điểm số theo lớp và theo kích thước trước khi tin vào kết quả.
Validation với save_json=True bổ sung AP cho vật thể nhỏ, trung bình và lớn trên các bộ dữ liệu phát hiện, tính theo các nhóm của COCO bằng faster-coco-eval: diện tích box dưới 32 x 32 pixel, tối đa 96 x 96 và lớn hơn. Các số liệu này tính gộp cả hai lớp. Khảo sát SynDroneVision cho biết hầu hết drone được gán nhãn trong Drone-vs-Bird đều nhỏ hơn 32 x 32, vì vậy hãy theo dõi AP_small chỉ dành cho drone và recall.
Để có các số liệu này, hãy đánh giá predictions.json dựa trên annotation ground truth tương ứng, sử dụng diện tích box theo pixel của ảnh gốc. Ultralytics ghi box theo tọa độ ảnh gốc, dùng tên gốc của tệp ảnh làm image ID và đánh số lớp tùy chỉnh bắt đầu từ 1, vì vậy drone là category 1 và chim là category 2 trong trường hợp này. Chuyển nhãn kiểm thử sang JSON định dạng COCO với cùng image ID và category ID, sau đó giới hạn đánh giá ở catIds=[1].
Nhóm kích thước nhỏ của COCO quá thô đối với các ứng dụng ở khoảng cách xa, vì drone 12 pixel và drone 30 x 30 cùng thuộc một nhóm. Hãy xác định các khoảng diện tích chi tiết hơn theo cách tương tự, chẳng hạn dưới 64 pixel diện tích (8 x 8), từ 64 đến 256 (16 x 16) và từ 256 đến 1,024 (32 x 32), rồi xem AP và recall của drone ở từng nhóm. Nếu nhãn của bạn có thông tin khoảng cách như LRDDv3, hãy báo cáo recall theo khoảng cách nữa. Đặt precision bên cạnh các chỉ số đó và thống kê riêng số dự đoán drone trên các khung hình chỉ có chim và bầu trời trống.

Hai thói quen giúp giữ cho các số liệu đáng tin cậy:
- Validation ở kích thước triển khai. Model được huấn luyện ở 1280 nhưng validation ở 640 sẽ thấy drone chỉ bằng một nửa kích thước lúc huấn luyện, khiến điểm số giảm vì những lý do không liên quan đến model.
- Đọc mAP50-95 một cách thận trọng. Dịch chuyển 2 pixel trên box 10 pixel làm giảm đáng kể IoU, vì vậy các ngưỡng nghiêm ngặt sẽ phạt mục tiêu nhỏ. Theo dõi recall để biết số drone bị bỏ sót và AP50 cho các detection được phân loại đúng với IoU 0.5.
Huấn luyện, chia lát và đánh giá detector drone YOLO26#
Các bước này đưa bạn từ bộ dữ liệu drone và chim đã hợp nhất đến việc so sánh suy luận trên toàn ảnh và suy luận chia lát bằng cùng một tập kiểm thử giữ riêng.
-
Cài đặt các package bằng
pip install -U ultralytics sahi. -
Tạo YAML cho bộ dữ liệu với chim là lớp thứ hai và một tập kiểm thử giữ riêng:
path: datasets/drones
train: images/train
val: images/val
test: images/test
names:
0: drone
1: bird- Huấn luyện ở 1280 từ trọng số pretrained.
batch=-1cho phép AutoBatch chọn batch size sử dụng khoảng 60% bộ nhớ GPU:
from ultralytics import YOLO
model = YOLO("yolo26s.pt")
model.train(data="drones.yaml", epochs=100, imgsz=1280, batch=-1, name="drone_1280")- Đánh giá baseline toàn ảnh trên tập kiểm thử ở cùng độ phân giải. Thao tác này ghi
predictions.jsonvào thư mục lần chạy:
best = YOLO("runs/detect/drone_1280/weights/best.pt")
metrics = best.val(data="drones.yaml", split="test", imgsz=1280, save_json=True)- Xuất các dự đoán chia lát cho cùng ảnh kiểm thử theo tọa độ ảnh gốc, đồng thời tắt lượt chạy toàn ảnh bổ sung của 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 # khớp với ID bắt đầu từ 1 trong predictions.json
preds.append(p)
Path("sahi_predictions.json").write_text(json.dumps(preds))- Đánh giá cả hai tệp dự đoán dựa trên cùng ground truth, chỉ xét lớp drone:
from faster_coco_eval import COCO, COCOeval_faster
gt = COCO("test_coco.json") # nhãn kiểm thử của bạn ở định dạng 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()So sánh AP drone theo kích thước, các dự đoán drone trên khung hình chỉ có chim và bầu trời trống, cùng độ trễ đầu cuối trên mỗi khung hình ở phần cứng triển khai. Chỉ duy trì chia lát nếu mức cải thiện với drone nhỏ xứng đáng với số lượt chạy bổ sung.
-
Tracking qua các khung hình dưới dạng ví dụ riêng dùng toàn ảnh:
best.track(source="perimeter.mp4", imgsz=1280, tracker="bytetrack.yaml")sử dụng chế độ track và không dùng các dự đoán SAHI ở trên. ByteTrack có thể kích hoạt lại một track bị mất khi detection về sau khớp với track đó trước khi track hết hạn. -
Xuất model để chạy trên edge. Với NVIDIA Jetson đặt tại camera, hãy xuất sang TensorRT bằng
best.export(format="engine", imgsz=1280, half=True)và làm theo hướng dẫn Jetson. Đo độ trễ trên thiết bị ở độ phân giải triển khai của bạn.
Nếu GPU của bạn không xử lý được việc huấn luyện ở 1280 pixel, bạn có thể chạy cùng bộ dữ liệu và các tham số trên dịch vụ huấn luyện cloud trong Ultralytics Platform.
Ai nên xây dựng detector drone theo cách này#
Quy trình này phù hợp với các nhóm bảo vệ một địa điểm cố định như vành đai sân bay, nhà tù, sân vận động hoặc hạ tầng trọng yếu, sử dụng camera RGB hoặc ảnh nhiệt để quan sát bầu trời. Quy trình này cũng phù hợp với các đơn vị tích hợp bổ sung thị giác máy tính cho cảm biến radar hoặc RF trong các hệ thống triển khai an ninh. Trong cả hai trường hợp, camera phải nhận diện được drone ở khoảng cách mà drone chỉ chiếm vài chục pixel.
Bắt đầu với DUT Anti-UAV và Drone-vs-Bird để thiết lập baseline, bổ sung nhãn chim và cảnh quay của bạn, huấn luyện YOLO26 ở 1280, rồi đánh giá mọi thay đổi dựa trên AP_small chỉ dành cho drone, recall và cảnh báo giả do chim. Thêm SAHI khi khung hình có độ phân giải 4K trở lên và kết quả đánh giá chia lát cho thấy hiệu quả cải thiện với drone nhỏ. Để tìm hiểu bài toán rộng hơn, xem hướng dẫn phát hiện vật thể nhỏ của chúng tôi và danh sách kiểm tra mAP cho vật thể nhỏ.
Câu hỏi thường gặp
Điều đó phụ thuộc vào camera và góc nhìn của bạn. DUT Anti-UAV với 10,000 ảnh RGB là baseline thực tiễn đầu tiên cho ánh sáng nhìn thấy. Drone-vs-Bird bổ sung video từ camera mặt đất có chim trong cảnh, Det-Fly bao quát góc nhìn không đối không ở 3840 x 2160, Anti-UAV410 bao quát hồng ngoại nhiệt, còn LRDDv3 bổ sung nhãn khoảng cách. Hãy huấn luyện trên nhiều bộ dữ liệu và giữ riêng một bộ để kiểm thử.
Không. VisDrone chứa ảnh chụp từ drone, được gán nhãn với 10 lớp như người đi bộ, ô tô và xe buýt, nhưng không có lớp drone. Bộ dữ liệu này hữu ích để thử nghiệm các thiết lập phát hiện vật thể nhỏ như kích thước ảnh và chia lát SAHI, nhưng để phát hiện drone, bạn cần bộ dữ liệu anti-UAV như DUT Anti-UAV hoặc Drone-vs-Bird.
Hãy thử
imgsz=1280nếu drone của bạn sẽ giảm xuống dưới khoảng 10 pixel ở kích thước mặc định 640. YOLO26 resize cạnh dài nhất của mỗi ảnh thànhimgsz, vì vậy giá trị lớn hơn giúp giữ lại nhiều pixel hơn trên mỗi drone, với lượng tính toán cao gấp khoảng bốn lần 640. Hãy validation và triển khai ở đúng kích thước đã dùng để huấn luyện.Có. SAHI nạp trọng số YOLO26 thông qua
AutoDetectionModel.from_pretrained(model_type="ultralytics", image_size=1280, ...)rồi chạy model trên các lát chồng lấn trước khi gộp các box. Vớiperform_standard_pred=False, khung hình 3840 x 2160 được chia thành các lát 1280 pixel với độ chồng lấn 0.2 sẽ cần tám lượt chạy forward. Hãy đánh giá đầu ra chia lát và baseline toàn ảnh trên cùng tập kiểm thử.Chạy validation với
save_json=Truetrên bộ dữ liệu phát hiện để lấy AP cho vật thể nhỏ, trung bình và lớn, tính gộp tất cả các lớp. Để có kết quả chỉ dành cho drone, hãy đánh giápredictions.jsonđã lưu dựa trên ground truth định dạng COCO có image ID và category ID tương ứng, giới hạn đánh giá ở lớp drone và dùng diện tích box theo pixel của ảnh gốc cho mọi nhóm chi tiết hơn.Có, hãy đưa chim vào dưới dạng một lớp được gán nhãn và thêm chúng vào tập kiểm thử cảnh báo giả. Chim là nguồn cảnh báo giả phổ biến; trong một thử nghiệm YOLO11m năm 2025, model có lớp drone và chim phát hiện drone tốt hơn đôi chút so với model chỉ có lớp drone. Drone-vs-Bird không gán nhãn chim, vì vậy hãy tự bổ sung các box đó và bỏ qua dự đoán chim khi inference nếu bạn chỉ cần cảnh báo drone.
Được viết bởi
Bình luận
Đặt câu hỏi, chia sẻ kết quả hoặc giúp đỡ người khác.










