ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

YOLOv8智能小车检测:权重文件、数据集与部署全流程指南

YOLOv8智能小车检测:权重文件、数据集与部署全流程指南 简介压缩包内含基于YOLOv8的智能小车视觉检测项目面向需要直接部署或继续训练检测模型的开发者与学习者。已训练好的模型权重文件可直接加载并快速用于小车检测推理附带的PR曲线与损失曲线便于评估模型精度和收敛表现同时提供使用LabelImg工具标注好的jpg图像数据集标签分别以xml和txt两种格式存放在两个文件夹中能够复用于模型微调、验证或其他检测任务。整套资源共2000个文件绝大多数为txt格式主要对应标签文本与辅助说明文件另有13个md说明文档、2个pdf参考文档和1个yaml配置文件压缩包整体大小148.07MB目录结构简洁、易于按需取用。目前已有329人学习下载适合正在开展智能小车课题、目标检测项目或YOLOv8入门实战的读者参考借鉴。1. YOLOv8智能小车检测这份权重和数据集能帮你省下一个星期的标注时间YOLOv8智能小车检测这个资源最值钱的不是代码而是那个已经训练好的权重文件和配套数据集——拿到手就能直接拿图片或摄像头跑检测不用从几千张图开始自己打标注、调参数。我拆这个包时正好在做工创赛的智能物流小车小车定位和障碍物识别是刚需用这份权重在PC上一次就出了检测框后面才慢慢用自己的场景图去做微调。它解决的是“车在哪、障碍物在哪”的视觉问题适合两类人刚摸到YOLOv8、想先看实际效果再决定要不要深入的新手以及比赛或项目赶时间、需要一个可靠基线模型的组队开发。2. 资源拆解权重、数据集与评估曲线先弄清每一份文件是干什么用的下载解压后不建议急着跑推理先把目录结构理清楚。绝大多数这类资源的组织方式是weights目录放训练好的模型文件dataset目录放jpg图片和xml/txt两种标注runs目录放训练过程的PR曲线、loss曲线、混淆矩阵。下面按我实际拆包的经验把每类文件怎么看、怎么用讲透。2.1 目录结构与关键文件best.pt、last.pt和runs里的曲线先给一份典型目录清单做参照具体文件名以你拿到的压缩包为准路径类型用途weights/best.ptPyTorch权重验证集mAP最高的那一轮推理和部署用这个weights/last.ptPyTorch权重最后一轮训练结果适合接着做微调dataset/images/*.jpg训练图片原始图像由labelimg标注过dataset/annotations/*.xmlVOC标签绝对坐标格式给人看的、方便转其他格式dataset/annotations/*.txtYOLO标签归一化坐标格式训练直接读取runs/detect/PR_curve.png评估图反映置信度阈值对精度的影响runs/detect/loss_curve.png评估图反映训练和验证损失的变化runs/detect/results.csv数值表每一轮的box_loss、cls_loss、mAP等原始数据best.pt和last.pt的区别是很多新手容易看走眼的点best.pt保存的是验证集上mAP最好的状态推理用它能拿到这个数据集上的最好表现last.pt是训练中断时最后保存的状态继续训练时拿它做起点能省掉重新加载best.pt时权重分布变化带来的波动。我一般习惯先跑best.pt看效果真要微调时再换last.pt。再看PR曲线。PR_curve.png横轴是Recall纵轴是Precision曲线越贴右上角说明这个模型在宽泛置信度范围内都稳。如果PR曲线在0.9以上那直接推理就行如果只在0.7左右漂浮说明数据本身难分或者类别样本不均衡得靠后面积累更多对应场景的图片来补短板。loss_curve.png里重点看val/box_loss和val/cls_loss这两条线如果能平缓下降到稳定值模型就没白训。2.2 xml与txt标签的对应关系同一个框两种坐标系labelimg标注时可以选择同时输出xml和txt这是很多数据集打包的默认做法。xml存的是VOC格式的绝对坐标也就是框在图片像素坐标系里的xmin、ymin、xmax、ymaxtxt存的是YOLO格式的归一化中心坐标加宽高也就是class_id、x_center、y_center、w、h。两种格式字段对比如下格式内容坐标参考系典型用途xmlobject/bndbox xmin ymin xmax ymax像素绝对坐标可视化检查、转COCO或VOC数据集txtclass_id x_center y_center w h归一化相对值YOLOv8训练直接读取如果遇到只有xml没有txt的情况可以自己写转换脚本。常见做法是用Python标准库ElementTree解析xml按图片实际宽高做归一化import xml.etree.ElementTree as ET def xml_to_yolo(xml_path, img_w, img_h, class_names): tree ET.parse(xml_path) root tree.getroot() lines [] for obj in root.findall(object): name obj.find(name).text cls_id class_names.index(name) box obj.find(bndbox) xmin float(box.find(xmin).text) ymin float(box.find(ymin).text) xmax float(box.find(xmax).text) ymax float(box.find(ymax).text) x_center (xmin xmax) / 2.0 / img_w y_center (ymin ymax) / 2.0 / img_h w (xmax - xmin) / img_w h (ymax - ymin) / img_h lines.append(f{cls_id} {x_center:.6f} {y_center:.6f} {w:.6f} {h:.6f}) return lines # 用法示例 # class_names [car, person] # yolo_lines xml_to_yolo(0001.xml, 1280, 720, class_names)这段代码的关键是把xml里的绝对坐标转成相对值x_center取xmin和xmax的中点再除以图片宽度w取框宽除以图片宽度。需要留意的是img_w和img_h必须和图片实际尺寸一致否则训练时YOLOv8按归一化坐标换算回像素会出现错位。如果xml里没有显式给出width和height就先用cv2或PIL读一遍图片拿到这两个值。补充一个标签检查技巧拿到txt后先看类别id范围。比如数据集只有两类那txt第一列只允许出现0和1出现2说明标注时候类别顺序没对齐。我一般会写个几行的遍历脚本把每个txt的首列去重打印出来几秒钟就能确认标签没串位。2.3 从loss曲线和混淆矩阵判断模型真实水平别只看mAP一个数很多人只看PR曲线和loss就判断模型行不行但混淆矩阵更能暴露问题。runs目录里通常还有confusion_matrix.png主对角线上的数字越高越好如果某个类别的误检大量落到另一个类别上说明这两类外观太接近需要补充难分样本。比如智能小车场景里行人和路桩容易互相误检这种问题在loss曲线上根本看不出来只有矩阵能暴露。再看results.csv时我习惯挑两个关键指标mAP0.5和mAP0.5:0.95。前者是IoU阈值0.5下的平均精度后者是多个IoU下的综合分。对智能小车这种对实时性要求高的场景mAP0.5有0.85以上就能用mAP0.5:0.95反而不用刻意追高因为小车端推理时一般不会把IoU阈值拉得很严。3. 把权重跑起来环境配置与图片、视频、摄像头三种推理方式资源给的是训练完的权重但要让它真正在你自己电脑上跑起来环境搭不对会卡很久。我习惯给这类项目单独建一个conda环境避免和系统里的旧版torch互相踩。下面按我自己重装一遍的流程写清楚。3.1 环境搭建Python版本、torch和ultralytics的搭配ultralytics要求Python 3.8以上推荐用3.10。创建虚拟环境后核心依赖就两个torch和ultralytics。Windows下如果只用CPU推理直接装CPU版torch能省一个多GB的CUDA库conda create -n yolo python3.10 conda activate yolo pip install ultralytics pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu第一个命令创建名为yolo的Python 3.10环境第二个命令激活它。pip install ultralytics会自动把opencv-python、numpy、pandas等依赖一起装上不需要手动逐个装。torch的CPU版本用--index-url指定torch官方CPU wheel源。装完后验证一下就三行代码import torch import ultralytics print(torch.__version__) print(ultralytics.__version__)能正常打印版本号就说明环境OK。如果电脑有NVIDIA显卡建议按照PyTorch官网给出的CUDA版本命令重新装GPU版torch训练速度差五到十倍。装CUDA版之前先用nvidia-smi确认驱动支持的CUDA版本别盲目装最新版驱动太旧会直接报torch无法使用GPU的警告。3.2 图片与视频推理conf、iou、imgsz三个关键参数怎么给环境没问题后推理是最好复现的环节。把best.pt路径换成你自己解压后的实际路径跑一张测试图from ultralytics import YOLO model YOLO(weights/best.pt) results model.predict( sourcetest.jpg, conf0.25, iou0.45, imgsz640, saveTrue ) # 打印每个检测框的类别和置信度 for box in results[0].boxes: cls_id int(box.cls[0]) conf float(box.conf[0]) print(fclass{cls_id}, confidence{conf:.3f})这里的conf 是置信度阈值低于0.25的框会被丢掉调小到0.1会看到大量置信度很低的误检框调大到0.5能过滤掉大部分噪声但也可能漏掉被遮挡的目标。iou是NMS去重时的IoU阈值两个重叠框的IoU超过这个值就只保留置信度高的那个一般不动0.45如果场景里密集目标多比如小车排队行驶可以把iou降到0.3减少相邻车辆被合并的概率。imgsz是输入网络的图片尺寸YOLOv8会先把原图等比缩放后再填充到640×640训练时是多少推理时就保持多少效果最稳。视频推理同样用predict把source换成mp4或avi路径就行model.predict(sourcetest_video.mp4, saveTrue, conf0.25, imgsz640)YOLOv8会自动逐帧检测并用VideoWriter把带框的结果写进runs/detect目录里输出的视频文件默认也带_compressed后缀。如果只想保存检测结果的坐标和类别到txt再加一个save_txtTrue。3.3 摄像头实时检测与CPU性能基线接摄像头时source填设备编号0代表系统默认摄像头。开发板上通常是单目USB摄像头直接这样跑from ultralytics import YOLO model YOLO(weights/best.pt) model.predict(source0, showTrue, conf0.3, imgsz416)这里把imgsz降到416是为了在CPU上换取帧率。没有GPU的桌面级i5处理器用640输入跑yolov8s大约10到15FPS降到416勉强接近20FPS。小车这种快速移动场景20FPS勉强盯得住但如果是近距离突然窜出的行人还是会明显掉链子。建议CPU部署时优先用小尺寸权重或蒸馏过的模型别指望一张yolov8x在纯CPU上实时。摄像头推理的另一个问题是延时感因为USB摄像头的曝光和网络推理串行整体延迟一般在两三百毫秒范围走线控时要在PID里留出这部分余量。真要做实时控制后面第6章会讲怎么用ONNX把推理放到更轻量的运行时上。4. 微调出自己的模型数据目录规范、训练参数与结果验证用这份权重做检测只是第一步。实际比赛场地、光照、车型都和你拿到的数据不一样最好的路径是用它提供的数据集做基线再采集自己的图片做增量微调。yolov8训练自己的数据集坑基本集中在目录结构、yaml配置和超参匹配这三块。4.1 数据集目录规范images和labels必须分开且一一对应YOLOv8默认的数据组织形式是images下分train和val子目录labels下也分train和val子目录txt文件名必须和jpg文件名保持一致。比如train图片里有一张img001.jpg那train标签目录下就要有img001.txt少一个都报错。一个规范的目录结构长这样car_dataset/ ├── images/ │ ├── train/ │ │ ├── img001.jpg │ │ └── img002.jpg │ └── val/ │ ├── img003.jpg │ └── img004.jpg └── labels/ ├── train/ │ ├── img001.txt │ └── img002.txt └── val/ ├── img003.txt └── img004.txt数据集down下来后先用脚本检查一下确保images/train里的每张jpg在labels/train里都有对应txt没有的空跑一遍就报“No labels found”之类的提示。检查脚本不复杂用os模块对比两个集合的文件名就行。配套的数据描述yaml长这样# car_dataset.yaml path: car_dataset train: images/train val: images/val names: 0: car 1: personyaml里的names顺序必须和txt里每个框的第一个字段类别id完全一致。假如txt第一列是1对应names[1]那训练时就认成person顺序错位全乱这是最隐蔽的坑。val可以不单独建直接指向train会让验证集失去意义不建议这么做。4.2 训练命令与关键参数从best.pt继续训练而不是从零开始在已经有这份资源的前提下最稳的方式是用资源里的权重做初始权重继续训练。命令行和Python脚本两种写法都给出任选一种yolo detect train \ datacar_dataset.yaml \ modelweights/best.pt \ epochs100 \ batch16 \ imgsz640 \ lr00.001 \ device0model填best.pt时ultralytics会把它当作预训练权重加载而不是从随机初始化开始。epochs建议先设100不是越大越好配合patience参数让它在验证集mAP不再提升时自动早停。batch16在8G显存上跑yolov8s基本够用如果显存吃紧就降到8。lr00.001这步很关键训练好的权重做迁移学习时学习率不能按默认的0.01来否则会把原有权重冲坏loss曲线前几轮就剧烈抖动。Python写法在同目录更可控from ultralytics import YOLO model YOLO(weights/best.pt) model.train( datacar_dataset.yaml, epochs100, batch16, imgsz640, lr00.001, patience20, device0 )参数含义和命令行一致。device填0是使用第一张GPU没GPU就填cpu。显存小就把batch和imgsz同时调低比如batch8、imgsz480两个参数一起降才不容易OOM。4.3 训练结果验证loss曲线、PR曲线和混淆矩阵怎么看训练结束后结果会写到runs/detect/trainN目录N是第几次训练。这里面results.csv是最值得盯的文件每一行都对应一个epoch的指标包含train/box_loss、train/cls_loss、val/box_loss、val/cls_loss、metrics/mAP50等。如果不想用ultralytics自带的可视化把results.csv拉出来自己画loss曲线也简单import pandas as pd import matplotlib.pyplot as plt df pd.read_csv(runs/detect/train/results.csv) cols [c for c in df.columns if val/box_loss in c] plt.plot(df[cols]) plt.title(val/box_loss) plt.xlabel(epoch) plt.ylabel(loss) plt.savefig(val_box_loss.png)把runs/detect/train路径换成你实际训练输出的路径这段代码会把验证集框损失画成一条线。判断标准很简单曲线如果稳定下降后进入平台期模型基本收敛如果下降到一半突然反弹说明学习率没配合好或者数据里有大量噪声标注这时候把lr0再降一个量级重跑。PR曲线和混淆矩阵在训练结束后会直接出现在同目录里不需要额外处理。对比PR_curve就能看出加了新数据后mAP有没有明显提升对比confusion_matrix能看出来新场景下哪些类别互相干扰比如小车和阴影。5. 避坑排查推理、标签、训练、部署的五个翻车现场这部分是用这套资源最容易踩的五个坑每一条都是真实项目里会遇到的按现象、原因、解决三步整理方便直接对号入座。5.1 权重加载失败报错现象是执行YOLO(weights/best.pt)时提示文件不存在或者KeyError类异常最常见的是把整个压缩包解压后的目录路径传给了YOLO()而不是.pt文件本身的路径也可能是ultralytics版本太旧读到高版本权重里新增的结构字段直接报错。解决方法是先用绝对路径确认文件存在并且把ultralytics升级到不低于训练权重产出版本的版本。通常训练用8.2.x推理环境最低也得8.0以上。我用的是pip install -U ultralytics升级完还得顺手重启内核或重开终端避免之前导入的旧版本还在内存里。5.2 txt标签类别id和yaml的names对不上现象是训练时loss正常下降但推理出来的检测框类别明明是car却标成person或打印出来的类别集合完全错乱。原因是txt第一列的id是按训练时的names顺序写的你自己改yaml时把names顺序换过id含义就漂移了。解决方法是先挨个看txt文件的首列值确认类别数范围再把yaml里names的顺序和原始资源说明对照。如果原始数据集是按car、person排的那txt里0一定是car1一定是person别多个空格或少个逗号。出现这类问题最稳妥的办法是重写一个小的映射脚本把旧的类别id批量替换成新顺序。5.3 训练loss曲线前几轮剧烈抖动现象是续训时train/box_loss在前10轮像心跳一样大幅起落之后的val指标也明显不如直接用best.pt推理。原因多半是lr0按默认的0.01继续训练学习率太大把已经收敛的权重又推离了原平衡点。解决方法是迁移学习场景下lr0先降到0.001如果还抖再降一个数量级到0.0005同时配合warmup_epochs设5到10轮预热。我续训自己的小车数据时习惯把adam的weight_decay也保持默认0.0005不动只动lr这一路。5.4 部署到RK3588板子帧率暴跌现象是在PC上GPU跑检测有几十FPS同样模型导出ONNX后放到RK3588的CPU上只有两三FPS画面卡到没法用。原因是ONNX在板端默认跑的是CPU没有利用RK3588的6 TOPS NPU算力。解决方法是分两步先用ultralytics导出ONNX再用RKNN-Toolkit2把ONNX转成rknn格式最后用rknn的Python接口加载并调用NPU推理。转换前要在PC上把ONNX的输出shape验证好别到板子上再调NPU推理时rknn.config里的target_platform填rk3588量化方式建议先用fp16跑通精度再试int8加速。如果只是临时验证也可以先不转rknn用rk3588的OpenCV配合onnxruntime的CPU端凑合跑但那个帧率只能用来拍演示视频不适合真上车。5.5 摄像头画面延迟明显检测框慢半拍现象是画面里的检测框明显滞后于物理世界里的车停车后框还要晃一下才能稳定。原因是摄像头采集分辨率过高USB带宽和CPU解码占用过多再加上推理延时整体延迟超过400毫秒。解决方法是把摄像头分辨率强制设低比如640×480推理imgsz同步设416或320并开启摄像头缓冲自动丢弃。具体做法是用cv2.VideoCapture打开设备后直接set CAP_PROP_FRAME_WIDTH和CAP_PROP_FRAME_HEIGHT再配合model.predict的streamTrue参数让推理线程和采集线程并行减少阻塞。6. 往小车端再走一步把best.pt转成ONNX并验证推理输出如果目标是真正把模型部署到小车上下一步是把PyTorch权重导成ONNX用它做跨平台验证。这个过程在PC上做完能省掉很多在板子上调试的时间。用ultralytics导出非常简单from ultralytics import YOLO model YOLO(weights/best.pt) model.export(formatonnx, imgsz640, halfFalse)执行完后同目录下会生成best.onnx。这里的half参数控制是否导出fp16半精度NVIDIA显卡推理可以开RK3588这类NPU建议先关掉转rknn时再单独做量化。导出后用onnxruntime在PC上验证一遍输出确认shape和数值符合预期再拿到板上去import onnxruntime as ort import cv2 import numpy as np sess ort.InferenceSession(best.onnx, providers[CPUExecutionProvider]) img cv2.imread(test.jpg) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img cv2.resize(img, (640, 640)) img img.astype(np.float32) / 255.0 img np.transpose(img, (2, 0, 1))[None] input_name sess.get_inputs()[0].name outs sess.run(None, {input_name: img}) print(outs[0].shape) # 典型输出: (1, 84, 8400)这里输出shape里的84是4个框坐标加类别数如果原始模型只做小车检测且类别数为80那第二维就是84如果类别数改成了3第二维就变成7。8400来自YOLOv8三个尺度下20×20、40×40、80×80的候选框总数。数值对得上说明模型转换没有丢层接下来再往RKNN或TensorRT方向走都是顺的。那次我做RK3588部署时心急着把ONNX直接丢给RKNN-Toolkit转换结果板子上推理结果全偏回来一查才发现是ONNX导出时没有按板子的输入要求固定batch和shape。从那以后我每次换平台都强制先在PC上用onnxruntime验证一遍输出shape和坐标范围再继续下一步这份resources也一直保留着这个验证脚本做模板。希望帮到你。本文还有配套的精品资源点击获取
返回列表