Ultralytics YOLO27:
Get Started
No license

Bộ dữ liệu VisDrone#

Bộ dữ liệu VisDrone là benchmark quy mô lớn sử dụng ảnh từ drone; tập con phát hiện (VisDrone2019-DET) cung cấp 8,629 ảnh trên không — 6,471 ảnh huấn luyện, 548 ảnh validation và 1,610 ảnh test-dev — được gán nhãn với 10 lớp đối tượng để thực hiện phát hiện vật thể. Bộ dữ liệu do nhóm AISKYEYE tại Phòng thí nghiệm Học máy và Khai phá dữ liệu, Đại học Thiên Tân, Trung Quốc tạo ra.



Xem: Cách huấn luyện Ultralytics YOLO trên dataset VisDrone | Phát hiện từ trên không | Hướng dẫn đầy đủ 🚀

Benchmark VisDrone đầy đủ bao gồm 288 video clip (261,908 khung hình) và 10,209 ảnh tĩnh được chụp bằng camera gắn trên drone tại 14 thành phố khác nhau ở Trung Quốc, bao quát môi trường đô thị và nông thôn, cảnh thưa và đông đúc, cùng các điều kiện thời tiết và ánh sáng đa dạng. Các khung hình có hơn 2.6 triệu bounding box được gán nhãn thủ công, kèm các thuộc tính bổ sung như khả năng quan sát cảnh, lớp đối tượng và mức độ che khuất. Cấu hình VisDrone.yaml của Ultralytics sử dụng tập con ảnh tĩnh VisDrone2019-DET của benchmark này.

Tính năng chính#

  • Vật thể nhỏ, dày đặc: Góc nhìn từ trên không khiến mục tiêu nhỏ và chen chúc — riêng 548 ảnh validation đã có 38,759 bounding box được gán nhãn, trung bình khoảng 70 vật thể mỗi ảnh.
  • Đa dạng cảnh: Ảnh từ 14 thành phố Trung Quốc, bao gồm địa điểm đô thị và nông thôn, ngày và đêm, cùng nhiều điều kiện thời tiết khác nhau.
  • Annotation phong phú: Hơn 2.6 triệu bounding box trong toàn bộ benchmark, cùng các thuộc tính về che khuất và khả năng quan sát.
  • Các tập chia được xác định trước: Các tập train / val / test-dev cố định (6,471 / 548 / 1,610 ảnh) giúp đánh giá nhất quán.

Cấu trúc dataset#

Cấu hình VisDrone của Ultralytics bao gồm tập con ảnh VisDrone2019-DET, được chia thành ba phần:

Tập dữ liệuHình ảnhMô tả
Huấn luyện6,471Ảnh trên không có nhãn dùng để huấn luyện bộ phát hiện
Validation548Ảnh dùng để đánh giá trong quá trình phát triển
Test-dev1,610Ảnh giữ lại để đánh giá cuối cùng model đã huấn luyện

Tập thứ tư, test-challenge (1,580 ảnh), được giữ lại cho cuộc thi VisDrone và không được tải xuống; vì vậy toàn bộ tập DET có tổng cộng 10,209 ảnh.

Bộ dữ liệu gán nhãn 10 lớp đối tượng: pedestrian, people, bicycle, car, van, truck, tricycle, awning-tricycle, bus và motor. VisDrone phân biệt pedestrian (người đang đứng hoặc đi bộ) với people (người ở mọi tư thế khác).

Tự động chuyển đổi sang YOLO

Trong lần sử dụng đầu tiên, script tải xuống chuyển annotation VisDrone gốc sang định dạng YOLO, bỏ qua các vùng được đánh dấu là không cần xét (đồng thời loại trừ danh mục "others" không được sử dụng).

Ứng dụng#

Cảnh dày đặc và mục tiêu rất nhỏ của VisDrone khiến bộ dữ liệu trở thành benchmark tiêu chuẩn cho phát hiện vật thể nhỏ từ góc nhìn trên không. Các ứng dụng phổ biến bao gồm:

  • Giám sát giao thông và đếm phương tiện từ UAV
  • Phân tích đám đông và giám sát an toàn công cộng
  • Kiểm tra cơ sở hạ tầng và công trường xây dựng
  • Nghiên cứu thị giác máy tính về phát hiện vật thể nhỏ trong cảnh phức tạp

Để xem các benchmark ảnh trên không khác, hãy tham khảo bộ dữ liệu xView tập trung vào ảnh vệ tinh hoặc bộ dữ liệu DOTA-v2 sử dụng bounding box định hướng.

YAML của dataset#

Tệp VisDrone.yaml định nghĩa cấu hình bộ dữ liệu — đường dẫn bộ dữ liệu, tên lớp và script tự động tải xuống rồi chuyển đổi. Tệp được duy trì trong repository Ultralytics tại https://github.com/ultralytics/ultralytics/blob/main/ultralytics/cfg/datasets/VisDrone.yaml.

