尧图精选

足球运动数据集训练YOLOv8全流程:从标签检查到参数调优

🕒 发布时间:2026/10/1 3:57:02 📁 来源:尧图网络
简介面向足球赛事智能分析场景的目标检测数据集覆盖足球、守门员、球员、裁判四类目标适合使用YOLOv3至YOLOv10系列算法的开发者或竞赛团队用于训练和验证。资源包共796个文件以jpg图片、txt标签为主同时包含Python训练脚本、数据集配置文件及可视化图表压缩包大小约101.87MB整体结构已按训练/验证/测试划分下载后可直接投入模型训练。已有665人学习浏览。数据集提取自比赛视频共372张原始图像可配合数据增强扩充样本标签由labelImg标注并采用YOLO格式也可按需转换为VOC或JSON格式。作为参考YOLOv5s在此数据集上的训练准确率达到93.5%不同算法表现会有所差异。通过本包可快速搭建足球目标检测的本地数据集环境减少标注与格式处理的时间成本便于专注于模型调优与推理验证。1. 拿到足球运动数据集之后先别急着开训很多做体育场景的团队第一步不是写模型而是找一份能用的足球运动数据集。这类数据集的典型构成是从比赛视频里抽出的帧配上球员、守门员、裁判和足球的标注框标签按 yolo 格式组织也就是每个图像对应一个同名 txt。你拿到手的不只是图片而是一个把「检测足球场上目标」这件事做成可训练任务的基础资产。它能解决的核心问题是帮你省掉从零标注的几周时间直接把精力放到模型调优和业务落地上去。适合的人群很明确——要做赛事直播分析、球员跑动热力图、技战术统计或者自动集锦的算法工程师和学生团队。但这份数据能不能直接喂进 yolo 训练取决于你怎么验证标签、划分数据集和设置训练参数本文就按我实操的顺序从拆包检查一直讲到模型验证与部署前的最后一步。2. 拆开足球运动数据集的内部结构yolo 格式标签到底在标什么拿到 zip 包之后别急着解压扔进训练脚本。yolo 格式数据集的表面结构都差不多但里面的标签是否规范、类别是否平衡、图像和 txt 是否一一对应直接决定你后面是花两小时调参还是花两周洗数据。我一般会先花十五分钟做四件事看目录、读标签、可视化、统计分布。2.1 文件清单与目录约定先按这个顺序检查你手上的 zip多数 yolo 格式数据集长这样football_dataset/ ├── images/ │ ├── train/ │ │ ├── frame_00001.jpg │ │ ├── frame_00002.jpg │ │ └── ... │ └── val/ │ ├── frame_01001.jpg │ └── ... ├── labels/ │ ├── train/ │ │ ├── frame_00001.txt │ │ ├── frame_00002.txt │ │ └── ... │ └── val/ │ └── frame_01001.txt ├── data.yaml └── classes.txt先确认三件事images 和 labels 下的 train/val 是否一一对应classes.txt 里的类别顺序是否和标签文件里的 class id 一致data.yaml 里的 path、train、val、names 是否指向真实路径。最常见的一个问题是数据集是从某个开源平台打包下来的目录层级深了一层data.yaml 里的相对路径全部失效。检查对应关系的脚本可以这样写#!/bin/bash # 检查 images/train 下每张 jpg 是否有同名 txt cd football_dataset for img in images/train/*.jpg; do base$(basename $img .jpg) if [ ! -f labels/train/$base.txt ]; then echo 缺少标签: $base fi done echo 检查完成这段脚本的逻辑很简单遍历训练集每张图片通过 basename 去掉 .jpg 后缀得到文件名再去 labels/train 目录查找同名 .txt找不到就打印出来。跑完之后你至少要确认「输出为空」或者「只有少量缺失」如果缺失文件超过 1%建议先补全再训练否则这几张图会被忽略造成训练集与验证集规模不稳定。2.2 读完一行 yolo 标签类别 ID、中心点坐标和归一化的关系打开一个 txt每一行代表一个目标框标准的五个数字是class_id x_center y_center width height以2 0.5213 0.4018 0.0231 0.0510为例class_id 是 2对应 classes.txt 里的第三个类别注意是从 0 开始计数后面四个数字全部是归一化坐标数值范围应在 0 到 1 之间。换算回像素坐标的公式是x_center_pixel x_center * image_width y_center_pixel y_center * image_height box_width_pixel width * image_width box_height_pixel height * image_height这里有个容易被忽略的坑归一化分母用的是图片原始宽高如果数据集中图片经过 letterbox 或直接 resize标签必须重新计算。我见过有人把原始标签直接用到 1280×1280 的输入上导致框全部偏移训练出来的模型在可视化时框全是歪的。顺便确认类别 ID 有没有超出范围。比如 classes.txt 只有四类player、goalkeeper、referee、ball但标签里出现 class_id 4 甚至更大的值那就是数据打包出了问题。这种问题用下面这段脚本可以一次性筛出来。2.3 用一段 Python 脚本做标签可视化确认人和球的框没标反只看数字没有体感我把标签画回图上十秒钟就能发现标注张冠李戴、坐标越界这类问题import cv2 def draw_yolo_label(image_path, label_path, class_names): img cv2.imread(image_path) h, w img.shape[:2] with open(label_path, r, encodingutf-8) as f: for line in f: parts line.strip().split() if len(parts) ! 5: print(f非法行: {line}) continue cls_id, x_center, y_center, bw, bh map(float, parts) cls_id int(cls_id) if not (0 cls_id len(class_names)): print(f类别ID越界: {cls_id}) continue # 还原像素坐标 x1 int((x_center - bw / 2) * w) y1 int((y_center - bh / 2) * h) x2 int((x_center bw / 2) * w) y2 int((y_center bh / 2) * h) color (0, 255, 0) cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) cv2.putText(img, class_names[cls_id], (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.6, color, 2) cv2.imwrite(check_visual.jpg, img) if __name__ __main__: class_names [player, goalkeeper, referee, ball] draw_yolo_label(images/train/frame_00001.jpg, labels/train/frame_00001.txt, class_names)这段脚本把归一化坐标还原成像素坐标然后用 OpenCV 画框和类别名。逻辑说明x1、y1 是左上角x2、y2 是右下角color 固定为绿色只是为了快速检查不区分类别。参数说明class_names 必须和 classes.txt 顺序一致否则画出来的人和球名字对不上。我通常随机抽 20 到 30 张图跑一遍重点看三点框是否紧贴目标、守门员是否被标成球员、足球是否被漏标。2.4 类别不平衡是常态球员、裁判、守门员的数量级差足球比赛画面里球员出现的频率远高于守门员和裁判足球虽然每帧都在但框很小。这个不平衡会直接影响训练——模型倾向于把一切都预测成球员因为球员样本多。写一个统计脚本直接输出每类的框数量、平均框面积占比和宽高比分布import os import numpy as np def analyze_labels(label_dir, image_dir, class_names): # 统计每类目标数量与面积占比 counts {name: 0 for name in class_names} area_ratios {name: [] for name in class_names} for txt_name in os.listdir(label_dir): if not txt_name.endswith(.txt): continue img_name txt_name.replace(.txt, .jpg) img_path os.path.join(image_dir, img_name) if not os.path.exists(img_path): continue img cv2.imread(img_path) h, w img.shape[:2] with open(os.path.join(label_dir, txt_name), r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: continue cls_id int(parts[0]) if cls_id len(class_names): print(f越界类别: {txt_name} - cls {cls_id}) continue bw, bh float(parts[3]), float(parts[4]) counts[class_names[cls_id]] 1 area_ratios[class_names[cls_id]].append(bw * bh) for name in class_names: if area_ratios[name]: mean_area np.mean(area_ratios[name]) print(f{name}: 数量{counts[name]}, 平均面积占比{mean_area:.5f}) if __name__ __main__: class_names [player, goalkeeper, referee, ball] analyze_labels(labels/train, images/train, class_names)这个脚本输出两个关键信息每类目标数量以及每类目标在图片中的平均面积占比。面积占比的意义在于判断小目标问题的严重程度。一般足球的框面积占比在 0.001 到 0.005 之间说明它在 1080p 画面里只有十几到几十个像素宽这种目标依赖高分辨率输入和合适的增强策略后面第四章会专门讲。统计完你心里要有预期如果球员有几万个框守门员只有几百个裁判也不多那就得在训练时考虑类别权重或者在评估时单独看每类的 AP而不是只看整体 mAP。这里不要迷信「总框数多数据集质量好」分布健康比总数重要得多。3. 把数据集接进 yolov8 训练自己的模型目录划分与 yaml 配置目录检查完、标签验证完下一步才是正式接进训练流程。现在主流做法是用 ultralytics 的 yolov8 系列原因是它的训练、验证、导出一条命令走完对自定义数据集的支持也最省事。这一章的目标是让你用这份足球运动数据集跑通第一条完整的训练命令并且明白每个参数在足球场景里该怎么设。3.1 训练集 / 验证集怎么切比例、乱序和防止镜头泄漏如果你拿到的 zip 里已经分好了 train/val这步可以跳过但如果只有全部图像和标签或者划分明显不合理建议重新切。足球比赛视频抽帧有个特殊问题同一场比赛的相邻帧高度相似如果随机切分验证集会混进大量与训练集几乎重复的画面mAP 虚高换到新比赛就翻车。我一般按「镜头」而不是按「单帧」来切。如果你只有帧序列没有镜头边界信息至少按比赛或时间段分# 伪代码把不同比赛的帧放在不同前缀目录下按前缀划分 # 假设文件名是 match_01_frame_0001.jpg, match_02_frame_0001.jpg mkdir -p images/train images/val labels/train labels/val # 比赛01、02进训练集比赛03进验证集 for img in images_all/match_01_*.jpg images_all/match_02_*.jpg; do mv $img images/train/ base$(basename $img .jpg) mv labels_all/$base.txt labels/train/ done这个做法的核心思想验证集必须来自模型没见过的比赛画面。如果你发现数据集里只包含一两场比赛那根本没法做可信的泛化评估后续可以考虑按时间抽帧、隔 N 帧取一帧做验证。清洗完目录再检查一遍两个集合的图片数量比例7:3 到 8:2 之间都可以验证集太小的话每类的 AP 方差会很大尤其守门员和裁判这种少样本类别会忽高忽低。3.2 data.yaml 的四个必填字段和两个易错位置yolov8 通过 yaml 文件描述数据集路径和类别名。手写一个干净的最小配置# football_dataset/data.yaml path: ./football_dataset # 数据集根目录相对当前工作目录 train: images/train # 训练图像目录 val: images/val # 验证图像目录 names: 0: player 1: goalkeeper 2: referee 3: ball四个必填字段是 path、train、val、names。两个易错位置一是 path 不要写绝对路径除非你确定训练机和打包机是同一台二是 names 的索引顺序必须和标签 txt 里的 class_id 完全一致否则类别名全部错位。这里的 path 可以是相对路径也可以是环境变量拼接的路径我习惯把 data.yaml 放在数据集根目录下这样 path 直接写一个点就行。如果你要训练的是特定模型变体还可以在 yaml 里加 names 之外的其他字段但初次跑通这四个字段够了。data.yaml 写完后可以用下面命令快速验证python -c import yaml; cyaml.safe_load(open(football_dataset/data.yaml)); print(c[names], c[train], c[val])这一步能帮你发现 yaml 语法错误和路径写错问题避免训练跑到一半才报 FileNotFoundError。3.3 从 yolo 预训练模型起步权重选择和冻结 backbone 的做法足球检测属于中等复杂度的目标检测不建议从零训练。业内通用做法是加载 yolo 预训练模型下载好的 COCO 权重比如 yolov8n.pt、yolov8s.pt然后基于它继续训练。ultralytics 在训练命令里写模型文件名会自动下载对应权重到缓存目录如果网络不通也可以手动把 .pt 文件放到项目目录下命令行指定本地文件即可。选哪个规模我的建议先试 yolov8s理由有三。第一足球场上的目标数量不算少n 模型的容量在密集人群 小目标场景下容易欠拟合第二m 和 l 训练时间明显变长对第一次跑通流程来说没有必要第三s 在 GTX 3060 级别显卡上能用 batch 16 跑训练节奏舒服。如果你后面发现球或者裁判的召回率上不去再升级到 m 或 l 不迟。冻结 backbone 是另一个常见操作。做法是在训练命令里加 freeze 参数yolo detect train \ datafootball_dataset/data.yaml \ modelyolov8s.pt \ freeze10 \ epochs50 \ imgsz640 \ batch16freeze10 表示冻结模型前 10 层主要是 backbone让模型先集中学检测头。什么时候该冻结当你的数据集规模和 COCO 差距太大或者标注质量一般时冻结 backbone 可以防止前期梯度把预训练特征冲坏。但要注意冻结不是万能的足球场景的视觉特征和 COCO 里的日常物体差距不小冻结层数太多反而限制了模型对球场纹理、草皮背景的适应所以建议先不冻结跑一个 50 epoch 的 baseline再对比冻结的效果。3.4 跑通第一条训练命令及关键参数说明给你一份我实际用过的训练配置注释写清楚每个参数在这个场景里的作用yolo detect train \ datafootball_dataset/data.yaml \ modelyolov8s.pt \ epochs120 \ imgsz1280 \ batch16 \ lr00.005 \ lrf0.01 \ warmup_epochs3 \ patience20 \ projectruns/train \ namefootball_s_1280 \ seed42参数说明imgsz 设成 1280 是因为足球在 640 输入下太小模型几乎学不到球的纹理lr0 设 0.005 是经验值比默认的 0.01 低一半因为小样本类别对学习率敏感lr 太大会让守门员这类样本的 loss 震荡lrf0.01 表示结束时学习率衰减到初始值的 1%patience20 是早停如果验证集 mAP 连续 20 个 epoch 不涨就停seed42 固定随机种方便复现。训练日志里重点看两个指标val 分支的 mAP50 和 mAP50-95以及每类的 AP。不要只看整体 mAP 涨了就开心展开看 ball 的 AP 才是足球场景的胜负手。训练结束后runs/train/football_s_1280 里会生成 weights/best.pt 和 last.pt以及混淆矩阵、曲线等可视化文件。4. 足球场景的训练参数调整小目标、密集人群与类间混淆第一次跑通不代表能用足球场景有三个老大难球太小、人太密、守门员和裁判容易被认成球员。这章全是针对这三个问题的调参和增强策略每一条都是可以直接抄进训练命令的东西。4.1 球在画面里太小多尺度训练与增强策略足球在电视转播画面里经常只有 10×10 像素左右。把 imgsz 提高到 1280 是最直接的解法但 GPU 显存不够时怎么办两个替代方案。一是把训练图像切成小块tiling比如把 1920×1080 的帧切成 4 个 960×540 的块球在块里相对变大代价是切块的边缘会产生截断目标标注也要跟着切比较麻烦。二是用多尺度训练让模型在每个 batch 里看到不同分辨率的图像增强对不同目标尺度的适应性。ultralytics 里开启多尺度训练的方法很简单就是设置训练参数里的 scale 范围和 mosaicyolo detect train \ datafootball_dataset/data.yaml \ modelyolov8s.pt \ epochs100 \ imgsz1280 \ batch12 \ scale0.3,1.5 \ mosaic0.8scale0.3,1.5 表示每次随机把图像缩放到原图的 30% 到 150% 之间再送入网络。逻辑说明多尺度训练的本质是让同一个目标在训练中以不同像素尺寸出现迫使检测头对不同尺度的特征都有响应。mosaic0.8 表示 80% 的 batch 使用马赛克增强4 张图拼成 1 张。但要小心mosaic 对密集小目标不友好拼图会让球进一步缩小所以我把 mosaic 从默认的 1.0 降到 0.8如果你发现训练时球一直检不出直接关掉 mosaic 试试。另外不要迷信高 imgsz。imgsz1280 训练出来的模型在推理时也用 1280否则尺度不匹配会导致精度下降如果你最终要部署到实时视频流1280 推理在低端显卡上撑不住 25fps就得在训练时就用 640 并接受球检测能力的下限。4.2 密集站位下的 NMS 冗余调整 conf 阈值和 iou 阈值足球比赛里球员扎堆是常态禁区里十几个人挤在一起检测框高度重叠。训练阶段这个问题会表现为 loss 正常下降但 mAP 卡住因为你用默认阈值评估时一个球员被多个框覆盖NMS 不知道该留哪个。推理和验证阶段调两个阈值yolo detect predict \ modelruns/train/football_s_1280/weights/best.pt \ sourcetest_video.mp4 \ conf0.35 \ iou0.45 \ imgsz1280conf0.35 比默认的 0.25 高能过滤掉大量重叠产生的低分框iou0.45 比默认的 0.7 低意味着 NMS 更容易删除重叠框。注意调这两个参数是「评估时」的行为模型本身没变。如果你发现某个球员被重复框住的概率很高可以用加权框融合WBF替代 NMSWBF 对密集人群的 AP 提升通常有 1 到 2 个点。不过 WBF 是后处理推理速度会变慢实时场景要权衡。还有一个思路在训练阶段增大 loss 中 IoU 分支的权重。yolov8 的 box 损失权重默认是 7.5如果你的框回归不准可以变成 10 或 12# model.yaml 或训练命令传参 box: 10.0这个参数在 ultralytics 里可以这样传box10.0。逻辑说明box 权重越大模型越专注把框回归得准代价是分类可能变差。足球场景里框回归要求不高球员框差几个像素不影响统计所以这个权重不建议调太高——除非你要做精细的越位分析。4.3 守门员和裁判的类间混淆给类别加权或改造输出策略守门员和球员外观相似都穿球衣裁判也穿运动服离远了和球员几乎分不清。这是类别定义本身的模糊性导致的——全场视角下守门员站在门前裁判在场上跑动和球员的差别主要靠位置和动作而不是外观。三个方案按成本从低到高排序。方案一在损失函数层面给少数类加权让模型犯错时更心疼。ultralytics 支持的类别权重设置方式是修改数据集 yaml 里的 loss 参数或者用cls_pw类别权重传入yolo detect train \ datafootball_dataset/data.yaml \ modelyolov8s.pt \ cls_pw1.0,2.0,2.0,1.0cls_pw 四个值分别对应 player、goalkeeper、referee、ball给守门员和裁判 2.0 的权重表示这两类分错的惩罚加倍。逻辑说明类别权重不直接改变样本数量但会放大少数类的 loss 贡献让梯度更新更偏向这些类。缺点是对任务本身的确定性无能为力——如果守门员和球员在画面里真的长得一样权重再大也白搭。方案二把位置先验加进后处理。守门员基本只在球门附近出现可以把检测结果和球场关键点门框位置结合把离球门过远的「守门员」预测框重新归类为球员。这个方法不需要重训模型只需要在推理脚本里加一段坐标判断逻辑很多足球分析项目就是靠这条规则把误检率砍掉一半的。方案三改用带注意力机制的检测头或者在数据层面做针对性增强——裁切守门员区域、翻转、颜色扰动让模型看到更多「守门员在不同光线下的样子」。如果你用 yolo 做基础可以考虑 yolov8 的 C2f 模块已经带了部分特征融合能力但如果你想正经提升类间区分度最有效的还是数据层面把守门员的样本量补起来。图像增强只能做有限变换真正的守门员动作扑救、开球、站位需要从更多场比赛里标出来。5. 足球运动数据集落地避坑我从标签检查和训练日志里看到的 5 个翻车点这一章全部来自实际踩坑经验每条按「现象 → 原因 → 解决」写帮你在训练之前就把问题挡在门外。5.1 现象mAP 高得离谱但换一场比赛验证全崩你训练集 mAP50 到了 0.92觉得自己模型成了拿到另一场比赛的视频里一跑球员漏一半球基本看不见。原因数据集的 train/val 划分是按单帧随机切的同一场比赛的相邻帧同时出现在两个集合里模型相当于开卷考试。解决重新按比赛或时间段划分数据集验证集里只放模型没见过的比赛。做法上先看文件名前缀match_01、match_02 这种就按前缀切如果文件名没有比赛信息可以用聚类按时间戳分组。这是最容易忽略、也最容易造成虚假成就感的问题。5.2 现象训练日志正常但 val 的守门员 AP 一直为 0原因标签里守门员被大量标成了 player。很多开源足球数据集是半自动标注的标注工具追踪球员时不区分守门员后处理也没人检查。解决先跑 2.4 的类别统计脚本看守门员数量是不是异常地少再用 2.3 的可视化脚本逐帧抽查。数量还好但 AP 为 0那就打开 val 集的守门员预测框和真实框对比如果是把守门员的框标到了球员身上直接修标签比调任何参数都管用。修标签别一张张改用 labelImg 或 CVAT 打开批量刷新或者写脚本按位置规则批量修正守门员框的中心点 y 坐标大于图像一半且靠近左右边界。5.3 现象loss 不降反升最后变成 NaN原因标签坐标越界加学习率太大。yolo 标签要求 x_center、y_center、width、height 都在 0 到 1 之间如果某个 txt 里出现了 1.2 这种值模型在计算 anchor 匹配时会出现无效梯度叠加 lr0.01训练中期 loss 直接炸掉。解决跑下面的标签校验脚本把越界行全部打印出来再决定是修标签还是删掉该样本import os def validate_labels(label_dir): bad_files [] for txt_name in os.listdir(label_dir): path os.path.join(label_dir, txt_name) with open(path, r) as f: for line in f: parts line.strip().split() if len(parts) ! 5: bad_files.append(txt_name) break try: vals [float(p) for p in parts[1:]] except ValueError: bad_files.append(txt_name) break if any(v 0 or v 1 for v in vals): bad_files.append(txt_name) break print(f有问题的标签文件: {len(bad_files)} 个) for fname in bad_files[:20]: print(fname) if __name__ __main__: validate_labels(football_dataset/labels/train)这个脚本逐一读标签行检查数值能否转成 float、坐标是否出界 0~1。逻辑上它不修改任何文件只负责报告如果你发现自己手里的数据集有一批越界标签优先想办法修正而不是直接删——尤其是守门员和球这种本来样本就少的类别删多了会进一步加剧不平衡。5.4 现象训练过程中 BN 层崩溃feature map 全变成 0yolo 训练中 bn 崩溃常见于学习率过大 batch 过小。现象是 loss 曲线突然断崖式下跌或变成 NaN然后后面所有 epoch 都在无效震荡。原因分析BN 在 batch 统计量不稳定时累积的 moving mean 被打乱网络输出塌缩。解决第一步把 lr0 从 0.01 降到 0.002~0.005第二步增大 batch批量至少 16第三步如果还崩在训练命令里加nbs64来提高名义 batch 大小。nbs 的作用是让优化器按照 64 的批量来缩放学习率而实际每次只喂 16 张图内存压力不变梯度更新更稳。5.5 现象推理视频时漏检呈「闪烁」状同一人这一帧有框、下一帧没框原因单帧阈值卡在置信度边界上加上足球视频运动模糊导致同一目标在不同帧的得分忽高忽低。解决如果只是推理不稳把 conf 从 0.35 降到 0.25 再试然后加 tracking 模块比如 ByteTrack跨帧关联利用轨迹的连续性补上漏掉的帧不要只依赖单帧检测。这个问题的本质不是模型坏了而是你用的评估画面恰好处于模型置信度的临界区多测几段不同机位的视频确认是边界问题还是系统性漏检再决定要不要补训练数据。6. 验证与上线用 mAP 之外的指标判断足球检测模型能不能用训练完别只看一个 mAP 数字就收工。足球场景的交付标准通常是「一段 90 分钟的视频能否稳定输出每帧的球员坐标和类别」这里有三个我每次必做的验证步骤外加一条把模型送上线的路径。第一步看混淆矩阵。ultralytics 训练输出里有 confusion_matrix.png重点看 referee 和 goalkeeper 这两类互相混淆的比例。如果 30% 的裁判被预测成球员说明类间区分没有解决这时候调阈值和后处理规则都比继续训更划算。注意混淆矩阵是按整个验证集算的你要会读它才知道模型错在哪主对角线越亮越好非对角线上的亮点就是错配源。第二步连续帧稳定性测试。抽一段 5 分钟的新比赛视频跑检测并统计每个目标的轨迹断点数量。做法是写个脚本逐帧检测用 IoU 关联相邻帧的框如果同一目标的框在 10 帧内消失又出现就算一次闪烁。这个数字比 mAP 更能说明问题——mAP 高但闪烁多上线后被业务方吐槽「怎么框一下有一下没有」的就是你。第三步导出与压测。确认精度达标后把模型导出成 onnx 再做推理速度测试yolo export \ modelruns/train/football_s_1280/weights/best.pt \ formatonnx \ imgsz1280 python -c import onnxruntime as ort import numpy as np sess ort.InferenceSession(best.onnx, providers[CUDAExecutionProvider]) x np.random.randn(1, 3, 1280, 1280).astype(np.float32) for _ in range(20): t0 time.time() outs sess.run(None, {sess.get_inputs()[0].name: x}) print(ftime: {(time.time()-t0)*1000:.1f} ms) 这段逻辑是先用 ultralytics 导出 onnx再用 onnxruntime 跑 20 次前向取平均耗时。参数说明imgsz 必须和训练时一致providers 里 CUDAExecutionProvider 优先没有 GPU 的机器会自动落到 CPU。这一步是为了确认模型在真实推理环境下的耗时避免训练时随手设的 1280 到部署时跑不动。上线后还要留一条回头路把生产环境里收集到的漏检帧每周抽一批快速标注后增量训练。我自己养成的习惯是每次训练前先跑一遍第 2 章的四个检查脚本再跑一条 50 epoch 的短训练验证标签没问题然后才上长训练这个流程帮我省掉过好几次「跑了一晚上发现 label 错位」的无效等待。希望对你也有用。本文还有配套的精品资源点击获取
上一篇/下一篇内容由系统自动关联 返回资讯列表 →