新闻详情

新闻详情

首页 / 资讯中心 / 详情

YOLOv8实战:从环境搭建到人脸识别与车辆检测部署

发布时间:2026/9/28 12:20:17来源:尧图网络
YOLOv8实战:从环境搭建到人脸识别与车辆检测部署
简介这是一套基于YOLOv8的智慧校园人脸识别与公路汽车检测综合项目面向目标检测、人脸识别方向的初学者与进阶学习者可直接用于毕业设计、课程设计、工程实训或大作业。项目利用YOLOv8与yolov8l-face模型实现校园门口场景的人脸检测配合跟踪技术自动锁定目标并通过dlib的resnet模型提取128维人脸特征与dataset数据集比对后自动识别是否为校内学生绿色表示可通行、红色表示未识别同时在画面中央统计识别成功的人脸数量另一模块则基于YOLOv8完成公路汽车检测与跟踪。资料包含34个文件涵盖Python源码、pt权重模型、mp4演示视频、png人脸样本、dlib依赖的dat数据及说明文档压缩包约334MB目录结构清晰从环境配置到训练预测均有覆盖。已有459人学习下载特别适合想快速上手YOLOv8人脸识别与车辆检测完整流程的读者。1. 从门禁到车流监控一个 YOLOv8 模型撑起两个场景先想清楚再动手把 YOLOv8 同时用在智慧校园的人脸识别门禁和公路汽车检测上听起来是两件毫不相干的事实际做起来却共享同一套繁琐流程环境搭建、数据标注、训练调参、模型导出与部署。很多人第一反应是直接拉官方预训练权重跑通 demo觉得“反正都是目标检测”真正动手才发现人脸框和汽车框的尺度差异极大一个 640 分辨率的模型往往顾此失彼人脸太小检不出车太大框不准。这篇文章就是把这条从零到部署的路线完整走一遍覆盖 Ubuntu 20.04 CPU 环境搭建、labelme 标注转 YOLO 格式、训练参数含义与损失曲线判读、显存受限时的参数调整再落到人脸识别门禁和公路车流量统计两个场景的具体推理代码。适合正在做基于 YOLOv8 的毕业设计或者想在园区小范围试点这两个方向的从业者照着步骤能复现遇到报错也知道去哪篇文章里找答案。2. 环境和数据准备Ubuntu 20.04 CPU 跑通 YOLOv8再把手头图片变成能训练的样本2.1 Ubuntu 20.04 搭建 YOLOv8 CPU 环境conda 三步装完不碰 CUDA很多同学一上来就卡在环境配置尤其手头只有一台不带独显的笔记本。其实 YOLOv8 对 CPU 环境非常友好ultralytics 这个 pip 包把核心依赖都打包了你只需要一个干净的 Python 环境。我习惯用 conda 新建虚拟环境避免把系统 Python 搞乱。conda create -n yolov8 python3.9 -y conda activate yolov8 pip install ultralytics装完后执行这行验证一下能打印出版本号说明环境没问题python -c from ultralytics import YOLO; print(YOLO.__version__)如果需要指定 PyTorch 版本可以先用 pip 装一个 CPU 版的 torch再装 ultralytics它会自动适配。conda 创建环境这一步可以把 python 版本换成 3.10 或 3.11ultralytics 目前对 3.8 到 3.11 都支持但我不建议用 3.12部分依赖还没跟上。CPU 版本不需要安装 CUDA 和 cuDNNPyTorch 会在 pip 安装时自动带上 CPU 版的预编译包这一点和 GPU 机器不一样GPU 机器要自己先装好对应版本的 CUDA 驱动和 PyTorch CUDA 版否则训练时会报“torch.cuda.is_available() 为 False”。环境装完后第一次运行 YOLO 通常还要下载预训练权重。执行下面这个命令会自动下载 yolov8n.pt 到当前目录yolo detect predict modelyolov8n.pt sourcehttps://ultralytics.com/images/bus.jpg如果你在服务器或国内网络环境下下载速度很慢常见做法是先用浏览器或 wget 把权重下载到本地再通过 model/path/to/yolov8n.pt 指定路径。权重文件不大yolov8n.pt 只有 6 MB 左右但对 CPU 场景足够用了。如果你是 GTX 1660 Ti 这类 6 GB 显存显卡用 yolov8n 起步也是明智的后面训练章节我会讲显存不足时的具体调参方案。2.2 labelme 标注转 YOLO 格式转换脚本与四个边界情况数据是所有目标检测项目的短板。智慧校园场景下人脸和汽车的数据来源通常是校园监控截图、门禁摄像头拍到的登记照、公开数据集比如 Wider Face 和 UA-DETRAC中筛选出来的图片。如果你要从零标注自己的数据最常见的标注工具不是 LabelImg而是 labelme因为它能直接导出 JSON 格式支持多人协作标注也方便做二次处理。labelme 标注完一张图会生成一个同名 JSON 文件里面记录图片尺寸、标注物体的形状和标签但它不是 YOLO 训练能直接吃的格式。YOLO 要求每个 txt 文件一行一个物体格式是“类别ID 中心点x 中心点y 宽度 高度”前四个数值都基于图片宽高归一化到 0~1。转换脚本是绕不开的坎我一般这样写import json, os, glob def labelme_to_yolo(json_path: str, out_dir: str, classes: dict) - None: with open(json_path, r, encodingutf-8) as f: data json.load(f) img_w data[imageWidth] img_h data[imageHeight] txt_name os.path.basename(json_path).replace(.json, .txt) txt_path os.path.join(out_dir, txt_name) with open(txt_path, w, encodingutf-8) as out: for shape in data[shapes]: label shape[label] if label not in classes: continue cls_id classes[label] points shape[points] xs [p[0] for p in points] ys [p[1] for p in points] x_min, x_max min(xs), max(xs) y_min, y_max min(ys), max(ys) x_center ((x_min x_max) / 2) / img_w y_center ((y_min y_max) / 2) / img_h box_w (x_max - x_min) / img_w box_h (y_max - y_min) / img_h out.write(f{cls_id} {x_center:.6f} {y_center:.6f} {box_w:.6f} {box_h:.6f}\n) classes {face: 0, car: 1, bus: 2, truck: 3} os.makedirs(yolo_labels, exist_okTrue) for json_file in glob.glob(labelme_jsons/*.json): labelme_to_yolo(json_file, yolo_labels, classes)这段脚本只处理矩形框也就是 labelme 里用 Rectangle 画出来的标注它的 points 只有两个对角点取 min/max 就能得到外接矩形。脚本里classes字典决定了标签和类别 ID 的对应关系一旦定下来就不要改因为这直接关系到后面训练 yaml 文件里的 names 顺序。四个边界情况需要特别注意第一如果标了多边形而不是矩形points 会是一长串顶点这时候 min/max 得到的仍是包住多边形的外接矩形但框会偏大建议只画 Rectangle第二如果图片里有被遮挡严重的物体是否标注成目标取决于你的业务需求人脸检测场景我会建议把遮挡超过一半的框删掉否则训练时会给模型传递大量模糊特征第三JSON 里的 imageWidth 和 imageHeight 一定要和实际图片尺寸一致否则归一化坐标全错训练时报 data loader 错误还查不出来第四一个 JSON 里可能有多个相同标签脚本会逐行写入没有问题但如果某张图没有任何有效标注生成的 txt 文件为空的这类空标签文件需要单独清理否则训练时遇到空标注会报警告甚至跳过。2.3 数据集划分与 data.yaml先分好 train/val 再谈训练数据转换完成后下一步是把图片和 txt 按 YOLO 约定组织成标准目录结构。常见做法是用下面的命令手动创建目录并切分数据mkdir -p datasets/campus/images/train mkdir -p datasets/campus/images/val mkdir -p datasets/campus/labels/train mkdir -p datasets/campus/labels/val切分时有一个很重要的点不要像分类任务那样直接 random 切分。监控视频抽帧得到的图片相邻帧高度相似如果同一段视频的帧同时出现在 train 和 val验证集的 mAP 会虚高到让你误以为模型已经收敛实际换一段新视频立刻翻车。更好的做法是按视频来源分组同一视频的帧全部归 train 或全部归 val再从 train 里抽一小部分当 val。校园场景如果有多个摄像头就按摄像头 ID 分组切分。在 datasets/campus 根目录下创建 data.yaml内容如下path: ./datasets/campus train: images/train val: images/val nc: 4 names: 0: face 1: car 2: bus 3: truck这里的 path 是数据集根目录train 和 val 是相对路径nc 必须和 names 里的数量一致。YOLOv8 训练时会自动读取这个 yaml不需要写绝对路径但要保证执行训练命令的工作目录和 path 的相对位置正确否则会报 Dataset not found。每类样本数量也是决定训练效果的重要因素我的建议是 face 至少 800 张car 至少 1500 张因为人脸尺度跨度大近景和远景都要覆盖汽车相对规整但车型差异大轿车、SUV、货车都要有。样本不够时优先去公开数据集补充而不是手动刷标注标注一个框约 30 秒三百张图就是一下午效率远低于采集公开数据。3. 训练与调参读懂 YOLOv8 训练参数含义用损失曲线判断模型是否在好好学3.1 训练你自己的 YOLOv8 数据集一条命令启动六个参数先记住数据准备好了训练本身并不复杂ultralytics 把训练封装得非常彻底。在数据集根目录的上一级执行下面命令yolo detect train datacampus.yaml modelyolov8n.pt epochs100 imgsz640 batch16 devicecpu projectruns namecampus_exp如果不喜欢命令行在 Python 脚本里启动是一样的效果from ultralytics import YOLO model YOLO(yolov8n.pt) model.train( datacampus.yaml, epochs100, imgsz640, batch16, devicecpu, projectruns, namecampus_exp, )这里六个参数先记住含义。epochs 是训练轮数CPU 条件下建议先跑 50 轮看趋势再决定要不要加到 100 轮以上。imgsz 是输入分辨率640 是默认值检测人脸这类小目标可以设到 960 甚至 1280但显存和耗时都会非线性上涨CPU 环境不建议超过 640。batch 是批量大小决定每次迭代喂多少张图给网络CPU 模式下 16 是安全值显存 6 GB 的 GTX 1660 Ti 上设 8 更稳。device 指定计算设备CPU 就写 cpu单卡 GPU 写 0。project 和 name 决定结果保存路径最终会生成 runs/campus_exp 目录。训练过程中你会发现几个自动生成的文件runs/campus_exp/weights/best.pt 和 last.pt前者是验证集 mAP 最高的权重后者是最后一轮的权重。一般都要用 best.pt 做后续推理和导出。如果你用 GPU 训练还可以加一个cacheTrue参数把所有图片提前加载到内存里能明显减少磁盘 I/O 带来的等待。CPU 环境建议不开内存不足会直接 OOM。3.2 损失函数曲线怎么画、怎么读results.png 里的六个关键指标训练完成后在 runs/campus_exp 目录下会生成 results.png 和 train/val_loss.png 等图像很多人不知道这些图像怎么用来判断模型状态。先看目录里有什么文件或图表常见的是 results.png 一张大图把训练过程中的 loss 曲线、精度曲线、召回率曲线和 mAP 曲线全画在一起。如果你想把自定义指标也画出来ultralytics 其实会在 runs/campus_exp/results.csv 里记录每一轮的原始数据你可以用 Python 自己重画import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/campus_exp/results.csv) plt.plot(df[epoch], df[train/box_loss], labeltrain box_loss) plt.plot(df[epoch], df[val/box_loss], labelval box_loss) plt.legend() plt.title(Box Loss Curve) plt.savefig(my_box_loss.png)我一般会看六个指标train/box_loss 和 val/box_loss 关注边框回归是否稳定train/cls_loss 和 val/cls_loss 关注分类是否收敛val/mAP50 和 val/mAP50-95 是最终评价指标。mAP50 指的是 IoU 阈值取 0.5 时的平均精度mAP50-95 是取 0.5 到 0.95 每隔 0.05 算一次再平均后者更严格。一个常见误读是只看 mAP50因为人脸检测框稍微偏一点 mAP50 也能很高但实际门禁抠出来的人脸区域偏了后续特征提取就会错所以人脸场景要重点看 mAP50-95。三条曲线怎么判断如果 train loss 持续下降但 val loss 在第 30 轮左右开始反弹说明过拟合了解决方法是调大 weight_decay 到 0.0005或者加数据增强如 hsv_h0.02如果 train loss 和 val loss 同步下降但 mAP50-95 提升缓慢说明模型容量不够换 yolov8s 比加训练轮数更有效如果 loss 曲线在中后期出现明显波动先检查学习率YOLOv8 默认用 SGD 加余弦退火可以在训练命令里加cos_lrTrue让学习率在最后 10 轮平滑降下来这两个设置我一般会开。3.3 低显存训练自救GTX 1660 Ti 和 CPU 机器的参数组合很多人的显卡是 GTX 1660 Ti 6 GB 或者根本没有 GPU这时候如果直接照抄网上 batch32 的命令训练开始两分钟就报 CUDA out of memory。这不是代码问题是显存峰值太大。ultralytics 提供了一个自动选 batch 的参数把 batch 设为-1模型会自动从 16 开始向下试探直到显存够用为止。我在 1660 Ti 上常用的一组参数是yolo detect train datacampus.yaml modelyolov8n.pt epochs100 imgsz640 batch8 device0 workers4 close_mosaic10close_mosaic 是 YOLOv8 里很实用但容易被忽略的参数它表示在训练最后 10 轮关闭 mosaic 数据增强。mosaic 增强会把四张图拼成一张训练好处是丰富背景多样性坏处是大幅拉高显存和内存占用而且最后几轮拼图会让模型在真实分布上适应不足。关闭后训练更稳mAP 通常不降反升。CPU 环境下我把 imgsz 降到 448batch 降到 8开着 close_mosaic一个类 800 张图 50 轮大概跑 6 到 8 小时这个时间成本可以接受。如果实在嫌慢可以先用 yolov8n 训练 30 轮把训练好的权重作为预训练权重再用 yolov8s 继续训练这种迁移方式在数据量不大的时候比直接训练大模型收敛更快。4. YOLOv8 实战避坑从数据、训练到部署最常见的 5 个翻车场景4.1 验证集 mAP 0.92新视频一个物体都检测不出来现象训练过程很好看损失曲线漂亮mAP50 到 0.92但拿到一段新监控视频跑推理人脸一个都没框出来汽车倒是能检测但框的位置飘。原因数据集划分出了“泄漏”。监控视频抽帧得到的图片相邻帧几乎一样我用 random_split 把同一段视频的帧同时分进了 train 和 val模型相当于“背下了”验证集的内容。换新场景自然全部翻车。另外人脸框在检测结果里全是 0.25 置信度以下说明模型学到的是过拟合的背景特征而不是人脸本身。解决按视频 ID 或摄像头编号分组切分数据同一来源的帧必须只落在 train 或 val 一侧。重新划分后 mAP 可能掉到 0.7 左右但这是真实水平。同时检查训练图片里是否混入了 demo 视频的截图这类图片往往带有界面水印模型会学习水印特征。4.2 损失曲线在第 20 轮出现 NaN训练直接中断现象训练到第 20 轮左右终端打印的 loss 突然变成 nan进度条停止继续训练也不会恢复。原因最常见的是学习率设置过大导致梯度爆炸尤其是迁移学习中用了较大的预训练模型时。另一种可能是标注文件里有超出图片边界的归一化坐标YOLOv8 的数据加载不会显式报错但在增强阶段会把越界框裁成零面积框计算 IoU 时出问题。解决先把学习率 lr0 从默认 0.01 调到 0.001重启训练。如果还出现 NaN写一个小脚本遍历所有 labels 文件里的坐标检查是否有 x_centerw/2 大于 1 或小于 0 的情况。label 转 yolo 时最容易出现这个问题的就是我在第 2 章提到的边界情况二多边形顶点取 min/max 后导致框被拉大超出了图片范围。4.3 显存 6 GB 开不了 batch 16网上教程抄来的参数一跑就 OOM现象GTX 1660 Ti 显存 6 GB照抄网上 batch16 imgsz640 的 YOLOv8 训练命令开始训练不到两分钟就报 torch.cuda.OutOfMemoryError重启也没用。原因YOLOv8 默认开启 mosaic 增强和大量在线增强4 张图拼接后虽然最终会被 resize 到 640但中间产生的特征图张量峰值远超单张 640 图的占用。batch 减半也不一定够因为 OOM 往往发生在 mosaic 拼接阶段。解决按 3.3 节的参数组合设置 batch-1 让 ultralytics 自动搜索最优 batch同时加上 close_mosaic10。如果用 batch-1 仍然 OOM直接把 imgsz 降到 480。另外检查是不是开了太多无关程序占显存用 nvidia-smi 看看进程列表把桌面环境关掉能省出 300 MB 到 500 MB。4.4 同一张图片反复推理结果却一帧有框一帧没框现象视频推理时同一辆卡车在第 10 帧检测出来第 12 帧又消失不是遮挡问题背景完全一样。原因有两个方向需要排查。第一是 conf 阈值设得太高真实物体边界框的置信度在 0.28 到 0.35 之间波动阈值设在 0.5 就会导致掉帧第二是模型对特定颜色和纹理的响应不稳定尤其车体反光的白色车YOLOv8 的 anchor-free head 会对目标的中心点位置敏感轻微偏移就导致置信度排队。解决把推理阈值降到 0.25同时开启 NMS 的 agnostic 模式agnostic_nmsTrue它在多类别重叠时不会因为类别不同而保留两个冲突框。视频推理中更推荐使用model.track()而不是model.predict()因为 ByteTrack 跟踪器会给每个目标分配 ID即使某一帧检测置信度低了跟踪器也能通过运动预测维持 ID 存在这就是为什么车流量统计要用跟踪而不用纯检测。4.5 人脸识别门禁YOLOv8 框到了脸但比对结果还是差很远现象人脸检测精度已经做到 mAP50 0.95但接上门禁系统后同一个人的通过率不到 70%经常误拒。原因这里踩了一个概念坑YOLOv8 做人脸检测只负责画框不做身份识别。它输出的 1280 维向量如果直接拿来当特征做余弦相似度比对效果非常差因为检测模型的特征并没有被显式地训练成“同一个人的不同照片距离近、不同人距离远”。门禁系统需要的是先检测对齐再用专门的特征提取模型比如 ArcFace 或 InsightFace对归一化后的人脸图提取特征再和注册库里的人脸特征做比对。YOLOv8 在这里只是整个流程的第一棒不能越俎代庖。解决调整流程为“YOLOv8 检测人脸框 → 按 landmark 五点对齐裁剪成年 112x112 的人脸图 → 用 ArcFace 特征提取模型得到 512 维特征 → 与注册库计算余弦相似度阈值设 0.5 左右”。检测框稍微偏一点就能明显影响识别正确率所以人脸检测模型的 mAP50-95 比 mAP50 更重要。另外门禁场景强烈建议加活体检测环节否则一张打印照片就能攻破系统这是人脸识别门禁系统设计的底线问题不能省略。5. 两个业务场景的实现人脸识别门禁与公路汽车检测的推理代码5.1 智慧校园人脸识别从 YOLOv8 检测框到特征比对的全流程把 YOLOv8 接入人脸识别门禁系统核心是明确每一环的职责。检测模型负责在整帧画面里找到人脸区域特征提取模型负责把人脸区域转换成可用于比对的向量。代码上两个模型串行执行下面是一个最小可用的人脸识别推理脚本import cv2 import numpy as np from ultralytics import YOLO det_model YOLO(runs/campus_exp/weights/best.pt) # 检测人脸框 def get_face_embedding(face_img: np.ndarray) - np.ndarray: # 这里接入 ArcFace 或 InsightFace 的特征提取 API # face_img 是已经对齐缩放为 112x112 的 RGB 图 # 返回 512 维归一化特征向量 pass def recognize(frame: np.ndarray, db_embs: dict, thresh: float 0.5): results det_model.predict(frame, conf0.3, verboseFalse) for r in results: for box in r.boxes: cls int(box.cls[0]) if cls ! 0: # 只处理 face continue x1, y1, x2, y2 map(int, box.xyxy[0]) face_crop frame[y1:y2, x1:x2] emb get_face_embedding(face_crop) for name, db_emb in db_embs.items(): sim float(np.dot(emb, db_emb)) # 余弦相似度 if sim thresh: print(f识别通过: {name}, 相似度 {sim:.3f})这里的 conf 阈值我设 0.3比检测 demo 的 0.5 低因为门禁场景宁可多检出一个候选框给后续特征比对判断也不能漏检。特征比对阈值 0.5 不是固定的实际部署前要在自己的数据上做 ROC 曲线找到误识率和拒识率平衡点。还有一个细节裁剪出来的人脸图要做归一化再送特征提取模型不同特征模型要求的输入尺寸不同常见的是 112x112 或 224x224千万别直接把检测框原图尺寸塞进去否则特征质量会明显下降。如果想在 CPU 上跑完整个流程建议检测模型用 yolov8n特征模型用 MobileFaceNet 这类轻量骨架单帧耗时能控制在 200 ms 左右。5.2 公路汽车检测类别定义、车辆计数与虚拟检测线公路汽车检测的应用场景一般是车流量统计、违停识别或车型分类。类别定义上我习惯把车分为 car、bus、truck 三类如果需要识别摩托车再加一个 motorbike不建议把颜色或品牌作为类别这类特征是细粒度分类任务YOLOv8 在类别过多时会互相干扰。车辆计数的核心不是每帧检测而是跟踪加检测线下面这段代码实现了按帧检测、按中心点跨越虚拟线计数的逻辑import cv2 from ultralytics import YOLO model YOLO(vehicle_best.pt) cap cv2.VideoCapture(highway_clip.mp4) line_y 600 # 虚拟检测线在画面中的 y 坐标 counted_ids set() count 0 while cap.isOpened(): ret, frame cap.read() if not ret: break # track 模式会在检测基础上加 ByteTrack 跟踪返回稳定的目标 ID results model.track( frame, persistTrue, trackerbytetrack.yaml, conf0.35, iou0.5, classes[1, 2, 3], # 只统计 car/bus/truck verboseFalse, ) if results[0].boxes is None: continue for box in results[0].boxes: cls int(box.cls[0]) track_id int(box.id[0]) if box.id is not None else -1 x1, y1, x2, y2 map(int, box.xyxy[0]) center_y (y1 y2) // 2 if abs(center_y - line_y) 5 and track_id not in counted_ids: counted_ids.add(track_id) count 1 cap.release() print(通过车辆数:, count)参数上需要注意几点tracker 参数指定用 bytetrack.yaml官方自带的配置文件在 ultralytics 安装目录里如果指定路径报错直接用字符串bytetrack.yaml让 ultralytics 自动找。classes[1,2,3] 限制了只跟踪这 IDs 对应车辆。conf0.35 比人脸门禁的高一点因为车辆特征稳定低阈值反而会导致货车等大目标被重复计数。中心点跨越检测线的判断用了“绝对差小于 5 像素”的简易方法实际项目里通常会记录上一帧中心点坐标判断两点连线是否与检测线相交这样能规避车辆在检测线附近被遮挡导致的漏计。车流量统计的精度瓶颈不在检测而在跟踪漂移卡车车身长ByteTrack 有时会把一辆车从中间切断成两个 ID这时候可以结合车底阴影或车辆外形宽高比做二次过滤这是做公路汽车检测项目最需要花时间的部分检测模型反而占不到一半工作量。5.3 一个模型同时检测人脸和汽车还是拆成两个模型这个问题我在做方案评审时每次都会被问到。统一模型只需要维护一条训练流水线、一份权重文件、一次推理但对显存小的设备压力大而且人脸的尺度和汽车差一个量级统一图幅下小人脸特征很难学充分。拆两个模型的优点是每个模型都能专注于尺度结构缺点是部署资源翻倍边缘盒子上推理时间翻倍。我的判断标准很简单如果目标设备是 RK3588 这类有 NPU 的盒子统一模型更合适NPU 可以跑一次推理完成所有检测但训练时最好用 1280 分辨率并在小目标增强上加权重如果是 CPU 纯软方案拆两个模型一个 yolov8n 专门检测人脸一个 yolov8n 专门检测车辆这样每个模型都能降到 640 输入。另外还有一种折中方案统一模型但把类别平衡采样训练时每个 batch 里按类别比例从数据集中采样不至于让车类样本把人脸类淹没。这三种方案没有绝对对错取决于部署算力和场景内两个任务的出现频率。6. 把模型导出为 ONNX 或 RKNN部署验证三步走训练完的模型不能直接搬到设备上跑先做导出和精度守恒验证。最常见的是导出 ONNX然后用 onnxruntime 跑同一张图对比坐标输出yolo export modelruns/campus_exp/weights/best.pt formatonnx opset12导出后用下面这段脚本对比原模型和 ONNX 模型的输出差异只要置信度差在 0.02 以内就说明导出无损import numpy as np import onnxruntime as ort from ultralytics import YOLO pt_model YOLO(runs/campus_exp/weights/best.pt) onnx_model ort.InferenceSession(runs/campus_exp/weights/best.onnx) img test.jpg pt_result pt_model.predict(img, conf0.25)[0] # 用 onnx_session.run 拿原始输出再手动解析 # 对比解析出的框坐标和 pt_result.boxes.xyxy如果目标设备是 RK3588还要用 RKNN-Toolkit 把 ONNX 转成 RKNN 格式并在板端用 rknn.run 验证输出。这里最容易出问题的是 ONNX 的 dynamic batch 设置和 NPU 不兼容转 RKNN 时建议固定 batch1输入尺寸也要固定 640x640。如果是海思 hi3516cv610 这类芯片转换链更长要先用 hiSilicon 的工具链把 ONNX 转成 caffe 格式再量化过程繁琐但原理一致。每一步转换后都要跑一遍验证脚本确认刚开提到的坐标和置信度差异这是移植成功与否的唯一可信标准。我自己的习惯是导出后不要急着测跑分先拿验证集 200 张图过一遍 ONNX 推理统计 mAP 对比原模型这个习惯已经帮我抓出过三次由于算子不支持导致的精度崩坏。转换出错时优先换 opset 版本和简化模型结构去掉模型里的自定义 attention 层而不是盲目重训。希望这篇文章能让你从环境搭建到场景部署少走些弯路也祝你的 YOLOv8 项目一次收敛。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Agent Loop 工程化实战:用 Graph Engineer 构建稳定可控的智能体 2026/9/28 16:32:43

