☰
输电线路异物检测:用YOLOv8在少量数据上从零训练到部署
2026/10/1 4:03:47 网站建设 项目流程

简介:输电线路异物检测目标检测数据集,面向电力巡检从业者、计算机视觉初学者以及目标检测算法研究人员,解决垃圾、气球、风筝等常见异物识别标注数据不足的问题。包内共1603个文件,含有800张jpg原图、801个txt标注文件,另提供py可视化脚本与png辅助文件;txt统一采用YOLO格式,类别包含垃圾、气球、风筝等4类,并已按训练集、测试集划分,另提供classes文件便于核对标签顺序与编号,可直接用于模型训练与效果验证。压缩包整体约286.84MB,目录结构清晰,运行show脚本即可快速预览标注结果,方便核对目标框与类别是否准确,减少等待标注和手动整理数据的时间。已有232人学习,适合用来进行YOLOv5等目标检测网络的练手、迁移学习或改进实验,也适合作为电力场景检测任务的起点数据。

1. 输电线路异物检测:800张已标注数据能撑起一个能用的模型吗

无人机巡检拍回来的照片堆在硬盘里,导线上的风筝、塑料布、防鸟刺挂绳、鸟巢得靠人一张张盯,盯到后面眼睛花不说,漏看一条细小的悬挂物,轻则告警误报,重则等异物引发放电了才被发现。输电线路异物检测要解决的正是这件事:用图像目标检测模型自动框出导线上挂着的异物,让巡检人员只处理报警帧,而不是从头到尾看完整段视频。手上这份数据是约800张已标注图像,YOLO标注格式,量不算大,但足够做一件很实在的事:把一个检测模型从零跑到能出指标、能出检测框的基线状态,再决定要不要继续采数据、补标注。适合谁?做电力视觉落地的工程师、想快速跑通YOLO全流程的研究生,以及需要给领导一个“这事能不能干”的结论的团队。800张数据跑不出一个完美的生产模型,但能跑出一个诚实的基线——这比空谈算法重要得多。

2. 先吃透YOLO标注格式:txt坐标、归一化和类别文件的一次性对齐

拿到一份YOLO格式的数据集,第一件事不是急着训练,而是把标注文件打开看明白。YOLO格式的标注不是图片里画框,也不是一个JSON,而是每个图片同名的一个txt文件,文件里每一行描述一个目标。如果这一步理解偏了,后面所有转换、训练、评估都会在某个环节突然翻车,而且报错信息往往还看不出来。

2.1 每行五个数字:类别、中心点、宽高,全部归一化

打开任意一个txt标注文件,常见的内容长这样:

0 0.562500 0.437500 0.075000 0.125000 1 0.312500 0.562500 0.043750 0.093750

每行五个数字,含义固定:第一个是类别ID,从0开始计数;第二个是目标中心点的x坐标,第三个是中心点的y坐标;第四个是目标宽度,第五个是目标高度。关键点在于,后四个值全部是相对于图片宽高的归一化值,范围在0到1之间。也就是说,如果图片宽度是1280像素,一个框的中心x是720像素,那txt里记录的是720除以1280等于0.5625,而不是720。

这个设计的用意是让标注与图片分辨率解耦。训练时YOLO会按输入尺寸resize图片,如果标注用的是绝对像素,resize之后所有框就全错位了。所以看到标注文件里的数字都是小数,不要觉得是精度问题,那是正常的。另外注意一点:宽度和高度的归一化不要求保持原比例,因为YOLO的anchor机制会自己学框的宽高分布,你只需要保证数值是“除以图片宽”和“除以图片高”分别算的就行,千万别把宽高都除以同一个数。

2.2 类别文件缺失或顺序不对:一个看不见的黑匣子

YOLO格式的数据集除了图片和txt,还必须有一个类别文件,通常叫classes.txt,里面每一行是一个类别名,行的顺序就是类别ID的顺序。比如:

bird_nest kite plastic_bag construction_trash

那标注文件里类别ID为0的就是bird_nest,ID为1的是kite,以此类推。这里有个很容易踩的坑:如果你从VOC或COCO格式转过来,类别顺序在转换脚本里写错,所有标注的ID就会整体错位。比如原数据里ID 0是kite,转换时classes.txt里却把bird_nest写在第一行,模型训练时就会把kite当成bird_nest学,最后推理结果全乱,而且从图片上肉眼看框的位置没错,极难察觉。

