☰
YOLOv11电力设备缺陷检测与定位优化:从数据到部署实践
2026/9/30 18:31:29 网站建设 项目流程

简介:面向电力巡检、计算机视觉与无人机应用领域的技术人员,这份资料围绕YOLOv11在电力设备缺陷检测与定位中的落地展开,系统讲解从数据构建到模型优化的完整链路,直接回应传统巡检效率低、成本高的痛点。文档共39页,涵盖电力设备巡检现状与挑战、YOLOv11技术基础、缺陷数据集构建、模型优化策略、检测与定位流程、代码实现、实验结果分析以及变电站、输电线路、分布式能源电站等真实案例,目录支持章节跳转,方便按需查阅。资源包为单个PDF文档,大小约2.2MB,文件内容完整,文字、图表、目录均显示正常。目前已有151人学习下载,适合需要快速上手YOLOv11电力缺陷检测项目的研究者、工程师和学生。通过学习可系统掌握无人机巡检场景下的数据处理、模型训练、推理后处理与性能调优方法,还可借助案例中的非极大值抑制、模型量化等细节规避常见问题,缩短项目落地周期。

1. 无人机巡检拍回来的电力设备图,为什么要专门为YOLOv11做定位优化

一条航线飞完,带回几千张8K原图,绝缘子自爆只剩几十个像素,销钉缺失甚至看不出完整形状。YOLOv11跑出来的mAP看着还行,可框就是框不准,导出坐标后无人机复飞定不到缺陷位置——这是无人机巡检电力设备落地的典型现场。标题里“电力设备缺陷检测与定位优化”强调的不只是把缺陷找出来,而是让YOLOv11的预测框能换算成可执行复飞或检修的坐标。下面按数据准备、网络优化、推理输出、边端部署的顺序展开,适合正在做输电线路巡检算法、被小目标漏检和定位偏差困住的工程师。

2. 规划自动巡检与组织数据集:让YOLOv11先“看得见”缺陷

2.1 缺陷类别体系:按“部件+缺陷”命名,别把绝缘子打成“设备”

电力设备缺陷检测和通用目标检测最大的差别在类别粒度。常见做法是把类别拆成“部件+缺陷”的组合,而不是笼统的“设备异常”。我参与过的项目里,缺陷类别一般按下面这套来定:绝缘子自爆、绝缘子破损、绝缘子闪络(表面有烧蚀痕迹)、销钉缺失、均压环倾斜、防震锤滑移、鸟巢、异物悬挂(塑料布、风筝线、树枝)。

这样拆有两点考量。第一,检修单需要明确“哪个部件出了什么问题”,如果只输出“异常”类别,现场人员拿到结果还是要人工看图确认。第二,不同缺陷的定位要求不一样,销钉缺失要精确到小部件位置,鸟巢只需要知道在塔头哪个区域,类别和定位精度强相关。

类别8K原图上典型尺寸可见光表现标注建议
绝缘子自爆20~60像素伞裙缺失、碎片反光矩形框即可
销钉缺失10~30像素金具上空洞矩形框,宁小勿大
均压环倾斜80~200像素环体与水平线夹角异常可加角度标签
鸟巢100~400像素枝条堆叠、颜色杂乱矩形框
异物悬挂50~300像素高亮或深色条状物矩形框

标注时有一个容易翻车的细节:小目标的标注框宁小勿大。销钉缺失在8K原图上可能只有15×15像素,标注人员习惯性往四周多扩几个像素,结果目标的中心点偏移,训练时回归损失一直被错误标签干扰。我一般要求标注完成后做一轮“框中心点一致性”抽检,把同一缺陷被不同标注员框出来的中心点距离大于5像素的样本全部退回。

2.2 如何规划无人机自动巡检:航高、云台角与重叠率怎么定

