1. 项目背景与核心价值
海上搜救(SAR)任务中,小目标检测一直是计算机视觉领域的难点。传统方法在无人机航拍场景下,对于水面漂浮的人体、小型船只、冲浪板等目标的识别率往往不足30%。我们团队基于YOLOv8架构,构建了专门针对海上搜救场景的优化方案,在自建数据集上实现了82.6%的mAP(IoU=0.5),相比基线模型提升超过45个百分点。
这个项目的独特价值在于:
- 首个公开的综合性海上搜救目标检测数据集,包含6类关键目标(落水者、救生艇、冲浪板、渔船、漂浮物、干扰物)
- 针对水面反光、目标遮挡等特殊场景优化的数据增强策略
- 修改后的YOLOv8网络结构在512x512输入下仍能保持对小目标的敏感度
- 完整训练pipeline包含无人机影像的几何校正模块
2. 数据集构建关键技术
2.1 数据采集与标注规范
我们联合海事部门,使用大疆M300 RTK无人机采集了超过1200公里的海岸线影像,最终筛选出有效样本如下:
| 目标类别 | 训练集数量 | 验证集数量 | 测试集数量 |
|---|---|---|---|
| 落水者 | 4,328 | 623 | 1,042 |
| 救生艇 | 1,856 | 264 | 441 |
| 冲浪板 | 3,217 | 459 | 766 |
| 渔船 | 2,104 | 301 | 502 |
| 漂浮物 | 5,639 | 805 | 1,342 |
| 干扰物 | 7,852 | 1,122 | 1,870 |
标注时特别注意:
- 对小于32x32像素的目标强制要求4人交叉验证
- 水面镜面反射区域用多边形标注而非矩形框
- 对半淹没目标标注水面分界线
2.2 数据增强策略
针对海上场景的特殊性,我们设计了分层增强方案:
python复制class MarineAugment:
def __init__(self):
self.basic_aug = A.Compose([
A.HorizontalFlip(p=0.5),
A.RandomBrightnessContrast(p=0.3)
])
self.advanced_aug = A.Compose([
A.GaussNoise(var_limit=(10, 50), p=0.5),
A.GlassBlur(sigma=0.7, max_delta=2, p=0.3),
A.RandomSunFlare(angle_lower=0.5, p=0.2)
])
def __call__(self, image, bboxes):
# 基础增强
augmented = self.basic_aug(image=image, bboxes=bboxes)
# 仅在30%概率下应用高级增强
if random.random() < 0.3:
augmented = self.advanced_aug(**augmented)
return augmented
3. 模型架构改进
3.1 Backbone优化
在YOLOv8n的基础上进行以下修改:
- 将stem层的卷积步长从2改为1,保留更多小目标特征
- 在C2f模块中增加skip connection分支
- 添加针对小目标的注意力模块:
python复制class SmallObjectAttention(nn.Module):
def __init__(self, channels):
super().__init__()
self.query = nn.Conv2d(channels, channels//8, 1)
self.key = nn.Conv2d(channels, channels//8, 1)
self.value = nn.Conv2d(channels, channels, 1)
def forward(self, x):
B, C, H, W = x.shape
q = self.query(x).view(B, -1, H*W).permute(0,2,1)
k = self.key(x).view(B, -1, H*W)
v = self.value(x).view(B, -1, H*W)
attn = torch.softmax(torch.bmm(q, k) / math.sqrt(C), dim=-1)
out = torch.bmm(v, attn.permute(0,2,1)).view(B,C,H,W)
return x + out
3.2 损失函数调整
采用动态权重分配策略:
- 对小于32x32的目标增加3倍分类损失权重
- 对靠近图像边缘的目标降低位置损失权重
- 引入水面区域先验知识调整置信度损失
4. 训练细节与参数配置
4.1 超参数设置
关键训练参数如下表所示:
| 参数项 | 设置值 | 选择依据 |
|---|---|---|
| 输入尺寸 | 512x512 | 平衡计算成本与细节保留 |
| Batch Size | 32 | 显存限制下的最大有效批大小 |
| 初始学习率 | 0.01 | 余弦退火策略的起点值 |
| 优化器 | SGD | 动量0.937,权重衰减0.0005 |
| 训练周期 | 300 | 验证指标平稳后提前终止 |
| 数据增强概率 | 0.7 | 防止过拟合的折中值 |
4.2 关键训练命令
使用Ultralytics框架的完整训练指令:
bash复制yolo train model=yolov8n-custom.yaml data=marine_sar.yaml \
epochs=300 imgsz=512 batch=32 \
optimizer=SGD lr0=0.01 momentum=0.937 \
weight_decay=0.0005 augment=0.7 \
fl_gamma=1.5 box=7.0 cls=1.0 obj=2.0 \
project=marine_detection name=exp1
5. 部署优化技巧
5.1 无人机端优化
在NVIDIA Jetson AGX Orin上的优化策略:
- 使用TensorRT进行FP16量化
- 对512x512输入进行切片推理(4x4网格)
- 开发基于海面运动特性的结果滤波算法
5.2 误报抑制方法
针对水面反光造成的假阳性:
- 建立动态背景模型:
python复制class DynamicBackground:
def __init__(self, alpha=0.1):
self.background = None
self.alpha = alpha
def update(self, frame):
if self.background is None:
self.background = frame.float()
else:
self.background = self.alpha*frame + (1-self.alpha)*self.background
- 实施基于光流的一致性验证
- 添加基于目标运动轨迹的滤波
6. 实际应用表现
在2023年东海联合搜救演习中的实测数据:
| 指标 | 日间表现 | 黄昏表现 | 夜间表现(红外) |
|---|---|---|---|
| 落水者检出率 | 89.2% | 76.8% | 68.4% |
| 平均定位误差(pixel) | 12.3 | 18.7 | 22.5 |
| 误报率/小时 | 2.1 | 5.3 | 8.7 |
| 推理速度(FPS) | 23.6 | 21.4 | 19.8 |
7. 常见问题解决方案
7.1 目标尺寸差异过大
解决方案:
- 采用多尺度训练(320-640随机缩放)
- 在检测头前添加特征金字塔增强模块
- 对测试图像进行滑动窗口处理
7.2 水面镜面反射干扰
处理流程:
- 基于偏振滤波的预处理
- 反射区域检测算法:
python复制def detect_reflection(image):
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
saturation = hsv[:,:,1]
value = hsv[:,:,2]
mask = (saturation < 30) & (value > 200)
return mask.astype(np.uint8) * 255
- 在损失函数中降低高亮区域的权重
7.3 模型轻量化需求
在保持精度的前提下压缩方案:
- 使用通道剪枝(保留率0.6)
- 知识蒸馏(教师模型为YOLOv8x)
- 量化感知训练(INT8精度)
8. 后续改进方向
- 融合毫米波雷达数据提升夜间性能
- 开发基于视频序列的轨迹预测模块
- 构建更大规模的极端天气数据集
- 探索Vision Transformer在小目标检测中的应用
关键提示:实际部署时要特别注意无人机拍摄角度与太阳位置的相对关系,逆光场景建议增加偏振镜。我们发现当太阳高度角低于30度时,检测性能会下降15-20%。