我一般拿到数据集会先写一个三行的小脚本,把每张图的类别ID、类别名和数量打印出来看一眼,确认分布符合预期再继续。这一步不花时间,但能省掉后面好几个小时的排查。

2.3 VOC或COCO转YOLO:转换脚本与坐标校验

输电检测项目里经常拿到的原始数据是VOC格式的xml,或者COCO格式的json,而不是现成的txt。转换逻辑本质上就是把绝对坐标算成归一化的中心点宽高。以VOC的xml为例,一个常见做法是这样:

import os import xml.etree.ElementTree as ET def voc_to_yolo(xml_path, out_txt_path, class_map): tree = ET.parse(xml_path) root = tree.getroot() size = root.find("size") img_w = int(size.find("width").text) img_h = int(size.find("height").text) lines = [] for obj in root.findall("object"): name = obj.find("name").text if name not in class_map: continue # 跳过未定义的类别,避免ID越界 class_id = class_map[name] bndbox = obj.find("bndbox") xmin = float(bndbox.find("xmin").text) ymin = float(bndbox.find("ymin").text) xmax = float(bndbox.find("xmax").text) ymax = float(bndbox.find("ymax").text) x_center = (xmin + xmax) / 2 / img_w y_center = (ymin + ymax) / 2 / img_h box_w = (xmax - xmin) / img_w box_h = (ymax - ymin) / img_h lines.append(f"{class_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}") with open(out_txt_path, "w") as f: f.write("\n".join(lines)) # class_map 是类别名到ID的映射,顺序必须和后续训练用的 classes.txt 一致 class_map = {"bird_nest": 0, "kite": 1, "plastic_bag": 2, "construction_trash": 3} voc_to_yolo("annotations/00001.xml", "labels/00001.txt", class_map)

这里有两个参数值得单独说。第一,x_center的计算用的是xmin加xmax除以2,这是框的中心点,不是左上角。第二,最后输出保留6位小数,足够表达亚像素精度,不要用round取整,否则小目标的框会飘。转换完之后,建议随便挑十张图,把txt读出来画到原图上,肉眼确认框和物体贴合,再进训练。可视化这一步是检验转换正确性的最低成本手段,跳过它就是在赌运气。

3. 用YOLOv8在800张数据上跑通训练:环境、命令与关键参数

数据格式确认无误后,进入训练环节。当前做目标检测,YOLOv8是社区里用得最多、文档最全的版本之一,v9、v10也有各自的优势,但v8的生态最成熟,遇到问题搜出来的解决方案最多。800张数据要跑通一次完整训练,数据量偏少,但流程上完全可行,关键是参数别乱调,先按保守设置跑一轮基线。

3.1 数据目录与data.yaml:训练前的固定动作

YOLOv8训练要求数据按固定目录结构组织。常见做法是分成images和labels两个大目录,各自再分train和val子目录。目录结构如下:

dataset/ ├── images/ │ ├── train/ # 约640张 │ └── val/ # 约160张 └── labels/ ├── train/ └── val/

图片和标注文件的文件名必须一一对应,只是扩展名不同。图片是jpg,标注是txt。train和val的比例按8比2划分,800张就是640张训练、160张验证。划分时要用随机种子固定,保证每次实验的训练集一致,否则模型指标的好坏没法对比。

接下来写data.yaml,这是告诉YOLO去哪里找数据、有几类、类别名是什么的配置文件:

path: /home/user/dataset # 数据集根目录的绝对路径 train: images/train # 训练图片相对路径 val: images/val # 验证图片相对路径 nc: 4 # 类别数量,和 classes.txt 的行数一致 names: 0: bird_nest 1: kite 2: plastic_bag 3: construction_trash

这里有一个高频翻车点:path字段如果写相对路径,YOLO会基于当前工作目录解析,不同机器上跑结果不一样。我一般写成绝对路径,或者写成相对于data.yaml所在目录的路径,然后命令行里cd到数据集根目录再执行训练。另外nc的值必须和names列表长度一致,不一致时训练能启动,但评估阶段会数组越界,报错信息很隐晦。

3.2 一条训练命令:从预训练权重到第一版模型

环境装好YOLOv8之后,训练命令本身很短。用ultralytics的命令行接口,最简形式是这样:

yolo detect train \ data=dataset/data.yaml \ model=yolov8n.pt \ imgsz=640 \ epochs=100 \ batch=16 \ device=0 \ project=runs/detect \ name=transmission_line_baseline