数据集的质量在起飞前就决定了,而不是在标注环节。规划无人机自动巡检时,有四组参数直接影响检测效果:航高、云台俯仰角、航向重叠率、拍照间隔。常见做法是用DJI Pilot或第三方航点飞行软件,把航线以航点CSV/JSON形式导入,飞控自动执行拍照。

我常用的一套参数是这样的:航高25~35米,云台俯仰角-60°到-75°,航向重叠率不小于60%,旁向重叠率50%。这样拍摄的可见光照片里,绝缘子串占图高度约40%~60%,单串上每片绝缘子的像素尺寸足够标注。如果云台角度太接近-90°,拍到的主要是设备顶部,绝缘子串会变成侧视短条,缺陷特征丢失严重。

下面是一个生成航点文件的脚本,按两个杆塔坐标生成一条直线航带。实际巡检时还需要在每个塔位生成环绕航点,我这里只给最小可用的生成逻辑。

import csv import math def make_waypoints(lat0, lon0, lat1, lon1, alt=30, pitch=-60, overlap=0.6, img_inline=200, out_csv="waypoints.csv"): """ 生成两点之间的自动巡检航点文件。 img_inline: 相邻两个拍照点之间的地面距离(m),需要根据飞行速度与对焦时间调整。 """ dist = math.hypot(lat1 - lat0, lon1 - lon0) * 111320.0 num = max(int(dist / (img_inline * (1 - overlap))), 2) rows = [] for i in range(num + 1): t = i / num lat = lat0 + (lat1 - lat0) * t lon = lon0 + (lon1 - lon0) * t # 每行: 纬度, 经度, 相对高度, 云台俯仰角, 机头朝向, 拍照动作 rows.append([lat, lon, alt, pitch, 0, 1]) with open(out_csv, "w", newline="") as f: writer = csv.writer(f) writer.writerow(["lat", "lon", "alt", "pitch", "yaw", "photo"]) writer.writerows(rows) return out_csv

这段脚本的核心是把两个杆塔坐标之间按重叠率均匀插入拍照点。img_inline是相邻拍照点的地面间隔,飞行中相机会在航点上悬停再拍摄,避免运动模糊。重叠率不是越高越好,60%~70%是性价比比较合适的位置——高于70%会产生大量冗余图,训练集会膨胀;低于50%会造成同一缺陷在不同照片里不连续,影响后续定位复飞。

2.3 4K原图裁切与标注:小目标训练的第一步

很多人拿到巡检原图直接resize到640像素就开训,结果绝缘子自爆在resize后的图上只剩几个像素,YOLOv11的P3检测头根本分不出来。正确做法是滑窗裁切,把8K原图切成640×640的小图,保留原始细节再喂给网络。

import cv2 import numpy as np import os def slide_crop(img_path, out_dir, crop_size=640, overlap=64): """ 把高分辨率巡检图切成训练用小块。 overlap 必须大于 0,否则同一缺陷跨切分边界时会丢失。 """ img = cv2.imread(img_path) h, w = img.shape[:2] os.makedirs(out_dir, exist_ok=True) name = os.path.splitext(os.path.basename(img_path))[0] idx = 0 step = crop_size - overlap for y in range(0, h - crop_size + 1, step): for x in range(0, w - crop_size + 1, step): crop = img[y:y + crop_size, x:x + crop_size] cv2.imwrite(os.path.join(out_dir, f"{name}_{idx}_{x}_{y}.jpg"), crop) idx += 1 # 最后一行/列补边,避免漏掉边缘目标 if h % step != 0 or w % step != 0: y = h - crop_size x = w - crop_size crop = img[max(0, y):y + crop_size, max(0, x):x + crop_size] pad = np.zeros((crop_size, crop_size, 3), dtype=np.uint8) pad[:crop.shape[0], :crop.shape[1]] = crop cv2.imwrite(os.path.join(out_dir, f"{name}_edge_{x}_{y}.jpg"), pad) return idx + 1

