【保姆级目标检测教程】Ubuntu 20.04 部署 YOLOv13 全流程(附训练/推理代码)

前言

YOLOv13 是 YOLO 系列的全新一代实时目标检测框架,在保持极高推理速度的同时显著提升了检测精度,广泛适用于嵌入式部署、工业质检、智能安防等多种场景。该版本提供了 NanoSmallLargeX-Large 四种模型规格,用户可以根据计算资源和具体任务需求灵活选择最适合的模型。

YOLOv13 在结构设计上引入了多项关键创新:HyperACE 模块(Hypergraph-based Adaptive Cross-scale Encoding) 通过将多尺度特征图的像素视为超图节点,使用可学习超边构建自适应建模多尺度特征之间的高阶语义关联,并借助线性消息传递提高复杂环境下的特征融合与感知能力。FullPAD 机制(Full-pipeline Aggregation and Distribution) 基于 HyperACE 模块,将增强后的跨尺度特征依次传递至骨干网络、特征融合层(neck)以及检测头(head),实现网络中信息的全路径聚合与分发,从而显著提升梯度传导效率和多层特征协同表现。此外,为提升推理效率并减轻模型体积,YOLOv13 引入了一系列轻量化结构设计,使用 深度可分离卷积(Depthwise Separable Convolution, DSConv)替代大核普通卷积,有效减少参数量与计算开销,同时保持或提升检出准确率。

本教程以 Ubuntu 20.04 操作系统 为基础,面向个人开发者与工程实践需求,详细介绍 YOLOv13 的安装配置、数据集准备、模型训练与推理部署等完整流程,帮助读者从零完成模型构建与应用。

在开始操作之前,请确保系统已正确安装 AnacondaMiniconda,以便创建和管理 Python 虚拟环境;同时已安装官方版本的 NVIDIA 显卡驱动 ,以确保 GPU 能够被正常识别并用于训练或推理。可使用以下命令验证 GPU 状态,并记录输出中的 CUDA Version,后续安装 PyTorch 时将作为参考:

bash 复制代码
nvidia-smi

一、下载 YOLOv13 源码

YOLOv13 目前未归属于 Ultralytics 官方分支,通常采用开源社区维护版本。您可以选择以下任一方式获取源码:

方式一:通过网页手动下载

  1. 访问 YOLOv13 项目主页

  2. 点击 Code > Download ZIP

  3. 下载后解压至本地任意目录。

方式二:通过 Git 克隆

bash 复制代码
git clone https://github.com/iMoonLab/yolov13.git
cd yolov13

二、配置运行环境

2.1 创建并激活 Conda 虚拟环境

bash 复制代码
conda create -n yolov13 python=3.11 -y
conda activate yolov13

建议使用 Python 3.11 版本以确保与依赖项(如 FlashAttention)兼容。

2.2 安装依赖项

  1. requirements.txt 文件内容替换为以下:

    txt 复制代码
    # torch==2.2.2 
    # torchvision==0.17.2
    # flash_attn-2.7.3+cu11torch2.2cxx11abiFALSE-cp311-cp311-linux_x86_64.whl
    timm==1.0.14
    albumentations==2.0.4
    onnx==1.14.0
    onnxruntime==1.15.1
    pycocotools==2.0.7
    PyYAML==6.0.1
    scipy==1.13.0
    onnxslim==0.1.31
    onnxruntime-gpu==1.18.0
    gradio==4.44.1
    opencv-python==4.9.0.80
    psutil==5.9.8
    py-cpuinfo==9.0.0
    huggingface-hub==0.23.2
    safetensors==0.4.3
    numpy==1.26.4
    supervision==0.22.0
    thop
    seaborn
  2. 使用国内源安装依赖

    bash 复制代码
    pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple

2.3 配置 PyTorch 环境

  1. 访问 PyTorch 官网历史版本页

  2. 选择 Pytorch Version >= 2.4.0 Conda/Wheel 安装命令(CUDA 版本应不高于本机 nvidia-smi 输出结果)

    1. 终端运行安装命令
    bash 复制代码
    pip install torch==2.4.0 torchvision==0.19.0 torchaudio==2.4.0 --index-url https://download.pytorch.org/whl/cu121

2.4 安装 FlashAttention(可选)

  1. 打开 FlashAttention Releases (Linux) 页面

  2. 下载适配当前系统架构和 CUDA 版本的 .whl 文件(推荐 v2.7.3)至 yolov13 目录下

  3. 执行安装命令

    bash 复制代码
    pip install ./flash_attn-2.7.3+cu12torch2.4cxx11abiFALSE-cp311-cp311-linux_x86_64.whl

三、准备数据集

