拓冰建站拓冰建站
首页 / 资讯中心 / 正文

YOLOv11多作物叶片病害识别:从数据集构建到TensorRT部署

简介这是一份面向农业科技从业者、计算机视觉开发者和科研人员的实战技术文档系统讲解将YOLOv11应用于作物叶片分析与病害识别的完整技术链路与落地实施要点。资源为单个PDF文件压缩包大小仅1.94MB共26页支持目录跳转与阅读器大纲定位便于按章节快速查阅。内容从精准农业与作物病害识别背景切入详细展开YOLOv11的网络结构、损失函数与训练过程并覆盖多作物叶片数据集的采集、标注、预处理等关键环节。同时梳理了从图像预处理、特征提取到目标检测与病害分类的实现流程并结合小麦、温室蔬菜、果园果树等真实案例给出可落地的系统构建与效果评估思路。文档目录完整、章节闭环目前已有62人浏览学习适合需要快速掌握YOLOv11农业智能识别全流程并构建相关技术方案的读者参考。1. 精准农业落地为什么我选 YOLOv11 做多作物叶片病害识别做农业视觉项目的人多少都经历过这种尴尬模型在公开数据集上 mAP 漂亮一到田间地头就翻车——光照一变、叶片重叠、病害早期症状不明显检测框就开始乱飘。我拆这份《精准农业落地-YOLOv11多作物叶片分析技术与病害识别全流程详解》时最直接的感受是它没有停留在“YOLOv11 很厉害”这个层面而是把从数据采集、标注规范、预处理、训练调参到落地部署的整条链路都串起来了。YOLOv11 相比前代最大的优势在于单阶段检测的实时性和轻量骨干网络的平衡这正好命中农业场景的两个硬需求设备算力有限、田间反馈要快。这份资源适合谁不是刚跑通 MNIST 的新手而是手里有作物图像、准备做病害检测但又不想从零攒经验的从业者。它能帮你少走至少一轮“数据白标、训练白跑”的弯路。2. YOLOv11 网络结构与损失函数先把黑匣子拆开再训练2.1 从 YOLOv1 到 YOLOv11单阶段检测的演进逻辑YOLO 系列的核心思路一直没变把目标检测当作回归问题一次前向传播同时输出类别和位置而不是像 Faster R-CNN 那样先提候选区域再分类。这个设计决定了它的速度下限天然比两阶段算法高一个量级。从 YOLOv1 到 YOLOv11每一代的主要工作都围绕三个方向展开骨干网络的特征提取能力、颈部网络的多尺度融合、检测头的回归精度。YOLOv11 在结构上的改变主要体现在骨干网络更轻量结合了深度可分离卷积和残差结构。这一点对农业场景特别关键。我在实际项目里用过 YOLOv5 和 YOLOv8到了 YOLOv11 最直观的感受是同等精度下模型体积更小Jetson Nano 这类边缘设备也能跑得动。如果只是做实验YOLOv5 够用如果要上田间设备YOLOv11 的轻量优势就体现出来了。2.2 从输入到输出YOLOv11 的四个关键模块YOLOv11 的网络结构可以分成四段理解输入层、骨干网络、颈部网络、检测头。输入层通常把图像缩放到 640×640这个尺寸是速度和精度之间的折中。如果叶子上的病斑很小比如只有十几个像素可以试试 1280 的输入但训练时间和显存占用会明显上涨。我一般先跑 640 看基线再根据小目标占比决定要不要升分辨率。骨干网络负责提特征。YOLOv11 用的轻量骨干结合了深度可分离卷积和残差块。深度可分离卷积把标准卷积拆成逐通道卷积和逐点卷积两步参数量能降不少残差块则保证网络加深时梯度不会消失。以下是 PyTorch 实现深度可分离卷积的参考写法import torch import torch.nn as nn class DepthwiseSeparableConv(nn.Module): def __init__(self, in_channels, out_channels, kernel_size3, stride1, padding1): super(DepthwiseSeparableConv, self).__init__() self.depthwise nn.Conv2d( in_channels, in_channels, kernel_sizekernel_size, stridestride, paddingpadding, groupsin_channels ) self.pointwise nn.Conv2d(in_channels, out_channels, kernel_size1) def forward(self, x): x self.depthwise(x) x self.pointwise(x) return xgroupsin_channels是深度可分离卷积的关键参数它让每个通道独立做卷积不做跨通道融合后面的1×1卷积再负责通道间的信息交互。这个结构用在骨干网络的中间层可以明显减少参数量代价理论上是表达能力的轻微下降但在叶片纹理这类中等复杂度特征上影响很小。颈部网络用的是 FPN 加 PAN 的组合。FPN 从顶层向下传递语义信息PAN 从底层向上传递定位信息两者结合保证不同尺度的叶片和病斑都能被检测头覆盖。检测头则在多个尺度的特征图上分别预测边界框、置信度和类别概率。2.3 损失函数的三个组成部分与实现细节YOLOv11 的损失函数由边界框损失、置信度损失、类别损失三部分组成。边界框损失用的是 CIoU它在 IoU 基础上额外考虑了中心点距离和宽高比。这个设计对农业场景很重要病斑区域经常是细长或不规则形状单纯用 IoU 对这类目标不敏感CIoU 能把预测框往真实框的中心和形状方向拉。import torch def ciou_loss(pred_boxes, target_boxes): # 交集区域 x1 torch.max(pred_boxes[:, 0], target_boxes[:, 0]) y1 torch.max(pred_boxes[:, 1], target_boxes[:, 1]) x2 torch.min(pred_boxes[:, 2], target_boxes[:, 2]) y2 torch.min(pred_boxes[:, 3], target_boxes[:, 3]) intersection torch.clamp(x2 - x1, min0) * torch.clamp(y2 - y1, min0) # 并集区域 pred_area (pred_boxes[:, 2] - pred_boxes[:, 0]) * (pred_boxes[:, 3] - pred_boxes[:, 1]) target_area (target_boxes[:, 2] - target_boxes[:, 0]) * (target_boxes[:, 3] - target_boxes[:, 1]) union pred_area target_area - intersection iou intersection / union # 最小外接矩形 c_x1 torch.min(pred_boxes[:, 0], target_boxes[:, 0]) c_y1 torch.min(pred_boxes[:, 1], target_boxes[:, 1]) c_x2 torch.max(pred_boxes[:, 2], target_boxes[:, 2]) c_y2 torch.max(pred_boxes[:, 3], target_boxes[:, 3]) c2 (c_x2 - c_x1) ** 2 (c_y2 - c_y1) ** 2 # 中心点距离 center_pred torch.stack(((pred_boxes[:, 0] pred_boxes[:, 2]) / 2, (pred_boxes[:, 1] pred_boxes[:, 3]) / 2), dim1) center_target torch.stack(((target_boxes[:, 0] target_boxes[:, 2]) / 2, (target_boxes[:, 1] target_boxes[:, 3]) / 2), dim1) d2 torch.sum((center_pred - center_target) ** 2, dim1) # 宽高比惩罚项 v (4 / (torch.pi ** 2)) * torch.pow( torch.atan((target_boxes[:, 2] - target_boxes[:, 0]) / (target_boxes[:, 3] - target_boxes[:, 1])) - torch.atan((pred_boxes[:, 2] - pred_boxes[:, 0]) / (pred_boxes[:, 3] - pred_boxes[:, 1])), 2) alpha v / (1 - iou v) ciou iou - (d2 / c2 alpha * v) return (1 - ciou).mean()这段代码里最容易忽略的是torch.atan的数值稳定性。当真实框或预测框的宽高接近 0 时反正切函数的值会不稳定导致v出现异常。实际训练时我会在宽高上做clamp比如限制最小为 1避免这种边界情况。置信度损失和类别损失都采用二元交叉熵。置信度损失需要处理正负样本不平衡——图像里大部分区域是背景只有少数区域有叶片或病斑。交叉熵本身对这个问题有一定容忍度但建议配合focal loss使用尤其是在病斑目标很小、数量很少的数据集上。3. 多作物叶片数据集的构建与预处理标注质量决定模型上限3.1 数据集构建的三个来源与多样性策略模型效果的上限在数据标注完成那一刻就定死了。YOLOv11 只是一个拟合工具它能把标注里的规律学到极致但不可能凭空学到标注里不存在的信息。所以数据集的来源和多样性必须认真设计。数据来源主要有三个渠道。实地拍摄是最可靠的但要注意拍摄时段和光照。以小麦锈病为例晴天上午 9 点到 11 点之间光照均匀叶片颜色还原最准确正午强光下叶片反光严重病斑颜色会偏淡。农业科研机构的数据通常标注规范但获取门槛高需要合作渠道。公开数据集如 PlantVillage 可以补充类别多样性但它的图像背景单一、光照条件理想直接用会与田间场景产生分布偏移。多样性方面要覆盖四个维度作物种类、病害类型、生长阶段、环境条件。以番茄为例幼苗期和结果期的叶片形态差异很大早疫病和晚疫病在叶片上的表现也不同。如果只收集某个生长阶段的图像模型到了实际场景里遇到其他阶段的叶片就会识别不准。环境条件同样关键我见过一个项目因为训练集里全是晴天拍摄的图像一到阴天模型精度掉了 15 个点。3.2 标注工具与规范边界框怎么框才算合格标注工具常用 LabelImg 或 RectLabel。LabelImg 免费开源输出 PASCAL VOC 格式的 XML 文件后续可以转成 YOLO 格式的 txt。在选择标注工具时优先考虑能直接导出 YOLO 格式的工具能省一步转换的麻烦。标注规范里最容易犯的错是边界框框得太大。很多人习惯把叶片整个框进去但病害识别关注的是病斑区域框得过大等于把大量健康叶片组织也塞进了正样本模型会学到错误的目标边界。正确的做法是让边界框紧贴病斑边缘宁可稍微小一点也不要留太多背景。# LabelImg 保存的 VOC XML 转 YOLO txt # class_id x_center y_center width height归一化坐标 # 命令行环境需要安装 lxml python voc_to_yolo.py --input annotations/ --output labels/ --classes classes.txt转换脚本的逻辑是读取 XML 里的bndbox坐标计算中心点和宽高再除以图像宽高完成归一化。注意 YOLO 格式要求x_center和width都除以图像宽度y_center和height都除以图像高度很容易搞混。多病害同时发生在一片叶子上时需要分别标注不同病害区域不能合并成一个框。标注质量控制建议双人标注加抽样检查。双人标注的做法是选 10% 的图让两个人独立标计算 IoUIoU 低于 0.8 的样本拿出来讨论抽样检查则在每批次标注完成后随机抽 5% 复查。这个流程看着繁琐但能避免后期训练时发现标注错误再返工。3.3 图像清洗与增强我常用的三个预处理脚本采集到的原始图像不可能直接进训练集。模糊图像和重复图像必须清洗掉否则等于主动给模型喂噪声。import cv2 def is_blurry(image, threshold100): gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) fm cv2.Laplacian(gray, cv2.CV_64F).var() return fm threshold拉普拉斯方差是判断图像模糊程度最常用的指标。它计算图像二阶导数的方差值越小说明图像越平坦、越模糊。threshold100是我在叶片图像上的经验值你可以先对一批人工分好类的清晰/模糊图算出各自的方差分布再取分界值。不同相机、不同分辨率的图像这个阈值会变不建议无脑套。import imagehash from PIL import Image def is_duplicate(image1_path, image2_path, threshold5): hash1 imagehash.phash(Image.open(image1_path)) hash2 imagehash.phash(Image.open(image2_path)) return abs(hash1 - hash2) threshold感知哈希把图像压缩成 64 位哈希值两张图哈希差异小于threshold就判定为重复。这个脚本在数据收集阶段特别有用因为从公开数据集和实地拍摄收集来的图像经常有重复或近似重复不清理会造成训练集和验证集数据泄露让评估结果虚高。图像增强方面几何变换优先做旋转和翻转因为田间拍摄角度天然多样颜色变换里亮度调整最重要光照变化是农业场景最大的干扰源噪声增强我一般不加真实场景的噪声模型复杂加了高斯噪声反而可能让模型学到不真实的特征。import cv2 import numpy as np def adjust_brightness(image, factor): hsv cv2.cvtColor(image, cv2.COLOR_BGR2HSV) h, s, v cv2.split(hsv) v np.clip(v * factor, 0, 255).astype(hsv.dtype) hsv cv2.merge((h, s, v)) return cv2.cvtColor(hsv, cv2.COLOR_HSV2BGR)这个函数把图像转到 HSV 空间只调整 V 通道亮度不动 H色相和 S饱和度。这样做的好处是病斑颜色不会被破坏。factor在 0.5 到 1.5 之间随机取值相当于模拟从阴天到强光的不同光照条件。直接在 BGR 空间乘系数会连带改变颜色饱和度效果不如 HSV 空间自然。3.4 数据划分的讲究不能随机分要按来源分数据划分是数据集构建里最容易被低估的一步。很多人直接用train_test_split随机划分但这个做法在农业场景有隐患同一株作物、同一块田里采集的多张图像高度相似随机划分会把相似图像分到训练集和验证集导致验证指标虚高。from sklearn.model_selection import train_test_split def split_dataset(data, labels, train_ratio0.8, val_ratio0.1): train_data, test_data, train_labels, test_labels train_test_split( data, labels, test_size1 - train_ratio, random_state42) val_data, test_data, val_labels, test_labels train_test_split( test_data, test_labels, test_size(1 - train_ratio - val_ratio) / (train_ratio val_ratio), random_state42) return train_data, train_labels, val_data, val_labels, test_data, test_labelsrandom_state42保证划分结果可复现排查问题时可以回溯。更严谨的做法是同一个采集批次或同一块田的图像整体划分到同一个集合避免跨集合信息泄露。如果数据集中某些病害类别样本很少考虑按类别做分层采样而不是纯随机。4. YOLOv11 模型训练与优化环境配置、参数调整与过拟合排查4.1 训练环境搭建硬件选型和软件安装训练 YOLOv11 对硬件的要求没有想象中高但也不能太寒酸。我的经验是个人项目 RTX 3060 12G 起步这个显存刚好能跑 640 输入、batch size 16 的训练如果是多作物多病害的大数据集建议上 RTX 4090 或 Tesla A100。CPU 至少 8 核内存 16G 起步数据加载和数据增强很吃 CPU 性能。软件环境方面Linux 是首选Ubuntu 18.04 以上版本对 PyTorch 和 CUDA 的支持最省心。Windows 也能跑但编译某些算子时会遇到兼容问题。安装 PyTorch 时要注意 CUDA 版本和显卡驱动匹配用错了版本会出现CUDA error: no kernel image is available之类的报错。# 适配 CUDA 11.3 的 PyTorch 安装示例 pip install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu113安装完后建议先跑一段小代码验证 GPU 是否可用不要直接开始训练。常见的问题是 PyTorch 装了 CPU 版本代码能跑但速度极慢模型训练需要几十个小时白白浪费时间。4.2 配置文件解读与关键参数调整YOLOv11 的配置文件把模型结构和训练参数分得很清楚我从实际项目出发讲几个最关键的参数。# 模型结构相关配置 model: backbone: efficientnet_b0 neck: PANet head: YOLOHead # 训练参数配置 train: batch_size: 16 epochs: 100 learning_rate: 0.001 optimizer: Adam # 数据相关配置 data: train_path: data/train.txt val_path: data/val.txt num_classes: 10batch_size的调整逻辑很简单显存不够就减半训练速度太慢就翻倍。但批量大小和学习率是联动的批量翻倍时学习率也可以相应调大否则收敛速度会变慢。epochs没有固定标准我一般先跑 100 轮观察验证集损失在哪个 epoch 开始不再下降再用早停机制截断。learning_rate是最敏感的参数0.001 是 Adam 优化器下比较稳妥的起点。如果损失曲线震荡严重降到 0.0001 再试。import torch.optim as optim from torch.optim.lr_scheduler import StepLR optimizer optim.Adam(model.parameters(), lr0.001) scheduler StepLR(optimizer, step_size10, gamma0.1) for epoch in range(100): # 训练代码 # ... scheduler.step()StepLR每 10 个 epoch 把学习率乘以 0.1这是比较激进的学习率衰减策略。更平滑的做法是用CosineAnnealingLR或ReduceLROnPlateau。ReduceLROnPlateau在验证损失不再下降时自动降低学习率省去手动观察的麻烦我现在的项目基本都用它。4.3 数据加载与训练循环的关键细节数据加载用 PyTorch 的Dataset和DataLoader组合。YOLOv11 的数据加载不只是读图像还要同步读对应的标注文件做随机增强并转换成模型需要的张量格式。import torch from torch.utils.data import Dataset, DataLoader import cv2 class CropLeafDataset(Dataset): def __init__(self, data_path, transformNone): self.data [] with open(data_path, r) as f: for line in f.readlines(): self.data.append(line.strip()) self.transform transform def __len__(self): return len(self.data) def __getitem__(self, idx): image_path self.data[idx] image cv2.imread(image_path) image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) if self.transform: image self.transform(image) # 读取对应 label 并转换格式 label self.parse_label(image_path) return image, label这里最容易踩坑的是cv2.imread读出来的图像是 BGR 顺序如果不转成 RGB 直接送入模型模型的检测效果会大打折扣尤其是对颜色敏感的病害识别。另一个常见问题是图像读取失败后没有处理None返回值训练到中途会直接报错中断所以建议在__getitem__里加上读取失败的保护逻辑。4.4 过拟合处理与超参数优化三个必查项训练过程中最先要盯的是训练损失和验证损失的差距。如果训练损失持续下降而验证损失不再下降甚至上升说明模型开始记住训练集的细节没有学到可泛化的特征。我处理过拟合有三个优先等级的操作。第一优先是数据增强强度把旋转角度从 10 度加大到 30 度、翻转和亮度调整全开这是成本最低的手段。第二优先是加正则化YOLOv11 通常带有 weight decay默认值 0.0005可以试着调到 0.001。第三优先才考虑减小模型复杂度或换更小的骨干网络。超参数优化的优先级排序是学习率 批量大小 输入分辨率 骨干网络。学习率不对其他参数调得再好都白搭。批量大小影响训练的稳定性和泛化性能。输入分辨率影响小目标的检测效果。模型保存与加载方面建议每个 epoch 都保存权重而不是只保存最后一轮。我习惯保留验证集 mAP 最高的权重作为最终模型同时保留最后一轮的权重用于分析训练过程。有些训练工具支持best.pt和last.pt分开存这个习惯很值得沿用。5. 避坑指南训练和落地中最常踩的六个坑5.1 数据泄露导致评估指标虚高现象训练集和验证集指标都很漂亮但模型放到新采集的图像上表现暴跌。原因同一株作物、同一块田拍摄的相似图像被随机划分到了训练集和验证集。模型实际上记住了这些图像的背景特征而不是病斑本身。解决按采集批次或地块进行分组划分。先把数据按拍摄时间、地点分组再按组划分训练集和验证集保证一组图像不会同时出现在两个集合里。这个操作能立刻让评估指标回落但那个回落后才是真实水平。5.2 标注框偏移导致训练无法收敛现象训练损失一开始能下降但到了一定程度就卡住不再动了验证集 mAP 也上不去。原因部分标注框没有紧贴目标边缘框得过大或过小。YOLO 的回归目标对标注噪声敏感标注框不准确会直接干扰边界框损失的计算。解决标注阶段就做质量控制按 3.3 节的方法进行双人标注和抽样检查。如果已经训练完了才发现问题用置信度筛选出验证集里预测效果最差的图像人工复查标注质量把明显错误的标注修正后重新训练。5.3 学习率设置不当导致损失震荡或收敛过慢现象损失曲线在某个区间内剧烈震荡或者下降速度极其缓慢训练 100 轮 mAP 还不到 0.3。原因学习率太大导致参数更新步长过大模型在最优解附近来回跳动学习率太小则参数更新太慢陷入鞍点或收敛时间过长。解决先让模型跑 3 到 5 个 epoch观察初始损失的变化趋势。如果初始损失出现大幅波动把学习率除以 10如果损失下降得几乎看不出来把学习率乘以 10。确定一个合适的量级后再用CosineAnnealingLR或ReduceLROnPlateau做衰减。5.4 类别不平衡导致少数病害类被忽略现象常见病害类别的 mAP 达到 0.8 以上但罕见病害类别的 AP 不到 0.1预测结果几乎全部集中在常见类别。原因数据集中常见病害样本数量远多于罕见病害。模型学到的最优策略是全部预测为常见类别因为这样整体损失最小。解决两类做法配合使用。数据层面对罕见病害类别做过采样让每个类别在训练集中至少有 200 张图损失函数层面对类别损失引入权重系数罕见类别的权重设得更高。如果罕见病害类型实在收集不到足够样本建议直接舍弃这个类别不要让它在数据集里凑数。5.5 输入分辨率不足导致小病斑检不出现象叶片上的早期病斑只有十几个像素训练时损失正常推理时这些病斑完全检测不到。原因640×640 输入经过骨干网络多次下采样后小目标的特征图尺寸太小信息已经丢失。YOLOv11 的多尺度检测虽然能覆盖不同大小的目标但对极小目标仍然力不从心。解决把输入分辨率从 640 提升到 1280代价是训练时间增加约 3 倍、显存需求成倍增长。另一种做法是只在推理时用更高分辨率做测试时增强训练保持 640 不变也能在一定程度上提升小目标召回率。5.6 边缘设备部署时模型跑不动现象训练时模型在 GPU 上检测速度有 100 FPS部署到边缘设备后只有不到 5 FPS无法满足实时监测需求。原因训练环境用的是 RTX 3090 或 A100边缘设备是 Jetson Nano 或树莓派算力差距太大。模型没有做剪枝和量化推理耗时和显存占用都超了设备上限。解决训练完成后先用 TensorRT 对模型做 FP16 或 INT8 量化通常能带来 2 到 4 倍的加速。如果量化后精度损失过大检查模型里是否有对量化不友好的算子比如某些激活函数尽量替换成量化友好的版本。再不行就换更小的骨干网络或降低输入分辨率。6. 四步验证法与 TensorRT 部署让模型真正在田里跑起来模型训练完不算结束真正检验成果的是部署后的实际表现。我总结了一套四步验证法每次模型交付前都按这个流程过一遍。第一步是数据分布验证。拿一批训练集里完全没出现过的新采集图像用训练好的模型做推理统计预测结果的置信度分布。正常情况是大部分正确预测的置信度在 0.6 以上如果置信度普遍偏低说明模型对真实场景的把握不足需要补充数据继续训练。第二步是病害严重程度分级验证。目标检测只能告诉我叶片上有病斑但农户需要知道病害到底严不严重、要不要马上打药。我的做法是对检测到的病斑区域做像素级分类计算病斑面积占叶片总面积的比例按 10%、30%、50% 分成轻、中、重三级。这一步可以在 YOLOv11 检测结果的基础上叠加一个轻量分割网络也可以用图像阈值分割做近似估计。第三步是误报率分析。把模型预测结果里有病斑但人工确认是健康的图像单独收集定期分析误报原因。我遇到过的误报来源包括叶片上的露珠被识别为病斑、机械损伤痕迹被识别为真菌病斑、品种本身的花青素沉积被识别为病害。每一类误报都有对应的处理方法比如在训练集里加入露珠和机械损伤的负样本。第四步是端到端推理验证。在目标设备上用实际采集的图像跑完整链路统计单帧推理耗时要控制在多少毫秒以内以及模型在连续运行多小时后是否出现内存泄漏或推理卡顿。import cv2 import torch # 加载 YOLOv11 模型 model torch.hub.load(ultralytics/yolov11, custom, pathbest.pt) # 推理单张图像 img cv2.imread(field_sample.jpg) results model(img, conf0.25, iou0.5) # 保存推理结果 for i, det in enumerate(results[0].boxes): x1, y1, x2, y2 det.xyxy[0].tolist() cls int(det.cls[0]) conf float(det.conf[0]) cv2.rectangle(img, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2) cv2.putText(img, f{class_names[cls]} {conf:.2f}, (int(x1), int(y1)-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.imwrite(result.jpg, img)conf0.25是置信度阈值低于这个值的检测结果会被丢弃。田间场景建议用 0.25 而非默认的 0.5因为早期病斑的置信度天然偏低阈值设太高会漏检。iou0.5是非极大值抑制的 IoU 阈值同一病斑被多个框覆盖时保留重叠度最高的框。如果部署在 Jetson Nano 上先导出 ONNX 再转 TensorRT 引擎# 导出 ONNX yolo export modelbest.pt formatonnx imgsz640 # 转 TensorRT FP16 trtexec --onnxbest.onnx --saveEnginebest_fp16.engine --fp16TensorRT 转换的边界条件要注意输入尺寸必须固定动态尺寸在边缘设备上会拖慢推理速度FP16 量化对大部分数据集精度损失在 0.5 到 1 个 mAP 点以内如果数据集本身标注噪声大这个损失基本感知不到。从那次在田间部署翻车之后我养成了一个习惯任何模型在交付前都必须按四步验证法走一遍完整流程数据分布、严重程度分级、误报率分析、端到端推理缺一不可。每一步都可能推翻前面所有工作但正是这些推翻的机会才是这份资源里最值钱的部分。希望帮到你。本文还有配套的精品资源点击获取
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门