Agent Loop 工程化实战:用 Graph Engineer 构建稳定可控的智能体

1. 从"能跑"到"能扛":Agent Loop 工程化的分水岭很多人第一次接触 Agent Loop 这个概念,是在某个深夜调通了一个 ReAct 循环——模型输出思考、调用工具、拿到结果、再思考,循环几轮之后任务完成了。那一刻确实很爽&…

阅读更多 →
大模型在营销广告中的落地实践:素材生成、人群洞察与转化承接 2026/9/28 16:32:43

大模型在营销广告中的落地实践:素材生成、人群洞察与转化承接

先交代背景。我所在的团队一直在做货拉拉的营销投放系统,主要覆盖线上广告素材生产、人群定向、落地页承接和投放效果复盘这条链路。2024年大模型技术成熟度上来之后,我们内部做了一个判断:与其跟风做一堆“大模型营销”的Demo,不…

阅读更多 →
YOLO血细胞检测数据集:三种标注格式与训练避坑指南 2026/9/28 16:32:43

YOLO血细胞检测数据集:三种标注格式与训练避坑指南

简介:YOLO红白细胞血小板检测数据集是面向目标检测学习者的医学细胞图像资源,包含1000张来自真实场景的显微镜照片,覆盖红细胞、白细胞与血小板三类目标,使用LabelImg逐框标注,边界准确、类别明确,可直接用…