逐个参数说含义。data指向刚写好的yaml文件。model用的是yolov8n.pt,这是官方预训练权重,在COCO上训练过,迁移到输电场景可以大幅缩短收敛时间,比从零训练效果好得多。imgsz是训练输入尺寸,640是默认值。epochs设100轮,配合早停机制,实际跑到五六十轮就可能停了。batch设16,如果你的显卡显存只有8G,改成8或4,显存不足时训练会直接OOM报错,那不是代码问题,是batch和显存的匹配问题。device=0表示用第一张GPU,没有GPU的机器改成device=cpu,但训练时间会翻很多倍。

第一次跑训练,我建议所有参数都用默认值,先拿到一个基线结果,看看mAP在什么水平。不要一上来就调学习率、改anchor、改损失函数权重,那些是第二步的事。基线模型的意义是让你知道“在完全不调的情况下,这个数据集能到多少分”,后续所有改进才有参照物。

3.3 预训练权重、epochs、batch的搭配原则

800张数据训练,最需要克制的是别把epochs设太大。数据量小,模型很容易过拟合,训练集loss持续下降,验证集loss却开始回升。YOLOv8默认有早停机制,patience参数默认100轮,意思是连续100轮验证集指标没提升就停止。对小数据集,我习惯把patience设成20到30,减少无谓的等待时间。

预训练权重的选择上,yolov8n是最轻量的版本,适合先验证流程。如果800张数据里小目标特别多,比如异物在整幅巡检图里只占几十个像素,可以考虑yolov8s,它的特征提取能力更强,但显存占用和训练时间都会上升。不要一上来就用yolov8x,800张数据撑不起这么大的模型,结果反而可能比n版更差,这是模型容量和样本量不匹配的典型问题,和数据本身质量无关。

另外关于损失函数,YOLOv8默认的组合是分类损失BCE、框回归损失CIoU和DFL。这几个损失的具体数值在训练日志里会单独列出来,你不需要改它们的默认权重。真正值得关注的是总loss的下降曲线:如果前10轮loss不降反升,大概率是学习率设置有问题或者数据标注有硬错误,这时候要停下来查数据,而不是继续等它自己收敛。

4. 800张数据不够用:数据增强和半监督扩充的落地做法

800张已标注数据对深度学习模型来说属于小样本。直接训练出来的模型,泛化能力通常不够,遇到没见过的光照条件、拍摄角度、异物形态就容易漏检。解决思路有两个方向:一是在训练时做数据增强,让模型在有限的样本上看到更多样的输入;二是想办法扩充标注数据,用半监督的方式把没标注的巡检图也利用起来。

4.1 YOLOv8内置增强参数:不动代码先调对配置

YOLOv8在训练时默认开启了一组数据增强,全部通过训练参数控制,不需要改代码。以下是一组针对输电巡检场景比较稳妥的增强配置:

# 在训练命令里追加这些参数,或写到args.yaml里 hsv_h: 0.015 # 色调扰动幅度,0.015对色彩敏感的输电场景已经足够 hsv_s: 0.7 # 饱和度扰动,模拟清晨和傍晚的色彩差异 hsv_v: 0.4 # 明度扰动,模拟阴天和逆光 translate: 0.1 # 图片平移比例,让目标出现在不同位置 scale: 0.5 # 缩放比例,模拟无人机不同拍摄距离 fliplr: 0.5 # 水平翻转概率,注意鸟巢方向性不强,可以开 mosaic: 1.0 # Mosaic拼接,把4张图拼成1张,小目标检测的关键增强

这些参数的逻辑:hsv三个值控制颜色扰动,输电场景里导线是金属灰色,异物是彩色,颜色扰动太强会让模型把颜色当成主要特征,反而学不到形状特征,所以hsv_h我压得比较低。scale设0.5是因为无人机巡检时拍摄距离有波动,目标大小变化明显,适当缩放能模拟这种变化。mosaic是YOLO系列最核心的增强,它把四张训练图随机裁剪拼接成一张,一方面增加了样本多样性,另一方面让模型在小尺寸目标上的表现更好。

需要提醒的是,mosaic对数据集的目录结构没有额外要求,但它会让标签跟着图片一起变换,如果原本的标注框有轻微偏移,mosaic之后偏移会被放大。所以用mosaic的前提是标注质量本身够好,标注框贴得不紧的数据集开了mosaic反而会把模型带偏。

