1. 项目缘起为什么从Ubuntu 20.04和YOLOv5开始如果你刚接触深度学习目标检测或者想找一个稳定、成熟、社区支持好的方案来快速验证想法那么“Ubuntu 20.04 YOLOv5”这个组合大概率是你绕不开的起点。我最早接触这个组合是在一个工业质检的POC项目里当时需要在两周内从零搭建一个能识别产品表面缺陷的演示系统。市面上框架很多但综合考量上手速度、文档完整度、预训练模型效果和部署友好性YOLOv5在当时乃至现在依然是平衡性最好的选择之一。而Ubuntu 20.04 LTS作为一个长期支持版本提供了极其稳定的底层系统环境避免了在新版本系统上可能遇到的各种依赖库冲突这对于追求复现性和稳定性的开发环境搭建来说是至关重要的基础。这个标题看似简单只是“环境搭建”和“数据集训练”但背后串联的是一条从零到一的完整深度学习应用链路。它不仅仅是敲几行安装命令更涉及到如何在一个纯净的系统上规划你的开发环境处理可能出现的版本冲突以及最关键的——如何将你手头的一堆图片变成模型能“读懂”并“学会”的标准数据。很多人卡在环境配置上更多人卡在数据准备上。网上教程很多但往往只讲“怎么做”很少系统地讲“为什么这么做”以及“做错了怎么排查”。这篇内容我就结合自己多次搭建和教学的经验把这套流程掰开揉碎了讲清楚目标是让你跟着走一遍就能拥有一个可工作、可调试、可扩展的YOLOv5开发环境并成功训练出第一个属于你自己的模型。2. 基石Ubuntu 20.04系统准备与基础环境配置在开始任何深度学习项目之前一个干净、可控的系统环境是高效工作的前提。Ubuntu 20.04 LTSFocal Fossa之所以成为很多实验室和公司的首选是因为其长达五年的标准支持周期确保了系统底层的稳定性和安全性更新。对于深度学习来说这意味着CUDA、cuDNN等核心驱动和库的兼容性有长期保障减少了因系统升级带来的意外麻烦。2.1 系统安装与初始设置无论你是使用物理机、虚拟机如VMware、VirtualBox还是云服务器安装Ubuntu 20.04的步骤大同小异。这里我强调几个对后续开发影响巨大的关键选择分区方案对于深度学习开发机我强烈建议采用手动分区。一个推荐的方案是/根目录50-100GB用于安装系统和软件。swap交换空间物理内存的1-2倍但不超过32GB。对于大内存机器如64GB以上可以设置与内存等大或略小主要用于休眠。/home家目录剩余所有空间。你的代码、数据集、模型权重都将存放在这里。将其独立分区未来重装系统时可以保留数据。软件源配置安装完成后第一件事就是更换为国内镜像源以加速软件下载。编辑源列表文件sudo cp /etc/apt/sources.list /etc/apt/sources.list.backup sudo sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list sudo apt update sudo apt upgrade -y这里使用的是阿里云镜像你也可以替换为清华、中科大等源。apt update是刷新软件包列表upgrade是升级已安装的包。这一步能为你后续安装各种依赖节省大量时间。基础开发工具安装接下来安装一些必不可少的工具。sudo apt install -y git curl wget vim build-essential cmake unzipgit版本控制和克隆YOLOv5代码库必备。curl/wget网络下载工具。vim一个高效的文本编辑器后续修改配置文件会用到。build-essential包含GCC、G、make等编译工具链是编译许多Python底层库如某些情况下需要从源码编译的PyTorch的基础。cmake跨平台的安装编译工具一些底层库的编译需要。unzip用于解压数据集等压缩包。2.2 Python环境管理Anaconda vs Miniconda vs 系统Python深度学习项目最怕“依赖地狱”——项目A需要PyTorch 1.7项目B需要PyTorch 1.12系统Python里各种包版本混乱不堪。解决这个问题的银弹就是环境隔离。我推荐使用Miniconda来管理Python环境。为什么不直接用系统Python或完整的Anaconda系统Python的包由apt管理版本通常较旧且全局安装容易冲突。完整的Anaconda体积庞大约500MB包含了大量你可能用不到的科学计算包。Miniconda是Anaconda的精简版只包含conda、Python和一些基础包体积小约50MB灵活性强。安装Minicondawget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh bash Miniconda3-latest-Linux-x86_64.sh安装过程中注意看提示建议将conda初始化到你的shell配置文件中通常是~/.bashrc。安装完成后重启终端或执行source ~/.bashrc使配置生效。创建专属的YOLOv5环境conda create -n yolov5 python3.8 -y conda activate yolov5这里我指定Python 3.8因为这是经过PyTorch和YOLOv5社区广泛测试的稳定版本。更高的版本如3.9 3.10也可能兼容但3.8是最稳妥的选择。环境命名yolov5清晰明了激活后你的终端提示符前会出现(yolov5)表示已进入该独立环境。3. 核心引擎PyTorch与CUDA驱动安装详解这是整个环境搭建中最容易出错也最影响后续训练速度的环节。核心是版本匹配NVIDIA显卡驱动、CUDA Toolkit、PyTorch版本、cuDNN版本必须相互兼容。3.1 NVIDIA显卡驱动安装首先检查你的显卡是否支持CUDA并确定型号lspci | grep -i nvidia如果使用的是云服务器可能需要先安装pciutilssudo apt install pciutils。Ubuntu 20.04提供了多种安装驱动的方式我推荐使用官方PPA仓库它能提供较新且稳定的驱动。添加PPA仓库并安装驱动sudo add-apt-repository ppa:graphics-drivers/ppa sudo apt update ubuntu-drivers devices # 查看推荐的驱动版本 sudo apt install nvidia-driver-version # 例如 nvidia-driver-470执行ubuntu-drivers devices后系统会列出可用驱动通常会有一个标记为“recommended”的版本。安装这个推荐版本通常是最稳妥的。对于较新的显卡如30系、40系可能需要安装510、515或更高版本的驱动。安装完成后必须重启系统。sudo reboot重启后验证驱动是否安装成功nvidia-smi这个命令会输出一个表格显示你的GPU型号、驱动版本、CUDA版本这里是驱动内嵌的CUDA版本并非我们后面要安装的CUDA Toolkit以及GPU的使用情况。看到这个界面说明驱动安装成功。3.2 CUDA Toolkit与cuDNN安装重要认知nvidia-smi显示的CUDA版本是驱动支持的最高CUDA版本。我们实际需要安装的是CUDA Toolkit其版本必须小于等于驱动支持的版本。PyTorch官方预编译包通常已经包含了对应版本的CUDA和cuDNN运行时库因此对于大多数只想使用YOLOv5进行训练和推理的用户可以跳过手动安装CUDA Toolkit和cuDNN的复杂步骤直接通过PyTorch官方命令安装即可这是最省心、最不容易出错的方式。但为了知识的完整性也为了应对某些需要从源码编译的特殊情况我简要说明一下手动安装的逻辑确定PyTorch需要的CUDA版本访问 PyTorch官网 查看当前稳定版PyTorch对应的CUDA版本。例如PyTorch 1.12.0可能对应CUDA 11.3或11.6。安装CUDA Toolkit到NVIDIA官网下载对应版本的CUDA Toolkit安装包runfile格式按照指令安装。注意在安装过程中不要安装驱动因为我们已经装好了只选择安装Toolkit。安装cuDNN下载与CUDA版本匹配的cuDNN库将其头文件和库文件复制到CUDA的安装目录中。这个过程涉及路径配置容易出错。因此再次强调对于YOLOv5用户优先采用下一节的PyTorch官方安装法。3.3 PyTorch与Torchvision安装这是最关键的一步。进入我们之前创建的yolov5conda环境使用PyTorch官网提供的命令进行安装。以安装支持CUDA 11.3的PyTorch 1.12.0为例请以官网最新命令为准conda activate yolov5 pip install torch1.12.0cu113 torchvision0.13.0cu113 torchaudio0.12.0 --extra-index-url https://download.pytorch.org/whl/cu113命令解析torch1.12.0cu113指定PyTorch版本为1.12.0且预编译了CUDA 11.3的二进制包。--extra-index-url告诉pip去PyTorch官方的CUDA仓库查找这个特定的包。安装torchvision和torchaudio是为了配套确保视觉和音频相关功能正常。安装完成后验证PyTorch是否能正确识别GPUpython -c import torch; print(torch.__version__); print(torch.cuda.is_available())如果输出你的PyTorch版本和True那么恭喜你PyTorch GPU环境配置成功如果显示False请检查conda环境是否激活、PyTorch版本与CUDA驱动是否兼容。实操心得网络问题可能导致从官方源下载很慢或失败。可以尝试使用国内镜像源如清华源。但注意PyTorch的CUDA版本包有时在镜像源上更新不及时。最可靠的方法是先使用官方命令如果速度太慢可以先用迅雷等工具下载好.whl文件再进行本地安装。4. YOLOv5项目部署与依赖安装环境就绪现在可以把YOLOv5请进来了。YOLOv5的代码托管在GitHub上由Ultralytics团队维护更新非常活跃。4.1 克隆代码与安装项目依赖# 确保在yolov5 conda环境下 conda activate yolov5 # 克隆项目代码 git clone https://github.com/ultralytics/yolov5.git cd yolov5 # 安装项目所需的Python依赖包 pip install -r requirements.txtrequirements.txt文件里定义了运行YOLOv5所需的所有Python包包括opencv-python、pillow、matplotlib、pandas等。pip会自动处理这些依赖。这里有一个经典坑点OpenCV的安装。requirements.txt里通常是opencv-python。在某些系统上这可能会因为缺少某些系统库而安装失败或运行时出错。如果遇到问题可以尝试先安装系统库sudo apt install libgl1-mesa-glx libglib2.0-0 libsm6 libxrender1 libxext6 -y然后再执行pip install -r requirements.txt。如果还是不行可以尝试安装opencv-python-headless无GUI版本对于服务器环境更友好。4.2 验证环境与快速推理测试安装完依赖后强烈建议进行一次快速测试确保整个流水线是通的。YOLOv5仓库提供了预训练的模型和测试图片。# 运行推理测试使用最小的yolov5s模型 python detect.py --source data/images --weights yolov5s.pt --conf 0.25参数解释--source data/images指定输入源这里是项目自带的data/images文件夹下的两张测试图片。--weights yolov5s.pt指定使用的模型权重。yolov5s.pt是预训练好的“小”模型程序会自动从GitHub Release页面下载如果本地没有。--conf 0.25置信度阈值低于此值的检测框将被过滤。执行后如果一切正常你会看到下载进度条然后程序开始推理。结束后结果会保存在runs/detect/exp目录下。用文件管理器打开这个目录看看图片上是否画出了检测框比如人、自行车。这证明了从模型加载、数据预处理、推理到后处理的可视化整个链条是完整的。注意事项第一次运行会自动下载模型权重请确保网络通畅。如果下载失败可以手动去YOLOv5的GitHub Release页面下载对应的.pt文件放到项目根目录。5. 从零构建创建自己的YOLOv5数据集环境跑通了接下来才是真正的重头戏——准备你自己的数据。很多教程在这里一笔带过但据我观察超过一半的失败项目都倒在了数据准备不规范上。YOLOv5要求的数据格式是一种特定的TXT标注文件。5.1 数据目录结构规范首先建立一个清晰的数据目录。我推荐如下结构your_dataset/ ├── images/ │ ├── train/ │ │ ├── image1.jpg │ │ ├── image2.jpg │ │ └── ... │ └── val/ │ ├── image100.jpg │ ├── image101.jpg │ └── ... └── labels/ ├── train/ │ ├── image1.txt │ ├── image2.txt │ └── ... └── val/ ├── image100.txt ├── image101.txt └── ...images/train/和images/val/分别存放训练集和验证集的图片文件如.jpg, .png。labels/train/和labels/val/分别存放对应图片的标注文件.txt文件名与图片名不含后缀必须严格一致。5.2 标注格式详解YOLO TXT格式YOLO格式的标注文件是纯文本文件每行代表图片中的一个物体实例。每一行的格式为class_id x_center y_center width height重要所有坐标值x_center,y_center,width,height都是归一化后的值即相对于图片宽度和高度的比例范围在0到1之间。class_id物体的类别索引从0开始整数编号。例如你有3类person(0),car(1),dog(2)。x_center物体边界框中心点的x坐标/图片宽度y_center物体边界框中心点的y坐标/图片高度width物体边界框的宽度/图片宽度height物体边界框的高度/图片高度举例假设一张图片尺寸为640x480上面有一个person类别0的边界框其左上角坐标为(100, 120)右下角坐标为(220, 350)。边界框中心点x_center (100 220) / 2 160,y_center (120 350) / 2 235边界框宽度width 220 - 100 120,height 350 - 120 230归一化x_center_norm 160 / 640 0.25y_center_norm 235 / 480 ≈ 0.4896width_norm 120 / 640 0.1875height_norm 230 / 480 ≈ 0.4792那么对应的TXT文件内容就是一行0 0.25 0.4896 0.1875 0.47925.3 标注工具选择与使用手动计算这些坐标是不现实的我们需要标注工具。市面上有很多选择LabelImg经典的老牌工具支持Pascal VOC和YOLO格式。图形界面上手简单。pip install labelImg labelImg使用LabelImg时在保存格式中选择“YOLO”它就会自动生成符合上述格式的TXT文件。Roboflow在线标注平台功能强大支持团队协作、数据增强、版本管理。对于个人和小项目有免费额度。它可以直接导出为YOLOv5格式非常方便。CVAT功能更强大的开源在线标注系统适合更复杂的标注任务如实例分割、关键点但部署和配置稍复杂。标注过程中的核心原则一致性同一类物体在不同图片中的标注标准要统一。完整性边界框应恰好包含整个目标物体既不要太大包含多余背景也不要太小截断物体。验证集独立验证集val的图片必须从未在训练集中出现过且最好能代表实际应用场景的分布。通常按8:2或9:1的比例随机划分训练集和验证集。5.4 创建数据集配置文件数据准备好后需要创建一个YAML配置文件告诉YOLOv5你的数据在哪里、有哪些类别。在YOLOv5项目根目录下创建一个新文件例如my_dataset.yaml# 数据集根目录路径 (相对于本yaml文件或绝对路径) path: /home/username/datasets/your_dataset # 训练集和验证集的图片目录相对于path train: images/train val: images/val # 类别数量 nc: 3 # 类别名称列表顺序必须与标注文件中的class_id对应 names: [person, car, dog]path你的数据集根目录your_dataset的绝对路径。train/val训练/验证图片的路径相对于path。nc类别总数。names类别名称列表索引号就是class_id。6. 模型训练参数解析与实战调优万事俱备只欠训练。YOLOv5的训练脚本功能丰富参数众多理解关键参数的意义是调优的基础。6.1 启动首次训练最基本的训练命令如下python train.py --img 640 --batch 16 --epochs 100 --data my_dataset.yaml --weights yolov5s.pt--img 640输入图片的尺寸训练时图片会被缩放到此大小。YOLOv5支持多尺度训练但这里固定为640。更大的尺寸如1280可能提升精度但显著增加显存消耗和训练时间。--batch 16批次大小。一次迭代送入模型的图片数量。这个值受限于你的GPU显存。如果出现“CUDA out of memory”错误需要减小batch。RTX 308010GB上训练yolov5sbatch16通常没问题。--epochs 100训练轮数。整个训练集被完整遍历一次称为一个epoch。100是一个常见的起始值具体需要根据损失曲线收敛情况调整。--data my_dataset.yaml指定上一步创建的数据集配置文件路径。--weights yolov5s.pt指定预训练权重。强烈建议使用预训练权重这能利用在COCO等大型数据集上学到的通用特征加速收敛并提升最终精度即迁移学习。yolov5s.pt是小型模型还有yolov5m.pt中、yolov5l.pt大、yolov5x.pt特大模型越大精度通常越高但速度越慢显存需求越大。执行命令后训练开始。你会看到终端输出每个epoch的训练损失、验证损失、以及精度指标mAP0.5等。所有训练日志、模型权重、可视化图表都会自动保存在runs/train/exp目录下后续训练会依次生成exp2,exp3等。6.2 关键训练参数深度解析除了上述基础参数还有一些对训练效果影响巨大的参数--cfg指定模型结构配置文件。如果你想修改网络结构如增减层、更换注意力机制可以修改models/目录下的yaml文件并通过此参数指定。对于初学者直接使用预定义模型--weights yolov5s.pt即可它会自动加载对应的结构。--device指定训练设备。--device 0表示使用第一块GPU--device 0,1表示使用前两块GPU进行数据并行训练。如果设为--device cpu则使用CPU训练极慢不推荐。--workers数据加载的线程数。用于在CPU上并行加载和预处理数据以喂给GPU。通常设置为CPU核心数。设置过大会增加CPU负担可能适得其反。--hyp指定超参数配置文件。YOLOv5使用data/hyps/hyp.scratch-low.yaml等文件定义学习率、权重衰减、 mosaic数据增强等超参数。通常不需要修改除非你进行深入的调优研究。--resume从上次中断的训练继续。例如--resume runs/train/exp/weights/last.pt。这在训练意外中断或想增加训练轮数时非常有用。6.3 训练过程监控与问题诊断训练启动后不能放任不管。你需要学会看两个东西终端日志和TensorBoard可视化。终端日志关注几个关键指标box_loss,obj_loss,cls_loss分别是边界框回归损失、目标置信度损失、分类损失。它们应该随着epoch增加而稳步下降。metrics/mAP_0.5在IoU阈值为0.5时的平均精度均值。这是衡量检测精度的核心指标应该逐渐上升并趋于稳定。val/box_loss等验证集上的损失。理想情况下训练损失和验证损失应该同步下降。如果训练损失下降但验证损失上升或波动很大可能是过拟合的迹象。TensorBoardYOLOv5在训练时会自动记录TensorBoard日志。在另一个终端启动TensorBoardtensorboard --logdir runs/train然后在浏览器中打开http://localhost:6006。这里可以看到所有损失和指标随训练步数的变化曲线比看终端数字直观得多。你可以清晰地看到学习率的变化曲线、各个损失函数的下降趋势以及验证集精度的提升过程。常见训练问题与排查Loss为NaN或突然变得巨大通常是学习率lr0设置过高。尝试使用更小的学习率或者使用预训练权重它自带一个较好的初始学习率规划。mAP始终为0或极低首要怀疑数据检查标注文件格式是否正确归一化坐标、类别ID从0开始。检查数据集配置文件.yaml中的path、train、val路径是否正确。检查类别不平衡某些类别的样本数是否过少尝试数据增强或收集更多数据。模型容量不足对于复杂场景yolov5s可能太小尝试yolov5m或yolov5l。训练速度极慢检查是否在使用GPUnvidia-smi查看GPU利用率。检查--workers数量是否合适数据加载可能成为瓶颈。图片尺寸--img过大也会显著影响速度。7. 模型评估、验证与导出训练完成后我们需要客观地评估模型的好坏并准备将其用于实际推理。7.1 模型验证与指标解读使用训练好的最佳权重通常是runs/train/exp/weights/best.pt在验证集上进行全面评估python val.py --weights runs/train/exp/weights/best.pt --data my_dataset.yaml --img 640这个命令会输出一系列详细的评估指标最重要的是mAP0.5 IoU阈值为0.5时的平均精度均值。这是最常用的指标值越高越好。mAP0.5:0.95 IoU阈值从0.5到0.95步长0.05计算的平均mAP。这是一个更严格的指标要求预测框与真实框的重合度更高。每个类别的精确率Precision、召回率Recall、AP值。同时在runs/val/exp目录下会生成一个confusion_matrix.png混淆矩阵可以直观看到模型在各个类别上的混淆情况还有P_curve.png精确率-置信度曲线和R_curve.png召回率-置信度曲线帮助你选择合适的置信度阈值--conf。7.2 使用自定义模型进行推理现在你可以用自己的模型来检测新图片或视频了python detect.py --source test_image.jpg --weights runs/train/exp/weights/best.pt --conf 0.5--source可以是一张图片、一个视频文件、一个包含图片的文件夹、一个摄像头ID如0甚至是一个网络视频流URL。--conf置信度阈值。根据验证结果中的P-R曲线调整在精确率和召回率之间取得平衡。值越高检测框越少但更可信值越低可能检出更多目标但也包含更多误报。7.3 模型导出为部署格式训练出的.pt文件是PyTorch模型要在其他平台如C、移动端、嵌入式设备部署需要转换成通用格式。导出为ONNXpython export.py --weights runs/train/exp/weights/best.pt --include onnxONNX是一种开放的模型交换格式被很多推理引擎如TensorRT, OpenVINO, ONNX Runtime支持。导出的best.onnx文件可以用于跨平台部署。导出为TensorRT如果需要在NVIDIA GPU上获得极致推理速度python export.py --weights runs/train/exp/weights/best.pt --include engine --device 0这需要你的环境已安装TensorRT。导出过程会在当前目录下生成一个best.engine文件这是一个针对你当前GPU和输入尺寸优化过的序列化引擎推理速度最快。8. 进阶技巧与持续优化路径完成第一次训练只是起点。要让模型在实际应用中表现稳健还需要一系列工程化优化。8.1 数据增强的威力与策略YOLOv5默认开启了强大的数据增强如Mosaic四图拼接、MixUp、随机仿射变换等这些都在hyp.yaml文件中配置。对于小数据集数据增强是防止过拟合、提升模型泛化能力的利器。你可以尝试调整hyp.yaml中的增强参数例如hsv_h,hsv_s,hsv_v调整色调、饱和度、明度的增强幅度。degrees随机旋转的角度范围。translate随机平移的比例。注意增强不是越强越好。过度的增强可能会让模型学习到不真实的模式反而损害性能。建议通过实验A/B测试来找到适合你数据集的增强强度。8.2 超参数调优YOLOv5提供了超参数进化Hyperparameter Evolution功能这是一种自动搜索较优超参数组合的方法。它会基于遗传算法在指定的超参数空间内进行搜索。python train.py --data my_dataset.yaml --weights yolov5s.pt --evolve这个过程非常耗时因为它需要启动很多次训练。通常只在数据集固定、且对模型性能有极致要求时使用。对于大多数项目使用默认超参数已经能得到不错的结果。8.3 模型选择与剪枝模型选择从s到x模型越来越大。选择的原则是在满足部署环境速度、显存要求的前提下选择精度最高的模型。可以用相同的训练配置分别训练s、m、l然后在验证集上对比它们的精度和速度。模型剪枝如果训练出的模型太大、推理太慢可以考虑剪枝。剪枝通过移除网络中不重要的连接或通道来减小模型大小、提升速度同时尽量保持精度。YOLOv5官方没有内置剪枝工具但社区有一些基于第三方库如torch-pruning的实践。8.4 部署实战考量将模型部署到生产环境时有几个关键点预处理/后处理对齐确保部署端的图像预处理归一化、通道顺序、尺寸缩放与训练时完全一致。后处理NMS非极大值抑制的参数如IoU阈值也需要对齐。量化将模型从FP32精度转换为INT8精度可以大幅减少模型体积、提升推理速度对嵌入式设备尤其重要。TensorRT和OpenVINO都支持INT8量化但可能需要一部分校准数据。多尺度推理训练时固定了--img尺寸但实际应用中图片尺寸多变。一种策略是保持模型输入尺寸不变将图片缩放并填充到固定尺寸另一种策略是构建一个简单的多尺度测试流程对同一张图片用不同尺寸推理然后融合结果但这会成倍增加计算量。从在Ubuntu 20.04上安装第一个驱动到训练出第一个能识别自定义目标的模型这个过程本身就是一个完整的微型项目周期。我自己的体会是前期的环境配置和数据准备虽然繁琐但磨刀不误砍柴工一个干净的环境和一份规范的数据能为你节省后期大量的调试时间。YOLOv5的魅力在于它的工程友好性它把很多复杂的训练细节封装得很好让开发者能更专注于数据、业务逻辑和模型调优本身。当你第一次看到自己标注的图片被模型正确框出来时那种成就感就是驱动你继续深入这个领域的最好燃料。