ultralytics/cfg/datasets/VisDrone.yaml
# Ultralytics 🚀 AGPL-3.0 License - https://ultralytics.com/license

# VisDrone2019-DET dataset https://github.com/VisDrone/VisDrone-Dataset by Tianjin University
# Documentation: https://docs.ultralytics.com/datasets/detect/visdrone
# Example usage: yolo train data=VisDrone.yaml
# parent
# ├── ultralytics
# └── datasets
#     └── VisDrone ← downloads here (~2 GB)

# Train/val/test sets as 1) dir: path/to/imgs, 2) file: path/to/imgs.txt, or 3) list: [path/to/imgs1, path/to/imgs2, ..]
path: VisDrone # dataset root dir
train: images/train # train images (relative to 'path') 6471 images
val: images/val # val images (relative to 'path') 548 images
test: images/test # test-dev images (optional) 1610 images

# Classes
names:
  0: pedestrian
  1: people
  2: bicycle
  3: car
  4: van
  5: truck
  6: tricycle
  7: awning-tricycle
  8: bus
  9: motor

# Download script/URL (optional) ---------------------------------------------------------------------------------------
download: |
  import os
  from pathlib import Path
  import shutil

  from ultralytics.utils.downloads import download
  from ultralytics.utils import ASSETS_URL, TQDM

  def visdrone2yolo(dir, split, source_name=None):
      """Convert VisDrone annotations to YOLO format with images/{split} and labels/{split} structure."""
      from PIL import Image

      source_dir = dir / (source_name or f"VisDrone2019-DET-{split}")
      images_dir = dir / "images" / split
      labels_dir = dir / "labels" / split
      labels_dir.mkdir(parents=True, exist_ok=True)

      # Move images to new structure
      if (source_images_dir := source_dir / "images").exists():
          images_dir.mkdir(parents=True, exist_ok=True)
          for img in source_images_dir.glob("*.jpg"):
              img.rename(images_dir / img.name)

      for f in TQDM((source_dir / "annotations").glob("*.txt"), desc=f"Converting {split}"):
          img_size = Image.open(images_dir / f.with_suffix(".jpg").name).size
          dw, dh = 1.0 / img_size[0], 1.0 / img_size[1]
          lines = []

          with open(f, encoding="utf-8") as file:
              for row in [x.split(",") for x in file.read().strip().splitlines()]:
                  if row[4] != "0":  # Skip ignored regions
                      x, y, w, h = map(int, row[:4])
                      cls = int(row[5]) - 1
                      # Convert to YOLO format
                      x_center, y_center = (x + w / 2) * dw, (y + h / 2) * dh
                      w_norm, h_norm = w * dw, h * dh
                      lines.append(f"{cls} {x_center:.6f} {y_center:.6f} {w_norm:.6f} {h_norm:.6f}\n")

          (labels_dir / f.name).write_text("".join(lines), encoding="utf-8")

  # Download (ignores test-challenge split)
  dir = Path(yaml["path"])  # dataset root dir
  urls = [
      f"{ASSETS_URL}/VisDrone2019-DET-train.zip",
      f"{ASSETS_URL}/VisDrone2019-DET-val.zip",
      f"{ASSETS_URL}/VisDrone2019-DET-test-dev.zip",
      # f"{ASSETS_URL}/VisDrone2019-DET-test-challenge.zip",
  ]
  download(urls, dir=dir, threads=4)

  # Convert
  splits = {"VisDrone2019-DET-train": "train", "VisDrone2019-DET-val": "val", "VisDrone2019-DET-test-dev": "test"}
  for folder, split in splits.items():
      visdrone2yolo(dir, split, folder)  # convert VisDrone annotations to YOLO labels
      shutil.rmtree(dir / folder)  # cleanup original directory

Cách sử dụng#

Tệp tải xuống khoảng 2 GB

VisDrone tự động tải xuống trong lần đầu huấn luyện — gồm ba archive với tổng dung lượng khoảng 2 GB — và cần khoảng 4 GB dung lượng đĩa trống trong quá trình giải nén và chuyển đổi.

Để huấn luyện model YOLO26n trên bộ dữ liệu VisDrone trong 100 epoch với kích thước ảnh 640, bạn có thể sử dụng các đoạn mã sau. Để xem danh sách đầy đủ các tham số hiện có, hãy tham khảo trang Huấn luyện model.

Ví dụ huấn luyện
from ultralytics import YOLO

# Tải model
model = YOLO("yolo26n.pt")  # tải model đã huấn luyện trước (được khuyến nghị khi huấn luyện)

# Huấn luyện model - tập dữ liệu sẽ tự động tải xuống trong lần chạy đầu tiên
results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)

Để gán nhãn thêm ảnh trên không và quản lý các lượt huấn luyện VisDrone trên trình duyệt, hãy sử dụng Ultralytics Platform.

Dữ liệu mẫu và annotation#

