1. YOLOv11与舰船检测:为什么选择这个组合?
第一次接触YOLOv11是在去年处理一个港口监控项目时。当时试过YOLOv5、YOLOv8等多个版本,最终YOLOv11在准确率和速度的平衡上给了我惊喜。特别是处理海上复杂环境时,它的C3k2块和C2PSA模块对小型舰船的检测效果明显优于前代。
舰船检测最大的难点在于背景干扰。海面波纹、光照变化、天气条件都会影响检测效果。实测发现,YOLOv11的SPPF模块能有效处理这类多尺度目标,而新增的注意力机制让模型在雾天场景下的召回率提升了约15%。
提示:如果你手头的显卡显存小于8GB,建议使用yolov11s而不是yolov11m/l版本,后者虽然精度更高但对硬件要求也更高。
2. 从零搭建开发环境
2.1 硬件准备:别在第一步踩坑
我的开发机配置是RTX 3060显卡+16GB内存,这个配置跑640x640分辨率的模型很流畅。遇到过最坑的问题是CUDA版本冲突,建议直接使用以下组合:
- CUDA 11.7
- cuDNN 8.5.0
- PyTorch 1.13.1
conda create -n yolov11 python=3.8 conda activate yolov11 pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 --extra-index-url https://download.pytorch.org/whl/cu1172.2 数据集处理:90%的工作在这里
公开的舰船数据集主要有SeaShips和FGSC-23,但实际项目中我发现这些数据分布和真实场景差异较大。建议自己采集数据时注意:
- 不同光照条件(顺光/逆光)
- 不同天气(晴/雨/雾)
- 多种拍摄角度(俯视/平视)
标注时推荐使用LabelImg,保存为YOLO格式。文件夹结构应该是:
dataset/ ├── images/ │ ├── train/ │ └── val/ └── labels/ ├── train/ └── val/3. 模型训练实战技巧
3.1 关键参数设置:我的调参笔记
经过20多次实验,这些参数组合效果最好:
- 初始学习率:0.01(用余弦衰减)
- 批量大小:8(显存不够可减半)
- 输入尺寸:640x640
- 数据增强:mosaic=0.5, hsv_h=0.015
model = YOLO('yolov11s.yaml').load('yolov11s.pt') # 从配置文件初始化 results = model.train( data='ship.yaml', epochs=100, batch=8, imgsz=640, device=0, # 使用GPU name='ship_v11' )3.2 训练过程监控:看懂这些曲线很重要
重点关注三个指标:
- mAP50-95:高于0.6说明模型不错
- val/box_loss:低于0.3为佳
- precision-recall曲线:两者平衡点越靠右上越好
遇到过最头疼的问题是过拟合,解决方法:
- 增加mixup数据增强
- 早停机制(patience=15)
- 减少模型深度
4. 部署到生产环境
4.1 PyQt5界面开发:让算法工程师也能做GUI
用PyQt5封装检测功能时,这几个组件最实用:
- QLabel显示检测结果
- QTimer实现实时视频流
- QThread避免界面卡顿
class DetectionThread(QThread): result_signal = pyqtSignal(np.ndarray) def run(self): while self.running: frame = self.capture.read() results = self.model(frame) self.result_signal.emit(results[0].plot())4.2 性能优化:从15FPS到30FPS的蜕变
这几个技巧让我的推理速度翻倍:
- 使用TensorRT加速(需转换模型格式)
- 将图像预处理移到GPU
- 启用half-precision推理
- 使用cv2.dnn.blobFromImage替代手动归一化
最终实现的系统功能:
- 图片检测:支持拖拽操作
- 视频分析:进度条可拖动
- 摄像头实时检测:显示FPS计数
- 批量导出结果:自动生成Excel报告
5. 常见问题解决方案
5.1 漏检问题排查手册
上周刚解决一个典型漏检案例:模型总是漏掉小型渔船。解决方法:
- 增加锚框数量(从3个改为6个)
- 在数据集中添加更多小目标样本
- 调整NMS的iou_threshold到0.45
5.2 内存泄漏排查:一个隐蔽的bug
发现长时间运行后内存会缓慢增长,最终定位到是OpenCV的VideoCapture没有及时释放。现在我的代码里都会加上:
def cleanup(self): if hasattr(self, 'capture'): self.capture.release() cv2.destroyAllWindows()6. 进阶优化方向
尝试过将YOLOv11与ByteTrack结合实现舰船追踪,效果比单纯检测提升明显。关键修改点:
- 在detect.py中集成追踪器
- 添加轨迹可视化功能
- 设计跨镜头ID保持机制
另一个有意思的尝试是用Gradio快速搭建Web演示界面,10行代码就能实现:
import gradio as gr def detect(image): results = model(image) return results[0].plot() gr.Interface(fn=detect, inputs="image", outputs="image").launch()最近在试验将模型部署到Jetson Xavier NX边缘设备,遇到的主要挑战是量化后的精度损失。目前的解决方案是使用QAT(量化感知训练),相比PTQ能保持约95%的原始精度。