3.1 构建数据集目录结构

  1. yolov13 目录下新建 data 文件夹

  2. yolov13/data/ 目录下建立以下文件夹:

    复制代码
    data/
    ├── Annotations/     # 存放 .xml 标注文件
    ├── images/          # 存放原始图像(.jpg)
    ├── ImageSets/       # 数据集划分列表
    └── labels/          # 转换后的 YOLO 格式标签

    建议使用 labelimg 工具对图像进行 VOC 格式标注,标注结果保存为 .xml 文件置于 Annotations/ 文件夹

3.2 数据集划分

在项目根目录下创建 split_train_val.py 脚本,运行后将在 ImageSets/ 生成 train.txtval.txttest.txt 等文件

python 复制代码
import os
import random
 
 
trainval_percent = 0.9
train_percent = 0.9
xmlfilepath = 'data/Annotations'
txtsavepath = 'data/ImageSets'
total_xml = os.listdir(xmlfilepath)
 
num = len(total_xml)
list = range(num)
tv = int(num * trainval_percent)
tr = int(tv * train_percent)
trainval = random.sample(list, tv)
train = random.sample(trainval, tr)
 
ftrainval = open('data/ImageSets/trainval.txt', 'w')
ftest = open('data/ImageSets/test.txt', 'w')
ftrain = open('data/ImageSets/train.txt', 'w')
fval = open('data/ImageSets/val.txt', 'w')
 
for i in list:
    name = total_xml[i][:-4] + '\n'
    if i in trainval:
        ftrainval.write(name)
        if i in train:
            ftrain.write(name)
        else:
            fval.write(name)
    else:
        ftest.write(name)
 
ftrainval.close()
ftrain.close()
fval.close()
ftest.close()

3.3 转换数据格式

