资讯动态

空中无人机检测数据集解析与YOLO训练避坑指南

发布时间:2026/10/13 9:01:04 来源:尧图企业网站定制
简介面向无人机视觉检测与目标识别研究、开发人员的旋翼无人机UAV图片数据集可直接用于训练与验证多种空中无人机检测算法。数据集包含7000多张已标注的无人机图片标签格式提供txt与xml两种适配YOLO系列及VOC格式等多种主流检测工具的标注要求。压缩包整体约876.78MB共22675个文件其中jpg图片约7558张并配套对应数量的txt标注文件与xml标注文件便于按需选择标注格式快速接入训练流程。资源统一按drone类别标注适合在目标检测课程设计、算法实验或模型调优中作为专用数据集使用。目前已有1113人学习下载可供需要无人机检测数据的开发者直接获取使用。1. 空中无人机的检测数据集7000多张UAV图片先把格式坑说在前面做空中无人机检测最头疼的往往是数据。这份旋翼无人机UAV数据集包含7000多张标注好的UAV图片类别只有drone标签同时给出txt和xml两种基本覆盖了YOLO和VOC两类主流标注格式。表面上看拿来就能训但实际复现时你会遇到txt和xml是否逐一对得上、标注框有没有越界、图片尺寸差异大不大、正负样本比例如何。这些问题不解决训练时loss降得再漂亮测出来还是一堆漏检。这里就按我拆这份数据的流程走一遍适合正在做空中无人机检测、需要一份可复现基础数据的从业者。2. 数据集结构解析txt与xml双格式到底该怎么用拿到数据集第一步别急着开训先把它当成一个待验证的数据包来拆。很多翻车现场都是因为标签文件格式和训练脚本预期不一致而不是模型本身不行。这份数据同时提供txt和xml看起来是贴心但两种格式共存本身就是一个需要先处理的风险点它们可能来自不同的标注轮次也可能在导出时丢了部分目标。2.1 先看文件构成一堆jpg背后藏着什么解压后你会看到大量.jpg文件文件名类似drone_2_595.jpg这是原始图片。同名的.txt和.xml是标注文件。第一步用脚本做数量统计find . -name *.jpg | wc -l find . -name *.txt | wc -l find . -name *.xml | wc -l第一行统计JPG图片数第二行统计TXT标签数第三行统计XML标签数。正常预期是三者数量一致至少jpg和txt一致、xml也一致。如果txt比jpg少说明有图片没有对应标签如果xml比jpg多说明存在冗余文件。我一般会把统计结果重定向到文件里仔细核对名单。然后抽取一个文件名看看三种文件是否真的能对应上ls drone_2_595.*这条命令列出同一基名下的所有扩展名文件。如果只看到.jpg而没有.txt或.xml就要警惕该图可能没有标注。对于训练集来说少量漏标还能靠清洗补救但漏标太多的话模型会把漏标的无人机当成背景造成严重的漏检。另一个值得做的是图片尺寸统计。空中无人机在画面里经常很小图片可能是1920x1080的航拍图也可能是640x480的监控截图尺寸分布不均会影响后续resize策略。可以用Python批量读取import cv2 import glob from collections import Counter sizes Counter() for p in glob.glob(*.jpg): img cv2.imread(p) if img is None: print(f无法读取: {p}) continue h, w img.shape[:2] sizes[(w, h)] 1 print(sizes)这里用OpenCV逐张读取图片尺寸统计不同宽高组合的出现次数。如果发现尺寸种类很多后面训练时就要注意resize带来的坐标换算误差尤其是标注框在小图上可能因为插值产生偏移。有些文件看起来是正常图片但用cv2.imread读出来是None这种文件要么损坏要么是伪装成jpg的异常文件需要直接删掉或转码否则训练时会在数据加载阶段莫名其妙崩掉。2.2 txt标签与xml标签的字段差异txt和xml都是标注文件但格式差异决定了它们喂给不同模型时的预处理方式不同。常见的txt是YOLO格式每行一个目标五个字段class_id x_center y_center width height四个坐标值都是相对图片宽高的归一化比例取值范围0到1。例如0 0.5213 0.4382 0.0417 0.0386表示类别是0即drone中心点在图片横向52.13%、纵向43.82%的位置框宽占4.17%高占3.86%。这个框如果出现在1920x1080图上像素宽就是1920*0.0417约80像素高约41像素属于典型小目标。xml则是VOC风格字段长这样annotation size width1920/width height1080/height /size object namedrone/name bndbox xmin960/xmin ymin460/ymin xmax1040/xmax ymax502/ymax /bndbox /object /annotationxml记录的是绝对像素坐标xmin/ymin/xmax/ymax同时需要和 里的宽高配合使用。两种格式本质描述同一个框但转换时很容易出错。常见的坑是坐标顺序YOLO是x_center, y_center, w, h而VOC是xmin, ymin, xmax, ymax写转换脚本时搞错一个字段整个框就飞了。我一般会写一个解析脚本同时读txt和xml把两者转成统一的绝对像素坐标并对比import glob def read_yolo(txt_path, img_w, img_h): boxes [] with open(txt_path) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cls, cx, cy, bw, bh parts cx, cy, bw, bh float(cx), float(cy), float(bw), float(bh) x1 (cx - bw / 2) * img_w y1 (cy - bh / 2) * img_h x2 (cx bw / 2) * img_w y2 (cy bh / 2) * img_h boxes.append((int(cls), x1, y1, x2, y2)) return boxes def read_xml(xml_path): import xml.etree.ElementTree as ET root ET.parse(xml_path).getroot() boxes [] for obj in root.findall(object): name obj.find(name).text bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) boxes.append((name, x1, y1, x2, y2)) return boxesread_yolo把归一化坐标还原成像素坐标read_xml直接读取VOC的绝对坐标。对比两个函数输出时重点看同一张图的框数量是否一致、坐标是否在容差范围内。如果txt的框比xml少很可能是标注工具导出时丢目标如果坐标对不上就要检查生成txt时用的是不是归一化比例。注意归一化坐标要求除以的是原图宽高而不是resize之后的宽高。有人从xml转txt时手滑写成了除以640结果同一张图在不同输入尺寸下框全错位。这种错误在训练时待一会儿能靠loss变异常发现但浪费的时间不值得。更隐蔽的是YOLO的框用wh表示宽高VOC的bndbox给的是两个角点坐标转的时候必须算abs(xmax-xmin)不然负的宽度会直接让训练崩溃。2.3 训练前必须做的一次数据体检格式对齐不等于数据健康。我建议训练前写一个体检脚本检查四件事图片是否都能打开、标注框是否越界、框面积是否过小、类别标签是否只有drone。import cv2, glob, os issues [] for p in glob.glob(*.jpg): txt p.replace(.jpg, .txt) if not os.path.exists(txt): issues.append((p, missing_txt)) continue img cv2.imread(p) if img is None: issues.append((p, broken_image)) continue h, w img.shape[:2] for line in open(txt): parts line.strip().split() if len(parts) ! 5: issues.append((p, bad_line)) continue cls, cx, cy, bw, bh parts cx, cy, bw, bh float(cx), float(cy), float(bw), float(bh) x1 (cx - bw/2) * w y1 (cy - bh/2) * h x2 (cx bw/2) * w y2 (cy bh/2) * h if x1 0 or y1 0 or x2 w or y2 h: issues.append((p, bbox_out_of_range)) if bw * w 10 or bh * h 10: issues.append((p, tiny_box)) print(问题总数:, len(issues)) for item in issues[:50]: print(item)这段脚本遍历所有jpg缺txt的、图片损坏的、格式错误的、框越界的、框太小的都会被记下来。越界框通常是因为标注时拉框超出了图像边界或者xml转txt时整数除法的精度问题。太小的框比如只有3x3像素对检测来说基本是噪声训练时反而会误导模型。把这些问题样本直接过滤掉而不是等训练时让loss自己消化这是血泪经验。关于类别可以统计一下txt里第一列出现的值awk {print $1} *.txt | sort | uniq -c如果只出现0说明类别id统一如果出现1、2说明数据集里可能混了其他类别或者标签工具从1开始编号。YOLO类别id默认从0开始如果你的标签里写的是1但data.yaml里设置nc1那这个1会被解释成超出类别范围训练直接报错。这种问题不用花时间调代码直接批量把1改成0。3. 把数据喂给YOLO系列目录组织与训练配置格式统一、数据健康之后接下来的事就是把数据按你选中的检测框架喂进去。无人机检测目前最常用的还是YOLO系速度快文档多遇到问题好查。这一章讲目录组织、配置文件和增强参数这些都是训练前必须走完的路。3.1 按YOLO习惯重排数据目录YOLO系框架一般期望这样的目录结构datasets/ drone/ images/ train/ val/ labels/ train/ val/images和labels一一对应且训练集和验证集分开。拿到这份数据集时所有jpg和标签通常堆在一个文件夹里需要自己做划分。常见做法是随机抽80%做训练集20%做验证集。注意划分时要保证同一个场景的连续帧不要被切开否则验证集会因为和训练集高度相似而虚高。我用一个Python脚本按文件名哈希划分import os, shutil, random, glob random.seed(42) image_files glob.glob(*.jpg) random.shuffle(image_files) split int(len(image_files) * 0.8) train_files image_files[:split] val_files image_files[split:] for subset, files in [(train, train_files), (val, val_files)]: os.makedirs(fimages/{subset}, exist_okTrue) os.makedirs(flabels/{subset}, exist_okTrue) for img_path in files: base os.path.splitext(os.path.basename(img_path))[0] shutil.copy(img_path, fimages/{subset}/{base}.jpg) txt f{base}.txt if os.path.exists(txt): shutil.copy(txt, flabels/{subset}/{base}.txt)这里random.seed(42)固定随机种子保证每次划分结果一致方便复现。copy而不是move避免原数据被破坏。如果原始是xml标签需要先统一转成txt再做划分或者把xml单独放一个目录训练时按xml路径去读。划分完再检查一遍一一对应for d in images/train labels/train; do echo $d: $(ls $d | wc -l); done for d in images/val labels/val; do echo $d: $(ls $d | wc -l); done数量不一致就说明有图片没标签或有标签没图片。用这个命令分别检查train和val两边确保数字对得上。注意有些图片文件名是drone_2_595.jpg对应的txt可能叫drone_2_595.txt如果你在重命名图片时改过文件名一定要同步改标签名很多工具只按基名匹配文件不匹配就相当于没有标签。3.2 配置文件与超参数选择YOLO系框架通常需要一个data.yaml内容和路径相关path: /your/absolute/path/datasets/drone train: images/train val: images/val nc: 1 names: [drone]path最好写绝对路径因为框架会在不同工作目录下对相对路径经常找不到数据。nc是类别数量这里是1。names里的顺序要和txt中class id对应。如果txt里class id是0names第一个位置就是drone。如果names写成[Drone]且数据集标签里是drone字符串匹配不上大部分框架会直接忽略这个类别导致训练样本为零。所以名称的大小写也要先确认。超参数方面对无人机这种目标最值得调的是imgsz和batch。常见默认imgsz640但如果图片里无人机像素小640的缩放会把很多目标缩到不足10像素几乎无法检测。我一般会先用imgsz1280跑一轮观察小目标recall有没有明显提升。代价是显存占用变成原来的4倍batch要相应减小。batch大小按显存来定8到16都是常见区间。显存紧张时不要硬上大batch用梯度累积也能等效。epochs我习惯先跑50轮看loss曲线确认拟合方向没问题再增加。如果50轮后val mAP还在上升说明数据量足够可以继续跑。注意数据集本身只有7000多张单类单目标属于中小规模数据。epochs设置太大容易过拟合尤其训练集和验证集分布接近时val指标会非常漂亮但实战表现一般。先跑50轮观察收敛情况再决定。训练命令以某个YOLO系实现为例python train.py --data drone.yaml --weights yolov5s.pt --img 1280 --batch 8 --epochs 50--data指向data.yaml--weights指向预训练权重--img设置输入尺寸--batch和--epochs按显存和时间定。训练开始时看终端日志重点关注是否加载到了图片和标签数量如果日志里显示train: 5600 images, val: 1400 images就说明数据路径正确如果显示0 images多半是images和labels的目录名没对应上或者yaml里路径写错。3.3 训练时的数据增强要不要开数据增强是双刃剑。YOLO默认开启mosaic、hsv、flip等增强对普通目标检测很有效但空中无人机场景有些特殊。先说mosaic。mosaic把4张图拼成一张对于通常占画面比例很小的无人机拼接后目标更小而且4张图的边框约束会引入大量不完整的对象。如果你发现训练过程中小目标recall一直上不去可以关掉mosaic或降低概率。常见做法是在最后20轮关闭mosaic让模型在接近真实分布的数据上微调。再说hsv。无人机在天空背景下的颜色相对单纯过度改变色相会把无人机和天空的对比破坏掉。我一般把hsv_h、hsv_s、hsv_v的强度降到默认值的0.2倍左右只做轻微扰动避免模型学到错误颜色关联。flip方面水平翻转对无人机检测基本无害但垂直翻转要慎重。因为无人机在空中姿态和相机视角有关垂直翻转会让无人机出现倒着飞的样本和真实场景分布不一致。如果只看mAP可能没感觉但部署测试时会出现大量误检。这些参数在YOLO的配置文件里都有对应项。以某个常见配置为例mosaic: 0.5 hsv_h: 0.005 hsv_s: 0.3 hsv_v: 0.3 fliplr: 0.5 flipud: 0.0mosaic概率降到0.5hsv强度降小上下翻转直接关闭。具体数值不是死的你去跑几次对比就能感受到这是我拆数据训练后的真实调整方向。另外如果原始图片里存在相机自动曝光导致的亮度突变可以把曝光扰动打开让模型对亮度变化更鲁棒。但注意不要改成对Gamma做极端变化否则天空和无人机的边缘会被破坏。4. 空中无人机检测避坑指南小目标、反光、误检三条线训练无人机检测和训练通用物体检测不太一样很多在COCO上不明显的问题在无人机上会放大。我整理了几条高频踩坑记录按现象、原因、解决三步写。这些坑大多不是代码层面的bug而是数据和场景导致的系统性问题排查起来更隐蔽。4.1 现象模型把鸟、风筝、塑料袋识别成无人机训练完跑测试发现false positive特别多鸟、风筝、甚至云朵边缘都被框成drone。原因有两层一是数据集的负样本太缺。这份数据集全是包含无人机的正样本没有专门收集不含无人机但长得像无人机的图片。模型没见过鸟自然不知道鸟不是无人机。二是训练时默认的置信度阈值偏低很多低置信度的误检也会被输出。解决思路是补负样本或者在训练时把背景图混入数据。常见做法是把没有目标的空图片也放进images目录labels文件为空。模型训练时会学习到这些区域不输出框的约束。另一种更直接的方法是收集一批鸟、风筝的公开图片标注成背景类别或者单独用它们做难负例挖掘。如果你不想额外找数据可以在训练中开启mosaic增强让背景区域自然出现在拼接图中对误检有一定缓解但不能根治。更重要的是测试时调高置信度阈值比如从0.25提到0.5误检数量会明显下降但小心同时召回也会下降。4.2 现象大图上的小无人机直接漏检测试时有一张1920x1080的航拍图无人机大概几十像素模型完全没检测到。原因首先是输入分辨率不够。典型的检测网络下采样32倍640x640输入对应特征图20x20一个50像素的无人机在特征图上不到2个像素特征被卷积直接抹掉。其次是训练样本里小尺寸框太少模型对大目标有偏置。再次标注框本身如果就有几个像素的偏移缩小后误差会被放大成完全不对齐的anchor。解决方法是分两步第一步把imgsz提到1280让50像素目标至少保留15个像素第二步是开启多尺度训练YOLO系框架可以在配置里设置尺度范围比如0.5到1.5随机resize。同时检查数据里小框占比如果多数框面积占比小于0.01应该考虑用SAHI这类切图推理工具把大图切成若干重叠小图分别检测再合并。虽然会增加推理时间但对小目标检测的提升非常明显。切图时切块大小建议设为训练分辨率的一半重叠率设20%到30%太少会让目标被切断太多会重复计算。如果用了切图还是完全没检测到就要先怀疑标注框本身是否准确拿一张图把真值框画出来看有些框的中心坐标在螺旋桨中心而视觉上更明显的是机身模型学到的特征会摇摆不定。4.3 现象txt与xml数量对不上用脚本统计发现txt比xml少了十几张或者反过来。原因是数据集制作时可能先标了xml然后单独转出txt转换过程中漏掉部分文件或者某些文件在拷贝时丢失。这是标注数据集的常见卫生问题。也可能是同一个文件名txt是空的但xml有内容说明转换脚本遇到没有目标的图片时生成了空txt而空txt在某些框架里会被当作损坏标签跳过。解决方法是写一个对齐脚本以图片文件为基准找出缺失对应的txt和xml。如果目标是YOLO训练就只保留txt和jpg如果要做Faster R-CNN就改用xml。不要同时依赖两种格式选一种标注作为truth另一种只用于交叉验证。我曾经图省事直接让训练脚本在txt不存在时退回去读xml结果两种格式混着用坐标基准不一致训练出的模型框偏移严重。从那以后我都先统一格式再训练。对齐时还要注意txt的行分隔符Windows下用\r\nLinux下是\n某些框架按\n分割时会把\r当成字符导致坐标解析失败报错信息又很隐晦。用sed批量替换掉\r再训练就行。4.4 现象训练集和验证集出现同源图片验证mAP高达0.95但放到新场景测试直接掉到0.6。原因很可能是划分数据集时没有按场景或时间序列分组而是全量随机打散。无人机视频帧中相邻几帧背景几乎相同如果这几帧被分到train和val两边验证集就成了已经看过答案的考试。数据集文件名叫drone_2_595、drone_2_942说明很多图来自同一视频序列数字跳跃越大越要小心。解决方法是按文件名前缀或序号间隔划分。比如同一前缀家族为同一场景把整个家族的图片分到同一集合里。最稳妥的方式是按时间连续段切分取前80%时间段的图像做训练后20%做验证保证测试帧在时间上不重叠。如果无法知道时间就按文件名哈希的前几位分组至少比全随机好一点。具体做法是在随机shuffle前先对文件名做groupby比如用文件名中第二个下划线之前的字符串作为场景id然后把整个场景id放到训练集或验证集。这样划分后验证集的mAP会比随机划分低几个点这才是真实水平的反映。4.5 现象白天图多、黄昏图少导致的类别偏移统计发现大部分图片是白天晴空夜间和黄昏的低光照图片很少。模型在白天上表现好一到逆光、黄昏场景就漏检。原因是数据集本身存在光照场景不平衡模型学到的颜色特征偏向白天无人机的深色轮廓。无人机在天空中的对比度在黄昏时大幅下降边缘不明显模型依赖的纹理特征失效。解决方法是做光照增强或亮度扰动。YOLO的hsv增强能把白天图的亮度、饱和度做一定扰动模拟黄昏效果。更彻底的是用Gamma校正或CLAHE对图像做预处理统一亮度分布。如果数据里有少量夜间图可以复制后做数据增强来扩充。但如果光照差异太大靠增强硬凑效果有限最好补充对应光照的真实数据。无人机检测本来就比普通物体更依赖轮廓没有足够光照多样性部署时早晚翻车。另外如果预期场景有逆光训练时可以用随机亮度扰动把部分图的整体亮度拉低同时把对比度拉高让模型不要太依赖全局亮度。5. 用迁移学习调优让无人机检测更快收敛数据准备好坑也排掉一轮之后下一步是让模型真正学起来。无人机检测任务用迁移学习是常规操作原因很直接通用目标检测数据集里的边缘、纹理、颜色特征足够丰富backbone训出来的低层特征直接可用你真正要教给模型的是无人机长什么样这种高层语义。一份7000多张的数据集从零开始训练检测头和回归头效率低而且容易欠拟合。5.1 预训练权重怎么选选预训练权重主要看模型体量和数据规模。显存充足可以用中等体量的模型比如m或l版本显存有限就用n或s版本。预训练权重提供的backbone特征提取能力对天空背景、螺旋桨和机身的边缘响应已经很好需要学习的主要是无人机类别专属的高层语义。我用这份数据集实测加载预训练权重后前10轮loss就能明显下降而从零开始训练到同样水平大概要多花两倍时间。加载方式因框架而异常见写法是指定weights参数python train.py --data drone.yaml --weights yolov5s.pt --img 1280 --batch 8 --epochs 50yolov5s.pt是预训练权重文件框架会自动加载并匹配backbone权重。如果使用自定义的预训练模型要注意类别数是否一致一般框架会忽略不匹配的输出层。看到权重加载日志中fc层或检测头不匹配是正常的不必担心只要梯度能顺利传回backbone就行。注意如果预训练权重是从某个不正规来源下载的可能包含修改过的网络结构加载时会报结构不匹配。最安全的是用框架官方提供的标准预训练文件至少保证网络定义一致避免把时间和精力浪费在排查结构问题上。5.2 冻结训练与解冻策略迁移学习另一个常用策略是冻结backbone先只训练检测头。无人机检测中图片的纹理、颜色和通用数据集差距不大backbone的低层特征基本可复用冻结能大大降低显存占用和训练时间。常见做法是冻结整个backbone训练10到20轮后解冻全模型用更低的学习率微调。在PyTorch手动实现的话大概是这样# 冻结backbone参数 for name, param in model.backbone.named_parameters(): param.requires_grad False # 第一段训练只更新head trainer.fit(model, train_loader, val_loader) # 解冻 for name, param in model.backbone.named_parameters(): param.requires_grad True # 第二段训练全局微调学习率降低 trainer.fit(model, train_loader, val_loader)先冻结训练让检测头快速适应drone类别再解冻用低学习率微调全部参数。这样做的好处是避免backbone在初期被少量无人机样本带偏。实际训练时第一段学习率可以用1e-4解冻后降到1e-5。如果只用一个学习率从头训到尾backbone的大梯度很容易破坏预训练特征导致收敛慢且最终精度低。训练哪个阶段需要验证看loss曲线。如果冻结阶段val loss下降缓慢但train loss下降正常说明检测头已经过拟合了几个epoch的数据需要提高backbone的适配能力提前解冻。如果解冻后val loss反而升高说明学习率太大把特征带偏了把全局学习率再降一个数量级。这两个判断都是经验性的不用卡死跑两次就能找到感觉。5.3 提高recall的小技巧anchor与分辨率无人机检测的痛点是小目标漏检这一点可以从anchor和输入分辨率两方面入手。YOLO系默认anchor是基于通用数据集统计的先验框比如十几像素的anchor很少因为通用数据集里小物体占比不高。直接套用会导致小无人机的匹配率低很多真值框没有anchor负责预测模型训练时就认为这些目标不存在。解决方法是自动计算anchor。在YOLO里有命令行参数或配置项比如python train.py --data drone.yaml --weights yolov5s.pt --img 1280 --autoanchor --epochs 50autoanchor会根据你的标注框尺寸重新聚类生成适合drone数据集的先验框。训练日志里会显示聚类后的anchor尺寸如果发现最小anchor仍然大于数据中最小的框可以把输入分辨率再提高或者手动在配置里增加更小的anchor尺寸。另一个技巧是调整anchor匹配阈值。默认阈值可能设得较高导致小框无法匹配到任何anchor。降低阈值可以增加匹配数量但也会让正样本变模糊。我一般先把autoanchor跑出来再去看训练集里每个真值框匹配到了几个anchor如果大量真值框是0匹配再决定改阈值。这个检查可以用框架自带的诊断工具也可以自己写一个前向传播统计样本分配前者方便后者能看得更细。分辨率对recall的影响同样直接。同样的训练次数imgsz640下小目标recall可能只有60%imgsz1280能到80%。但1280的显存开销是4倍训练时间也接近4倍。如果你的任务强调recall那这个代价值得如果更看推理速度可以训练时用1280推理时用640或动态尺寸效果通常比直接用640训练更好。这也是很多落地项目的常规操作既拿到小目标精度又保住跑的实时性。6. 验证检测效果而不是只看lossmAP、PR曲线与可视化训练结束先别急着高兴loss降下来只代表拟合过程顺利不代表检测能力达标。无人机检测的衡量要看验证集上的precision、recall、mAP以及更直观的预测图。这一章讲我用得最顺的验证三步每一步都能帮你定位下一步调参方向。6.1 用Val模式跑一次完整评估训练结束后用验证集跑一次评估python val.py --data drone.yaml --weights best.pt --img 1280val.py会加载验证集并输出整体指标。对单类数据集AP就是该类别的AP。重点看recall因为无人机检测漏检比误检更致命。mAP0.5:0.95更严格如果这个值低说明框的定位精度不够模型可能只框到机身的一部分或者把螺旋桨和机身分别框了出来。6.2 可视化预测结果来定位系统性错误指标只是数字真正有用的是把预测框画到图上。可以写个脚本保存一批预测结果results model(img) for box in results.boxes: x1, y1, x2, y2 box.xyxy[0].tolist() conf box.conf.item() cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0,255,0), 2) cv2.putText(img, fdrone {conf:.2f}, (int(x1), int(y1)-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 1)把预测图画到图上翻一遍你会发现漏检的通常是小目标误检的通常出现在有重复纹理的建筑物或树影。这时候再回头调anchor、输入分辨率和负样本比盲目改模型结构有用得多。6.3 一个自查习惯随机抽100张图人工过一遍无论指标多漂亮我都会从验证集随机抽100张图把预测结果画出来人工看一遍。这一步能发现很多指标看不出的问题比如框偏移、重复框、置信度误报。从那以后每次训练完我都强制走一遍可视化抽查把典型错误列成清单再决定下一步。无人机检测这行数据比模型更值得花时间。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