4.2 针对输电场景的定制增强:复制粘贴小目标和光照模拟

内置增强是通用的,真正让模型适配输电巡检场景,还需要两招。第一招是Copy-Paste增强,专门解决少类别样本不足的问题。比如800张数据里塑料布只有几十个标注框,模型很难学够它的形态。做法是把塑料布的标注框从原图抠出来,随机贴到其他训练图上,同时把标注写入目标图的txt里。这一招对小目标尤其有效,因为它保留了目标的真实纹理,而不是像旋转、缩放那样改变目标本身。

import cv2 import numpy as np def copy_paste(src_img, src_box, dst_img, dst_label_path): x1, y1, x2, y2 = src_box patch = src_img[y1:y2, x1:x2].copy() h, w = patch.shape[:2] # 在目标图上随机找一个位置,不覆盖图片中心区域以外的敏感位置 max_x = dst_img.shape[1] - w max_y = dst_img.shape[0] - h if max_x <= 0 or max_y <= 0: return new_x = np.random.randint(0, max_x) new_y = np.random.randint(0, max_y) # 简单叠加,不做透明度混合,保持目标边缘清晰 dst_img[new_y:new_y+h, new_x:new_x+w] = patch # 把新目标追加到txt文件 img_h, img_w = dst_img.shape[:2] cx = (new_x + new_x + w) / 2 / img_w cy = (new_y + new_y + h) / 2 / img_h bw = w / img_w bh = h / img_h with open(dst_label_path, "a") as f: f.write(f"2 {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}\n")

这段代码的适用条件是少数类样本太少且目标本身是刚体或半刚体。参数上需要注意两点:一是粘贴位置要避开图片边缘,否则框的中心点坐标容易越界;二是粘贴的缩放比例要随机,或者与原图目标尺寸近似,不要贴出一个现实中不可能出现的巨大塑料布。代码里class_id写的是2,实际使用时要改成你少数类对应的ID。

第二招是光照扰动。输电巡检图有相当一部分是在逆光、阴天、雾霾条件下拍的。训练集里如果晴天照片占多数,模型到阴天就容易误检。我常用的办法是用亮度调整模拟阴天,用加噪模拟雾霾,把这类增强以一定概率应用到训练图。YOLOv8内置的hsv_v参数只能调亮度,但对雾霾没有建模,所以额外写一个高斯噪声叠加对极端天气更有效。

4.3 半监督伪标签扩充:把没标注的巡检图用起来

数据增强是在已有样本上做文章,半监督则是把没标注的数据变成训练数据。做法很直接:用当前训练好的基线模型去推理一批没有标注的巡检图,把置信度高于阈值(比如0.8)的检测结果当作伪标签,筛选后加入训练集再训练一轮。这个过程可以迭代,每次提升模型质量,下一次就能挖出更多高置信度的伪标签。输电巡检的原始视频帧和无人机照片通常大量存在,缺的只是标注,所以这个思路在实际项目里非常实用,相当于用算力换人工标注意愿。

伪标签的筛选要卡两个条件:置信度阈值要高,避免把模型自己的错误预测当成标签教回去;同时要过滤掉太小的框和贴边的框,因为这些位置本身标注质量就存疑。我一般还会对伪标签做类别平衡,少数类的伪标签放宽置信度到0.7,多数类收紧到0.85,防止模型越学越偏。做三轮伪标签扩充之后,等效训练数据量通常能翻一倍以上,模型mAP的提升幅度在小数据集上比调任何超参数都明显。

5. 输电异物检测避坑指南:五个真实高频问题与排查步骤

这一章是血泪经验的集中地。做了几个数据集、跑过几轮真实训练之后,你会发现真正耗时间的不是调模型,而是查那些看起来莫名其妙的故障。以下五条问题,现象、原因、解决一条条说清,排在前面的是最常发生的。

5.1 训练能启动,但第一个epoch就报“标签格式错误”

现象:训练刚开始几秒,日志里出现类似“Label format error”或者“corrupt image”的提示,有时候直接中断,有时候跳过一些图片继续。

原因:常见的有三种。一是某个图片对应的txt文件内容是空的,图片存在但没有任何标注,YOLO读到一个空标签会认为文件损坏。二是txt里的坐标值超过1.0或者小于0.0,这个通常是从VOC转YOLO时,xmax或ymax计算错误导致的,比如除以了错误的图片尺寸。三是类别ID超过了nc设置的值,比如data.yaml里nc=3,但txt里出现了类别ID为3的行。

