从训练到部署:YOLOv11 实现 SAR 船舶高效分割全流程实操指南
从训练到部署:香橙派玩转YOLOv11实现SAR船舶高效分割(全流程实操指南)
SAR(合成孔径雷达)凭借全天时、全天候的成像优势,在海洋船舶监测、海上搜救、航运管理等领域具有不可替代的价值。而船舶分割作为SAR影像解译的核心任务,传统方法不仅精度有限,还难以在低成本嵌入式设备上落地。
今天,我们就来解锁一个实用方案:基于YOLOv11实现SAR船舶分割,并完整部署到香橙派嵌入式设备 ,从数据预处理、模型训练、格式转换到最终端侧推理,全程干货可落地,让低成本嵌入式设备也能胜任高精度SAR船舶分割任务。

一、数据预处理:SAR船舶分割的基础前提
数据是模型训练的"粮食",尤其SAR影像存在相干斑噪声、目标与背景对比度低、船舶形态多样等特点,高质量的数据预处理直接决定后续模型训练的效果。本部分将完成从数据集准备到YOLOv11格式适配的全流程。
1. 数据集获取与筛选
首先我们需要获取SAR船舶相关数据集,推荐两类可选方案:
-
公开数据集:优先选择带有分割标注的数据集,如 SAR Ship Detection Dataset (SSDD) (包含大量近岸/远海SAR船舶影像)、Airbus Ship Detection Challenge(可提取分割标注);若暂无现成分割标注,可选用检测数据集并通过LabelMe补充分割标注。
-
自定义数据集:若有自有SAR影像,需筛选无模糊、无遮挡、船舶目标清晰的样本,剔除无船舶、标注不全的无效数据。
数据筛选原则:建议最终整理至少500张有效样本,按「训练集:验证集:测试集=7:2:1」的比例划分,保证训练的泛化性和验证的有效性。
2. 规范YOLOv11 Seg数据目录结构
YOLOv11的分割任务(Segmentation)要求固定的目录结构,否则模型无法正确识别影像和标注,目录结构如下(命名为sar_ship_dataset):
Plain
sar_ship_dataset/
├── images/ # 存放所有SAR影像
│ ├── train/ # 训练集影像(.png/.jpg/.tif,SAR影像优先保留tif格式)
│ ├── val/ # 验证集影像
│ └── test/ # 测试集影像
└── labels/ # 存放对应分割标注文件(与影像一一对应,同名.txt格式)
├── train/
├── val/
└── test/
3. 标注格式转换(转为YOLOv11 Seg格式)
YOLOv11 Seg的标注格式有严格要求,每个.txt标注文件的每行格式为:
Plain
class_id x1 y1 x2 y2 ... xn yn
- 说明:
class_id为类别编号(船舶任务统一为0,从0开始计数);x1 y1...xn yn为船舶目标的轮廓点集,且所有坐标均为归一化后的相对坐标(即像素坐标/影像宽、像素坐标/影像高,范围0-1),点集需按轮廓顺时针/逆时针有序排列。
格式转换实操(以LabelMe标注.json为例)
若使用LabelMe完成分割标注,会生成.json文件,可通过以下Python脚本批量转换为YOLOv11 Seg格式:
代码下载:
https://download.csdn.net/download/xiesibo2012/92565194
4. SAR影像专属预处理与增强
针对SAR影像的特点,需进行针对性预处理和增强,提升模型泛化性:
-
离线预处理(提前执行)
-
去相干斑噪声:使用Lee滤波、Frost滤波消除SAR影像固有噪声,基于OpenCV实现简易Lee滤波:
Pythonimport cv2 import numpy as np def lee_filter(img, window_size=3, sigma=0.1): img = img.astype(np.float32) # 计算窗口内均值和方差 mean = cv2.blur(img, (window_size, window_size)) mean_sq = cv2.blur(img**2, (window_size, window_size)) var = mean_sq - mean**2 # Lee滤波公式 weight = var / (var + sigma**2) filtered = mean + weight * (img - mean) return filtered.astype(np.uint8) -
归一化:将SAR影像像素值缩放到0-1之间,消除亮度差异影响。
-
统一尺寸:将所有影像统一为640×640(适配YOLOv11默认输入,也可根据香橙派性能调整为416×416)。
-
-
在线增强(YOLOv11自带,训练时开启)
无需手动编写代码,训练时通过参数配置即可,适合SAR影像的增强方式包括:
-
随机水平/垂直翻转(避免船舶方向偏差)
-
随机缩放(0.5-1.5倍,适配不同大小船舶)
-
马赛克增强(提升小目标鲁棒性)
-
高斯噪声添加(模拟SAR噪声,进一步提升泛化性)
5. 编写数据集配置yaml文件
最后,编写YOLOv11识别的数据集配置文件(命名为sar_ship.yaml),内容如下:
YAML
# 数据集路径(相对路径/绝对路径均可,推荐绝对路径避免报错)
path: /home/xxx/sar_ship_dataset # 数据集根目录
train: images/train # 训练集影像路径(相对于path)
val: images/val # 验证集影像路径
test: images/test # 测试集影像路径(可选)
# 类别配置
nc: 1 # 类别数量(船舶任务仅1类)
names: ['ship'] # 类别名称(与标注中的class_id对应)
二、模型训练:基于YOLOv11的SAR船舶分割训练
YOLOv11作为最新一代YOLO系列模型,在分割任务上兼具高精度、高速度、轻量化 三大优势,且提供了官方ultralytics库,极大简化了训练流程。注意:香橙派性能有限,优先在PC端完成模型训练,再部署到香橙派。
1. PC端训练环境准备
-
硬件要求:建议NVIDIA显卡(≥GTX 1060,支持CUDA加速),内存≥16G(保证批次训练流畅)。
-
软件环境:
-
Python 3.8-3.11(兼容性最佳)
-
核心库:
ultralytics(YOLOv11官方实现) -
可选加速:CUDA Toolkit 11.8/12.1 + cuDNN(提升训练速度)
-
-
环境安装命令:
Bash# 安装ultralytics核心库 pip install ultralytics # 验证安装(查看YOLOv11版本) yolo check
2. YOLOv11 Seg模型选型
YOLOv11提供了5种规模的分割模型,针对香橙派嵌入式场景,选型优先级如下:
| 模型名称 | 特点 | 适用场景 |
|---|---|---|
| yolov11n-seg | 最小体积、最快速度、精度稍低 | 香橙派(优先选择,平衡速度与精度) |
| yolov11s-seg | 体积较小、速度较快、精度适中 | 香橙派5/5 Plus(性能较强时) |
| yolov11m/l/x-seg | 体积大、精度高、速度慢 | PC端验证,不推荐嵌入式部署 |
本文优先选择yolov11n-seg(预训练模型官方已提供,无需从头训练)。 |
3. 开始训练(两种方式可选,全程可落地)
YOLOv11支持命令行和Python脚本两种训练方式,按需选择即可。
方式1:命令行训练(简洁高效)
Bash
yolo segment train \
data=sar_ship.yaml \
model=yolov11n-seg.pt \
epochs=100 \
batch=16 \
imgsz=640 \
device=0 \
patience=20 \
save=True \
project=sar_ship_train \
name=exp1
参数说明:
-
data:数据集yaml文件路径 -
model:预训练模型路径(官方会自动下载缺失的预训练模型) -
epochs:训练轮数(100轮足够满足SAR船舶任务) -
batch:批次大小(根据显卡显存调整,显存不足可改为8) -
imgsz:输入影像尺寸(与预处理统一,640×640) -
device:训练设备(0为第一张NVIDIA显卡,CPU训练填cpu) -
patience:早停耐心值(20轮验证集精度无提升则停止训练,避免过拟合) -
project/name:训练结果保存路径
方式2:Python脚本训练(灵活可扩展)
Python
from ultralytics import YOLO
# 加载YOLOv11n-seg预训练模型
model = YOLO('yolov11n-seg.pt')
# 开始训练
results = model.train(
data='sar_ship.yaml',
epochs=100,
batch=16,
imgsz=640,
device=0,
patience=20,
save=True,
project='sar_ship_train',
name='exp1'
)
# 查看训练结果(可选)
print("训练完成,关键指标:", results.metrics)
4. 训练结果分析与模型保存
训练完成后,在sar_ship_train/exp1/weights目录下会生成两个核心模型文件:
-
best.pt:验证集效果最优的模型(后续优先使用该模型进行转换和部署) -
last.pt:最后一轮训练的模型(精度通常不如<best.pt>)
同时,目录下会生成results.png,包含核心指标曲线(mAP50、mAP50-95、IoU、像素精度),判断训练效果的标准:
-
曲线平稳上升,无明显震荡(说明训练稳定)
-
mAP50≥0.9、IoU≥0.85(SAR船舶任务达标,可满足实际需求)
-
无过拟合(验证集指标与训练集指标差距不大)

