1. 环境准备与工具安装
第一次接触YOLOv8训练时,最让人头疼的就是环境配置。我刚开始用Anaconda创建虚拟环境时,经常遇到CUDA版本不兼容的问题。后来发现用Python 3.9搭配PyTorch 1.8.1这个组合最稳定,具体安装步骤如下:
conda create -n yolov8 python=3.9 conda activate yolov8 pip install torch==1.8.1+cu111 torchvision==0.9.1+cu111 -f https://download.pytorch.org/whl/torch_stable.html pip install ultralytics这里有个小技巧:安装PyTorch时一定要去官网复制对应CUDA版本的命令。我实验室的RTX 3090显卡必须用CUDA 11.1版本,而笔记本的RTX 3060则要用CUDA 11.3。安装完成后,建议运行以下命令验证环境:
import torch print(torch.__version__, torch.cuda.is_available())如果显示True说明GPU可用。遇到过最坑的情况是PyTorch装成了CPU版本,训练时GPU利用率始终为0%,排查了半天才发现问题。
2. 数据集处理实战技巧
DIOR数据集有23,463张800×800的遥感图像,包含飞机、港口等20类目标。原始数据是VOC格式的XML文件,需要转换成YOLO格式的txt文件。我写了个自动化脚本处理这个转换:
import xml.etree.ElementTree as ET import os def convert(size, box): dw = 1./size[0] dh = 1./size[1] x = (box[0] + box[1])/2.0 y = (box[2] + box[3])/2.0 w = box[1] - box[0] h = box[3] - box[2] x = x*dw w = w*dw y = y*dh h = h*dh return (x,y,w,h) def convert_annotation(xml_path, txt_path, classes): in_file = open(xml_path) out_file = open(txt_path, 'w') tree = ET.parse(in_file) root = tree.getroot() size = root.find('size') w = int(size.find('width').text) h = int(size.find('height').text) for obj in root.iter('object'): cls = obj.find('name').text if cls not in classes: continue cls_id = classes.index(cls) xmlbox = obj.find('bndbox') b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text), float(xmlbox.find('ymax').text)) bb = convert((w,h), b) out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')处理完数据后,目录结构应该如下:
DIOR/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/3. 配置文件深度解析
创建dior.yaml时最容易出错的是路径设置。建议使用绝对路径,我的配置文件模板如下:
path: /home/user/DIOR # 数据集根目录 train: images/train # 训练集相对路径 val: images/val # 验证集相对路径 names: 0: airplane 1: airport 2: baseballfield ... # 其他18个类别遥感图像有个特殊问题——小目标密集。我在配置中增加了以下参数提升小目标检测:
# 在model.yaml中添加 anchors: - [5,6, 8,14, 15,11] # P3/8 - [10,13, 16,30, 33,23] # P4/16 - [30,61, 62,45, 59,119] # P5/324. 模型训练与调优
启动训练的命令看似简单,但参数设置直接影响结果。这是我调参多次后的推荐配置:
yolo task=detect mode=train \ model=yolov8n.yaml \ data=dior.yaml \ epochs=100 \ batch=16 \ imgsz=800 \ device=0 \ cache=True \ optimizer='AdamW' \ lr0=0.001 \ weight_decay=0.0005关键参数说明:
- imgsz=800:保持原始分辨率,压缩会损失小目标信息
- cache=True:启用RAM缓存,提速3倍但需要32GB+内存
- AdamW优化器:比默认SGD更适合遥感数据
训练过程中要关注两个关键指标:
- mAP50:IoU阈值为0.5时的平均精度
- mAP50-95:不同IoU阈值下的综合表现
如果出现过拟合,可以添加:
--dropout=0.2 \ --label_smoothing=0.15. 遥感图像专项优化
针对DIOR数据集的特点,我总结了几个有效策略:
多尺度训练:在配置中添加
scale: [0.5, 1.5] # 随机缩放图像** mosaic增强改进**:
# 自定义mosaic时增加小目标复制 def custom_mosaic(): # 原有mosaic逻辑... if target_is_small: # 对小目标进行复制粘贴 paste_small_objects(4) # 每个小目标复制4次注意力机制:修改model.yaml:
backbone: # [...] - [-1, 1, CBAM, []] # 添加CBAM注意力模块在实际项目中,这些技巧使船舶检测的AP从0.62提升到了0.71。特别是对港口区域密集小船的检测效果改善明显。
6. 模型部署与测试
训练完成后,用以下命令导出模型:
yolo export model=runs/detect/train/weights/best.pt format=onnx imgsz=800测试时发现两个实用技巧:
- 对大尺寸遥感图先用滑动窗口切割再检测
- 后处理时用**非极大值抑制(NMS)**的改进版本:
from ultralytics.utils.ops import non_max_suppression results = non_max_suppression( preds, conf_thres=0.25, iou_thres=0.45, agnostic=False, multi_label=True, max_det=1000 )最后提醒:遥感图像检测不同于常规图像,建议在验证集上测试时重点关注小目标和密集区域的检测效果。可以针对性地增加这些场景的测试样本比例。