解决:写一个扫描脚本,遍历所有txt,检查行数、每行五个值是否都在合法范围、类别ID是否小于nc。发现异常文件后单独处理,不要删整个目录,因为可能只是某一张图标注有问题。这个脚本值得保留下来,以后每次拿新数据集都先跑一遍,能挡掉大半的翻车现场。另外有一种隐蔽情况:图片是RGB三通道,但某些巡检相机的图片是RGBA四通道PNG,txt坐标没变,但YOLO读图时会自动转成RGB,坐标不受影响,却会导致训练速度异常慢。遇到图片格式不统一,最好统一转成jpg或png三通道。

5.2 训练前几轮loss直接变NaN,或loss不降反升

现象:第一轮训练时总loss输出为nan,或者loss在前十轮一直在高位震荡,完全没有下降趋势。

原因:loss出现NaN,最常见的是学习率过大导致梯度爆炸,尤其是用了预训练权重后新加的分类头初始化不稳定。另一个常见诱因是训练数据里有全黑的图片,或者是大量的空白背景图,这些图造成的梯度异常会把整个模型的权重推向无效区域。loss不降反升则多半是前面说的数据问题,比如类别ID错位,模型在学一个自相矛盾的映射关系,loss当然降不下去。

解决:先把学习率从默认的0.01降到0.001再试一轮。YOLOv8用warmup机制,前几轮会从小学习率开始线性增长,如果warmup结束后的峰值学习率太高,一样会炸。降低学习率之后如果loss恢复正常,就说明是学习率问题。如果还是NaN,去检查数据集里有没有纯黑图、有没有尺寸只有几十像素的小图,把这些图剔除后再训练。还有一个容易被忽略的点:BatchNorm在batch=1的情况下会出问题,统计量无法计算,至少用batch=2以上训练。BN层的running_mean和running_var在小batch上会剧烈波动,严重时表现为训练初期指标正常,后期突然翻车,这就是社区里常说的BN崩溃,规避方式是batch尽量大于8,或者使用accumulate梯度累积。

5.3 mAP看着有三四十,但小目标几乎全漏检

现象:验证集上的mAP整体说得过去,但把单张巡检大图放大看,塑料布、小树枝、风筝线这类占比很小的目标一个都没框出来,只捡到了几个大的鸟巢。

原因:训练尺寸imgsz=640对巡检原图来说太小了。巡检相机的照片通常是4000×3000甚至更大,一个小目标在原图里占80×80像素,缩放640之后只占大约10×10像素,特征几乎消失。目标检测模型对极小目标的召回率本来就低,这是算法层面的固有限制,不是阈值问题。

解决:两条路。第一条是把imgsz增大到1280或1536,目标在输入图中的像素占比变大,模型有机会学到它的特征,代价是显存翻几倍,训练时间变长。第二条是切片推理,把大图切成若干重叠的patch,每个patch按原始分辨率或接近原始分辨率输入模型检测,然后把所有patch的检测结果合并回原图坐标。切片的patch size一般取640或1280,overlap设成20%,避免目标正好被切在patch边缘而截断。实测下来,切片推理对输电场景的漏检率改善非常明显,代价是推理时间线性增加。

5.4 验证集mAP漂亮,现场部署误检率高到没法用

现象:模型在训练时用的验证集上mAP达到0.6以上,看起来不错,一部署到现场摄像头或无人机图传上,误检率飙升,把导线弧垂、绝缘子串、远处的人影全框成异物。

原因:这是典型的训练分布和测试分布不一致。巡检数据集多半是无人机在晴天、固定高度、固定角度拍的,现场部署的摄像头装在杆塔上,视角是仰拍,背景里有天空、树木、建筑,光照条件也和训练数据差别很大。模型没有见过这些场景,自然会把没见过的纹理误判为目标。另一个原因是验证集本身和训练集同源,都是从同一批飞行任务的照片里划分的,背景相似度高,模型在验证集上的表现被高估了。

解决:部署前必须做跨场景验证。找几段不同时间、不同天气、不同拍摄角度的巡检视频,当作额外的测试集,看看模型在这些数据上的表现。如果误检集中在背景区域,可以考虑给模型增加一个背景类别,把常见的绝缘子、杆塔、导线也标出来,让模型学会区分“线路上正常的东西”和“线路上不该有的东西”。这一步本质上是重新定义任务:从“检异物”变成“检一切非正常物体”,类别设计变一下,误检率会大幅下降。现场部署时还可以对检测框做时间序列滤波,连续N帧都检测到同一个位置才报警,单帧偶发误检直接丢掉。

