ARTICLE DETAIL

资讯详情

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

航拍屋顶检测数据集:VOC+YOLO格式458张三类别目标检测实战解析

航拍屋顶检测数据集:VOC+YOLO格式458张三类别目标检测实战解析 简介面向航拍图像目标检测任务的屋顶检测数据集适合无人机遥感、城市建筑规划等场景帮助研究人员与开发者免去从零标注的烦琐工作。压缩包共1376个文件体积约132.59MB核心为458张jpg航拍图片以及一一对应的458个PASCAL VOC格式xml标注文件和458个YOLO格式txt标注文件另含少量说明类txt可直接接入主流检测框架训练。数据集标注类别共3类roof、roof_asb、roof_asb_notsure覆盖普通屋顶、石棉瓦屋顶及不确定类别总标注框数2889个全部通过labelImg按矩形框规则绘制标注信息准确合理。当前已有428人学习下载适合需要高质量航拍屋顶样本进行模型训练、算法验证或数据增强的深度学习使用者。1. 航拍屋顶检测为什么我劝你先别急着标数据拿到一批航拍影像第一件事往往不是跑模型而是先问自己我要检测的目标到底是“屋顶”还是“屋顶上的东西”。航拍屋顶检测数据集VOCYOLO格式458张3类别这个标题已经把答案框得很死——3个类别、458张图、VOC和YOLO双格式、7z压缩。它摆明了是给目标检测训练用的不是给语义分割或者实例分割用的所以你在标注的时候脑子里就得一直绷着“框”这根弦。先泼一盆冷水458张图对深度学习目标检测来说真不算多。COCO那种级别的数据集是十几万张哪怕是一个垂直场景的私有数据集上千张也只是起步。但这不是劝退理由反而是这篇文章最值得聊的地方——小数据集怎么做、怎么做才能不翻车才是真实项目里最常遇到的场面。VOC格式负责标注和校验YOLO格式负责喂给训练脚本7z压缩负责把文件体积压下来方便分发三者合在一起就是一个可以直接开工的“最小可燃包”。这套东西适合谁一句话手里有航拍数据但不想从零写标注转换脚本的人或者刚把YOLO环境配好、缺一份能立刻跑通训练闭环的数据集的人。如果你是做电力巡检、光伏板监测、城市违章建筑识别这类方向的这份数据集的类别定义大概率跟你的业务有重叠。但如果你是做遥感语义分割的看到“VOCYOLO”就要果断绕道因为这份东西天生不是为像素级任务准备的。下面我从格式拆解讲起一直聊到避坑和进阶用法全程以这份458张三类别数据集为线索但所有命令和参数都能套到你自己的数据上。2. 先拆格式VOC和YOLO各自管什么为什么这份数据集要双格式2.1 VOC格式JSON和XML之外的“老牌工业标准”到底长什么样VOC格式来自PASCAL VOC竞赛虽然这几年赛事已经停了但它的标注文件格式仍然被LabelImg、LabelStudio、Roboflow这些工具默认支持。这个格式最大的特点是“目录结构即元数据”也就是说你打开文件夹不用读任何说明文档光看目录层级就能猜到内容组织逻辑。一份标准的VOC数据集顶层目录通常长这样VOCdevkit/ └── VOC2007/ ├── Annotation/ │ ├── roof_001.xml │ └── roof_002.xml ├── JPEGImages/ │ ├── roof_001.jpg │ └── roof_002.jpg ├── ImageSets/ │ └── Main/ │ ├── train.txt │ ├── val.txt │ └── trainval.txt └── labels/ # 有些版本会带有些不会Annotation目录放XMLJPEGImages放原图ImageSets/Main放划分好的训练验证名单。这三个目录是VOC格式的骨架缺一个很多脚本就会直接报错。XML文件内部才是重点一份典型的屋顶标注XML长这样annotation folderVOC2007/folder filenameroof_001.jpg/filename size width1920/width height1080/height depth3/depth /size object nameroof/name poseUnspecified/pose truncated0/truncated difficult0/difficult bndbox xmin156/xmin ymin213/ymin xmax873/xmax ymax642/ymax /bndbox /object /annotation这里有几个细节值得较真。bndbox里的四个值是像素坐标不是归一化坐标很多新手在这里就栽了跟头——拿VOC的XML去喂YOLO不经过坐标转换就直接训练损失函数从一开始就是乱的。另外difficult标记很关键航拍影像里经常有“半截屋顶”——一半在画面里、另一半被图幅裁掉这种对象如果不标difficult1模型训练时就会反复学习“半个屋顶也是屋顶”推理时看到半栋楼也给你框出来。坐标系的差异是VOC和YOLO最大的分水岭。XML里是左上角和右下角的绝对像素坐标YOLO用的则是相对图片宽高的归一化坐标——中心点x、中心点y、框宽、框高四个值全部在0到1之间。这个转换公式是x_center (xmin xmax) / 2 / widthy_center同理box_width (xmax - xmin) / width。看起来只是除以宽度但如果你用的是不同来源的标注工具有的工具把坐标存成了整数有的存成了浮点转换结果就会差出好几个像素在航拍大图上可能无所谓但如果是小目标这几个像素误差直接影响AP值。2.2 YOLO格式为什么训练脚本只认TXT不认XMLYOLO系列从v5到v8包括v9和最新的v11训练脚本默认读取的标注格式就是TXT而且是“一行一个目标”的平铺结构。这个设计背后有个工程考量读TXT比解析XML快得多数据加载阶段省下的CPU开销在训练几百个epoch时会积累成肉眼可见的速度差。一份YOLO格式的标注文件长这样2 0.531250 0.492593 0.226562 0.214815 0 0.152344 0.587037 0.088542 0.151852 1 0.710938 0.377778 0.130208 0.194444每一行五个数字第一个是类别ID后面四个是归一化坐标。注意类别ID是整数从0开始数不是从1开始也不是直接用类别名字符串。如果你打开TXT看到第一列是小数那多半是把类别ID写成了浮点训练时torch会直接报类型错——这个坑我在后面避坑章节专门讲。这份“航拍屋顶检测数据集VOCYOLO格式458张3类别”之所以给双格式就是为了省掉你转换的这一步。但说实话我在实际项目里从来不直接用别人给好的YOLO格式开训。原因很简单标注质量没法验证。TXT文件是给人眼看最难懂的格式3500个目标配上458张图你不可能靠肉眼去数每个TXT里有没有漏标错标。我的习惯是先从YOLO格式倒退到VOC用可视化的方式验证一轮确认坐标没丢、类别没错再转头去训练。这个“多绕一圈”的操作能帮你躲掉大量训练到一半才发现数据问题的悲剧。3. 解压与验证458张图怎么落地7z压缩暗藏哪些坑3.1 7z解压Windows和Linux两个平台的高频翻车点标题里带“.7z”后缀说明这份数据集用了7-Zip压缩。7z格式的压缩率通常比zip高出10%到20%对458张航拍图来说如果原图是1920×1080的JPG压缩包可能只有几十MB到一两百MB这个体量在网盘和微信传输场景下都还友好。Windows上解压很简单装个7-Zip右键解压到当前文件夹就行。但这里有个高频翻车点7-Zip的“解压到文件夹”功能会把压缩包内的根目录一层套一层。如果数据集作者压缩时把最外层目录叫“roof_dataset”你解压两次就得到roof_dataset/roof_dataset/VOC2007然后你的训练脚本路径就要多写一层非常容易踩到路径错误。Linux服务器上解压是另一套玩法常见命令是# 先确认7z是否安装Ubuntu/Debian系没装就装一下 sudo apt update sudo apt install p7zip-full # 解压到指定目录 7z x roof_dataset.7z -o./roof_dataset -y # 查看压缩包内部结构不实际解压 7z l roof_dataset.7z-o参数指定输出目录注意-o后面直接跟路径不能有空格写成-o ./roof_dataset在某些版本会报错。-y参数是覆盖已存在的文件服务器上跑了两次解压又不想被反复询问时这个参数很救命。7z l这个命令是容易被忽略的宝贝。我每次拿到别人的压缩包第一件不是解压是先7z l看一眼里面的目录结构。如果看到压缩包根目录下直接散落着JPEGImages和Annotations你就知道解压路径应该指向数据集根目录如果看到根目录套了一层VOC2007那路径就要相应加深。这种先看一眼再动手的习惯能省掉你后面改配置文件的十分钟。注意如果解压过程中出现“密码错误”但你又确定密码是对的先检查是不是中文输入法开着了或者密码里有没有被自动补全改掉的字符。7z的密码错误提示是“Cannot open file as archive”跟RAR那种“密码错误”是两套文案。命令行下用7z x -p你的密码能避免GUI粘贴时多带空格。3.2 收到数据后第一件事跑通目录体检和可视化抽检解压之后别急着训练先做三件体检数文件、看尺寸、画框。第一数文件确认数量对得上# 统计JPG和TXT数量应该都和458一致 find . -name *.jpg | wc -l find . -name *.txt | wc -l # 统计XML数量VOC格式下应该也是458 find . -name *.xml | wc -l数量对不上别慌常见情况是.gitkeep之类的隐藏文件混在里面或者个别图片转换时没生成对应的标注。wc -l数出来的是文件个数如果你用find | wc发现TXT比JPG多多半是某个图有多个TXT残留或者多目标导出时按目标数生了文件——这就属于数据集制作时的坏习惯得人工清。第二看尺寸确认图片是不是统一分辨率python3 -c from PIL import Image import glob sizes {} for p in glob.glob(./JPEGImages/*.jpg): im Image.open(p) sizes[im.size] sizes.get(im.size, 0) 1 for size, cnt in sorted(sizes.items(), keylambda x: -x[1]): print(f{size}: {cnt}张) 航拍数据集最常见的问题之一就是混着4032×3024的手机图和512×512的裁剪哨兵图。YOLO训练时会统一resize但不同分辨率的图混在一起小物体在低分辨率图上可能只有十几个像素在高分辨率图上可能占上百个像素这会让模型的尺度感知能力混乱。如果发现分辨率不统一我的建议是要么全部缩放到统一尺寸选一个中间值比如1280×1280要么按比例缩放到统一短边宁可横竖不统一也别让个别大图主导损失函数。第三画框视觉验证标注质量import cv2 import glob # 读取YOLO格式TXT在原图上画框保存 for txt_path in glob.glob(./labels/*.txt): img_path txt_path.replace(labels, images).replace(.txt, .jpg) img cv2.imread(img_path) h, w img.shape[:2] with open(txt_path) as f: for line in f: cls, xc, yc, bw, bh map(float, line.split()) x1 int((xc - bw/2) * w) y1 int((yc - bh/2) * h) x2 int((xc bw/2) * w) y2 int((yc bh/2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(int(cls)), (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imwrite(./check_ txt_path.split(/)[-1].replace(.txt, .jpg), img) if glob.glob(./check_*.jpg).__len__() 20: break # 抽前20张看看就好这段代码的用意不是把所有图片都画一遍框而是抽前20张肉眼过一圈。重点看三类问题框有没有明显偏大包住背景、框有没有切到屋顶边界但漏掉人字顶的尖端、类别ID有没有跟肉眼判断不一致。这三类问题在TXT格式里看一百遍都发现不了画出来一眼就能揪出。注意画框脚本里的labels和images目录名要跟你数据集里的实际目录结构对齐如果这份数据集用的是yolo_labels或obj_train_data这种自定义目录记得改路径。4. 训练策略458张图怎么训出能用的模型而不是过拟合到姥姥家4.1 小数据集选YOLO哪个版本预训练权重怎么选458张图、3个类别这个数据规模决定了你不能从零训练。YOLO从零训练的默认图是COCO的118K张图、80个类别哪怕你拿两张2080Ti跑一个星期从随机初始化训458张图也只会得到一套“记住了训练集”的权重——验证集的mAP可能只有0.1不到训练集却跑到0.9以上这就是教科书级的过拟合。所以正确做法是加载COCO预训练权重然后冻结backbone只训练检测头。YOLOv5和YOLOv8是这里最稳妥的两个选择。v5的生态最老各种魔改版和资料最多v8的anchor-free设计对小目标更友好航拍屋顶在画面里往往偏小我一般优先选v8。v11虽然新但训练脚本和部署链路的坑还没被充分踩平小数据集阶段没必要追新。选预训练权重有个判断标准看它的类别分布。COCO预训练权重里有person、car、truck这些常见目标有它们的底层特征做迁移对屋顶检测是有帮助的——屋顶的纹理、边缘、色彩关系和车、建筑是有共性的。如果你拿的是某个“屋顶专用”预训练权重反而要小心因为预训练数据集里的屋顶类别跟你这份数据集的屋顶定义未必一致可能包含斜屋顶、平屋顶、彩钢瓦屋顶而你的3类可能是“住宅屋顶、厂房屋顶、在建屋顶”迁移效果未必好。4.2 一份可直接改的训练配置参数怎么调为什么这么调假设你用YOLOv8训练前的目录准备如下dataset/ ├── images/ │ ├── train/ # 从458张里按8:1:1切出的366张 │ ├── val/ # 46张 │ └── test/ # 46张可以跟val合并 └── labels/ ├── train/ ├── val/ └── test/每个子目录下的TXT文件名必须和JPG文件名一一对应一个都不能少。YOLO训练脚本靠文件名匹配图片和标签文件名对不上就直接skip而且静默skip不报错等你训完发现mAP0再回头找数据问题一上午就没了。训练命令如下yolo train \ modelyolov8n.pt \ dataroof.yaml \ epochs200 \ imgsz1280 \ batch16 \ lr00.003 \ lrf0.01 \ optimizerAdamW \ freeze10 \ patience30roof.yaml是数据集描述文件内容如下path: ./dataset train: images/train val: images/val test: images/test nc: 3 names: 0: residential_roof 1: factory_roof 2: under_construction这几个参数是我每次小数据集训练都会较真的地方逐个说imgsz1280是航拍场景最关键的参数。航拍图的视野范围大屋顶在画面里往往只有几十个像素宽如果你用默认的640尺寸等下采样到特征图的时候小目标的特征可能只剩一个像素点。1280能显著提升小目标召回率代价是训练速度下降。458张小数据集加COCO预训练权重v8n用单张V100大概一小时能跑完200轮时间成本完全能接受。freeze10是冻结前10层。YOLOv8的backbone前10层基本是通用的边缘、纹理、色彩特征提取器冻结它们可以大幅减少需要更新的参数量让训练更快、更稳。但要注意冻结层数不能太多如果freeze20以上的配置在coco预训练下可能没大问题但在458张小数据集上如果冻结过深detect层的梯度也会受影响模型学不到你这份数据的特殊性。10这个数值是v8社区里调出来比较折中的值。batch16这个在V100 32G上很轻松但在8G显存的卡上就要降到8或者4。小数据集没必要硬开大batch因为大batch会降低梯度噪声模型更容易陷入训练集的局部最优本质是加重过拟合。宁可batch小一点、epoch多一点让模型在随机梯度噪声里学到更鲁棒的特征。lr00.003比默认的0.01要保守。小数据集加载预训练权重后模型已经处于一个比较低的损失区域学习率太大会让权重剧烈波动把预训练学到的特征打碎俗称“灾难性遗忘”。0.003配合AdamW是v8在迁移学习场景里的一个稳手配方。如果你的损失曲线前20轮震荡剧烈试试0.001。反之如果收敛太慢可以试着调回0.005。patience30是早停耐心值。训练200轮、验证集mAP连续30轮没有提升就自动停止。458张训练集的mAP曲线必然会有抖动patience太小容易提前停在半山腰太大又浪费时间。30轮是个平衡值配合每5轮保存一次的checkpoint能让你在模型还没训完时就能提前看验证集效果。4.3 边训练边盯什么损失曲线和混淆矩阵的高频坑训练启动后别撒手不管。用tensorboard或YOLO自带的results.png盯三个曲线的走势train/box_loss、val/box_loss和val/cls_loss。正常情况三个loss都是单调下降val_loss和train_loss的差距小于20%。如果val_loss先降后升、train_loss继续下降就是过拟合的典型信号这时该做的不是降学习率而是先回去看数据集——458张图按8:1:1切验证集只有46张46张里的样本分布如果和训练集差异大val_loss抖动就会异常剧烈。此时考虑两个方向一是把切分比例从8:1:1调整为9:0.5:0.5让验证集更“均匀”二是做简单的数据增强比如随机旋转±30度、水平翻转、随机亮度抖动但航拍屋顶的朝向是有物理意义的翻转时要考虑屋顶的采光面方向乱翻转会让模型学混。提示v8训练过程中每5轮会生成一张confusion_matrix.png。不要只看mAP数值建议每50轮打开一次混淆矩阵看一眼类别混淆情况。航拍屋顶的3个类别里最容易混淆的是“厂房屋顶”和“在建屋顶”因为彩钢瓦和混凝土楼板在灰度特征上非常接近如果混淆矩阵里这两个类别的误分率高训练完就要考虑合并类别还是增加对应类别样本量。训练结束后还要做一件事用val.py或yolo val命令跑一遍带上save_jsonTrue拿到每一类的AP、AR。注意看小类别的AP50-95而不是只看AP50。AP50只算IoU0.5的框匹配对屋顶这种边缘不规则的物体AP50很容易虚高到0.9以上但AP50-95才能真正反映框的精准度。如果AP50有0.85但AP50-95只有0.4说明框的位置偏差普遍在几个像素到十几个像素之间部署到业务里可能能接受但做数字化管理比如算屋顶面积就会出问题。5. 训练避坑小数据集翻车实录458张图差在哪5.1 类别ID从1开始导致的全军覆没现象训练启动后损失函数前期正常下降但到了第20轮左右突然NaN。原因TXT文件里的类别ID是1、2、3而YOLO的类别索引是从0开始即合法的ID是0、1、2。ID3越界后模型输出的类别维度不匹配对数损失计算时出现log(0)变成无穷大。解决训练前先写一个10行脚本扫一遍所有TXT的最大类别值超过nc-1就直接报错过滤。这个脚本也不难就是你前面画框脚本里按int(cls)取出来的值大于2时就打一个警告。我每次换数据集都会跑一遍已经变成肌肉记忆了。python3 -c import glob bad [] for f in glob.glob(./labels/*.txt): for line in open(f): cls int(line.split()[0]) if cls 2: bad.append(f) print(有问题的文件:, bad[:10] if bad else None) 5.2 训练集和验证集的类别分布严重失衡现象mAP高但实际部署时某些屋顶类别一个都检测不出来。原因458张图不是均匀切成三份的。如果切分时只用random.shuffle 固定比例很可能某一类屋顶在图里只出现在训练集中验证集里完全没有模型学到的该类特征就“没有反馈信号”验证集mAP还虚高。解决用分层抽样切分。按TXT里每个类别的目标数做加权保证训练集和验证集里每个类别的目标占比大致一致。更简单粗暴的办法是直接把验证集当作留出法选46张图时保证每类目标至少出现5次。用现成工具也行sklearn的train_test_split加上stratifyy参数就能做。import glob from collections import Counter # 统计每张图的类别组合用于分层 def image_class_counts(txt_path): counts Counter() for line in open(txt_path): cls int(line.split()[0]) counts[cls] 1 return tuple(counts[i] for i in range(3)) paths glob.glob(./labels/*.txt) labels [image_class_counts(p) for p in paths] from sklearn.model_selection import train_test_split train_paths, val_paths train_test_split(paths, test_size0.1, stratifylabels, random_state42) print(ftrain: {len(train_paths)}, val: {len(val_paths)})5.3 图片EXIF旋转导致画框错位现象可视化抽检时看到框的位置和屋顶完全对不上有的框偏到旁边的树上去。原因无人机和手机拍的JPG自带EXIF方向信息有的厂商写的是“方向旋转90度”。OpenCV的imread读图时会忽略EXIF方向直接按原始像素读而你画框用的是原始像素坐标看起来就是“框跟着原图走但展示时被旋转了”。解决先统一转换成不带EXIF的标准方向再画框。用PIL的ImageOps.exif_transpose()处理后再转成OpenCV格式。如果数据集本身是这种“带EXIF”的训练时YOLO也会因为读取器不同而出现“同一张图两张读法的尺寸不一致”进而导致标注偏移。最稳妥的处理转换数据时直接用PIL重存一遍JPG把EXIF信息丢掉。from PIL import Image, ImageOps import glob for p in glob.glob(./JPEGImages/*.jpg): im Image.open(p) im ImageOps.exif_transpose(im) # 自动根据EXIF旋转 im.save(p, JPEG, quality95, exifb) # 清空EXIF5.4 7z二次解压导致目录嵌套训练脚本路径直接崩现象yolo train运行到数据加载阶段报FileNotFoundError路径提示图片不存在。原因压缩包内根目录是roof_dataset解压到dataset目录后实际路径变成dataset/roof_dataset/images/...训练脚本找的是dataset/images/...缺了一层。解决用7z l先看压缩包根目录如果是套了层的解压完直接mv把内层目录提出来。有些数据集作者会把VOC和YOLO两套目录都打进同一个压缩包解压后你会发现VOCdevkit和yolo_dataset并列这时候训练脚本的path字段要精确指向yolo那一套不能写在根上。5.5 类别名称和实际含义对不上现象训练完看混淆矩阵发现factory_roof和residential_roof几乎完全分不开模型把带烟囱的住宅屋顶全识别成厂房。原因标注者用视觉特征来定义类别但屋顶检测的真实业务定义往往更复杂——同样是人字顶住宅和村集体仓库长得一样同样是平顶商用楼和厂房也长得一样。458张图里某些类别的“视觉区分度”本身就不足。解决一张图和它的标注要让人不看标签也能判断“哦这是厂房”。航拍图里判断不了的时候两个做法一是调整类别定义把“视觉可分”作为第一原则比如改成“彩钢屋顶/混凝土屋顶/在建屋顶”这属于纯视觉类目模型更容易学二是给模型增加上下文——切图时把屋顶周围的院子、道路关系也裁剪进来让模型有更多判别线索。这个思路在航拍小目标场景里比调模型参数更管用。6. 数据增强和部署验证458张图的上限怎么靠策略去捅破6.1 Mosaic和马赛克之外的增强组合别把天气因素忘了YOLOv8默认的增强管线里有Mosaic、随机仿射变换、HSV扰动这些东西对通用目标检测很有效但航拍屋顶有个特殊点表观特征受光照影响极大。同一个彩钢瓦屋顶正午的强反射和阴天的哑光特征差异比不同类别的屋顶还大。所以我在小数据集训练时会额外加大两个增强操作的权重一个是hsv_h和hsv_s让模型对色相和饱和度变化更鲁棒另一个是随机的灰度化模拟阴天和传感器噪声。v8的augment参数里hsv_h0.015hsv_s0.7hsv_v0.4是默认值对小数据集我会把hsv_s加到0.8甚至1.0同时打开degrees10让模型对轻微旋转变换鲁棒。但注意degrees别超过15度航拍图里的屋顶朝向和道路走向是有物理垂直感的旋转过头会导致模型学到“斜屋顶”的假特征。Mosaic增强在小数据集上也值得保留但有个坑Mosaic会把4张图拼成1张大图如果458张图里某些类别的图很少比如“在建屋顶”只有30张Mosaic的随机采样很容易让这些稀有类别在拼接图里“被淹没”在其他类别的目标中。我在这种场景下会把mosaic超参从默认的1.0降到0.5也就是一半的epoch不用Mosaic让模型有更多机会看单张完整图。6.2 部署阶段的验证别只看mAP拿一版“推理脚本”去跑真实场景训练结束后最后一个步骤不是把模型丢给后端接口而是做一轮“蒙特卡洛验证”——找几张训练集里没有的航拍图跑一次推理把输出的框画出来人眼过一遍。from ultralytics import YOLO model YOLO(runs/detect/train/weights/best.pt) results model.predict( source./real_world_samples/, imgsz1280, conf0.3, iou0.5, saveTrue, ) for r in results: for box in r.boxes: cls int(box.cls[0]) conf float(box.conf[0]) xyxy box.xyxy[0].tolist() print(f类别{cls} 置信度{conf:.2f} 坐标{xyxy})conf0.3这个值在航拍场景里通常偏保守如果你希望召回更多小目标可以降配到0.15到0.2但代价是误检变多。这里有个经验值航拍屋顶这类目标conf从0.3降到0.1召回提升大约15%误检提升大约50%——所以不要在部署时就指望靠降置信度来兜底数据侧的增强和模型侧的过拟合控制才是正道。部署验证这步还会暴露一个训练阶段看不见的问题TTATest Time Augmentation和推理尺寸。训练时用1280的输入但部署时视频流或单帧如果是4K分辨率直接喂1280会丢失大量小目标细节。这时候用imgsz1600或imgsz1920推理往往比在训练阶段堆数据提点更快。代价是部署机器的推理帧率下降在航拍巡检这种离线分析场景完全能接受实时场景就要权衡了。6.3 一个大实话习惯数据集的“脏”程度决定了你的天花板写到这我得说点实在的。458张图、3个类别这个数据集的规模决定了它适合做技术验证和流程跑通但不适合做“精度冲刺”。如果你要拿它当生产级模型的数据底座大概率要做的第一件事不是调参而是继续采数据把3个类别各自补到500张以上让总数上到1500到2500张的量级。我自己的习惯是拿到这类小型数据集先做一轮“数据体检三件套”——格式校验、可视化抽检、类别分布统计全通过后再花小半天跑一轮短训练用50个epoch摸个底看看mAP是否达到“能用”的下限。如果低于0.5的mAP50-95我不会急着调参而是先怀疑数据是不是标注框太松、类别定义太主观、还是某个类别的样本量严重不足。数据和模型互相打架的时候数据几乎永远是优先级更高的那一方。这个习惯救过我很多次。有一次我拿一份600多张的类似数据集跑屋顶检测怎么调都差口气最后用可视化脚本把每张图的框叠加率和目标面积分布统计出来一看发现最小的目标在整图里只占0.02%的面积也就是不到4×4像素。这种目标再牛的模型也学不出来——后来我用切图策略把原图切成4块1280×1280的子图重新训练mAP直接从0.31跳到了0.67。如果这份458张三类别数据集是你入航拍检测的第一份“燃料”我建议你按这个顺序走完先解压、体检、画框再训练、看曲线、部署验证。整个过程卡在哪一步就回头检查哪一步的数据。模型没有准备好之前数据永远先准备好数据没有验证干净之前模型训练就是给一堆垃圾做梯度下降。希望这份从格式到训练再到避坑的拆解能让你花在458张图上的每一分钟都有回报——不只是训出一个能跑的模型而是建立一套拿到任何航拍数据集都能快速上手的流程。希望帮到你。本文还有配套的精品资源点击获取
返回列表