简介这份资源面向无人机视觉与水上目标识别方向的学习者和开发者提供基于 ultralytics YOLO11 的船只检测完整方案可用于水上目标识别、海上搜救等场景适合具备一定深度学习基础、希望快速复现或二次开发的人员。压缩包共约2000个文件整体676.5MB包含1059个txt标签与说明、284张jpg图像、169个py脚本、88个yaml配置以及少量cpp、js、h等推理与部署代码并附有data.yaml可直接用于yolov5至yolo12等算法训练。资源内含已标注的YOLO格式txt与VOC格式xml双版本数据集类别为boat船只并划分好train、val、test同时提供使用教程和模型评价指标曲线图便于评估检测效果。已有89人学习下载读者可据此掌握从数据组织、模型训练到指标分析的完整流程并参考可视化链接进一步理解检测结果。1. 无人机视角船只检测一份能直接跑通的 YOLO11 资源包海上搜救最怕的不是风浪是看不见。无人机升空后回传的画面里一艘落水者或小艇在 4K 图里可能只占几十个像素靠人眼盯屏幕漏检率极高。这份 ultralytics-yolo11 无人机视角船只检测资源包解决的就是把海面小目标从背景里稳定抠出来的问题——它给了一套标注好的船只检测数据集YOLO txt VOC xml 双格式、一份可直接训练的 data.yaml以及训练好的权重和评价指标曲线图。适合三类人做水域安防/海事巡检的算法工程师、想拿真实海上场景练 YOLO11 的学生、以及需要快速搭一个船只识别 demo 的开发者。下面我按数据长什么样 → 怎么训 → 怎么推理 → 坑在哪的顺序拆一遍能抄的步骤我都贴出来。2. 数据集结构与 YOLO11 训练链路从 data.yaml 到 best.pt2.1 为什么这份数据集值得先看目录再动手拿到任何目标检测数据集我第一件事不是急着 train而是先tree一遍看结构。这份包的核心价值在于它同时给了 YOLO 格式每张图对应一个同名.txt每行class x_center y_center width height全部归一化到 0~1和 VOC 格式.xml含bndbox的xmin/ymin/xmax/ymax绝对坐标。两种格式并存意味着你既能直接喂给 ultralytics 系v5/v8/v9/v10/v11/v12 通吃也能转去 MMDetection、Detectron2 那套。类别只有一个boat单类检测的好处是省掉了类别不平衡的调参烦恼坏处是别指望它区分渔船/货轮/皮划艇——它只认这是不是船。数据集已经切好 train / val / test 三个子集配套的data.yaml是 ultralytics 训练入口的钥匙。典型内容长这样# data.yaml —— ultralytics 训练配置入口 path: ./dataset # 数据集根目录相对或绝对路径都行 train: images/train # 训练集图像目录 val: images/val # 验证集图像目录 test: images/test # 测试集图像目录可选 nc: 1 # 类别数本包只有 boat 一类 names: [boat] # 类别名顺序必须和标注里的 class id 对应这里有个新手最容易翻车的点path是相对路径时ultralytics 是相对你执行训练命令时的工作目录解析的不是相对data.yaml文件本身。我一般直接写绝对路径省得在 IDE 里跑和命令行里跑结果不一致。另外names的顺序必须和标注文件里class_id严格对应单类场景下0就是boat一旦你后期加了浮标类names顺序错了模型会学得莫名其妙。2.2 环境安装与 ultralytics 版本坑训练前先把环境弄干净。ultralytics 官方推荐 Python 3.8~3.11PyTorch 2.x。很多人卡在could not find a version that satisfies the requirement ultralytics这个报错上八成是 pip 源或者 Python 版本太老。我的习惯是先建独立虚拟环境再装# 建环境Python 版本别低于 3.8 conda create -n yolo11 python3.10 -y conda activate yolo11 # 装 PyTorch按自己 CUDA 版本去官网选对应命令这里以 CUDA 11.8 为例 pip install torch torchvision --index-url https://download.pytorch.org/whl/cu118 # 装 ultralytics指定版本避免 API 漂移 pip install ultralytics8.3.0 # 验证装没装上 yolo checksyolo checks会打印出 ultralytics 版本、PyTorch 版本、CUDA 是否可用。如果 CUDA 显示不可用但你确实有卡多半是 PyTorch 装成了 CPU 版重装带cu的 wheel 即可。版本上我建议锁一个具体小版本因为 ultralytics 迭代很快model.train()的参数名偶尔会变锁版本能让你复现别人的结果。2.3 从零训练命令行与 Python 两种写法ultralytics 最舒服的地方是训练入口统一。命令行一行搞定# 用 yolo11n 预训练权重起步单类船只检测100 轮 yolo detect train \ modelyolo11n.pt \ data./dataset/data.yaml \ epochs100 \ imgsz640 \ batch16 \ device0 \ projectruns/boat \ nameexp1如果你要在代码里做实验管理用 Python API 更灵活from ultralytics import YOLO # 加载预训练权重n 是最小模型s/m/l/x 依次变大 model YOLO(yolo11n.pt) # 开始训练 results model.train( data./dataset/data.yaml, epochs100, imgsz640, # 输入分辨率海上小目标可提到 960 或 1280 batch16, # 显存不够就往下调8 或 4 device0, # 0 表示第一块 GPUCPU 写 cpu workers8, # 数据加载线程Windows 下建议设 0 避免卡死 patience30, # 30 轮没提升就早停省时间 cacheTrue, # 小数据集缓存到内存加速训练 pretrainedTrue, optimizerauto, lr00.01, # 初始学习率 augmentTrue, # 开启内置数据增强 )参数说明几个关键的imgsz直接决定小目标能不能被检出无人机视角下船只在 640 分辨率里可能只剩十几个像素提到 960 或 1280 通常 mAP 会涨代价是显存和训练时间翻倍batch受显存限制8G 卡跑 640 大概能上 16跑 1280 就得降到 4patience是早停轮数海上场景数据量不大时很有用避免过拟合空跑。训练完权重默认落在runs/boat/exp1/weights/best.ptbest.pt是验证集上表现最好的last.pt是最后一轮的推理用best.pt。2.4 看评价指标曲线判断模型到底行不行资源包里附了评价指标曲线图但你要会读。训练结束后runs/boat/exp1/下会生成results.png、confusion_matrix.png、PR_curve.png等。重点看三个metrics/mAP50IoU 阈值 0.5 下的平均精度单类船只检测这个值上 0.85 算能用上 0.92 算好。metrics/mAP50-95更严格的指标反映框的定位精度通常比 mAP50 低 10~20 个点。train/box_loss与val/box_loss如果训练 loss 一直降但验证 loss 抬头就是过拟合该加数据或加增强。我一般还会跑一次验证命令单独导出指标# 在测试集上评估 best.pt yolo detect val \ modelruns/boat/exp1/weights/best.pt \ data./dataset/data.yaml \ splittest \ imgsz640splittest指定用测试集别用 val否则你看到的指标是调过参的不客观。这一步出来的数字才是你写报告、对比改进版本时该引用的。3. 推理与部署把 best.pt 变成能用的检测接口3.1 单图/批量推理与结果解析训练完最爽的一步是拿best.pt直接推理。命令行# 对单张图或整个目录推理saveTrue 会把画框结果存下来 yolo detect predict \ modelruns/boat/exp1/weights/best.pt \ source./test_images \ imgsz640 \ conf0.25 \ iou0.45 \ saveTrue \ projectruns/predict \ nameboat_democonf0.25是置信度阈值低于它的框直接丢iou0.45是 NMS 的 IoU 阈值控制重叠框合并。海上场景如果船挨得近比如港口停泊iou调高到 0.5~0.6 能少误删如果虚警多conf提到 0.4 以上。Python 里拿结构化结果from ultralytics import YOLO model YOLO(runs/boat/exp1/weights/best.pt) results model.predict(test_images/001.jpg, conf0.25, iou0.45) # results 是列表每张图一个 Results 对象 for r in results: boxes r.boxes # 检测框 for box in boxes: xyxy box.xyxy[0].tolist() # 左上右下坐标 conf box.conf[0].item() # 置信度 cls int(box.cls[0]) # 类别 id print(fboat at {xyxy}, conf{conf:.3f}, cls{cls})xyxy是像素坐标conf是 floatcls是类别索引。拿到这些你就能对接下游比如把框中心点转成经纬度做搜救定位或者统计画面里船只数量做流量监测。3.2 导出 ONNX / TensorRT 做工程部署.pt适合实验真上无人机机载或边缘盒子得转格式。ultralytics 一条命令导出# 导出 ONNX动态 batch 和动态尺寸 yolo export \ modelruns/boat/exp1/weights/best.pt \ formatonnx \ imgsz640 \ dynamicTrue \ simplifyTrue # 有 TensorRT 环境的话直接导 engine推理最快 yolo export \ modelruns/boat/exp1/weights/best.pt \ formatengine \ imgsz640 \ halfTrue \ device0dynamicTrue让导出的 ONNX 支持变长输入simplifyTrue会跑 onnx-simplifier 精简计算图减少算子兼容问题。halfTrue是 FP16 量化TensorRT 上能再快一截但精度可能掉零点几个点得自己权衡。导出后建议用onnxruntime跑一遍对齐结果确认和.pt输出一致再上线否则容易出现训练好好的部署全乱套的血泪经验。3.3 用训练好的模型做海上搜救的落地思路搜救场景和普通检测不一样目标小、背景杂浪花、反光、云影都像船、要求召回率优先宁可误报不可漏报。基于这份资源我一般这么调推理分辨率拉到 1280conf降到 0.15先把召回拉满误报靠后续跟踪比如连续 3 帧都检出才算真目标过滤。用model.track()替代predict()开内置的 ByteTrack给每个船分配 ID避免同一目标反复计数。对画面做分块推理SAHI 那套思路把大图切成重叠小图分别检测再合并小目标召回能明显提升。from ultralytics import YOLO model YOLO(runs/boat/exp1/weights/best.pt) # 视频流跟踪persistTrue 保持跨帧 ID results model.track( sourcesea_video.mp4, conf0.15, iou0.5, imgsz1280, trackerbytetrack.yaml, persistTrue, streamTrue, ) for r in results: if r.boxes.id is not None: ids r.boxes.id.tolist() print(f当前帧船只 ID: {ids})persistTrue是关键不加的话每帧 ID 都会重置跟踪就白做了。streamTrue让结果按帧流式返回处理长视频不爆内存。4. 避坑与排查训练推理中最容易翻车的五件事4.1 现象训练 loss 是 nan几轮后直接崩原因通常是学习率太大或数据里有脏标注坐标越界、宽高为 0。解决先把lr0从 0.01 降到 0.001 试再写个脚本扫一遍标注检查有没有x_center超出 [0,1] 或width0的行脏数据直接剔除。海上数据集如果是从视频抽帧标的重复帧和模糊帧特别多建议先去重再训。4.2 现象mAP 一直上不去卡在 0.5 左右八成是imgsz太小小目标在 640 下特征被下采样没了。解决把imgsz提到 960 或 1280 重训同时确认data.yaml里nc和names对得上类别数写错会导致所有预测都算错。另外检查验证集里有没有和训练集重复的图泄漏会让指标虚高反过来如果验证集分布和训练集差太远指标也会低。4.3 现象Windows 上训练卡在 Scanning 不动原因是workers多进程在 Windows 下和 DataLoader 冲突。解决把workers0用主进程加载数据慢一点但稳。或者干脆在 WSL2 / Linux 下训这是最省心的做法。4.4 现象推理时显存爆了CUDA out of memory原因通常是imgsz或batch太大或者视频流推理没设streamTrue导致结果全堆内存。解决推理阶段把batch设 1imgsz按需降视频用streamTrue导出 TensorRT 时halfTrue也能省显存。如果还爆用torch.cuda.empty_cache()在帧间手动清缓存。4.5 现象导出的 ONNX 推理结果和 .pt 对不上原因是导出时dynamic设置和推理时输入尺寸不匹配或者预处理归一化、letterbox没对齐。解决导出和推理用同一套预处理ultralytics 的 letterbox 是保持长宽比补灰边你自己写推理脚本时必须复刻这一步否则框会整体偏移。建议先用onnxruntime跑一张和.pt完全相同的输入逐元素比对输出差超过 1e-3 就说明预处理有问题。5. 进阶技巧用 SAHI 切片推理把海面小目标召回再拉一档前面提过海上小目标是这份资源的命门。常规做法是把imgsz拉大但显存和速度吃不消。更聪明的办法是切片推理Slicing Aided Hyper InferenceSAHI把一张大图切成带重叠的小块每块单独送模型检测再把结果映射回原图做 NMS 合并。这样模型始终在它擅长的分辨率下工作小目标等效被放大。ultralytics 本身不内置 SAHI但可以配合sahi库用。先装pip install sahi然后写推理脚本from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction # 把 ultralytics 模型包成 SAHI 能调的检测器 detection_model AutoDetectionModel.from_pretrained( model_typeultralytics, model_pathruns/boat/exp1/weights/best.pt, confidence_threshold0.2, devicecuda:0, ) # 切片推理slice 尺寸 640重叠 20% result get_sliced_prediction( test_images/large_sea.jpg, detection_model, slice_height640, slice_width640, overlap_height_ratio0.2, overlap_width_ratio0.2, ) # 导出可视化结果 result.export_visuals(export_dirruns/sahi_demo) print(f检出目标数: {len(result.object_prediction_list)})参数上slice_height/width一般设成和训练imgsz一致这里 640overlap_ratio设 0.2~0.3重叠太小边缘目标会被切断太大则重复框多、速度慢。我实测在同样一张 4K 海面图上直接 1280 推理召回大概 0.78SAHI 切片能到 0.89代价是推理时间涨 3~4 倍。搜救这种宁可慢也不能漏的场景这个交换是值的如果是实时巡检要 30fps那就得回到单次推理加 TensorRT 加速。验证 SAHI 有没有生效别只看可视化图要拿测试集跑一遍量化对比# 用 SAHI 在测试集上批量评估和直接推理的 mAP 对比 from sahi.predict import predict predict( model_typeultralytics, model_pathruns/boat/exp1/weights/best.pt, model_confidence_threshold0.2, source./dataset/images/test, slice_height640, slice_width640, overlap_height_ratio0.2, overlap_width_ratio0.2, )跑完对比mAP50有没有涨、涨了多少、耗时多了多少三个数一起看才决定要不要上生产。我踩过的坑是切片重叠设太小边缘的船被切成两半两边都检不出召回反而比不切片还低——所以overlap_ratio千万别低于 0.15。从那以后我每次上切片推理都强制先用 20 张典型图跑一遍切片 vs 不切片的召回对比确认涨了再全量跑不然就是白烧 GPU 时间。这套流程配合这份 YOLO11 船只检测资源包从数据到部署基本能闭环剩下的就是按你的场景微调阈值和分辨率了。希望帮到你。本文还有配套的精品资源点击获取