使用 voc_label.py 将 VOC 标注转为 YOLO 格式,并生成 labels/*.txttrain.txt 等路径列表(请注意将 classes 列表修改为你的目标类别)

python 复制代码
import xml.etree.ElementTree as ET
import os
from os import getcwd
 
sets = ['train', 'val', 'test']
classes = ['填写自己的类别']
abs_path = os.getcwd()
print(abs_path)
 
 
def convert(size, box):
    dw = 1. / (size[0])
    dh = 1. / (size[1])
    x = (box[0] + box[1]) / 2.0 - 1
    y = (box[2] + box[3]) / 2.0 - 1
    w = box[1] - box[0]
    h = box[3] - box[2]
    x = x * dw
    w = w * dw
    y = y * dh
    h = h * dh
    return x, y, w, h
 
 
def convert_annotation(image_id):
    in_file = open('data/Annotations/%s.xml' % (image_id), encoding='UTF-8')
    out_file = open('data/labels/%s.txt' % (image_id), 'w')
    tree = ET.parse(in_file)
    root = tree.getroot()
    size = root.find('size')
    w = int(size.find('width').text)
    h = int(size.find('height').text)
    for obj in root.iter('object'):
        # difficult = obj.find('difficult').text
        difficult = obj.find('difficult').text
        cls = obj.find('name').text
        if cls not in classes or int(difficult) == 1:
            continue
        cls_id = classes.index(cls)
        xmlbox = obj.find('bndbox')
        b = (float(xmlbox.find('xmin').text), float(xmlbox.find('xmax').text), float(xmlbox.find('ymin').text),
             float(xmlbox.find('ymax').text))
        b1, b2, b3, b4 = b
        # 标注越界修正
        if b2 > w:
            b2 = w
        if b4 > h:
            b4 = h
        b = (b1, b2, b3, b4)
        bb = convert((w, h), b)
        out_file.write(str(cls_id) + " " + " ".join([str(a) for a in bb]) + '\n')
 
 
wd = getcwd()
for image_set in sets:
    if not os.path.exists('data/labels/'):
        os.makedirs('data/labels/')
    image_ids = open('data/ImageSets/%s.txt' % (image_set)).read().strip().split()
    list_file = open('data/%s.txt' % (image_set), 'w')
    for image_id in image_ids:
        list_file.write(abs_path + '/data/images/%s.jpg\n' % (image_id))
        convert_annotation(image_id)
    list_file.close()

3.4 编写数据集配置文件

yolov13/data目录下创建 data.yaml,内容如下:

yaml 复制代码
# 路径请根据实际情况填写,需为 train/val/test 图片路径列表的绝对路径
train: /home/your_username/yolov13/data/train.txt
val: /home/your_username/yolov13/data/val.txt
test: /home/your_username/yolov13/data/test.txt

# 修改为你的类别总数
nc: 5

# 类别名称列表,应与 voc_label.py 中填写的类别顺序完全一致
names: ['填写自己的类别']

3.5 下载预训练权重

  1. yolov13目录下创建 weights 文件夹

  2. 打开 YOLOv13 项目主页

  3. 下滑找到 YOLOv13-N YOLOv13-S ...,点击并下载至 yolov13/weights 文件夹


四、模型训练

在项目根目录下创建 train.py,内容如下(根据需要修改对应参数):

python 复制代码
from ultralytics import YOLO

if __name__ == '__main__':
    # 初始化模型,加载预训练权重
    model = YOLO('weights/yolov13n.pt')  # 可替换为 yolov13s.pt、yolov13m.pt 等其他版本

    # 启动模型训练
    results = model.train(
        data='/home/your_username/yolov13/data/data.yaml',  # 修改为您的数据集配置文件的绝对路径
        epochs=180,      # 总训练轮数,视数据集规模与性能要求调整
        batch=4,         # 每轮训练的批量大小,取决于显存大小(如 8GB 显存建议 batch=4~8)
        workers=2,       # 数据加载线程数,推荐设为 CPU 核心数的一半左右
        imgsz=640,       # 输入图像尺寸,训练时将图像缩放至该大小(YOLO 通常为 640×640)
        mosaic=1.0,      # Mosaic 数据增强概率,范围为 0.0~1.0(适当提高可增强鲁棒性)
        mixup=0.0,       # MixUp 数据增强权重,适用于多目标融合背景,适当使用可缓解过拟合
        copy_paste=0.1,  # Copy-Paste 增强比例,常用于分割任务,对检测任务影响较小
        device=0         # 训练所使用的设备编号,0 表示第 1 块 GPU;如无 GPU 请设置为 'cpu'
    )

运行训练命令:

bash 复制代码
python train.py

训练过程中将自动保存模型权重与日志,默认输出路径为 runs/detect/ 目录。


五、模型推理

  1. 静态图像或视频文件推理 :在项目根目录下创建 inference.py 文件,用于实现对图像或视频文件的目标检测功能,示例代码如下:

    python 复制代码
    from ultralytics import YOLO
    import cv2
    
    if __name__ == '__main__':
        # 加载训练好的模型
        model = YOLO('runs/detect/train/weights/best.pt')  # 修改为实际路径,或替换为 yolov13n.pt 等预训练权重
    
        # 指定输入源,可为图像路径、视频路径
        results = model.predict(
            source='data/images/test.jpg',  # 输入图像路径
            save=True,                      # 是否保存带有预测框的输出图像
            conf=0.25,                      # 置信度阈值(过滤低置信度目标)
            iou=0.45,                       # NMS 阈值,用于消除重叠框
            device=0                        # 推理设备,0 表示使用 GPU,'cpu' 表示使用 CPU
        )

    默认预测结果将保存至 runs/detect/predict/ 目录下

  2. 摄像头画面实时推理 :在项目根目录下创建 detect.py 文件,实现对来自本地摄像头的视频流进行实时目标检测,示例代码如下:

    python 复制代码
    import cv2
    from ultralytics import YOLO
    
    if __name__ == '__main__':
        # 加载模型
        model = YOLO('runs/detect/exp/weights/best.pt')  # 替换为你的权重路径
    
        # 打开摄像头
        cap = cv2.VideoCapture(0)
        if not cap.isOpened():
            print("无法打开摄像头")
            exit()
    
        while True:
            ret, frame = cap.read()
            if not ret:
                print("无法读取视频帧")
                break
    
            # 推理
            results = model.predict(frame, conf=0.25, iou=0.45, device=0, verbose=False)
    
            # 可视化结果(Ultralytics 返回的是带坐标的图像)
            annotated_frame = results[0].plot()
    
            # 显示图像
            cv2.imshow('YOLOv13 Camera Detection', annotated_frame)
    
            # 按下 q 退出
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
    
        cap.release()
        cv2.destroyAllWindows()

相关推荐
guygg8829 分钟前
ubuntu手动编译VTK9.3 Generating qmltypes file 失败
linux·运维·ubuntu
一只小灿灿1 小时前
前端计算机视觉:使用 OpenCV.js 在浏览器中实现图像处理
前端·opencv·计算机视觉
荔枝味啊~3 小时前
相机位姿估计
人工智能·计算机视觉·3d
诗意亭序3 小时前
ubuntu16.04 虚拟机与电脑共用wifi
ubuntu
mozun20204 小时前
激光雷达信号提取方法对比梳理2025.7.8
目标检测·激光雷达·信号提取·gm-apd·滤波算法
scilwb4 小时前
Isaac Sim 4.5中iRobot Create 3机器人LightBeam传感器系统完整实现教程
ubuntu
Black_Rock_br6 小时前
语音交互新纪元:Hugging Face LeRobot如何让机器人真正“懂你”
人工智能·计算机视觉·机器人
1900_6 小时前
【论文解读】Referring Camouflaged Object Detection
人工智能·目标检测·计算机视觉
applebomb9 小时前
没合适的组合wheel包,就自行编译flash_attn吧
python·ubuntu·attention·flash
198910 小时前
【零基础学AI】第31讲:目标检测 - YOLO算法
人工智能·rnn·yolo·目标检测·tensorflow·lstm