从训练到部署:香橙派atlas310 YOLOv11 实现 SAR 船舶高效分割全流程实操指南

从训练到部署: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影像的特点,需进行针对性预处理和增强,提升模型泛化性:

  1. 离线预处理(提前执行)

    • 去相干斑噪声:使用Lee滤波、Frost滤波消除SAR影像固有噪声,基于OpenCV实现简易Lee滤波:

      Python 复制代码
      import 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)。

  2. 在线增强(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(保证批次训练流畅)。

  • 软件环境:

    1. Python 3.8-3.11(兼容性最佳)

    2. 核心库:ultralytics(YOLOv11官方实现)

    3. 可选加速: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. 模型转换的核心必要性

  1. 脱离PyTorch环境:ONNX格式无需安装庞大的PyTorch库,减少香橙派环境部署成本。

  2. 减小模型体积:通过简化优化,ONNX模型体积通常比.pt模型小30%-50%。

  3. 提升推理速度: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-seg ONNX模型)。

  • 高性能:香橙派5/5 Plus(八核RK3588 CPU,支持NPU加速,推理速度更快,可运行yolov11s-seg)。

(2)系统安装

安装Ubuntu 22.04 ARM64版本(兼容性好,支持大部分AI库),步骤如下:

  1. 下载香橙派对应Ubuntu 22.04 ARM64镜像(官网获取)。

  2. 使用BalenaEtcher将镜像烧录到16G以上SD卡。

  3. 插入SD卡,启动香橙派,配置网络和用户名密码,更新系统:

    Bash 复制代码
    sudo 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推理的代码请后台私信

预期结果
  1. 终端输出"推理结果已保存到:sar_ship_result.jpg"。

  2. 目录下生成sar_ship_result.jpg,可通过SSH下载到PC端查看,影像中船舶目标被红色掩码分割,绿色边界框标注,附带置信度。

  3. 推理速度:香橙派5运行yolov11n-seg ONNX模型(640×640输入),推理速度约10-20 FPS,满足实时性要求;香橙派4B约5-10 FPS,可通过降低输入尺寸(416×416)提升速度。

常见问题排查
  • 推理结果异常:检查预处理是否与训练时一致,输入尺寸是否匹配。

  • 推理速度过慢:更换更小的yolov11n-seg模型,降低输入尺寸,或进行FP16量化。

  • 模型加载失败:检查ONNX模型是否转换有效,香橙派是否安装正确的ARM64版本onnxruntime

五、总结与展望

本文完整实现了从数据预处理→YOLOv11模型训练→ONNX格式转换→香橙派端推理的SAR船舶分割全流程,核心亮点如下:

  1. 针对性强:针对SAR影像特点做了专属预处理,提升模型泛化性。

  2. 可落地性高:全程使用轻量化工具,香橙派环境搭建简单,脚本可直接运行。

  3. 平衡性能与成本:选用YOLOv11n-seg轻量化模型,在低成本香橙派上实现了高精度、实时性的SAR船舶分割。

后续可进一步优化的方向:

  1. 硬件加速:利用香橙派5的NPU,通过RKNN Toolkit将ONNX模型转换为RKNN格式,进一步提升推理速度。

  2. 模型优化:使用模型蒸馏,将yolov11x-seg的高精度迁移到yolov11n-seg,平衡精度与速度。

  3. 实时流推理:对接SAR影像流,实现实时在线船舶分割与监测。

至此,香橙派玩转YOLOv11实现SAR船舶分割的全流程已完成,希望能为大家的嵌入式AI部署和SAR影像解译提供实用参考!

相关推荐
晚烛4 分钟前
CANN + 物理信息神经网络(PINNs):求解偏微分方程的新范式
javascript·人工智能·flutter·html·零售
爱吃烤鸡翅的酸菜鱼5 分钟前
CANN ops-math向量运算与特殊函数实现解析
人工智能·aigc
波动几何16 分钟前
OpenClaw 构建指南:打造智能多工具编排运行时框架
人工智能
程序猿追17 分钟前
深度解码AI之魂:CANN Compiler 核心架构与技术演进
人工智能·架构
新缸中之脑18 分钟前
Figma Make 提示工程
人工智能·figma
赫尔·普莱蒂科萨·帕塔19 分钟前
智能体工程
人工智能·机器人·软件工程·agi
觉醒大王22 分钟前
AI写的青基中了
人工智能·笔记·深度学习·学习·职场和发展·学习方法
深鱼~23 分钟前
深度剖析ops-transformer:LayerNorm与GEMM的融合优化
人工智能·深度学习·transformer
哈__26 分钟前
CANN图优化技术:深度学习模型的编译器魔法
人工智能·深度学习
灰灰勇闯IT27 分钟前
神经网络的基石——深度解析 CANN ops-nn 算子库如何赋能昇腾 AI
人工智能·深度学习·神经网络