裁切时的overlap我建议至少64像素,实际项目里取128更稳。原因很简单:缺陷不会自己避开切分边界,如果overlap太小,同一个缺陷在两个相邻切块里各剩一半,标注时要么漏标要么标注被截断的残片。还有一个必须一致的约束——训练时用640裁切,推理时也要用同样的裁切策略。我见过有人训练用tile思路,推理却直接resize整张图,结果小目标漏检率飙升,这不是模型问题,是训练和推理的尺度域不一致。

标注层面,裁切后的小图建议用矩形框。多边形标注在绝缘子串等细长部件上有精度优势,但标注成本高出一倍,而且YOLOv11原生的检测头输出的是水平框,多边形标签最终也要转成外接矩形,收益不大。裁切后的样本量会膨胀到几千到上万张,我一般会顺手给每张切块记录它在原图中的坐标(文件名里保留了x/y),这样标注框可以反向映射回原图,方便后面做定位输出。

3. 按YOLOv11网络结构做小目标优化:P2检测头与注意力模块的取舍

3.1 YOLOv11网络结构里,哪些模块对电力小目标友好

YOLOv11沿用CSPNet思路,主干用C3k2模块替代了早期YOLOv8的C2f,同时引入了C2PSA这个带自注意力的阶段,检测头还是anchor-free的Decoupled Head,输出P3、P4、P5三个尺度。对这个结构,电力小目标检测的关键不在分类分支,而在“小目标有没有机会走到检测头”。

P3特征图是8倍下采样,一个640×640的输入图对应80×80特征图。原图中20像素的绝缘子缺陷,缩到640输入后在特征图上只剩2~3个像素,勉强能激活。YOLOv11的C2PSA对全局上下文有帮助,但计算量集中在深层,对浅层小目标特征的增益有限。所以我的判断是:电力巡检这种“目标极小、纹理清晰”的场景,优先动检测头,动主干收益最直接。

3.2 给YOLOv11加P2小目标检测头:yaml改法与代价

给YOLOv11加P2检测头是常见改进方向。做法是在主干早期拉出一层2倍下采样(stride=4)的特征,融合进neck,让网络在小目标还没被过度下采样时就输出预测。以Ultralytics仓库里的yolo11.yaml为基线,改动集中在head部分:

# yolo11_p2.yaml 关键改动片段 # 假设原backbone的P2输出索引是4,P3输出索引是6 head: - [-1, 1, Conv, [256, 3, 2]] # 从20x20上采样到40x40的过渡 - [-1, 1, nn.Upsample, [None, 2, "nearest"]] - [ -1, 4, Concat, [1]] # 和主干第4层(P2, 160x160)拼接 - [-1, 1, C3k2, [256, False]] # 融合后输出P2特征 - [-1, 1, Conv, [256, 3, 2]] # 降采样回P3尺度 - [ -1, 6, Concat, [1]] # 后续继续按原head接入Detect

这段配置的核心是把主干早期的P2层特征(stride=4)通过上采样再融合回neck,让Detect的输入多了一个大分辨率分支。Detect模块会自动多出一个stride=4的检测头,前提是nc、通道数和模型build逻辑能对齐。我这边的实操顺序是:先复制yolo11.yaml,改head部分,再运行一次yolo detect train,如果Detect的stride报错,说明backbone索引写错了。

代价必须先说清楚:P2检测头的输出分辨率是160×160(输入640时),相比P3的80×80计算量增加不少。我实际跑下来的经验是,训练显存增加25%~40%,推理耗时增加20%~30%。对巡检场景,如果缺陷在输入图上大于25像素,P2的提升不明显;但销钉缺失这种10~15像素的目标,P2几乎是必须的。飞机拍回来的8K原图裁切到640后,小目标仍然只有十几个像素的场景,优先加P2而不是堆注意力模块。

3.3 hcanet这类的跨尺度注意力:能不能直接塞进C2PSA