5.5 混淆矩阵总和不是100%,pos得数看得一头雾水

现象:训练结束后看混淆矩阵,每一行的百分比加起来不是100%,或者某个类别的一列出现了一个明显偏大的值,和直觉完全不符。

原因:YOLOv8输出的混淆矩阵纵轴是真实类别,横轴是预测类别。矩阵对角线是正确分类的比例,但非对角线里有一个“背景”列,模型预测为背景但实际上有目标的样本都归进去了。背景列的存在会让每一行的总和看起来不是100%,实际上是因为有些目标被漏检了,模型没有输出任何框,这些样本被YOLO归类为背景。这是正常现象,不是算法算错了,和社区里常讨论的“混淆矩阵总和不为1”是一个问题。

解决:看混淆矩阵时重点看对角线,以及目标误检到了哪个具体类别,这两个信息对模型改进最有价值。比如kite的框经常被预测成plastic_bag,说明这两个类别在形状和颜色上容易混淆,需要增加这两个类的训练样本,或者检查标注里有没有把塑料布标成风筝的错标。背景列占比较高说明漏检严重,回到5.3小节提到的imgsz和切片方向去解决。一句话总结:不要拿着非对角线的值去调损失函数,先去查数据。

6. 从验证到部署:把输电异物检测模型真正用起来

训练出模型不是终点,输电巡检项目的交付物通常是一个能跑在边缘设备上的推理程序。这里写三个最实用的环节:模型怎么验收、怎么导出部署、高分辨率图怎么处理。

6.1 用混淆矩阵和PR曲线决定模型能不能上现场

训练结束后不要只看mAP,把混淆矩阵和PR曲线也拉出来看。PR曲线的曲线下面积就是AP,但曲线本身的形状更重要:如果曲线在低召回率区域就快速掉下去,说明模型的高置信度预测里混着不少误检;如果曲线在召回率0.8之后才掉,说明模型漏检可控但置信度阈值可能需要调低。我一般用验证集PR曲线找一个“误检和漏检平衡点”,作为部署时置信度阈值的初始值。但必须强调,这个阈值只是起点,现场阈值要用5.4节说的跨场景测试集来重新标定。

6.2 导出ONNX部署到RK3588或Jetson:量化与输入尺寸的取舍

边缘设备上跑YOLO,常见做法是导出ONNX再用各平台的推理引擎转换。导出命令很简单:

yolo export model=best.pt format=onnx imgsz=640 opset=12 simplify=True

导出后先在本机用onnxruntime验证一遍输出,确认和PyTorch的结果一致,再交给RKNN或TensorRT做进一步转换。这一步有两个参数要现场调:一是输入尺寸,边设输入尺寸和训练尺寸一致时精度最高,但边缘设备的算力有限,640不够就降到480或416,每降一档速度会有明显提升,代价是准确率小幅下降,建议拿现场数据实测对比后再定。二是量化,RK3588上做INT8量化能把推理速度提升不少,但量化后误检率经常上升,原因是输电场景的导线和异物的纹理差异比较细。如果量化后精度掉得厉害,退回到FP16推理,速度和精度的平衡通常更稳。

6.3 高分辨率巡检图的切片推理:最后一步加速和合并

部署阶段处理无人机拍摄的大图,切片是绕不开的环节。把一张4000×3000的图切成6个1280×1280的patch,重叠部分设成20%,逐patch推理后再合并。合并的逻辑是把patch里检测框的坐标加上patch在原图中的偏移量,换算成原图坐标,然后对重叠区域的重复框做NMS去重。这一步如果用手写循环去拼,效率很低,推荐用现成的切片工具配合并行推理,四个patch的推理可以同时跑,整图处理时间只比单patch多一点点。

我自己的交付习惯是:先把一张典型的现场大图完整走一遍切片+检测+合并的流程,保存可视化结果给现场人员看,确认框的位置和人眼判断一致,再批量跑全部数据。图像目标检测项目做到最后,真正决定好坏的不是模型结构,而是数据质量、部署细节和验收口径这三件事。这个顺序我在多个数据集上验证过,也希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询