从 0 开始用 Python 训练YOLOv8检测模型(保姆级·单篇到底)

从 0 开始用 Python 训练YOLOv8检测模型(保姆级·单篇到底) 面向读者完全没编程基础、没配过环境、没跑过深度学习。复现效果①配好环境②用示例数据训练③换自己的图片重新训练④一段代码画出检测框。最终效果速览先看结果原图检测后自训权重注左为原图右为运行infer.py后自动画框效果识别原理目标检测的底层逻辑“先瞎框→再打分→修好框→去重→留结果”而训练阶段靠“对答案梯度下降”让这套策略越来越准。简易流程分析先撒网——在图上扔几万只空框。网眼打分——每只框问两件事框里有目标吗框要挪哪才刚好去重留最优——同类重叠只留最自信的那个。靠“对答案-打手心”循环练出好网眼就成了检测器。一. 硬件与系统确认数据集的收集项目要求检查方法系统Windows 11 / 10WinR→ 输入winverGPUNVIDIA RTX4060具体不做要求仅本贴机器型号设备管理器→显示适配器磁盘剩余 15 G具体按照数据库大小而定资源管理器看 C 盘网络可访问 NVIDIA 官网NVIDIA官网网址二. 准备配置环境参考文章【YOLOv8系列】二YOLOv8环境配置手把手嘴对嘴保姆教学-CSDN博客由于文章发布时长较久本一章节内容目的为更新下载资源的按键与页面操作指向。且后期操作与参考文章有所不同请谨慎选择。1.Anaconda下载Anaconda 的详细下载教程参考最新版最详细Anaconda新手安装配置环境创建教程_anaconda配置-CSDN博客Anaconda 下载链接Download Anaconda Distribution | Anaconda进入页面后点击Skip registration点击Download会自动匹配下载符合系统的 Anaconda 包安装地址可以自定义Finish 安装结束2.创建yolov8虚拟环境在电脑左下角搜索Anaconda点击打开Anaconda Prompt创建新的虚拟环境yolov8conda create -n yolov8 python3.8激活yolov8环境conda activate yolov8激活后这个页面可以先不用关掉之后还要用的3.pytorch安装WinR输入cmd命令弹出对话框后。输入命令nvidia-smi自己电脑是否有GPU如果有CUDA版本是多少。如果没有则安装CPU版本的pytoch跳过后续CUDA以及CUDNN步骤。nvidia-smiPytorch 官网链接PyTorch进入官网后点击 Get started进入后根据你自己的电脑配置去选择最后得到安装命令4.CUDA下载不确定是否是网络问题打开CUDA官网CUDA Toolkit Archive | NVIDIA Developer 是这个样子与开头引用帖子中的显示界面不同。按照这个页面进行操作只会下载开源的压缩包不能进行安装所以我另外找了一个网址CUDA 工具包 - 免费工具和培训 | NVIDIA 开发者根据自己的设备条件进行选择最后会给出官方下载链接直接点击 Download 进行下载安装。默认安装即可记录下安装路径。安装完成后再按照参考贴的步骤继续操作方法一【右击此电脑】—【属性】—(界面右边)【高级系统设置】—【环境变量】—点击【系统变量】里的path进去查看环境变量。方法二任务栏搜索【环境变量】打开后点击【高级】—【环境变量】双击【系统变量】中的【path】进行查看需要看一下环境变量若没有安装默认安装路径自行添加。C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\libnvvpC:\Program Files\NVIDIA Corporation\Nsight Compute 2022.1.1\C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.6\bin————————————————版权声明本文为博主原创文章遵循 CC 4.0 BY-SA 版权协议转载请附上原文出处链接和本声明。原文链接https://blog.csdn.net/weixin_44765053/article/details/1401619865.安装Pycharm个人使用Pycharm可以选择社区版免费专业版要收费。Pycharm 社区版下载链接感谢您下载 PyCharm Community Edition下载完之后打开安装点下一步遇到选择路径 修改路径到D盘或者其它除C盘外的文件夹点击下一步将四个选项都选上再点击下一步直至安装结束。6.安装必要库接着之前的界面继续安装ultralytics库pip install ultralytics安装完成下载 YOLO 源码可以从百度网盘链接直接下载建议放在D盘之后用Pycharm打开链接: https://pan.baidu.com/s/1crvO5XIRxEUSzWpbG8QrAg?pwdy4xx 提取码: y4xx点击右上角【文件】—【设置】按照下图进行选择一般会自动出现适配的解释器基础环境配置完成。三 标注工具获取及使用1.标注工具的推荐市面上推荐的标注工具有很多可以自行搜集例如10个最流行的开源机器视觉标注工具_开源标注工具-CSDN博客贴主自用的标注工具是 Roboflow 和 精灵标注助手Colabeler二者都是免费标注工具。Roboflow 需要翻墙进入精灵标注助手可以在本地直接使用。接下来标注部分都以精灵标注助手为基础进行操作。Roboflow 的使用教程YOLOv8官方推荐免费数据集网站Roboflow_yolo数据集分享网站-CSDN博客Roboflow 网址Roboflow: Computer vision tools for developers and enterprises精灵标注助手的使用教程精灵标注助手Colabeler使用教程-CSDN博客精灵标注助手 下载网址http://www.colabeler.com/如果进不去可以直接百度百科会有别的网址提供下载的2.标注软件的下载安装位置系统会默认C盘可以自定义安装文件位置按键完成安装打开后的界面3.标注信息的获取准备数据集根据你的识别目标创建数据集数据集一般指图片 .jpg .png等类似于我的识别目标是行人和车辆那么数据集如图图片放置在同一个文件夹中注想要精确度越高识别种类越多数据集规格越大千张打底。新建项目选择对应的项目类型进行创建位置标注通用目标检测人脸、车辆、瑕疵、猫狗凡是要说出“在哪儿、是什么”的都用它。图像分类整图识别垃圾邮件图片过滤、工业“合格/不合格”判断只关心整张图属于哪一类不关注目标位置。像素级分割实例分割 / 语义分割自动驾驶里“每个像素属于车道还是行人”、医学影像“肿瘤边界到底在哪”。3维位置标注立体检测 / 机器人抓取仓库里箱子长宽高、自动驾驶里“车前 20 米有行人”需要真实世界坐标。视频追踪视频目标检测ID 保持路口统计车流、球场追踪运动员轨迹要让框在帧与帧之间是同一个ID。图片转录OCR 目标识别把文字区域当“目标”识别出每行每字例如车牌、身份证、小票。其中最常用的是位置标注。其算法成熟人脸、车辆、商品、缺陷检测 80% 场景都用它是工业界最常用、最优先上的项目类型。以下操作以“位置标注”项目类型进行数据标注自定义项目内容分类值是指该项目要识别的类型譬如行人、车辆等进行标注框图在图像中框出目标对象并选择对应的标注类别注在框图时可以选择曲线框、多边形框和矩形框根据需要进行选择。注在每张图片标注完后要点击底部“蓝色的√”来保存标注信息否则切换到下一张图片会丢失信息。导出标注信息可以新建一个文件夹进行标注信息的储存标注信息的导出类型有多种本贴导出的信息是 json 文件格式。注YOLOv8 默认只支持 YOLO 格式的 txt 标注文件进行训练后续需要进行格式转换代码放在下面每份 json 文件对应一张图片下面是 0008.json 的内容{path:C:\\Users\\23637\\Desktop\\数据集\\0008.jpg,outputs:{object:[{name:person,bndbox:{xmin:121,ymin:99,xmax:157,ymax:208}},{name:person,bndbox:{xmin:367,ymin:120,xmax:395,ymax:184}},{name:car,bndbox:{xmin:160,ymin:106,xmax:321,ymax:191}}]},time_labeled:1757924438505,labeled:true,size:{width:399,height:300,depth:3}}path被标注的图像文件路径name识别对象的标签名称xminyminxmaxymax是边界框对应目标在图上的标注位置四 权重训练1.权重训练前期准备以及文件格式转换数据集分类格式转换必须对数据集进行分类即划分为训练集、验证集必要时还包括测试集才能用于 YOLO 的权重训练。训练集Training Set用于模型参数的学习。验证集Validation Set用于调参、监控过拟合、选择模型。测试集Test Set用于最终评估模型泛化能力。不划分数据集会导致模型评估失真甚至严重过拟合。以下表格是常见数据集比例划分训练集验证集测试集70%20%10%YOLOv8 默认只支持 YOLO 格式的 txt 标注文件进行训练以下代码convert_to_yolo.py功能为自动扫描你数据集中的所有.json文件提取类别person和car并编号按 70% / 20% / 10% 划分为 train / val / test将每个.json转换为 YOLO 格式的.txt生成后期需要使用的 data.yaml 文件输出到你指定的目录结构import os import json import random import shutil from pathlib import Path # 只用改这里 json_dir Path(rdata/Annotations) # 所有 json 所在 img_dir Path(rdata/Images) # 所有图片所在 output_dir Path(rdataset) # 输出根目录 # # 1. 创建输出目录 for split in [train, val, test]: (output_dir / images / split).mkdir(parentsTrue, exist_okTrue) (output_dir / labels / split).mkdir(parentsTrue, exist_okTrue) # 2. 读取全部标注文件 json_files list(json_dir.glob(*.json)) list(json_dir.glob(*.Annotations)) if not json_files: raise FileNotFoundError(f{json_dir} 下找不到任何 .json 或 .Annotations 文件) random.shuffle(json_files) # 3. 自动提取类别 class2id {} for jf in json_files: data json.loads(jf.read_text(encodingutf-8)) for obj in data.get(outputs, {}).get(object, []): class2id[obj[name]] 0 class2id {n: i for i, n in enumerate(sorted(class2id))} print(类别映射, class2id) # 4. 生成 data.yaml (output_dir / data.yaml).write_text( ftrain: ./images/train\nval: ./images/val\ntest: ./images/test\nnc: {len(class2id)}\nnames: {list(class2id.keys())}\n, encodingutf-8, ) # 5. 划分数据集 n len(json_files) splits { train: json_files[: int(n * 0.7)], val : json_files[int(n * 0.7): int(n * 0.9)], test : json_files[int(n * 0.9):], } def to_yolo(bbox, W, H): x (bbox[xmin] bbox[xmax]) / 2 / W y (bbox[ymin] bbox[ymax]) / 2 / H w (bbox[xmax] - bbox[xmin]) / W h (bbox[ymax] - bbox[ymin]) / H return x, y, w, h # 6. 转换 复制 for split, files in splits.items(): for jf in files: data json.loads(jf.read_text(encodingutf-8)) img_stem Path(data[path]).stem img_ext Path(data[path]).suffix # 找图片多后缀兼容 src_img None for ext in (img_ext.lower(), img_ext.upper(), .jpg, .jpeg, .png, .JPG, .JPEG, .PNG): tmp img_dir / (img_stem ext) if tmp.exists(): src_img tmp break if src_img is None: print(f⚠️ 找不到图片{img_stem}.*) continue dst_img output_dir / images / split / src_img.name shutil.copy(src_img, dst_img) # 写标签 txt_path output_dir / labels / split / f{img_stem}.txt with open(txt_path, w) as f: for obj in data.get(outputs, {}).get(object, []): x, y, w, h to_yolo(obj[bndbox], data[size][width], data[size][height]) f.write(f{class2id[obj[name]]} {x:.6f} {y:.6f} {w:.6f} {h:.6f}\n) print(dataset/images 和 dataset/labels 已有文件dataset/data.yaml 已生成。)运行代码后最终呈现的文件结构是这样的文件准备以下训练权重的代码import os os.environ[KMP_DUPLICATE_LIB_OK] TRUE # 允许重复 OpenMP 运行时治标 os.environ[OMP_NUM_THREADS] 1 # 强制只用一个 OpenMP 线程治本 import cv2, os cv2.setNumThreads(0) # 禁止 OpenCV 内部再开线程 from ultralytics import YOLO def main(): model YOLO(yolov8n.pt) model.train( datarultralytics-main/YOLO/dataset/data.yaml, epochs100, imgsz640, batch16, device0, workers0, projectruns/train, namepersoncar, pretrainedTrue, ampTrue, cacheFalse, ) if __name__ __main__: import multiprocessing multiprocessing.freeze_support() main()最终文件架构如图2.训练权重在 pycharm 中打开 train.py 文件右击点击运行底部会出现运行状态栏训练权重的时间会比较长可以稍作等待。最后会在 ultralytics-main/runs/train/person_car/weights 找到 best.pt 这是训练100轮后达到的最好效果的权重。五 效果验证训练结束后拿到权重 best.pt 可以进行效果检测。以下是简单的检测代码 infer.py 结果可视化一般表现为 种类名称和置信度。import os import cv2 from ultralytics import YOLO # 1. 加载你自己训练好的权重 model_path rD:\ultralytics\ultralytics-main\best.pt # 换成你的权重路径 model YOLO(model_path) # 2. 单张图片 source rD:\ultralytics\ultralytics-main\image\1.jpg # 换成你的图片路径 # 3. 输出目录 output_dir rD:\ultralytics\ultralytics-main\output os.makedirs(output_dir, exist_okTrue) # 4. 只检 person(0) 和 car(1) results model(source, streamTrue, classes[0, 1]) for i, result in enumerate(results): annotated_frame result.plot() save_path os.path.join(output_dir, fresult_{i}.png) cv2.imwrite(save_path, annotated_frame) print(f保存检测结果到{save_path}) cv2.imshow(YOLOv8 Detection, annotated_frame) if cv2.waitKey(0) 0xFF ord(q): break cv2.destroyAllWindows()原图和训练后的图片对比原图检测后自训权重其中框上的名称和数字分别代表着 类别ID 和 置信度 。总结有错误处请帮助指出希望它能够帮到你。