阅读更多 →
DFT测试压缩核心参数:SSN Bus Width与EDT Channels选型指南 2026/9/28 16:32:43

DFT测试压缩核心参数:SSN Bus Width与EDT Channels选型指南

1. 为什么要重新审视SSN Bus Width与EDT Channels做DFT做了快十年,我见过太多项目在测试压缩配置上“能用就行”,结果到了量产阶段被测试时间拖到怀疑人生。SSN Bus Width和EDT channels这两个参数,表面上看只是工具里的几个下拉选项&#xf…

阅读更多 →
Python分支结构核心解析:if/elif/else决策逻辑与实战应用 2026/9/28 16:32:43

Python分支结构核心解析:if/elif/else决策逻辑与实战应用

看到这个标题的第一眼,我确实愣了一下。《霸总与Python小姐:分支结构的甜宠必修课》,乍看像网文,细看才发现是在用“做决策”这件事串起Python里最容易被低估的一组语法:if、elif、else。你如果正在自学Python&#xf…

阅读更多 →
双路可调稳压电源设计与实战:LM317T/LM337T深度解析 2026/9/28 16:32:37

双路可调稳压电源设计与实战:LM317T/LM337T深度解析

1. 为什么双路可调电源是电子爱好者绕不开的“第一台真实验室设备”你拆过多少块废旧电源?焊过多少个USB充电模块?用过多少个“稳压模块”却在调试运放电路时被噪声拖垮整板信号?我见过太多人把“能输出电压”和“能支撑可靠实验”混为一谈—…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