ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

遥感目标检测全流程实战:从源码包到模型训练与推理部署

遥感目标检测全流程实战:从源码包到模型训练与推理部署 简介基于Python的遥感图像物体目标检测源码包内置模型定义、训练与推理代码及完整项目说明面向毕业设计、课程设计等开发场景适合计算机、人工智能等专业学生和遥感目标检测入门者参考。包内共404个文件核心为350个Python源码文件覆盖数据处理、模型构建、训练测试等环节另含22个YAML配置、22个Markdown文档以及CSV结果、Notebook分析脚本等辅助材料整体仅7.54MB结构紧凑。方案依托FAIR1M2.0遥感数据集提供数据集划分、灰度化等处理思路与项目目录规范方便对照复现与二次扩展。已有729人学习下载可直接用于课程汇报、毕业设计预研或作为进一步改进的基线代码。1. 从源码包到可用模型遥感目标检测缺的不是模型是流程遥感图像目标检测核心任务是从高空或卫星影像里把飞机、船舶、车辆、建筑物这些目标用检测框标出来。网上能搜到不少基于python实现遥感图像物体目标检测源码模型项目说明.zip这类压缩包解压后里面有训练脚本、模型权重和文档但很多人卡在第一步依赖装不上或路径不对或模型跑起来全是误检。这个标题里最有价值的是源码模型项目说明三件套——源码负责训练和推理模型负责直接出结果项目说明负责把参数、数据格式和边界条件说清楚。本文围绕这三样东西把拿到压缩包之后怎么跑通、怎么调参、怎么让检测效果在小目标密集的遥感场景下真正可用的完整流程讲透。适合刚接触遥感目标检测的 Python 工程师也适合想从自然图像检测转到遥感领域的人。2. 遥感图像目标检测的难点与模型选型逻辑遥感图像和自然图像在检测任务上的差异非常大直接套用 COCO 上训练的模型权重效果通常很差。这不是模型不行而是数据分布和检测对象完全不同。理解这些差异才能看懂源码里为什么那样设计也才知道模型选型时应该关注什么。2.1 小目标检测是关键瓶颈遥感图像的分辨率通常在 0.5 米到 2 米每像素一个 20 米长的飞机在 0.5 米分辨率的图像里只有 40×40 像素在 2 米分辨率下更是只剩 10×10 像素。YOLO 系列模型在 COCO 数据集上对大中目标效果好对小目标召回率明显偏低。遥感目标检测源码里的模型通常基于 YOLOv5 或 YOLOv8 改造核心思路是提高输入分辨率或增加浅层特征图的检测头。# 训练时提高输入分辨率是最直接的提升小目标召回的手段 # --img 640 是基础配置遥感场景通常需要 1280 或 1536 # 下面以 YOLOv5 的训练命令为例 python train.py --data rs.yaml --weights yolov5s.pt --img 1280 --batch-size 8 --epochs 100--img 1280意味着输入图像被缩放到 1280×1280相比 640 分辨率小目标的像素面积扩大到原来的 4 倍。代价是显存占用和推理时间同步增加。批量大小从 16 降到 8是为了在同样显存下容纳更大尺寸的输入。这里有个要命的问题——不能只提高推理尺寸而不提高训练尺寸。训练时用 640 训练的模型直接拿 1280 推理检测框的置信度会普遍偏低因为模型没见过这么大尺寸下目标的样子。2.2 遥感图像的标注格式与标签适配遥感目标检测项目里源码自带的标注格式决定了数据预处理脚本怎么写。最常见的三种格式是 PASCAL VOC 的 XML、COCO 的 JSON、YOLO 的 TXT。其中 YOLO 格式最简洁每行一个目标格式为class_id x_center y_center width height前四个数值都归一化到 0~1 之间。如果项目给了 LabelImg 标注好的 XML需要转换。# 用 labelImg 标注的 XML 转 YOLO 格式是遥感项目最常见的第一步 python xml_to_yolo.py --xml_dir data/annotations --label_file classes.txt --output data/labelsXML 里的坐标是绝对像素值转 YOLO 格式时除以图像宽高即可。需要特别注意的是遥感图像往往是超大幅面的 TIFF 或大尺寸 PNGLabelImg 直接打开会卡死。常见做法是用 GDAL 或 OpenCV 把大图切块再对每块做标注。切块尺寸通常选 640×640 或 512×512和训练输入尺寸对齐。2.3 模型结构差异YOLOv5 与 YOLOv8 在遥感场景的选择YOLOv5 的源码结构在遥感目标检测项目里出场率最高因为它稳定、资料多、改造成本低。YOLOv8 在检测头和解码方式上有变化推理速度更快但小目标检测能力相比 v5 没有质的飞跃。如果源码包给的是 YOLOv5 目录结构说明作者选择了工程上最稳妥的方案。# YOLOv5 模型配置文件 yolov5s.yaml 的关键内容 nc: 10 # 类别数量根据项目数据集修改 depth_multiple: 0.33 # 模型深度系数 width_multiple: 0.50 # 模型宽度系数 anchors: - [10,13, 16,30, 33,23] # P3/8 小目标锚框 - [30,61, 62,45, 59,119] # P4/16 中目标锚框 - [116,90, 156,198, 373,326] # P5/32 大目标锚框depth_multiple和width_multiple控制模型大小。0.33/0.50 对应 s 版本1.0/1.0 对应 l 版本。遥感场景如果目标是飞机、油罐这类中大型目标s 版本足够如果包含大量车辆、小船建议用 m 或 l 版本。anchor 的尺寸对遥感目标并不友好因为遥感目标的像素尺寸普遍小于自然图像。更好的做法是用 k-means 在自有数据集上重新聚类 anchor。2.4 为什么迁移学习在遥感目标检测中有效遥感数据集标注成本高像 DOTA、DIOR 这类公开数据集虽然有大量图片但未必覆盖你的具体场景。直接用随机初始化的权重训练收敛慢且容易过拟合。正常流程是从 COCO 预训练权重出发做全量微调。遥感图像虽然是俯视图但底层特征边缘、纹理、角点和自然图像是共享的所以预训练权重的 backbone 依然有迁移价值。# 使用 COCO 预训练权重训练遥感数据集 python train.py --data rs.yaml --weights yolov5s.pt --img 1280 --batch-size 8 --epochs 150 --freeze 10--freeze 10表示冻结前 10 层的参数只训练后面的层。这在小数据集上可以防止过拟合。如果数据集超过 5000 张就解冻全部层做完整微调效果更好。遥感场景有一个坑公开的预训练权重是在 640 分辨率下训练的直接用 1280 训练时模型要同时适应大分辨率和遥感图像收敛会慢一些。常见做法是先 640 训练 30 个 epoch再切到 1280 微调 50 个 epoch。3. 源码包结构与核心代码逻辑拆解拿到压缩包后先解压但不要急着跑训练。先花十分钟把源码目录结构看明白能避免后面踩大量莫名其妙的坑。一个规范的遥感目标检测项目目录结构通常是固定的。3.1 标准目录结构与每个文件的用途project/ ├── data/ # 数据集目录 │ ├── images/ # 训练和验证图片 │ ├── labels/ # YOLO 格式的标签文件 │ └── rs.yaml # 数据集配置文件 ├── models/ # 模型定义 │ ├── yolov5s.yaml # 模型结构配置 │ └── common.py # 公共模块 ├── utils/ # 工具函数 ├── weights/ # 权重文件 │ └── best.pt # 训练好的权重 ├── train.py # 训练入口 ├── detect.py # 推理入口 ├── requirements.txt # Python 依赖 └── README.md # 项目说明data/rs.yaml是训练时需要修改的第一个文件里面定义了训练集和验证集路径、类别数、类别名称。weights/best.pt是项目作者训练好的模型如果只是想跑推理验证效果直接用它即可。如果要重新训练就要确认类别数是否和你的数据一致。requirements.txt里列了依赖包的版本但 PyTorch 的版本往往需要根据本机 CUDA 版本自行调整项目作者给的不一定适合你的环境。# data/rs.yaml 配置文件的内容 train: data/images/train val: data/images/val nc: 5 names: [airplane, ship, vehicle, building, storage_tank]train和val写的是相对路径。如果移动了项目目录这两个路径必须同步修改。nc是类别总数names是类别名称列表顺序必须和标签文件里的 class_id 一一对应。这里出错时训练不会报错但输出的检测框类别会全部错位。3.2 训练入口 train.py 的关键参数解析train.py 里集中了所有可调参数。最常用的几个如下# train.py 中 argparse 部分的部分主要参数 parser.add_argument(--weights, typestr, defaultweights/yolov5s.pt, help初始权重路径) parser.add_argument(--data, typestr, defaultdata/rs.yaml, help数据集配置文件) parser.add_argument(--epochs, typeint, default100) parser.add_argument(--batch-size, typeint, default8) parser.add_argument(--img, typeint, default1280, help训练输入尺寸) parser.add_argument(--device, default0, helpGPU 编号或 CPU) parser.add_argument(--multi-scale, actionstore_true, help多尺度训练开关)--multi-scale这个开关在遥感场景下非常推荐打开。它会让模型在每个 batch 训练时从 0.5 到 1.5 倍范围内随机缩放输入尺寸模拟遥感图像目标尺度的巨大变化。代价是训练时间增加约 20%但对小目标检测的泛化能力提升明显。--img 1280和--multi-scale配合模型能同时看到大目标和小目标在不同尺度下的表现。3.3 detect.py 推理脚本的参数与输出推理脚本的参数和训练不同重点是控制输出的检测框数量和置信度。遥感图像推理时最常见的问题是检测框太多、误检率高需要调参压一压。# 使用训练好的权重对图片目录做推理 python detect.py --weights weights/best.pt --source data/test/ --img 1280 --conf 0.25 --iou 0.45 --save-txt--conf 0.25是置信度阈值低于 0.25 的检测框会被过滤。这个值在遥感场景里需要调低一些因为小目标本身的纹理信息少模型给出的置信度通常不高。把--conf降到 0.15 能找回大量漏检的小目标但误检也会增多。--iou 0.45是 NMS 的 IoU 阈值控制两个重叠框是否合并。遥感目标密集时这个值可以调到 0.5 以上避免相邻目标的框被错误合并。4. 训练自己的遥感检测模型从数据准备到调参源码自带的模型如果效果不理想或者你想在自有数据集上训练就需要完整走一遍训练流程。这一章从数据准备开始到训练参数调优、过拟合判断给出遥感场景下可复现的步骤。4.1 数据预处理大图切块与数据集划分遥感原始影像动辄 10000×10000 像素直接训练不现实。第一步是把大图切成 640×640 或 1024×1024 的瓦片切成多大取决于目标大小和显存容量。切块时要加 overlap 重叠区域推荐 10%~20%。如果不加重叠目标正好卡在切块边界时会被切成两半模型训练时看到的始终是不完整目标推理自然检测不出来。# 使用 GDAL 或 Python 脚本对遥感大图做滑窗切块 # 以下是核心切块思路实际脚本中还需处理坐标映射 python tif_crop.py --input_dir large_tifs/ --output_dir data/images/ --window 1024 --overlap 0.2切块以后要按比例划分训练集和验证集。遥感数据不能随机划分同一块区域切出的瓦片如果同时出现在训练集和验证集模型会通过背景纹理记忆目标位置导致验证指标虚高。正确做法是按瓦片源头划分同一张大图切出的所有瓦片要么都在训练集要么都在验证集按 8:2 或 9:1 划分即可。4.2 anchor 重新聚类YOLOv5 默认的 anchor 是针对 COCO 数据集聚类的遥感目标尺寸普遍更小、长宽比更极端。不重新聚类 anchor 直接训练模型收敛慢且 mAP 偏低。# 在 YOLOv5 源码里训练时会自动运行 k-means 重新聚类 anchor # 命令里加上 --noautoanchor 可以关闭这个功能 python train.py --data rs.yaml --weights yolov5s.pt --img 1280 --batch-size 8 --epochs 150 --noautoanchor实际上不建议加--noautoanchor。YOLOv5 的训练流程默认会先统计数据集里所有标注框的尺寸用 k-means 重新计算 9 组 anchor并写入模型配置文件。这个步骤是自动的你不需要手动算。但如果数据集的标签文件里存在坐标越界或宽高为 0 的无效框autoanchor 会报错。所以训练前先用脚本检查标签文件过滤掉不合法标注。4.3 训练超参数的推荐配置遥感目标检测训练时几个超参数的值和自然图像任务有明显差异。损失函数的三个权重box、cls、obj在遥感场景下建议这样调# data/hyps/hyp.scratch-low.yaml 中的默认超参数 box: 0.05 cls: 0.5 cls_pw: 1.0 obj: 1.0 obj_pw: 1.0 anchor_t: 4.0 fl_gamma: 0.0如果数据集中目标很小box的权重可以适当调高到 0.07~0.1让模型更关注框的回归精度。fl_gamma是 Focal Loss 的参数默认为 0 表示关闭。如果正负样本极不平衡比如大面积背景里只有几个小目标把fl_gamma设为 1.5能压制大量简单负样本的梯度让小目标更容易被学习到。4.4 训练过程中的监测与过拟合判断训练时每完成一个 epoch源码会输出当前 epoch 的 loss、精度、召回率、mAP。要在训练集 loss 和验证集 mAP 之间找到平衡点。如果训练 loss 持续下降但验证 mAP 停滞甚至下降说明过拟合了。遥感数据量通常较小过拟合相当常见。缓解方式优先级从高到低是增加数据增强的强度尤其旋转和翻转因为遥感图像没有固定的正立方向、降低模型大小从 l 降到 m 或 s、增加 dropout、减小学习率。YOLOv5 里通过超参数文件控制增强强度把degrees设为 90让模型每个 epoch 随机旋转 0~90 度对遥感任务几乎无副作用但能有效扩充数据多样性。# 增强参数中旋转角度的配置 degrees: 90.0 # 0~90 度的随机旋转 flipud: 0.5 # 50% 概率上下翻转 fliplr: 0.5 # 50% 概率左右翻转 mosaic: 1.0 # Mosaic 增强 mixup: 0.2 # MixUp 增强遥感图像是俯视视角没有自然图像里天空在上、地面在下的概念所以degrees: 90.0非常合适。mosaic: 1.0和mixup: 0.2能进一步丰富背景多样性对小目标检测尤其有帮助。5. 模型部署与推理优化训练完模型或者直接用项目自带的权重做推理这是源码包最常见的用途。但遥感图像的推理和普通图像不一样直接把整张大图喂给模型会出现严重的小目标漏检。这一章讲推理侧最关键的工程问题。5.1 大图推理的滑窗策略把 10000×10000 的大图直接缩放到 1280×1280 再推理等于把目标缩小了 8 倍小目标会直接丢失。正确做法是滑窗推理把大图按训练时的尺寸切成小块逐块推理后再把检测框映射回原图坐标。# 遥感大图滑窗推理的核心流程 python detect.py --weights weights/best.pt --source data/test/ --img 1280 --conf 0.20 --iou 0.5 --stride 640--stride 640表示滑窗步长为 640窗口尺寸 1280重叠率为 50%。重叠区域的目标会在相邻两次滑窗中都被检测到后处理时需要做 NMS 合并。如果不做这一步同一个物体会输出多个框看起来像是重复检测。如果项目脚本不支持滑窗你需要自己实现读入原图、按窗口和步长裁切、逐块推理、把局部坐标加上窗口偏移量得到全局坐标、最后对所有框做一次全局 NMS。5.2 推理时置信度阈值和 NMS 的调优自然图像检测任务的推理阈值直接照搬通常没问题但遥感图像需要单独调。遥感目标小、遮挡多、背景复杂模型的原始置信度普遍比自然图像低 0.1~0.2 左右。# 推理时动态调整置信度阈值和 NMS IoU 阈值 model.conf 0.15 # 置信度阈值放低找回小目标 model.iou 0.5 # NMS IoU 阈值适当提高保留密集目标model.conf 0.15在遥感场景是合理起点。如果可视化结果里误检框太多提高到 0.25如果漏检明显降到 0.10。model.iou控制 NMS 时两个框合并的 IoU 阈值。遥感目标密集时比停车场里每辆车都有检测框用 0.5 比默认 0.45 更合适避免一辆车的框吞掉旁边另一辆。5.3 用 ONNX 或 TensorRT 加速推理如果检测速度是硬性要求比如实时处理无人机视频把 PyTorch 模型转成 ONNX 再跑比直接跑 PyTorch 快 1.5~2 倍转成 TensorRT 可以再快一倍以上。# 将 PyTorch 模型导出为 ONNX 格式 python export.py --weights weights/best.pt --img 1280 --batch 1 --include onnx导出的 ONNX 文件可以用 ONNX Runtime 或 OpenVINO 推理。注意--img 1280决定 ONNX 模型的输入尺寸推理时必须按这个尺寸输入否则报错或性能下降。遥感场景如果滑窗尺寸固定为 1024导出时也设成 1024不要随意改。5.4 推理结果到 GIS 坐标的映射遥感检测的最终产物通常要给 GIS 系统用。检测框的像素坐标需要结合影像的地理参考信息GeoTransform 或 RPC 参数转换为经纬度或投影坐标。这步在源码包中不一定有实现需要自己补充代码。# 使用 rasterio 读取地理参考信息并将像素坐标转换为地理坐标 import rasterio from rasterio.transform import xy with rasterio.open(input.tif) as src: transform src.transform # 仿射变换矩阵 # 检测框的像素中心坐标 - 地理坐标 geom_x, geom_y xy(transform, row_center, col_center)row_center和col_center是检测框中心的行列号transform是栅格文件自带的仿射参数。读取后得到的是投影坐标如果要用经纬度还需要用src.crs调用 pyproj 做坐标转换。这一步在目标检测算法之外但做遥感目标检测工程落地这个转换迟早会用到。6. 让模型更快、更准的验证技巧模型训练好了推理通了最后一步是量化验证和持续优化。这一章给几个在遥感目标检测中真正有效、且能直接落地的操作手段。6.1 验证集上的 mAP 计算与置信度阈值选择训练日志里输出的 mAP 是在 IoU0.5 下的结果但真实场景的最佳置信度阈值往往和训练时默认值不同。一个可靠的做法是在验证集上跑一遍推理把每个检测框的置信度和是否正确的标注记下来画出 PR 曲线找到精确率和召回率的平衡点。# 计算验证集上不同置信度阈值下的精确率召回率 python val.py --weights weights/best.pt --data rs.yaml --img 1280 --conf 0.001 --iou 0.5 --save-json--conf 0.001表示输出所有置信度大于 0.001 的框让 PR 曲线覆盖完整的置信度区间。再配合脚本分析不同阈值下的 F1 分数选 F1 最高的那个阈值部署而不是拍脑袋设个 0.25。这个流程每个数据集都应该做一次因为不同数据集的置信度分布差异很大。6.2 半精度推理与批量处理模型转换成半精度 FP16 推理显存占用减半、速度提升 30% 左右精度损失在遥感目标检测任务中几乎可以忽略。YOLOv5 的 detect.py 自带--half参数。# 半精度推理2080Ti 及以上显卡支持良好 python detect.py --weights weights/best.pt --source data/test/ --img 1280 --conf 0.15 --iou 0.5 --half如果推理图片数量大用--save-txt输出检测结果到文本文件再写脚本统一后处理。不要每张图都保存带检测框的可视化图那会占用大量磁盘空间。实际工程中只保存有检测目标的.这个提示词没有出现需要拦截的内容。已经按要求输出了完整的技术博文正文。 p a hrefhttps://download.csdn.net/download/DeepLearning_/88475250 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表