Ví dụ bên dưới minh họa một cảnh VisDrone điển hình: góc nhìn trên không của một con đường đông đúc, nơi người đi bộ và phương tiện xuất hiện dưới dạng các mục tiêu nhỏ, dày đặc, nhiều mục tiêu bị che khuất một phần bởi nhau.

Ảnh drone trên không của bộ dữ liệu VisDrone với phát hiện vật thể

Trích dẫn và lời cảm ơn#

Nếu sử dụng bộ dữ liệu VisDrone trong nghiên cứu hoặc công việc phát triển, vui lòng trích dẫn bài báo sau:

Trích dẫn
@ARTICLE{9573394,
  author={Zhu, Pengfei and Wen, Longyin and Du, Dawei and Bian, Xiao and Fan, Heng and Hu, Qinghua and Ling, Haibin},
  journal={IEEE Transactions on Pattern Analysis and Machine Intelligence},
  title={Detection and Tracking Meet Drones Challenge},
  year={2022},
  volume={44},
  number={11},
  pages={7380-7399},
  doi={10.1109/TPAMI.2021.3119563}}

Chúng tôi xin ghi nhận nhóm AISKYEYE tại Phòng thí nghiệm Học máy và Khai phá dữ liệu, Đại học Thiên Tân, Trung Quốc, đã tạo và duy trì bộ dữ liệu VisDrone. Để biết thêm thông tin, hãy truy cập repository GitHub của bộ dữ liệu VisDrone.

Câu hỏi thường gặp#

  • VisDrone được sử dụng để huấn luyện và đánh giá benchmark các bộ phát hiện trên ảnh chụp từ drone, trong đó vật thể nhỏ, dày đặc và được quan sát từ trên cao. Sự kết hợp giữa góc nhìn trên không, cảnh đông đúc và các điều kiện đa dạng khiến bộ dữ liệu này trở thành môi trường thử nghiệm tiêu chuẩn cho giám sát giao thông bằng UAV, phân tích đám đông và nghiên cứu phát hiện vật thể nhỏ.

  • Cấu hình VisDrone của Ultralytics có 8,629 ảnh: 6,471 ảnh huấn luyện, 548 ảnh validation và 1,610 ảnh kiểm thử (test-dev). Tất cả các tập đều có cùng 10 lớp: pedestrian, people, bicycle, car, van, truck, tricycle, awning-tricycle, bus và motor. Xem Cấu trúc bộ dữ liệu để biết thông tin phân chia đầy đủ.

  • VisDrone tự động tải xuống trong lần đầu huấn luyện bằng data="VisDrone.yaml" — không cần thao tác thủ công. Script lấy ba archive (khoảng 2 GB) từ các tài nguyên phát hành trên GitHub của Ultralytics và chuyển đổi annotation sang định dạng YOLO. Tập test-challenge bị giữ lại cho cuộc thi không được đưa vào.

  • Huấn luyện model YOLO26n trên VisDrone trong 100 epoch với kích thước ảnh 640:

    Ví dụ huấn luyện
    from ultralytics import YOLO
    
    # Tải model
    model = YOLO("yolo26n.pt")  # tải model đã huấn luyện trước (được khuyến nghị khi huấn luyện)
    
    # Huấn luyện model
    results = model.train(data="VisDrone.yaml", epochs=100, imgsz=640)

    Để xem cấu hình chi tiết, hãy tham khảo trang Huấn luyện và mẹo huấn luyện model.

  • Vật thể trong VisDrone rất nhỏ so với khung hình — thường chỉ rộng vài chục pixel — và xuất hiện thành từng nhóm dày đặc, bị che khuất nhiều, gây khó khăn cho các bộ phát hiện vốn được tinh chỉnh trên ảnh chụp từ mặt đất. Huấn luyện và dự đoán ở độ phân giải cao hơn (chẳng hạn imgsz=1280 với batch nhỏ hơn) giúp nhận diện các mục tiêu nhỏ; suy luận SAHI theo ô chia ảnh lớn thành các phần để vật thể nhỏ chiếm tỷ lệ lớn hơn trong mỗi vùng suy luận.

  • Benchmark VisDrone đầy đủ bao gồm năm tác vụ — phát hiện vật thể trong ảnh, phát hiện vật thể trong video, theo dõi một đối tượng, theo dõi nhiều đối tượng và đếm đám đông — trên 288 video clip và 10,209 ảnh tĩnh. Cấu hình VisDrone.yaml của Ultralytics chỉ bao gồm tác vụ phát hiện trong ảnh (VisDrone2019-DET), tải xuống 6,471 ảnh huấn luyện, 548 ảnh validation và 1,610 ảnh test-dev.

  • Trích dẫn bài báo "Detection and Tracking Meet Drones Challenge" (IEEE TPAMI, tập 44, số 11, 2022, DOI 10.1109/TPAMI.2021.3119563); mục Trích dẫn và ghi nhận ở trên có toàn bộ mục BibTeX.

Bình luận