“yolov11 hcanet”是近期的热词。从我理解的角度看,它属于一种跨尺度注意力特征融合思路,目标是让浅层高分辨率特征拿到深层的语义信息,同时让深层特征感知到浅层的细节位置。对电力巡检的小目标缺陷,这个方向和P2检测头的诉求高度重合。

但我不会一上来就复刻完整的HCANet结构。常见做法是把它的核心思想简化为一个轻量模块,插入到neck的Concat操作附近。下面是我在项目里验证过稳定涨点的一种写法,替代原C2PSA的补充分支:

import torch import torch.nn as nn class CrossScaleAttn(nn.Module): """ 轻量跨尺度注意力: 高分辨率分支做空间注意力,深层分支上采样后按通道加权相加。 本质是把hcanet的跨尺度融合思路降维成可训练模块。 """ def __init__(self, high_c, low_c, out_c): super().__init__() self.reduce = nn.Conv2d(low_c, high_c, 1) self.spatial = nn.Sequential( nn.Conv2d(high_c * 2, 1, 3, padding=1), nn.Sigmoid() ) self.out = nn.Conv2d(high_c, out_c, 1) def forward(self, high_feat, low_feat): low_up = nn.functional.interpolate( self.reduce(low_feat), size=high_feat.shape[-2:], mode="bilinear", align_corners=False ) cat = torch.cat([high_feat, low_up], dim=1) att = self.spatial(cat) fused = high_feat * att + low_up * (1 - att) return self.out(fused)

这段代码要插入的地方是neck里高分辨率特征和上采样特征Concat之后。它的作用不是加深网络,而是让网络显式学会“在哪个位置融合浅层细节与深层语义”。实际验证时,我建议做单变量对照:先跑通baseline,再只加这个模块,观察mAP@0.5:0.95和P2分支的漏检率。如果涨点不明显,先检查是不是训练epoch太少或者P2层本来就不缺特征。

3.4 环境配置与训练参数:从命令行到loss曲线

YOLOv11的环境配置不算复杂,前提是PyTorch和CUDA版本对齐。我用的是一套比较稳的组合:

conda create -n yolo11 python=3.10 -y conda activate yolo11 pip install torch==2.1.2 torchvision==0.16.2 --index-url https://download.pytorch.org/whl/cu121 pip install ultralytics

装完先跑一次yolo detect predict model=yolo11n.pt source=https://ultralytics.com/images/bus.jpg,能出结果再开始训练。这一步能过滤掉八成环境问题。训练参数方面,我习惯把Mosaic的关闭时机单独设出来,这是电力小目标训练一个容易踩的坑。

yolo detect train \ data=power_defect.yaml \ model=yolo11n.pt \ epochs=200 \ imgsz=640 \ batch=16 \ optimizer=SGD \ lr0=0.01 \ close_mosaic=10 \ project=runs/power

close_mosaic=10表示最后10个epoch关闭Mosaic增强。Mosaic能把四张图拼在一起,对小目标有一定增强作用,但训练后期BN的统计量需要稳定,边框坐标也需要回归得足够准,此时继续开Mosaic会让框偏抖动。训练时我盯着两条曲线:train/box_loss和val/box_loss。两者同步下降说明模型在学,val掉train不降是过拟合,train掉val不降先看数据泄漏。mAP只看最后50个epoch的走势,不要在前100个epoch做判断。

4. 推理阶段定位优化:把预测框变成可执行复飞的坐标

4.1 定位误差从哪来:标注、NMS与边界框损失的三个贡献

训练阶段做了优化,推理阶段同样有定位优化要做。误差源有三个,按影响从大到小排:标注框本身偏移、NMS阈值不适配、边界框回归损失对细长目标不敏感。