三、模型转换:从PC端.pt到香橙派友好格式
香橙派作为嵌入式设备,硬件资源有限(CPU性能弱、无高端显卡),直接运行PyTorch原生的.pt模型存在两个问题:一是依赖PyTorch环境,部署繁琐;二是推理速度慢,无法满足实时性要求。
因此,需要将.pt模型转换为嵌入式友好的ONNX格式(通用性强、体积小、推理速度快,支持ONNX Runtime推理框架),若香橙派搭载NVIDIA显卡,还可进一步转换为TensorRT格式,加速效果更优。
1. 模型转换的核心必要性
-
脱离PyTorch环境:ONNX格式无需安装庞大的PyTorch库,减少香橙派环境部署成本。
-
减小模型体积:通过简化优化,ONNX模型体积通常比
.pt模型小30%-50%。 -
提升推理速度:ONNX针对嵌入式设备做了优化,推理速度比原生
.pt模型快2-3倍。
2. 转换为ONNX格式(PC端完成)
使用ultralytics库可一键完成转换,无需手动编写复杂代码,两种方式可选:
方式1:命令行转换
Bash
yolo export \
model=sar_ship_train/exp1/weights/best.pt \
format=onnx \
imgsz=640 \
simplify=True
参数说明:
-
format=onnx:指定转换格式为ONNX -
simplify=True:简化ONNX模型,去除冗余层,减小体积并提升推理速度 -
imgsz=640:保持与训练一致的输入尺寸,避免推理误差
方式2:Python脚本转换
代码下载:
https://download.csdn.net/download/xiesibo2012/92565195
3. 验证ONNX模型有效性
转换完成后,在best.pt同目录下会生成best.onnx文件,可通过onnxruntime库验证模型是否有效:
Python
import onnxruntime as ort
import numpy as np
import cv2
# 加载ONNX模型
ort_session = ort.InferenceSession('best.onnx')
# 准备测试输入(640×640×3,归一化到0-1)
test_img = cv2.imread('sar_ship_dataset/images/test/ship_001.jpg')
test_img = cv2.resize(test_img, (640, 640))
test_img = test_img / 255.0
test_img = np.transpose(test_img, (2, 0, 1)) # 转换为CHW格式
test_img = np.expand_dims(test_img, axis=0) # 添加批次维度
test_img = test_img.astype(np.float32)
# 执行推理(获取输出)
outputs = ort_session.run(None, {ort_session.get_inputs()[0].name: test_img})
# 验证输出是否正常
print("ONNX模型输出形状:", [out.shape for out in outputs])
若能正常输出形状,说明ONNX模型转换有效,无格式错误,可迁移到香橙派进行部署。
4. 可选优化:模型量化(进一步提升香橙派推理速度)
为了让模型更适配香橙派,可将ONNX模型从FP32精度量化为FP16(半精度)或INT8(8位整数),进一步减小体积、提升推理速度:
-
FP16量化:体积减小50%,速度提升约1倍,精度损失极小(推荐)。
-
INT8量化:体积减小75%,速度提升约2倍,需提供校准集,精度略有损失。
量化工具可使用onnxruntime.quantization,此处不再展开,核心思路是通过量化工具对best.onnx进行优化,生成量化后的ONNX模型。
四、香橙派端:模型推理与SAR船舶分割落地
完成模型转换后,接下来就是香橙派端的部署与推理,全程围绕"轻量化、高效率"展开,确保在低成本嵌入式设备上实现实时分割。
1. 香橙派前期准备
(1)硬件选型
推荐两款高性价比型号,满足不同需求:
-
入门级:香橙派4B(四核CPU,4G内存,足够运行
yolov11n-segONNX模型)。 -
高性能:香橙派5/5 Plus(八核RK3588 CPU,支持NPU加速,推理速度更快,可运行
yolov11s-seg)。
(2)系统安装
安装Ubuntu 22.04 ARM64版本(兼容性好,支持大部分AI库),步骤如下:
-
下载香橙派对应Ubuntu 22.04 ARM64镜像(官网获取)。
-
使用BalenaEtcher将镜像烧录到16G以上SD卡。
-
插入SD卡,启动香橙派,配置网络和用户名密码,更新系统:
Bashsudo apt update && sudo apt upgrade -y
2. 香橙派推理环境搭建
搭建轻量化推理环境,仅需安装必要依赖,避免占用过多资源:
Bash
# 安装Python3和pip3
sudo apt install python3-pip python3-opencv -y
# 安装ONNX Runtime(ARM64版本,轻量化推理框架)
pip3 install onnxruntime numpy
验证环境:运行python3 -c "import onnxruntime, cv2; print('环境搭建成功')",无报错即说明环境可用。
3. 模型与数据迁移
将PC端转换好的best.onnx模型和测试SAR影像,通过SSH(scp命令)或U盘迁移到香橙派的指定目录(如/home/orangepi/sar_ship_infer/):
Bash
# 从PC端通过scp迁移(替换为自己的香橙派IP和路径)
scp best.onnx orangepi@192.168.1.100:/home/orangepi/sar_ship_infer/
4. 编写香橙派端推理脚本(完整可运行)
编写轻量化推理脚本(sar_ship_infer.py),实现SAR影像读取、预处理、模型推理、结果绘制与保存:
Python
import onnxruntime as ort
import cv2
import numpy as np
class YOLOv11SARShipSeg:
def __init__(self, onnx_model_path, imgsz=640, class_name='ship'):
self.imgsz = imgsz
self.class_name = class_name
self.class_id = 0
# 加载ONNX模型
self.ort_session = ort.InferenceSession(onnx_model_path)
self.input_name = self.ort_session.get_inputs()[0].name
self.input_shape = self.ort_session.get_inputs()[0].shape
def preprocess(self, img_path):
"""影像预处理(与训练时保持一致)"""
# 读取SAR影像
img = cv2.imread(img_path)
self.original_img = img.copy()
self.img_h, self.img_w = img.shape[:2]
# 去噪声、调整尺寸
img = self.lee_filter(img)
img = cv2.resize(img, (self.imgsz, self.imgsz))
# 归一化、转置(HWC→CHW)、添加批次维度
img = img / 255.0
img = np.transpose(img, (2, 0, 1))
img = np.expand_dims(img, axis=0).astype(np.float32)
return img
def lee_filter(self, img, window_size=3, sigma=0.1):
"""SAR影像去相干斑噪声"""
img = img.astype(np.float32)
mean = cv2.blur(img, (window_size, window_size))
mean_sq = cv2.blur(img**2, (window_size, window_size))
var = mean_sq - mean**2
weight = var / (var + sigma**2)
filtered = mean + weight * (img - mean)
return filtered.astype(np.uint8)
def infer(self, img_path):
"""执行推理"""
# 预处理
input_img = self.preprocess(img_path)
# 模型推理
outputs = self.ort_session.run(None, {self.input_name: input_img})
return outputs
def postprocess(self, outputs):
"""后处理:解析分割结果,还原到原始影像尺寸"""
# 解析YOLOv11 Seg输出(简化版,针对单类船舶)
pred_masks = outputs[1] # 分割掩码输出
pred_boxes = outputs[0] # 边界框输出
# 反归一化,还原到原始影像尺寸
scale_x = self.img_w / self.imgsz
scale_y = self.img_h / self.imgsz
return pred_boxes, pred_masks, scale_x, scale_y
def draw_result(self, img_path, save_path='result.jpg'):
"""绘制分割结果并保存"""
# 推理与后处理
outputs = self.infer(img_path)
pred_boxes, pred_masks, scale_x, scale_y = self.postprocess(outputs)
# 绘制分割掩码(简化版,针对单类)
result_img = self.original_img.copy()
for mask in pred_masks:
# 调整掩码尺寸并绘制
mask = cv2.resize(mask.transpose(1, 2, 0), (self.img_w, self.img_h))
mask = (mask > 0.5).astype(np.uint8) * 255
# 绘制彩色掩码(红色,透明度0.5)
color_mask = np.zeros_like(result_img)
color_mask[:, :, 2] = mask
result_img = cv2.addWeighted(result_img, 0.7, color_mask, 0.3, 0)
# 绘制边界框和类别名称
for box in pred_boxes[0]:
x1, y1, x2, y2, conf, cls = box
if cls != self.class_id or conf < 0.5: # 置信度过滤
continue
# 反归一化坐标
x1, y1 = int(x1 * scale_x), int(y1 * scale_y)
x2, y2 = int(x2 * scale_x), int(y2 * scale_y)
# 绘制边界框
cv2.rectangle(result_img, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 绘制类别和置信度
text = f"{self.class_name} {conf:.2f}"
cv2.putText(result_img, text, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 保存结果
cv2.imwrite(save_path, result_img)
print(f"推理结果已保存到:{save_path}")
return result_img
# 实例化并执行推理
if __name__ == "__main__":
# 替换为自己的模型路径和测试影像路径
model = YOLOv11SARShipSeg(onnx_model_path='best.onnx', imgsz=640)
model.draw_result(img_path='test_ship.tif', save_path='sar_ship_result.jpg')
5. 运行推理并查看结果
在香橙派终端运行推理脚本,查看最终效果:
Bash
cd /home/orangepi/sar_ship_infer/
python3 sar_ship_infer.py
使用acl推理的代码请后台私信
预期结果
-
终端输出"推理结果已保存到:sar_ship_result.jpg"。
-
目录下生成
sar_ship_result.jpg,可通过SSH下载到PC端查看,影像中船舶目标被红色掩码分割,绿色边界框标注,附带置信度。 -
推理速度:香橙派5运行
yolov11n-segONNX模型(640×640输入),推理速度约10-20 FPS,满足实时性要求;香橙派4B约5-10 FPS,可通过降低输入尺寸(416×416)提升速度。
常见问题排查
-
推理结果异常:检查预处理是否与训练时一致,输入尺寸是否匹配。
-
推理速度过慢:更换更小的
yolov11n-seg模型,降低输入尺寸,或进行FP16量化。 -
模型加载失败:检查ONNX模型是否转换有效,香橙派是否安装正确的ARM64版本
onnxruntime。
五、总结与展望
本文完整实现了从数据预处理→YOLOv11模型训练→ONNX格式转换→香橙派端推理的SAR船舶分割全流程,核心亮点如下:
-
针对性强:针对SAR影像特点做了专属预处理,提升模型泛化性。
-
可落地性高:全程使用轻量化工具,香橙派环境搭建简单,脚本可直接运行。
-
平衡性能与成本:选用YOLOv11n-seg轻量化模型,在低成本香橙派上实现了高精度、实时性的SAR船舶分割。
后续可进一步优化的方向:
-
硬件加速:利用香橙派5的NPU,通过RKNN Toolkit将ONNX模型转换为RKNN格式,进一步提升推理速度。
-
模型优化:使用模型蒸馏,将yolov11x-seg的高精度迁移到yolov11n-seg,平衡精度与速度。
-
实时流推理:对接SAR影像流,实现实时在线船舶分割与监测。
至此,香橙派玩转YOLOv11实现SAR船舶分割的全流程已完成,希望能为大家的嵌入式AI部署和SAR影像解译提供实用参考!