ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

无人机视角飞机目标检测数据集:从拆包到YOLO训练与mAP优化的完整指南

无人机视角飞机目标检测数据集:从拆包到YOLO训练与mAP优化的完整指南 简介无人机视角下的飞机目标检测数据集包含训练集479张、验证集31张、测试集16张均为高空及无人机视野下的飞行器图片覆盖不同角度、高度、光照与云层、城市、旷野等背景。标注采用YOLO格式每类含边界框与类别标签单图最多可含20余个飞机实例适合用于小目标检测、密集目标识别及低空监测算法开发。整个资源共1054个文件以526张jpg图像与526份txt标注为主另含yaml配置文件与docx数据集说明文档压缩包约15.63MB结构简洁可直接用YOLOv5/v7/v8等框架加载训练。目前已有202人学习下载。数据源自无人机与高空视角贴近机场空域监测、无人机交通管理及国防低空预警等真实场景可支撑计算机视觉算法验证与航空器识别模型构建。1. 无人机视角飞机目标检测数据集.zip一次讲透从拆包到把 mAP 做稳的完整路径你刚拿到这份「无人机视角飞机目标检测数据集.zip」最该有的预期是它能把从数据准备到模型训练再到效果验证的整条链路跑通但不会替你解决所有问题。俯视视角下飞机只有几十个像素、停机坪上机身紧紧相邻、背景里跑道线和建筑边缘反复干扰判断这些才是这类数据集的常态也是后面真正要啃的硬骨头。接下来的写法完全按工程顺序走解压后先识别目录和标注格式再转成 YOLO 能吃的结构然后训练、排错、验证。适合正在做低空无人机视觉或遥感目标检测的从业者也适合第一次用无人机图像练手目标检测的进阶新手。2. 拆包后的第一件事看清目录结构、标注格式和类别分布拿到 zip 不要急着双击训练脚本先花十分钟把里面到底装了什么看清楚。这个习惯能帮你省掉后面一整天排查格式兼容性问题的时间。飞机目标检测在数据组织上和一群人流的通用检测数据集有区别它更接近遥感目标检测那一套习惯目录和标注的“方言”很多需要先对上接口。2.1 一份 zip 里常见的三种目录组织方式解压之后你大概率会遇到下面三种结构之一它们的来源不同处理方式也不同。第一种是“YOLO 工程即时可用”结构一眼就能认出来顶层是images/和labels/两个目录里面再按train/、val/、test/分子集标签全是同名.txt。这种属于数据发布者已经替你把脏活干完了直接进入第三章的训练配置就好。第二种是沿用学术数据集的“VOC 风格”结构根目录下是JPEGImages/、Annotations/、ImageSets/。图片在JPEGImages标注是Annotations下的.xml文件ImageSets/Main/里存放划分用的train.txt、val.txt。HRSC2016 这类遥感数据集家族就很喜欢这种组织方式飞机数据集的 zip 里撞见它不奇怪。这种结构不能直接被 YOLO 工程消费需要先做格式和目录转换。第三种是“COCO 风格”标注集中在单个annotations.json图片散在images/下可能还带stuff或panoptic之类目录。这种情况比较少见但遇到时别慌转换思路和 VOC 一致只是解析的字段从bndbox变成了bbox。还有一类特殊情况你拿到的 zip 里可能已经带了一个README.txt或者classes.txt里面写着类别名比如airplane。这个文件在转换格式时很重要先读它别删。打开 zip 之后我喜欢先跑一遍最小命令把目录层级摸清楚unzip -q 无人机视角飞机目标检测数据集.zip -d plane_dataset cd plane_dataset find . -maxdepth 2 -type d | sort-q是安静模式解压过程不刷屏-d指定解压目标目录。find -maxdepth 2只看前两层目录避免被图片文件把终端刷花。命令执行完你屏幕上列出来的就是这份数据集的主骨架。如果 zip 解压后出现嵌套层比如最外层还有一个同名文件夹我一般用mv把它提出来再重新组织而不是让训练脚本去面对plane_dataset/plane_dataset/images/...这种层层嵌套的路径后面写data.yaml时极易出错。2.2 三组命令快速判断标签格式VOC、COCO 还是 YOLO目录结构只能猜个大概真正决定后续工作量的还是标注文件长什么样。判断格式最快的办法不是打开文件看内容而是先统计扩展名再抽查一个文件做样本。echo 统计标注文件扩展名 find . -type f \( -name *.xml -o -name *.json -o -name *.txt \) | awk -F. {print $NF} | sort | uniq -c echo 抽查一个文件的头 3 行 first_xml$(find . -name *.xml | head -n 1) head -n 3 $first_xml第一段命令把三类常见标注文件分别数了一遍哪个数量最多哪种格式就是主力。如果三类都有说明发布者既给了原始 VOC 标注又附带了转换好的 YOLO 标签此时优先用.txt格式省一次转换的功夫。第二段命令随机挑一个文件看内容bndbox开头的是 VOCimages:[开头的是 COCO纯class_id x_center y_center width height的是 YOLO。三种格式的核心差异可以用一张表说清楚格式文件后缀坐标含义是否需要归一化VOC.xmlxmin, ymin, xmax, ymax像素否COCO.jsonx_top_left, y_top_left, width, height像素否YOLO.txtx_center, y_center, width, height0~1 归一化是VOC 和 COCO 存的是绝对像素坐标好处是直观坏处是换分辨率就得重算。YOLO 存的是相对比例跨分辨率训练不用改标签这也是为什么训练前大家都要往 YOLO 格式上靠。无人机图像分辨率差异极大有 1280×720 的也有 4K 甚至更高YOLO 格式的归一化特性在这种场景下优势非常明显。还有一个小信号要留意如果目录里图片后缀五花八门.jpg、.png、.tif混在一起说明数据来源是多架次、多传感器采集的训练时要特别注意“同场景图像进入训练集和验证集”的问题这在第四章会展开讲。2.3 把 VOC 标注转成 YOLO 数据归一化坐标脚本与四个边界处理假设你已经确认这份 zip 是 VOC 风格那就是最常见的“需要动手”的情况。转换逻辑本身不复杂读取bndbox的四个像素值算出中心坐标和宽高再除以图片尺寸完成归一化。但工程上的坑往往在细节直接上完整脚本。import xml.etree.ElementTree as ET from pathlib import Path CLASS_NAMES [airplane] # 以 zip 里的 classes.txt 为准顺序不能乱 def voc_to_yolo(xml_path: Path, out_dir: Path) - None: tree ET.parse(xml_path) root tree.getroot() size root.find(size) img_w float(size.find(width).text) img_h float(size.find(height).text) lines [] for obj in root.findall(object): name obj.find(name).text if name not in CLASS_NAMES: continue # 出现飞机以外的类别直接跳过 cls_id CLASS_NAMES.index(name) box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) if xmax xmin or ymax ymin: print(f[跳过非法框] {xml_path.name} 的 {name}) continue x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h box_w (xmax - xmin) / img_w box_h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}) if lines: out_path out_dir / (xml_path.stem .txt) out_path.write_text(\n.join(lines), encodingutf-8) def convert_all(ann_dir: Path, out_dir: Path) - None: out_dir.mkdir(parentsTrue, exist_okTrue) for xml_file in sorted(ann_dir.glob(*.xml)): voc_to_yolo(xml_file, out_dir) print(f转换完成共处理 {len(list(ann_dir.glob(*.xml)))} 个 XML 文件) convert_all(Path(plane_dataset/Annotations), Path(plane_dataset/labels))脚本里有四个边界处理是血泪经验换来的少一个后面都要翻车。第一个是类别过滤。这份 zip 号称飞机检测但采集过程中很难保证框里全是飞机偶尔会出现bird、drone甚至person标签。脚本里CLASS_NAMES只留airplane其他类别一律跳过防止混入的类别把class_id顶乱。第二个是非法框判断。xmax小于等于xmin的框转换后宽高是 0 或负数YOLO 训练时会产生 NaN 梯度简接毁掉整个训练过程。宁可丢弃一个样本也别让一个脏框污染整个 epoch。第三个是归一化后坐标越界。飞机贴着图像边缘时x_center可能算出来是 1.02 这种值。严格说 YOLO 解析器能容忍轻微越界但在计算损失时会带来不必要的波动建议在写入前做一次min(max(val, 0.0), 1.0)截断越界太离谱的直接丢弃。第四个是空标签文件。一张图片里没有任何合法飞机框时脚本不会生成.txt这是一件好事。但如果你把这张图片硬塞进训练集模型会被迫学习“这张图没有飞机”的负样本信息这本身不坏前提是你知道自己在制造负样本。如果不想让这张图参与训练记得同步把它从images/train里移走。转换完成后验证一下标签和图片是不是一一对应ls plane_dataset/images | sed s/\.[^.]*$// | sort img_names.txt ls plane_dataset/labels | sed s/\.[^.]*$// | sort lab_names.txt comm -3 img_names.txt lab_names.txt | head -n 20如果有图片没标签说明该图是负样本或者标注漏了有标签没图片说明 XML 里引用的图像文件缺失。这两种情况都要在训练前处理掉否则训练时会读到空的张量。3. 把数据喂给 YOLO模型选型、data.yaml 与训练参数设定格式转换完成之后数据集就算“能用”了。接下来要解决的是怎么训练这一步决定了最终精度上限。很多刚开始接触无人机目标检测的人上来就默认用yolov8n跑跑完发现漏检一堆这是把通用目标检测的习惯直接搬到了小目标场景。飞机在俯视图里尺寸太小模型选型和参数都要针对这个特点调整。3.1 模型选型为什么无人机小目标场景首选 YOLOv8 的 s 或 mUltralytics 系列的n、s、m、l、x五档模型深度和宽度依次增加。对目标检测任务来说模型越大理论上特征表达越强但代价是显存占用和推理速度。模型定位无人机飞机场景的建议显存参考yolov8n最轻量适合嵌入式不推荐主力容易漏小目标2~3 GByolov8s精度与速度的折中首选6 GB 显存可跑4~6 GByolov8m精度优先追求更高 mAP 时选它8~12 GByolov8l/x超大模型效果最好但训练慢12 GB 以上为什么n在小目标场景里表现不如人意因为模型小意味着特征图通道数少深层特征对细节的保留能力弱。飞机在 640×640 图像里往往只有 30×30 像素经过 5 次下采样后只剩不到 5×5 个像素的信息量这时候骨干网络的表达能力几乎决定了检出与否。s相比n提升明显m相比s提升有限但训练时间明显增加。我一般会先用yolov8s跑一轮完整的训练看val集上的结果再决定要不要上m。不要一上来就x除非你已经让s暴露出了问题否则只是在浪费时间。如果跑完发现mAP50-95在 0.4 上下徘徊说明瓶颈在数据或者标签不在模型大小。3.2 写对 data.yaml路径、类别数、类别名一个都不能错data.yaml是 YOLO 工程的数据入口写错它训练会连第一步都过不去。最常见的错误是把path写成images/train的上一级然后train字段又写了一遍images/train结果路径被拼成images/train/images/train报错信息还不好看。一个可以直接套用的模板# plane.yaml path: /home/user/plane_dataset # 数据集根目录换成你自己的绝对路径 train: images/train # 相对 path 的路径 val: images/val test: images/test # 没有 test 目录就删掉这行 nc: 1 # 类别数量 names: [airplane] # 类别名列表顺序和转换脚本里一致写完data.yaml建议先做一次“半训练”验证路径有效性再跑正式训练python -c from ultralytics import YOLO; m YOLO(yolov8s.pt); m.train(dataplane.yaml, epochs1, imgsz640, batch2)epochs1加batch2一分钟内就能跑完一个最小循环。如果这个命令正常结束说明图片能读到、标签能匹配、类别数量不越界。千万别跳过这步否则正式训练跑了两小时才发现names里类别顺序和标签不一致前功尽弃。还有一个容易被忽略的检查点nc必须和names列表长度一致且names里索引 0 对应的是训练标签里class_id 0的类别。转换脚本里airplane排在CLASS_NAMES第一位那data.yaml里names第一位也必须是airplane顺序不能按字母改否则模型训练的语义完全错乱。3.3 训练命令与五个必调参数imgsz、batch、epochs、patience、nms数据配置无误后正式训练命令长这个样子yolo detect train \ dataplane.yaml \ modelyolov8s.pt \ imgsz640 \ batch16 \ epochs200 \ patience30 \ cos_lrTrue \ cacheram \ device0这里面对无人机飞机检测最关键的是imgsz。COCO 上的通用目标检测imgsz640是默认值够用但飞机目标小imgsz太低会把飞机压成十几个像素框都画不准。imgsz640是底线如果机器显存吃紧优先减batch而不是减imgsz。反过来如果原图是 4K 大图不要直接把整图缩到 640这等于把飞机从 100 像素缩到 20 像素训练效果会很差正确做法是切块训练这部分放在第五章讲。batch是显存敏感项。yolov8s配 16 需要 8 GB 左右显存8 GB 卡建议直接batch8。别为了“显存不够但想跑满”去开ampFalse混合精度在这里能省 30% 显存默认开启就好。epochs和patience是一对组合拳。不要以为epochs300就比epochs200好训练曲线过了某个阶段就进入平台期早停机制的价值就在这里。patience30表示连续 30 个 epoch 验证集指标没有提升就自动停。如果数据集只有几千张图epochs200完全够。这里有个“后悔药”要记住训练中断后不要从头再来Ultralytics 支持断点续训yolo detect train resumeTrue它会自动读取runs/detect/train/weights/last.pt从断点位置继续。这项功能在显存不够导致中途训练崩溃时特别好用前提是你没有动过数据集。此外训练完成后测试阶段不要忘记nms参数这里提前埋个伏笔第四章会专门说它在停机坪密集场景里怎么坑人。训练过程里如果发现日志出现box_loss和cls_loss一起长时间不动先怀疑标签不是格式问题而是标签框根本没有落在完整飞机上——这可能不是模型的问题而是标注质量问题。把置信度最高的预测框直接用yolo detect predict画出来肉眼抽查二十张图能比任何 loss 曲线都更快告诉你数据到底行不行。4. 避坑清单无人机视角飞机检测最容易翻车的五个点无人机视角的飞机检测和地面视角的行人检测遇到的坑完全不是一回事。小目标占比高、同类别目标密集排列、背景高频纹理多这三个客观因素会放大多数训练细节里的问题。以下五条是我在实际跑这种数据集时踩过或见过的坑每条按“现象→原因→解决”写方便你对照排查。4.1 小目标直接“蒸发”漏检率高的首要原因现象训练完跑验证集mAP50看着还行但画出来的检测框全在原图里的大飞机上小飞机一个都没框到。把验收集里目标框面积低于 32×32 像素的样本单独统计召回率可能不到 0.2。原因小目标在特征图里的信息占比太小。YOLOv8 的骨干网络下采样 5 倍一个 20×20 像素的飞机在 640 输入下最终可能只剩 1 个像素点参与分类特征基本消失。这就是业内常说的“小目标在深层特征图里蒸发”。解决优先级从高到低排三招。第一把imgsz从 640 提到 896代价是显存和训练时间第二两个策略组合——先对原图做滑窗或切块处理把小目标“放大”后再训练第三如果切块后还想进一步压榨在data.yaml里按面积分层采样人为让训练时的样本分布偏向小框。4.2 停机坪密集场景一个框压住三架飞机的 NMS 难题现象在停机坪或机场跑道区域飞机并排停放间距很小推理结果一画出来一个高置信框盖住了相邻的两三架飞机或者检测框数量和实际飞机数量差了将近一半。原因NMS非极大值抑制默认阈值在 0.45 左右两个高度重叠的同类别框会被当成“同一个目标”而被抑制。地面场景重叠较少这个阈值没问题停机坪上的飞机几乎贴在一起检测头输出的多个候选框 IoU 太高被 NMS 误杀。解决推理时把 NMS 阈值往下调。在predict命令里加conf0.25 iou0.3iou就是 NMS 的 IoU 阈值。还有一个保守方案如果模型在验证集上对密集区输出大量置信度偏低但位置正确的框可以用 WBF加权框融合后处理替代 NMS能把紧邻目标的召回拉回不少。调低iou的代价是误检可能上升因为抑制变弱后背景上一些位置重复的假阳性框也会留下来。我的习惯是先把iou0.3跑一轮验证看误检数量再决定是否切回 0.45不要盲调。4.3 类别编号串位loss 不降与 mAP 为 0 的常见幕后黑手现象训练 loss 刚开始降得正常到第十几个 epoch 就停在 1.0 附近不再动验证集mAP始终是 0.00。打开预测图模型框出了东西但 label 显示的全是同一个类别或者类别编号和框的位置对不上。原因最常见的是转换脚本里CLASS_NAMES顺序和data.yaml里names顺序不一致。比如转换脚本写的是[plane]data.yaml写的是[airplane, bird]标签里 class_id0 的含义就全乱了。解决训练前先做一次标签统计用一条命令抽查类别分布find plane_dataset/labels -name *.txt | xargs awk {print $1} | sort | uniq -c跑出来的结果class_id的最大值必须严格小于nc编号不能跳档数量分布也值得看一眼。如果 1 号类别样本数只有几十个而 0 号类别有几千个这种极度不均衡会导致模型在训练中学不到少数类别。先确认格式再谈样本均衡。另外有些 zip 的主人发布数据时会把classes.txt和标签一起放进去但标签里的 class_id 已经按字母序排过classes.txt里却是按采集顺序排的两者对不上。这种“标签版本不一致”的坑比格式问题更难排查唯一的办法就是抽查标注边界框在原图上的位置是否正确。4.4 训练集与验证集同源mAP 虚高的统计学陷阱现象训练结束val集 mAP50-95 高达 0.85很有成就感。换成一段航拍视频实测漏检多到没法看和验证集结果完全对不上。原因数据采集者通常把一段完整的无人机视频按帧拆成图片然后随机切分到train和val。问题是相邻帧之间场景高度重叠第 25 帧和第 26 帧里的飞机几乎在同一位置模型等于把训练时见过的“答案”背下来了。验证集反映的不是泛化能力而是记忆能力。解决严格按“采集轮次”划分数据。一个架次、一个起降循环产生的一组图片必须整体进入train或val不能打散。如果 zip 里没有给出视频或架次信息用图像采集时间戳或者拍摄位置近似推断。跑完训练后用 OD 性能曲线结合未参与训练的一段视频来评估别只看 val 指标。这种“同源数据导致的虚高 mAP”在无人机场景特别常见因为无人机拍摄天然是“一段一段”的人和车的数据还可以随机分飞机的数据一定要按场景分。4.5 负样本缺失模型把屋顶、跑道线当飞机现象训练完成后在背景复杂的大图上推理误报严重停机坪旁边的屋顶、跑道上的标志线、甚至树冠阴影都被框成飞机。原因无人机视角下飞机从上方看是一个带机翼的矩形而许多建筑屋顶、标线本身就有类似几何特征。如果训练集里全是“有飞机的正样本图”模型学到的其实是“长相似飞机的纹理块”泛化必然差。解决准备一组完全不含飞机的负样本图添加到训练集和验证集里。负样本加入images/train但labels/train里没有对应.txt文件——这正是 2.3 节里说过的空标签场景的正常用法。验证集也必须放负样本否则precision会被正样本的“单类别分布”拉高看起来很高换到真实环境就直接崩。负样本不要找太多占比 10%~20% 就够太多了会把模型带偏让它认为背景里什么都没有。如果 zip 里没有负样本图用飞机不出现的机场周边航拍图也行但尽量保持拍摄高度和角度一致避免引入无关的视觉分布。5. 验证模型到底看没看见飞机特征图可视化与切图推理训练结束不是终点要回答“模型是不是真的学到了飞机特征”得跳出 mAP 数字单独看。特征图可视化能告诉你模型在哪一层、什么位置产生了响应切图推理能告诉你小目标漏检到底是被“缩小”杀死的还是真的没学会。这两件事做完才算把一轮训练彻底闭环。5.1 用特征图和热力图观察模型在哪一层响起了飞机验证 mAP 是统计学层面的判断特征图则是“黑匣子”层面的判断。很多无人机检测模型训练到一半loss 在降mAP 也在升但没人知道模型看到的是什么。把中间层的输出铺开能直接看出模型对飞机所在区域的响应是否集中。这里用一个基于 PyTorch hook 的脚本在模型中间层抓取特征然后压缩成一张热力图import cv2 import numpy as np import torch from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt).model model.eval() feats {} def make_hook(name): def hook(_m, _i, out): feats[name] out.detach() if torch.is_tensor(out) else out[0].detach() return hook # 4 表示 backbone 中段的某个卷积层可按需更换索引 model.model[4].register_forward_hook(make_hook(backbone_mid)) img cv2.imread(val_002.jpg) img cv2.resize(img, (640, 640)) x torch.from_numpy(img[..., ::-1].transpose(2, 0, 1).copy()) / 255.0 x x.unsqueeze(0) with torch.no_grad(): _ model(x) fmap feats[backbone_mid][0].mean(dim0).cpu().numpy() fmap cv2.normalize(fmap, None, 0, 255, cv2.NORM_MINMAX).astype(np.uint8) cv2.imwrite(heatmap_stage4.jpg, fmap) print(f特征图尺寸: {fmap.shape})这段代码的思路是在模型处理一张图的过程中把指定层的输出“截获”下来然后对通道维度取平均值把高维特征压缩成一张单通道图。亮点密集的位置就是模型认为“这里更像飞机”的区域。对比原图看热力图时重点关注两点。第一亮点是否集中在飞机轮廓内如果热力图在飞机区域强烈响应说明模型已经建立了有效的视觉模式如果亮点散布在全图边角说明特征没有对齐目标大概率是训练数据标签噪声太大。第二不同的层响应差异很大浅层特征对边缘和纹理敏感深层特征对语义敏感看深层时强响应区域基本等于模型决策位置。这个验证方法的价值在于它能直观区分“模型因为偶然的纹理相似度而检测到飞机”和“模型真的学到了飞机几何结构”这两种完全不同的情形。小飞机在深层特征图上如果也能稳定出现亮点再回去调 NMS、调置信度才有意义。5.2 用 SAHI 把大图切成小块把小目标漏检率压下来的实操特征图只能看“模型在学什么”切图推理则是直接改变输入尺寸来提升小目标召回率。无人机一张原图往往有 2000 像素宽整图缩放到 640 后飞机太小。把大图切成 256×256 的小块分别推理飞机在每一块里的相对尺寸变大了好几倍检测难度随之下降。这就是 SAHISlicing Aided Hyper Inference的核心理念遥感目标检测里已经在大量使用这种方法。from sahi import AutoDetectionModel from sahi.predict import get_sliced_prediction model AutoDetectionModel.from_pretrained( model_typeultralytics, model_pathruns/detect/train/weights/best.pt, confidence_threshold0.25, image_size640, ) result get_sliced_prediction( val_002.jpg, model, slice_height256, slice_width256, overlap_height_ratio0.2, overlap_width_ratio0.2, ) result.export_visuals(export_dir./sahi_out)参数里的核心是slice_height、slice_width和两个overlap_ratio。切片越小飞机相对越大但切片数量膨胀会导致推理变慢重叠区设置的意义是避免飞机恰好被切在边缘导致一个机身被拆成两半最后谁都检测不出来。0.2 的重叠率是绝大部分场景的合理起点不需要再激进。confidence_threshold我建议用 0.25。切图推理后每张切片里“有效目标”的密度下降置信度普遍比整图推理偏低一点阈值卡在 0.3 以上容易把真飞机过滤掉。对比方法很简单用同一份验证集分别跑整图推理和 SAHI 切图推理统计mAP和漏检数。如果切图后漏检明显下降说明瓶颈在输入尺寸如果提升不大说明问题更多停留在模型容量和标签质量上下一步应该调整训练策略而不是推理策略。6. 进阶把 mAP 再抬一点的三个落地技巧当一轮常规训练完成、验证流程也跑通了之后想在现有数据集上把指标再往上抬有三个从业者常用的方向按性价比排序讲。第一个是旋转框检测。无人机俯视下的飞机方向任意水平框会把大量机翼间的背景算进框内导致 IoU 计算失真NMS 也更容易误杀相邻目标。如果 zip 里外的标签只是水平框想走这条路线得先对部分数据重新标旋转框。可选工具是 mmrotate 这类旋转框检测框架它对遥感目标的支持比较成熟但需要额外的标注工作量适合在已有模型精度逼近上限后再投入。第二个是后处理融合。同一张推理图用不同的slice重叠率或者不同尺度的imgsz跑两次再把两份检测框做加权融合效果通常强于单次推理。这类融合方法在验证集上把 mAP50 拉高 1~3 个点属于常态。我习惯只在线下验证时使用融合线上部署若算力不允许就退回到单一推理。第三个是迭代式标注修正。跑完一轮训练后用best.pt对没有参与训练的视频帧做预测先自动标注一批置信度高于 0.7 的检测框再人工做抽查修正——不是全量检而是只看模型认为“非常确定”的那些。这样可以把数据集规模快速扩起来再训一轮。如果标注资源连抽查都不够开放词汇目标检测可以拿来兜底新出现的飞机形态但现阶段不推荐做主力成本太高。我自己的习惯是每一轮训练结束都在没有参与训练的视频上先跑一段用肉眼扫一遍框的真实落位然后再看 mAP 曲线。曲线会说谎检测框不会。你按这套流程把数据集从拆包、转换、训练一路做到验证踩过的坑会变成下个项目最值钱的资产。希望帮到你。本文还有配套的精品资源点击获取
返回列表