标注偏移的解决办法是交付前复核中心点一致性,这条前面提过,不再重复。NMS的问题在电力场景很典型:绝缘子串上密集排列的伞裙,置信度高的框之间IoU很高,如果iou阈值设得太大(超过0.7),相邻的框会被并成一个,导致框的中心点整体偏移。我建议推理时固定conf=0.25, iou=0.45;如果缺陷密集且单个缺陷占图很小,把conf降到0.1,靠类别得分和形状过滤掉虚检。

边界框回归损失方面,YOLOv11默认用CIoU,对大而方的目标友好。电力设备缺陷多是细长条,比如绝缘子破损在图上是一个窄长矩形,CIoU的长宽比惩罚会让回归稳定但不够精确。我见过有人直接把loss换成SIoU,在小目标框回归上有提升,代价是训练收敛变慢。稳妥的做法是先保留CIoU,完成一个baseline,再用SIoU做对照,不要一上来就换。

4.2 YOLOv11保存推理结果:从图片到结构化CSV

默认的yolo predict只输出画好框的图片。做巡检报告时,我需要的是结构化数据——每张原图、每个缺陷框、置信度以及换算后的坐标。先在命令行里把txt结果打开:

yolo detect predict \ model=runs/power/weights/best.pt \ source=./inference/images \ save=True \ save_txt=True \ save_conf=True \ project=runs/inference \ name=result \ imgsz=640 \ conf=0.25 iou=0.45

加上save_txt=True save_conf=True后,每个推理结果会生成同名txt文件,每行内容是class_id conf x_center y_center w h,坐标是归一化到输入图尺寸的比例值。这一步对应很多人在搜的“yolov11保存推理结果”和“预测后保存”,其实就是这组参数,不需要额外写代码。

但要落到巡检报告里,光有txt不够,还要把归一化坐标换算回原图像素,并和原图文件名关联。下面这段脚本读取txt,输出一个合并CSV:

import glob import os import csv def labels_to_csv(pred_dir, label_dir, img_w=640, img_h=640, out_csv="result.csv"): rows = [] for txt in glob.glob(os.path.join(label_dir, "*.txt")): stem = os.path.basename(txt).replace(".txt", ".jpg") with open(txt) as f: for line in f: cid, conf, cx, cy, w, h = line.split() cx, cy, w, h = map(float, [cx, cy, w, h]) x_orig = int((cx - w / 2) * img_w) y_orig = int((cy - h / 2) * img_h) rows.append([ stem, int(cid), round(float(conf), 3), x_orig, y_orig, int(w * img_w), int(h * img_h) ]) with open(out_csv, "w", newline="") as f: writer = csv.writer(f) writer.writerow(["filename", "class_id", "conf", "x_pixel", "y_pixel", "w_pixel", "h_pixel"]) writer.writerows(rows) return out_csv

这里有个前提:如果推理输入的是原图resize到640后的结果,坐标要乘回原图尺寸比例,而不是直接用640。更稳妥的方式是推理时不做letterbox以外的缩放,直接对裁切块推理,坐标天然在原图坐标系里。上面脚本的img_w/img_h参数对应推理输入尺寸,如果推理前做了等比例缩放,要在这里乘上缩放系数。

4.3 图像坐标换算GPS坐标:单应性变换的够用版本

检测框有了,但巡检人员要的是“缺陷在哪个杆塔的哪一侧、距离塔身多少米”。图像坐标到GPS坐标的换算是定位优化的最后一步。精确做法要用相机内参、云台角度、无人机POS数据做共线方程解算,工程上我常用单应性变换做近似。

import cv2 import numpy as np def pixel_to_gps(x, y, H): """ x, y: 图像像素坐标 H: 3x3单应矩阵,由至少4组图像像素与RTK实测坐标联立求解 """ p = np.array([[[x, y]]], dtype=np.float32) out = cv2.perspectiveTransform(p, H)[0][0] return out[0], out[1] # lat, lon # 在每张照片拍摄后,取图像四角对应的4个实测GPS点 src = np.array([[0, 0], [5472, 0], [5472, 3648], [0, 3648]], dtype=np.float32) dst = np.array([ [31.230100, 121.473200], [31.230250, 121.473210], [31.230240, 121.473350], [31.230090, 121.473340] ], dtype=np.float32) H, _ = cv2.findHomography(src, dst) lat, lon = pixel_to_gps(200, 400, H)

