NWPU VHR-10 遥感目标检测数据集详解与 YOLOv8 实战指南

NWPU VHR-10 是一个极具挑战性的地理空间目标检测数据集,包含 10 个类别,共 650 张高分辨率遥感图像。该数据集广泛用于评估模型在复杂背景下的目标识别能力,支持 YOLO 和 COCO 格式。
数据按默认比例划分为:390 张训练集、130 张验证集、130 张测试集。手动标注了包括飞机、船只、储罐、棒球场、网球场、篮球场、田径场、港口、桥梁和车辆在内的各类目标。

数据集总体信息
| 项目 | 描述 |
|---|---|
| 数据集名称 | NWPU VHR-10 (Northwestern Polytechnical University Very High Resolution 10-class Dataset) |
| 任务类型 | 遥感图像中的地理空间目标检测 |
| 图像总数 | 650 张(均为高分辨率遥感图像,源自 Google Earth 等平台) |
| 图像分辨率 | 约 600×600 至 1000×1000 像素,空间分辨率高 |
| 标注格式 | YOLO TXT 格式、COCO JSON 格式 |
| 数据划分 | 训练集 390 张、验证集 130 张、测试集 130 张(比例 ≈ 6:2:2) |
| 应用场景 | 军事侦察、城市规划、灾害评估、智能遥感解译等 |
类别定义与实例数量统计
| 类别 ID | 类别名称(英文) | 类别名称(中文) | 标注实例数量 |
|---|---|---|---|
| 0 | Airplane | 飞机 | 757 |
| 1 | Ship | 船只 | 302 |
| 2 | Storage Tank | 储罐 | 655 |
| 3 | Baseball Diamond | 棒球场 | 390 |
| 4 | Tennis Court | 网球场 | 524 |
| 5 | Basketball Court | 篮球场 | 159 |
| 6 | Ground Track Field | 田径场 | 163 |
| 7 | Harbor | 港口 | 224 |
| 8 | Bridge | 桥梁 | 124 |
| 9 | Vehicle | 车辆 | 598 |
总标注目标数:3,896 个
所有目标均以水平边界框(Axis-Aligned Bounding Box)标注。
推荐使用方式
- 模型训练:直接使用提供的 YOLO 或 COCO 格式,适配 YOLOv5/v8、MMDetection、Detectron2 等主流框架。
- 评估指标:通常采用 [email protected](IoU=0.5)作为主指标。
- 挑战点:小目标(如车辆、飞机)、类间尺度差异大(港口 vs 车辆)、背景复杂(城市、水域、农田混合)。
- 扩展建议:可结合 DIOR、DOTA 等遥感数据集进行跨域泛化研究。
项目结构建议
为了便于管理,建议按照以下目录结构组织数据:
nwpu_vhr10_yolo/
├── dataset.yaml # 数据集配置文件
├── train.py # 主训练脚本
├── predict_demo.py # 推理演示
├── export_model.py # 模型导出脚本
└── data/
├── images/
│ ├── train/ # 390 张训练图像
│ ├── val/ # 130 张验证图像
│ └── test/ # 130 张测试图像
└── labels/
├── train/ # 对应 .txt 标注(YOLO 格式)
├── val/
└── test/
假设你已将官方提供的 YOLO 格式数据按上述结构组织完毕。
数据集配置文件 dataset.yaml
这是 YOLOv8 训练的核心配置,定义了路径、类别数量和名称。请确保路径与实际存放位置一致。
path: ./data
train: images/train
val: images/val
test: images/test
nc: 10
names:
- airplane
- ship
- storage_tank
- baseball_diamond
- tennis_court
- basketball_court
- ground_track_field
- harbor
- bridge
- vehicle
详细训练代码 train.py
接下来我们编写训练脚本。针对遥感场景中小目标较多的特点,我推荐优先使用 yolov8m 或 yolov8l 模型,并在参数中开启 Mosaic 增强以提升鲁棒性。
from ultralytics import YOLO
import torch
def main():
device = 'cuda' if torch.cuda.is_available() else 'cpu'
print(f"🚀 使用设备:{device}")
# 选择模型(遥感小目标多,推荐 yolov8m 或 yolov8l)
model_name = "yolov8m.pt"
project_name = "nwpu_vhr10_detection"
# 加载预训练模型
model = YOLO(model_name)
# 开始训练
results = model.train(
data='dataset.yaml',
epochs=150, # 遥感数据复杂,建议充分训练
imgsz=640, # NWPU 图像较小,640 足够;若需更高精度可用 1024
batch=16, # 640 分辨率下 batch=16(32G 显存可设 32)
name=project_name,
device=device,
patience=30, # 早停机制(验证集 mAP 不升则停)
save=True,
plots=True, # 自动生成 PR 曲线、混淆矩阵、样本可视化
exist_ok=False,
workers=8,
optimizer='AdamW',
lr0=0.01,
lrf=0.01,
augment=True, # 数据增强(关键!提升小目标和尺度变化鲁棒性)
hsv_h=0.015,
hsv_s=0.7,
hsv_v=0.4,
degrees=15.0, # ±15° 旋转(遥感视角多样)
translate=0.1,
scale=0.5,
flipud=0.0, # 不上下翻转(地理目标方向敏感)
fliplr=0.5, # 左右翻转安全
mosaic=1.0, # Mosaic 增强(对小目标如 vehicle/airplane 极有效)
mixup=0.1
)
# 在测试集上评估最终性能
metrics = model.val(data='dataset.yaml', split='test')
print("\n✅ NWPU VHR-10 测试集结果:")
print(f" [email protected] (all): {metrics.box.map50:.5f}")
print(f" [email protected]:0.95: {metrics.box.map:.5f}")
print(f" Precision: {metrics.box.mp:.5f}")
print(f" Recall: {metrics.box.mr:.5f}")
if __name__ == '__main__':
main()
运行命令:
python train.py
推理演示 predict_demo.py
训练完成后,我们可以对单张图片进行推理。注意,对于遥感小目标,适当降低置信度阈值有助于提高召回率。
from ultralytics import YOLO
model = YOLO('runs/detect/nwpu_vhr10_detection/weights/best.pt')
results = model.predict(
source='test_image.jpg',
conf=0.25, # 遥感小目标建议降低阈值
iou=0.45,
save=True,
show=True,
line_width=2,
font_size=12
)
# 打印检测结果
class_names = [
'Airplane', 'Ship', 'Storage Tank', 'Baseball Diamond',
'Tennis Court', 'Basketball Court', 'Ground Track Field',
'Harbor', 'Bridge', 'Vehicle'
]
for result in results:
boxes = result.boxes
print(f"检测到 {len(boxes)} 个目标")
for box in boxes:
cls_id = int(box.cls.item())
conf = float(box.conf.item())
print(f" → {class_names[cls_id]} (置信度:{conf:.3f})")
模型导出(用于部署)
如果需要将模型部署到边缘设备或生产环境,可以导出为 ONNX、TensorRT 或 OpenVINO 格式。
from ultralytics import YOLO
model = YOLO('runs/detect/nwpu_vhr10_detection/weights/best.pt')
# 导出为 ONNX(通用)
model.export(format='onnx', imgsz=640, simplify=True)
# 导出为 TensorRT(NVIDIA GPU / Jetson)
model.export(format='engine', imgsz=640, half=True, device=0)
# 导出为 OpenVINO(Intel CPU)
model.export(format='openvino', imgsz=640)
训练优化建议
在实际训练中,可能会遇到一些特定问题,以下是针对性的解决方案:
| 挑战 | 解决方案 |
|---|---|
| 小目标漏检(如车辆、飞机) | 启用 mosaic=1.0,使用 imgsz=1024(若显存允许) |
| 类别不平衡(如桥梁仅 124 个) | YOLOv8 内置 Focal Loss 变体,通常无需额外处理;也可对稀有类过采样 |
| 背景复杂干扰 | 增加 hsv_v 和 degrees 增强,提升光照与角度鲁棒性 |
| 实时遥感分析 | 若部署于边缘设备(如无人机),可改用 yolov8s + TensorRT |
通过以上步骤,你可以快速搭建起基于 NWPU VHR-10 的遥感目标检测流程,并根据实际需求调整模型参数以获得最佳效果。


