尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

YOLOv8实战全指南:环境配置、数据标注与模型部署避坑

发布时间:2026/9/29 15:12:43

资讯中心
01
ARTICLE

YOLOv8实战全指南:环境配置、数据标注与模型部署避坑

YOLOv8实战全指南:环境配置、数据标注与模型部署避坑
简介《YOLOv8技术基础与实战第一版》是面向目标检测和深度学习读者的PDF文档从YOLO单阶段预测思想出发系统梳理v1至v8的演进脉络讲解多尺度特征提取、上下文编码、损失函数改进及锚框调整等关键点并讨论小物体与遮挡场景的应对方案。资源包内仅1个PDF文件约29.18MB独立完整便于离线阅读。已有433人学习/浏览是入门YOLOv8的热门资料。文档还覆盖AP/mAP评估指标与非极大值抑制NMS原理结合自动驾驶、视频监控、农业检测等场景给出数据预处理、模型训练、测试与部署的完整流程并通过实际案例说明如何按任务选择模型与硬件平台、平衡速度与精度帮助读者建立从理论到实战的清晰路径。1. YOLOv8到底是什么一个被误当作「模型」的实战工具箱第一次听说YOLOv8的人多数会先去翻网络结构图把C2f、SPPF、解耦头这些名词抄进笔记然后在环境配置上卡一整天。可无论是做毕业设计还是要在rk3588/Orin这类设备上部署检测都不该从结构图开始。这份《YOLOv8技术基础与实战(第一版)》走的是相反路径先建立从环境到数据的完整复现链路再回头解释结构。反直觉的是真正拖慢进度的从来不是模型本身而是数据格式、依赖版本和训练参数这些「细枝末节」。它适合刚拿到数据集的新手、用GTX 1660 Ti这类6G显存卡硬训模型的人以及想给YOLOv8加注意力机制做改进的进阶者。有NVIDIA显卡最好只有CPU也能跑通流程只是慢。下面按我实际项目里的固定顺序讲装环境、转数据、训模型、导出部署。2. 从零把环境跑通venv、CUDA版本与ultralytics的安装细节在装任何东西之前先明确一件事YOLOv8不是某个单独的模型文件而是由ultralytics这个Python包统一提供的检测、分割、姿态、分类四项能力。所以「YOLOv8哪里下载」这个问题官方答案就一条路pip安装ultralytics包。很多人被各种博客里的「源码编译」「下载release包」绕晕其实大多数情况完全不需要。接下来按我自己的安装顺序讲每一步都给出命令和判断标准。2.1 装之前先分清你要的是YOLOv8检测、分割还是姿态模型同一个包模型入口靠后缀区分。yolov8n.pt是检测模型yolov8n-seg.pt是实例分割yolov8n-pose.pt是人体姿态yolov8n-cls.pt是图像分类。中间字母n代表nano往上是s、m、l、x体积和精度依次增加。对第一次训练自己数据集的人来说选n或s起步最稳后面会解释为什么。常见做法是先创建项目目录把所有文件放进去再装包mkdir yolo_project cd yolo_project python3 -m pip install --upgrade pip python3 -m pip install ultralytics参数说明mkdir之后的工作目录就是后续所有yolo命令的运行根目录权重文件会下载到这里项目不会散落在系统各路径。pip install ultralytics会自动拉取torch、torchvision、opencv-python、pandas等依赖不需要手动逐个装。如果本机已有旧版本torch建议先确认版本兼容性或在后续venv里重新装。使用python3 -m pip而不是直接pip能避免系统里多个Python版本并存时pip装到了一个你不用的解释器上。还要注意Python版本。ultralytics对Python有版本要求开发环境一般用3.8到3.12之间的版本都能跑低于3.8会在导入时报语法错误高于3.12可能遇到某个依赖还没适配。用python3 --version先确认不符合就换一个干净Python。2.2 用venv隔离环境YOLOv8安装失败的后悔药我见过太多人把torch直接装进系统Python半年后系统包升级opencv和torch互相打架最后只能重装系统。给YOLOv8开一个独立的venv虚拟环境成本低又留了后悔药是新手最该养成的习惯。venv不是conda它不额外管理CUDA只隔离Python包对大多数机器足够用。python3 -m venv ~/yolo_env source ~/yolo_env/bin/activate python -m pip install --upgrade pip python -m pip install ultralytics参数说明第一行创建虚拟环境目录之后想彻底卸载删除~/yolo_env这个文件夹即可不影响系统。source激活后命令行前缀会出现(yolo_env)。下次开新终端需要先执行这条再操作。注意先激活虚拟环境再装包否则pip会把包装进系统路径。可以用which python确认当前解释器是否在虚拟环境里。如果机器上装了Anaconda用conda create -n yolo python3.10也行道理相同。不同之处只是conda环境全局管理venv更轻。不要把两个混在一台机器上处理同一个项目会给自己挖坑。提示如果你的机器上装有多个Python版本确认正在用的是哪个可以用which python检查venv里pip和python一定来自同一个解释器但系统里混装时经常出现pip装到另一个Python的情况。2.3 CUDA版本对齐为什么PyTorch装对了YOLOv8才能跑ultralytics本身不直接调用CUDA它调用的是PyTorch。PyTorch编译时绑定了某个CUDA运行时版本比如cu118、cu121这个版本要和显卡驱动兼容。很多人误以为nvidia-smi里显示的CUDA版本就是该装哪个其实nvidia-smi显示的是驱动支持的「最高CUDA版本」装低于它的cu118或cu121都能跑。判断步骤是先看驱动够不够新再装对应PyTorch最后用import torch检查。常见组合见下表。显卡驱动CUDA版本建议PyTorch安装索引适用场景11.xcu118老显卡、老驱动12.xcu121或cu124近三年主流显卡安装示例以CUDA 12.1为例python -m pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121注意上面的URL是PyTorch官方为CUDA 12.1预编译的轮子索引版本号以你运行时PyTorch官方页面为准。如果机器没有NVIDIA显卡就不要加--index-url直接装CPU版torch后面所有训练也能跑只是慢得多。安装完成后运行下面命令验证python -c import torch, torchvision; print(torch.__version__, torch.cuda.is_available())输入里如果是True说明CUDA路径可用如果是False常见原因是装成了CPU版torch或者驱动太旧。不要往下训练先解决这个。2.4 验证环境用官方权重跑一次推理装好之后先不碰自己的数据用官方权重跑一次推理确认整条链路是通的。这一步能省掉后面排查环境的时间。yolo predict modelyolov8n.pt sourcebus.jpg参数说明bus.jpg是官方测试图也可以换成任意一张你电脑里的jpg第一次运行会自动下载yolov8n.pt权重到当前工作目录。命令执行完会在当前目录的runs/detect/predict里生成标注好框的图片。看到绿色框和类别名说明安装、推理链路全部正常。如果卡在「Downloading」说明当前网络下权重下载不畅后面的避坑章节有离线应对办法。验证通过后环境部分就算完成。此时再回头去看YOLOv8的检测头结构、anchor free的匹配策略都会轻松很多——你已经知道它输出的是「每张图若干目标框类别」结构图只是解释框是怎么算出来的。下一章处理最关键的数据环节。3. 把自己的数据喂进去VOC转YOLO格式与目录结构的四个边界坑模型结构再清楚数据格式错了也白搭。训练自己数据集最常见的翻车点不是模型而是标注文件。YOLOv8要求每个图片对应一个同名TXT每行一个目标写的是归一化后的中心点坐标。网上能找到的大多数老数据集是VOC的XML或者COCO的JSON直接拿来训是跑不起来的。3.1 YOLO标注格式的本意归一化坐标为什么比像素坐标好用一行TXT的完整格式是类别序号 x_center y_center width height类别序号从0开始计数四个数值全是相对于图片宽高的比例范围在0到1之间。比如一张宽1000、高800的图里一个框左上角(200,300)、右下角(700,600)转换成YOLO格式就是中心点((200700)/2450, (300600)/2450)宽500高300除以图宽高得到0.45、0.5625、0.5、0.375。好处是不管训练时把图缩放到640还是480标注都不需要跟着改模型会在训练内部统一做letterbox缩放。这也是为什么YOLOv8训练时换imgsz不需要重新标注。VOC的XML把坐标写成像素绝对值COCO的JSON把框写成[x,y,w,h]像素值它们都要先做一次换算。因此任何「从别人的训练脚本里直接抄数据加载代码」的做法在YOLOv8里都没必要你只要把标注转成TXT剩下交给ultralytics自己处理。3.2 VOC XML转YOLO TXT转换脚本与四个边界坑最常用的做法是写一个Python脚本做转换逐个读取XML文件把像素坐标归一化后写成TXT。下面这个脚本是我常用来处理Pascal VOC格式数据集比如动物识别项目的版本逻辑精简过能直接改classes列表后用。import xml.etree.ElementTree as ET from pathlib import Path classes [cat, dog] # 顺序必须与 data.yaml 的 names 完全一致 src_xml Path(VOC/Annotations) out_txt Path(VOC/labels) def voc_to_yolo(xml_path: Path): tree ET.parse(xml_path) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) lines [] for obj in root.iter(object): name obj.find(name).text if name not in classes: continue box obj.find(bndbox) x1 float(box.find(xmin).text) y1 float(box.find(ymin).text) x2 float(box.find(xmax).text) y2 float(box.find(ymax).text) # 中心点与宽高再统一除以图片宽高做归一化 cx (x1 x2) / 2.0 / w cy (y1 y2) / 2.0 / h bw (x2 - x1) / w bh (y2 - y1) / h lines.append(f{classes.index(name)} {cx:.6f} {cy:.6f} {bw:.6f} {bh:.6f}) out_txt.mkdir(parentsTrue, exist_okTrue) (out_txt / (xml_path.stem .txt)).write_text(\n.join(lines)) for xml_file in src_xml.glob(*.xml): voc_to_yolo(xml_file) print(done)代码逻辑说明第5行classes列表是全局映射转换后TXT里的第一个数字就是classes的索引这一步错了后面mAP必为0。第13到16行先取图片宽高后面对所有坐标统一除以它得到0到1的比例值。cx(x1x2)/2/w这种写法比先算像素中心再归一化更直接两个公式等价。第21行强制格式化到6位小数目的是统一精度避免训练时读到科学计数法导致解析异常。转换的四个边界坑XML里的width/height和图片真实尺寸不一致常见于数据集被人裁剪后XML没更新。转换后务必抽几张图用3.4的可视化脚本核对框位置。有的XML文件存在没有bndbox的object被标注者标记为difficult要单独处理或者直接continue跳过否则int()转换会报错。类别名大小写要敏感比如Cat和cat会被当成两个类转换脚本里的classes和data.yaml里要完全一致。输出TXT的文件名必须和图片文件名完全同名只换后缀YOLOv8是按stem匹配图和标注的任何不匹配都会让这张图变成无标注的负样本。注意转换脚本里classes列表和后续data.yaml的names必须来自同一个文件。我一般把两个类名先写在一份总配置里转换和训练共用避免两份配置在项目中途漂移。3.3 data.yaml配置YOLOv8训练入口最容易错的地方转到TXT之后还需要一个data.yaml告诉训练器去哪里找图片和标注。这个文件的格式是固定的我一般放在数据集根目录下。path: /home/user/datasets/animals train: images/train val: images/val names: 0: cat 1: dog参数说明path是数据集根目录的绝对路径train和val是相对于path的子目录路径里面直接放图片。关键点labels目录不用写在yaml里。ultralytics会在每个子目录的同级处自动找labels即images/train对应labels/train。目录结构必须是「images/train放图、labels/train放TXT」这种镜像关系。val这一项必须写不能删。只写train的话训练时没有验证集最后的mAP曲线全为空你会不知道模型到底有没有收敛。names的序号和转换脚本里的classes顺序一一对应从0开始。如果你把cat设为1、dog设为0转换脚本没改训练就会把两个类别完全学反。3.4 画框检查训练前把标注可视化一遍数据转换完先别急着训花时间把标注画到图片上看一遍能拦下大量后面查几小时的问题。这一步我几乎每次数据集到手都会做。import cv2 from pathlib import Path img_dir Path(images/train) lab_dir Path(labels/train) out_dir Path(check_imgs) out_dir.mkdir(exist_okTrue) for img_path in sorted(img_dir.glob(*.jpg)): img cv2.imread(str(img_path)) h, w img.shape[:2] lab_file lab_dir / (img_path.stem .txt) if not lab_file.exists(): continue for line in lab_file.read_text().strip().splitlines(): cls, cx, cy, bw, bh map(float, line.split()) x1 int((cx - bw / 2) * w) y1 int((cy - bh / 2) * h) x2 int((cx bw / 2) * w) y2 int((cy bh / 2) * h) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) cv2.putText(img, str(int(cls)), (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imwrite(str(out_dir / img_path.name), img)说明第12行把归一化中心坐标换算回像素坐标画框如果框明显偏移或超出图片边界说明转换脚本里XML和图片尺寸对不上。第14行的int()强制转换会排查掉解析错误如果某个TXT里出现了大于1的坐标画出来的框会飞出图像。建议随机抽样20到40张图看不只看画得对不对还要看有没有把目标框漏掉。漏框会直接导致模型把「没有框」当正确答案学。4. 训出第一个模型batch、epochs、imgsz与学习率参数的落地含义数据就绪后进入训练环节。YOLOv8的训练入口是yolo命令但它暴露了二三十个参数新手最容易在这步晕。我按使用频率把参数分成「必须调」「偶尔调」「基本不动」三档逐个讲清楚。4.1 YOLOv8训练最小命令从预训练权重起步最小可用的训练命令比很多人想象的简单yolo detect train \ datadata.yaml \ modelyolov8n.pt \ epochs100 \ imgsz640 \ batch16参数说明modelyolov8n.pt这一行同时做了两件事指定用yolov8n这个结构的预训练权重并继承它在COCO上学到的特征。对数据量几千张的小数据集来说从预训练开始比从零训yaml结构收敛快得多。epochs100是总训练轮数数据量小或时间紧可以先跑50后面看曲线再决定加不加。imgsz640是训练分辨率ultralytics内部会自动对原图做letterbox不需要你手动resize。batch16是每轮每张卡同时处理的图片数它直接决定显存占用和梯度更新的平滑度。新手常犯的错误是直接把batch拉到最高然后OOM。如果项目中途中断机器上已经存在best.pt想接着上次进度继续训练用yolo detect train modelpath/to/best.pt resumeTrue它会自动读取训练状态继续不需要重设epochs也不用手动找优化器状态。4.2 训练参数含义表从epochs到amp逐个说清楚下面这张表是YOLOv8里我实际会动的参数按重要程度排列。默认值随ultralytics版本会微调以yolo train时控制台打印的配置为准。参数常见取值含义与调法epochs50-300总训练轮数。验证集mAP不再上升时就该停不是越大越好batch-1到64-1表示自动选能装进显存的最大值。数据量大时尽量不用太小batch4以下梯度噪声大imgsz480/640/1280训练分辨率。小目标为主时不要降到480优先保640patience50-100早停轮数。连续patience轮验证集不涨就自动停workers4-16数据加载线程数。设0最容易排查染色问题但极慢device0 或 0,1用哪张GPU。多卡用逗号分隔CPU训练时写devicecpuampTrue/False混合精度训练。默认开6G小显存卡保持开老显卡算子不兼容再关cacheFalse/ram/disk把图缓存到内存或磁盘加速数据读取lr00.001-0.01初始学习率。迁移学习一般用默认0.01小数据集调到0.001plotsTrue训练结束后自动生成PR曲线、混淆矩阵等图片到runs目录补充说明amp默认开启混合精度能让6G显存跑更大的batch。如果你发现开了amp后某些操作报错老显卡偶发再关掉它但要明白关掉后显存占用会上升。cacheram把整个数据集读进内存训练速度提升明显但前提是内存够大。几十GB的数据集不建议会直接OOM。lr0是我遇到训练震荡时第一个调整的参数。loss曲线像心电图一样上下跳优先把lr0降到0.001而不是加batch。这些参数的意义不是背下来而是知道「模型训得不好时先动哪个」。我一般固定batch、imgsz先调epochs和patience最后才碰lr0。4.3 GTX 1660 Ti怎么调显存不够时的妥协顺序6G显存跑YOLOv8是当前很多学生和初级工程师的现实条件完全够用关键是选对型号和参数。我的固定组合是yolov8n imgsz640 batch16显存占用大约3到4G1660 Ti可以稳定跑。想换yolov8s就要把batch降到8yolov8m基本不建议在6G卡上冲除非用imgsz480。显存不够时的妥协顺序应该是先降batch再确认amp开着再换更小的模型最后才降imgsz。原因很直接imgsz降到480会让小目标的召回明显变差而batch从16降到8对最终精度的影响小得多。如果用的还是老驱动、老卡优先升级驱动而不是换PyTorch版本因为新版cu开头的torch往往要求更新的驱动。一个实用技巧把batch设成-1ultralytics会自动做一次显存探测选一个能装下的最大值。它会从一个小batch开始逐步尝试直到OOM然后回退省去手动二分试错的时间。但自动探测不一定最优它可能选到恰好不OOM的值训练后期因为缓存增长还是会炸。训练时另开一个终端nvidia-smi盯这张表看GPU-Util和Memory Usage。显存占用顶着上限是正常的但如果利用率持续低于80%问题在数据加载而不是显存去看5.4的排查。这一步的经验是与其纠结某个参数该不该动不如先确认瓶颈在显存还是数据方向错了再调一夜也没用。4.4 损失曲线怎么看用results.csv画图判断过拟合训练结束后ultralytics会在runs/detect/train下生成results.csv和results.png。results.png已经画好了所有曲线但我想看更细的对比时会用下面的方式重新画。import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/train/results.csv) epoch df[epoch] plt.plot(epoch, df[train/box_loss], labeltrain box loss) plt.plot(epoch, df[val/box_loss], labelval box loss) plt.legend() plt.xlabel(epoch) plt.ylabel(loss) plt.show()说明CSV列名里train/box_loss是训练集边框损失val/box_loss是验证集两者走势是最重要的诊断信息。正常状态两者一起下降然后趋于平缓验证集略微高于训练集。若train还在降、val开始反弹说明过拟合此时加patience早停、加数据增强或换小模型都比继续训有用。如果train和val在几十个epoch后都几乎不降先回头看3.4的可视化结果多半是标注质量出问题比如框没标全、类别标签错位。想改模型结构的人我在这一栏多说一句网上大量「YOLOv8改进」的核心就是换backbone或改head加坐标注意力机制、加P2小目标分支等但前提是先用官方参数跑出一个能复现的baseline。没有baseline就改结构一旦翻车你分不清是结构问题还是超参问题。5. YOLOv8训练与部署避坑五类高频问题的排查顺序这一章来自我实际踩过的坑按出现频率排序。每条都按「现象→原因→解决」写你可以当成排查清单用。5.1 预训练权重下载卡住现象、原因与离线解决办法现象第一次运行yolo predict或yolo train时控制台停在Downloading...很久不动或者反复下载失败。这个现象在内网机器和网络不稳定的场景尤其常见。原因yolov8n.pt等预训练权重存储在外部公共服务器上网络环境不好时容易超时。ultralytics代码会在当前工作目录找不到pt文件时触发下载而下载逻辑没有断点重试失败一次就退出。解决找一台网络正常的机器把对应权重文件提前下载好拷贝到目标机器的当前工作目录文件名保持yolov8n.pt、best.pt不变。程序检测到本地已有文件就会跳过下载。离线内网部署时我还会把配置目录一并手动拷贝避免程序在启动阶段尝试联网检查更新。这个方法同样适用于训练中断后想恢复只要best.pt和last.pt都在目录里resumeTrue就能继续。5.2 CUDA out of memory显存爆炸的排查顺序现象训练开始几秒或几个epoch后控制台报torch.cuda.OutOfMemoryError有时还会附带显存占用提示。原因显存占用取决于模型大小、batch、imgsz和amp状态。最常见是batch设得过高其次是imgsz640但选了m或l模型还有一种是开了大量数据缓存训练中后期缓存增长把剩余显存吃满。解决按4.3的顺序逐项降先batch减半再把模型从s换成n最后imgsz降到480。同时确认amp保持开启。如果项目里有人把ampFalse写死了把它改回True。改完任何一项都要重新启动训练不要热切换。真到了6G卡推不动的地步检查是不是数据尺寸本身异常大比如原图上万像素宽先在数据预处理阶段把大图切片而不是无脑缩imgsz。5.3 loss不下降且mAP是0标签错位的典型案例现象训练能正常跑完但val的mAP50一直是0train/box_loss在几个epoch后稳定在一个不高不低的数值上不再变化。原因九成是标签错位。常见三种一是data.yaml里names顺序和转换脚本里的classes顺序不一致模型把猫学成狗验证时类别对不上二是TXT里的归一化坐标写错比如把左上角x1直接除以w当中心点导致框的中心全偏到图片左上角三是labels目录和images目录名不匹配标注全没被读进去。解决先做3.4的可视化检查把labels/train里的TXT画到原图上立刻就能看出框是否偏。再打印data.yaml的names和类别的实际含义对照确保第0类是同一个目标。最后检查目录结构images/train里每张图必须有同名TXT在labels/train里文件名完全一致包括大小写。这三步走完mAP为0的问题基本就解决了。5.4 GPU利用率只有30%数据加载拖慢训练现象nvidia-smi显示显存占用正常但GPU-Util长期在30%上下跳动一个epoch要跑很久。原因GPU一直在等CPU和磁盘把数据送进来。常见是workers设成0单线程读图、数据集放在机械硬盘、没有开cache。YOLOv8默认会在线做Mosaic等增强这本身就是CPU密集操作数据加载跟不上时GPU只能空转。解决把workers设为8或更高注意某些老机器上workers过高会导致子进程反复启动一般设4即可数据集放到SSD内存充足的情况下打开cacheram一次性把图片读进内存。用完这些手段GPU-Util一般能上到90%。还不行的话把Mosaic增强的强度降下来因为Mosaic要在训练时拼接四张图是CPU最重的部分。5.5 rk3588与Orin部署翻车导出算子与NMS的坑现象训练好的best.pt在PC上用yolo predict一切正常导出ONNX后部署到rk3588或Orin平台要么转换工具直接报某个算子不支持要么输出结果在板子上全偏或没框。原因YOLOv8的检测头在推理时自带一组后处理逻辑包括置信度过滤和NMS。导出ONNX时这些逻辑能否被部署工具识别取决于导出参数和工具版本。rk3588的RKNN工具链对部分动态shape和特殊算子支持有限Orin的TensorRT里如果没接对NMS节点输出维度会对不上。解决导出时固定尺寸并设置兼容性参数常见做法是yolo export modelbest.pt formatonnx opset12 imgsz640然后用部署平台官方提供的YOLOv8示例脚本做转换不要自己硬写解析。RKNN场景注意输出张量shape是[1,84,8400]检测而不是[1,8400,84]写后处理前先用onnxruntime打印一下实际输出shape再动手。分割模型导出多一项量化校准用验证集图片做int8量化校准集否则精度掉得厉害。这些是部署阶段的血泪经验提前打印shape和校验单个输出值能省下大量调试时间。6. 把模型变成可交付的东西导出格式选择与置信度阈值验证训练完的best.pt只是中间件。真正交付给业务方的通常是ONNX或TensorRT engine而这两步决定了模型在线上是「能用」还是「刚好能用」。6.1 先做一次全阈值扫描再决定conf定多高模型在验证集上的mAP高不代表它默认的0.25置信度阈值一定适合你的业务。我现在的习惯是训练后遍历一遍conf看F1最高的点在哪再把它写进部署配置from ultralytics import YOLO model YOLO(best.pt) for conf in [0.05, 0.1, 0.25, 0.4, 0.5, 0.7]: m model.val(datadata.yaml, confconf) print(conf, mAP50, m.box.map50, mAP50-95, m.box.map)说明这段代码用不同置信度阈值在验证集上重算指标。框少、误报影响大的场景比如计数宁可把conf调高小目标多、漏检更伤的场景比如动物识别conf调低。6.2 导出ONNX后用onnxruntime验证输出导出时固定尺寸是部署最稳妥的选择yolo export modelbest.pt formatonnx opset12 imgsz640导出后先别急着接平台用onnxruntime在PC上跑通一遍输出解析确认shape和你预期的[1,84,8400]一致import onnxruntime as ort sess ort.InferenceSession(best.onnx) print([o.name for o in sess.get_outputs()]) print(sess.get_outputs()[0].shape)输出打印出来的是输出节点名和维度只有这里对了板子上的后续代码才值得写。如果opset或模型结构导致输出节点是动态shape部署端就得额外做尺寸猜测这是最常见的坑。我做项目多年的一个习惯是每个模型交付前都要在独立的一批测试图上跑一次「带上下文的推理」。所谓带上下文就是包含真实业务里的光照和背景而不是只用验证集里那些被选过的图片。跑完把这批结果图和指标一起存档下次模型再迭代时拿出来对比。先调conf、再验导出、最后存档这套流程走熟后部署现场基本不会出幺蛾子。希望帮到你。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。