这段代码的核心是findHomography,它用四组对应点求出一个3×3矩阵,把图像坐标映射到经纬度平面。注意我这里的坐标是近似示意,实际使用时四个基准点要用RTK采集设备或照片角点的POS信息。单应性变换的局限性是假设地面是平面,对山地、大高差杆塔误差会偏大。我一般把这种输出定位到“让巡检人员能拿着GPS找到缺陷区域”,而不是直接指导登塔作业。

换算完成后,把结果追加上一步的CSV,形成最终巡检缺陷表:文件名、类别、置信度、像素坐标、GPS坐标、缺陷裁剪图路径。这份CSV就是交给检修班组的东西,也能作为待复飞确认的任务清单。

5. YOLOv11电力缺陷检测避坑指南:典型问题与排查记录

5.1 小目标mAP上不去,框总是差几个像素

现象:mAP@0.5还可以,mAP@0.5:0.95一直停在低位,训练到150个epoch也不涨。放大预测图看,框像是“套”在了目标外围而不是贴合目标。

原因:小目标本身只占十来个像素,标注框中心点偏移3像素,IoU就从0.7掉到0.5以下。加上多个标注员标准不一致,同一个绝缘子自爆,有的框得紧,有的框得松,模型学不到稳定的边界。

解决:先抽50张训练图,把人工标注框可视化叠加到原图上,重点看小目标框和真实边缘的重合度。标注规范强制固定为“框住缺陷可见部分,不包含周边背景”。对标注中心点做一致性抽检,中心偏差超过5像素的图从训练集剔除。如果剔除后数据量不足,就回去补裁切overlap,让同一缺陷在多个tile里重复出现,增加有效样本。

5.2 绝缘子串被裁切截断,漏检和误检混在一起

现象:训练时裁切overlap设成0,或者overlap只有16像素,推理时绝缘子串在tile边界处被切断。结果是绝缘子自爆的检测框经常缺了一半,同一根绝缘子串在相邻tile里一次检出一次漏检。

原因:裁切让长条形目标的结构不完整。绝缘子串的上下文信息——包括串的长度、两端的金具连接、相邻串间距——在边界处全部丢失。模型只看到局部,自然无法稳定判断。

解决:训练和推理的裁切overlap统一提到128像素,并且推理时执行“重叠区域结果合并”。后处理阶段对相邻tile输出的同一类别框,如果IoU超过0.5且中心点距离小于50像素,合并成一个框,保留置信度高的那个。另外,对绝缘子串这类长条目标,裁切方向尽量沿串体方向错位,不要让串体轴向恰好落在裁切边界上。

5.3 训练loss正常,验证集却框偏

现象:train/box_loss降得很好,val/box_loss也在降,但可视化验证集预测结果时,所有框整体偏向某个方向,比如偏左上或偏右下。

原因:最常见的是验证过程中的Mosaic未关闭。Mosaic把多张图拼接,边框坐标在拼接边界处被截断,模型学到的框中心被拉偏。另一个原因是标签归一化格式错误——yolo格式要求中心点坐标和宽高都除以图片宽高,如果某一步把宽高除以了错误尺寸,框就会系统性偏移。

解决:训练命令里确认close_mosaic大于0,验证时单独跑一次yolo detect val,确认验证集不做随机增强。排查标签格式写一段脚本:

import glob for f in glob.glob("labels/*.txt"): with open(f) as fp: for line in fp: cid, cx, cy, w, h = map(float, line.split()) # yolo格式要求 cx, cy, w, h 都属于 [0, 1] if not (0 <= cx <= 1 and 0 <= cy <= 1): print(f"bad label: {f}, {line}")

如果cx/cy超过1,说明归一化除以的尺寸和实际图像尺寸不一致。这个问题通常出现在裁切脚本和标注工具版本不匹配时,裁切后的图是640×640,标签却按原图尺寸归一化。

5.4 Jetson Nano上推理只有几帧:瓶颈不在模型

现象:模型在PC上跑TensorRT能有80帧,部署到Jetson Nano上用model.predict直接推理只有2~3帧,整个巡检流程没法实时处理。

原因:直接调用PyTorch模型推理,GPU利用率很低,而且Jetson Nano的GPU规模远小于桌面显卡。另一个隐藏问题是推理脚本里每张图都重新做一次预处理、一次后处理,CPU和GPU串行执行。

解决:先把模型导出成TensorRT engine,推理脚本加载的是best.engine而不是best.pt。再把预处理(resize、归一化)从Python端挪到TensorRT binding上,减少内存拷贝。如果硬件支持,用INT8量化再提一轮速度。这些在下一章展开。

5.5 保存的推理结果坐标画错位置

现象:预测生成的图片上框的位置是对的,但用txt坐标画到原图上,框整体偏移,有的偏差几十个像素。

原因:save_txt输出的坐标是相对于推理输入图的归一化坐标。推理时如果输入做了letterbox加灰边,或者从8K原图缩放到了640,坐标需要逆变换回原图坐标系。直接拿640的坐标画到原图上,必然错位。

解决:推理时不要对原图做resize,只做裁切,裁切的tile坐标就是原图坐标。如果用letterbox,逆变换代码要保存letterbox的参数:

def letterbox_inverse(x, y, ratio, pad_w, pad_h): x_orig = (x - pad_w) / ratio y_orig = (y - pad_h) / ratio return int(x_orig), int(y_orig)

ratio是缩放比例,pad_w/pad_h是灰边宽度。这个逆变换要放在每次推理后、写CSV之前。我踩过一次坑,结果是把所有框画到了图右下角,查了半天才发现是letterbox的pad没参与逆变换。

6. 部署到Jetson Nano:TensorRT导出、INT8量化与端侧定位

6.1 先把YOLOv11导出成TensorRT engine

Jetson Nano 部署YOLOv11的详细步骤,核心是把训练好的权重转成TensorRT的engine格式。用Ultralytics导出:

yolo export model=runs/power/weights/best.pt format=engine half=True device=0

这会生成best.engine,首次导出会针对当前设备做kernel调优,耗时几分钟。导出完后推理脚本直接加载engine文件,不再依赖PyTorch的模型定义。我的习惯是导出后删掉.pt,防止工程里混用。

6.2 INT8量化校准集怎么挑

FP16在Jetson Nano上能跑,但要想实时处理巡检视频流,INT8更现实。量化校准集我一般选500~1000张,原则是覆盖所有缺陷类别、包含白天和黄昏两种光照、包含远端和近景两种尺度。校准集不能是训练集里的同一批,否则量化后指标虚高。

trtexec --onnx=best.onnx \ --saveEngine=best_int8.engine \ --int8 \ --calib=calib.txt \ --batch=8

6.3 端侧推理脚本验证定位结果

加载engine后,先跑一批测试图,对比FP16和INT8的mAP差距。我第一次在这块板子上做量化时,FP16掉点严重,最后查出来是推理时图像缩放的尺寸和校准集不统一。后来把校准集按白天/黄昏各一半,INT8的掉点才控制在0.5以内。每次部署换了光照环境,都要重新校准一轮,不能一劳永逸。如果你的项目也要把YOLOv11部署到Jetson Nano这类边缘设备,务必先固化图像预处理参数,再动量化配置,这个顺序能省很多排查时间。希望帮到你。

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

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

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

立即咨询