YOLO v11的学习记录(七) 阶段小结

工作流程:

1、准备数据

        准备图片数据,如果图片比640*640大很多,就用学习记录(六)中的脚本把图片裁切成640*640。https://blog.youkuaiyun.com/xulibo5828/article/details/155039775

脚本内容:

# 将标注过的大图片分割为640x640的块,并保存json文件
import copy
import json

import cv2
import os
from pathlib import Path


# 将图像尺寸调整为640的倍数
def split_image_into_blocks(image_path, output_dir, block_width=640, block_height=640):
    block_count = 0  # 块计数器
    # 创建输出目录
    os.makedirs(output_dir, exist_ok=True)
    # 读取图片
    image = cv2.imread(image_path)
    if image is None:
        raise ValueError(f"无法读取图片: {image_path}")
    # 调整图片尺寸
    height, width = image.shape[:2]
    _, b = divmod(width, block_width)
    w_out = width + block_width - b  # 调整为640的倍数
    _, b = divmod(height, block_height)
    h_out = height + block_height - b   # 调整为640的倍数
    img = cv2.resize(image, (w_out, h_out), interpolation=cv2.INTER_CUBIC)
    # 放大比例
    w_scale = w_out / width
    h_scale = h_out / height


    # 获取同名json文件
    file_name = Path(image_path).stem
    try:
        with open(file_name + '.json', encoding="utf-8") as f:
            json_data = json.load(f)  # 同名图片文件的json数据
    except:
        json_data = None


    # 获取图片尺寸
    height, width = img.shape[:2]
    print(f"调整后的大图片尺寸: 宽{width} x 高{height}")
    print(f"分割块尺寸: 宽{block_width} x 高{block_height}")

    # 计算可以分割的块数(按完整块计算)
    num_blocks_width = width // block_width
    num_blocks_height = height // block_height

    print(f"将分割为 {num_blocks_width}x{num_blocks_height} 个图片块")

    # 分割并保存块

    for i in range(num_blocks_height):
        for j in range(num_blocks_width):
            # 计算当前块的坐标(左上角开始)
            start_x = j * block_width
            start_y = i * block_height
            end_x = start_x + block_width
            end_y = start_y + block_height

            # 提取图片块
            block = img[start_y:end_y, start_x:end_x]

            # 保存图片块(文件名包含行列信息)
            block_filename = os.path.join(
                output_dir,
                f"{file_name}_row{i}_col{j}_index{block_count}.jpg"
            )
            json_filename = os.path.join(
                output_dir,
                f"{file_name}_row{i}_col{j}_index{block_count}.json"
            )
            cv2.imwrite(block_filename, block)  # 保存图片块
            # 更新json文件
            if json_data is None:
                print(f"无法读取json文件: {file_name}.json")
                block_count += 1
                continue
            data= copy.deepcopy(json_data)  # 复制json数据,避免修改原数据
            for shape in data['shapes']:
                points  = []
                for point in shape['points']:
                    w = round(point[0] * w_scale, 0) - start_x  # 坐标按照小块的0点重新定位
                    h = round(point[1] * h_scale, 0) - start_y
                    if 0 <= w <= block_width and 0 <= h <= block_height:  # 如果坐标在小块内,则添加到points中
                        points.append([w, h])
                # 如果points的长度大于20,则保留,否则删除
                if len(points) > 20:
                    shape['points'] = points
                else:
                    shape['points'] = []

            data['shapes'] = [item for item in data['shapes'] if item['points'] != []]   # 删除points为空的形状
            data['imagePath'] = f"{file_name}_row{i}_col{j}_index{block_count}.jpg"   # 更新图片路径
            data['imageHeight'] = block_height   # 更新图片高度
            data['imageWidth'] = block_width    # 更新图片宽度
            # 更新json文件
            with open(json_filename, 'w', encoding="utf-8") as f:
                json.dump(data, f)
            block_count += 1

    print(f"分割完成,共生成 {block_count} 个图像块")



if __name__ == "__main__":
    # 替换为你的图片路径
    input_image_path = "img000012.jpg"

    split_image_into_blocks(
        image_path=input_image_path, output_dir='new')

2、标注图片

        使用AnyLabeling 标注图片,方法学习记录(四)。https://blog.youkuaiyun.com/xulibo5828/article/details/145576775

3、转换成YOLO格式

        将数据转换成YOLO格式,并自动生成数据集和设置文件。学习记录(五)。

https://blog.youkuaiyun.com/xulibo5828/article/details/154795464

# 将·AnyLabeling标注的json文件转换为YOLO格式
import json
import os
import random
import shutil
from pathlib import Path
 
import yaml
 
 
def convert_AnyLabeling_to_YOLO(source_path, target_path, copy_image=False, divide_train_val=True):
    # 创建目标文件夹
    os.makedirs(os.path.join(target_path, 'labels', 'train'), exist_ok=True)
    os.makedirs(os.path.join(target_path, 'labels', 'val'), exist_ok=True)
    os.makedirs(os.path.join(target_path, 'labels', 'test'), exist_ok=True)
    os.makedirs(os.path.join(target_path, 'images', 'train'), exist_ok=True)
    os.makedirs(os.path.join(target_path, 'images', 'val'), exist_ok=True)
    os.makedirs(os.path.join(target_path, 'images', 'test'), exist_ok=True)
 
    file_idx = 0   # 当前处理文件的索引(用来区分训练集和验证集)
    classes_file = os.path.join(source_path, 'classes.txt')  # 类别文件,所有分类标签
    yaml_file = os.path.join(target_path, 'dataset.yaml')  # 设置文件
    #  读取json文件
    jsons = list(Path(source_path).resolve().glob("*.json"))  # 获取json文件列表
    random.shuffle(jsons)   # 随机打乱json文件列表
    jsons_count = len(list(jsons))  # json文件数量
 
    # 标签类别文件的处理
    if not os.path.exists(classes_file):   # 如果不存在标签类别文件,则创建一个空文件
        with open(classes_file, 'w', encoding='utf-8') as cf:
            cf.write('')
    with open(classes_file, 'r+', encoding='utf-8') as cf:
        classes = cf.read().splitlines()   # 读取标签类别文件中的所有标签,并存储在列表中
 
        # 从json文件中读取标签类别并写入标签类别文件
        for file in jsons:
            with open(file, 'r', encoding='utf-8') as jf:
                data = json.load(jf)
                for d in data['shapes']:
                    if d['label'] not in classes:
                        classes.append(d['label'])
                        cf.write(f"{d['label']}\n")
 
 
    if divide_train_val and jsons_count < 10:
        print(f"{source_path} 文件夹中json文件数量小于10,不进行转换")
        return
 
    # 开始转换json文件
    for json_file in jsons:
        # 读取json文件并获取数据
        file_name = json_file.stem   # 文件名(不带后缀)
        with open(json_file, encoding="utf-8") as f:
            data = json.load(f)  # json数据
        # 数据集的划分
        if file_idx < jsons_count * 0.7:
            purpose = 'train'
        elif file_idx < jsons_count * 0.9:
            purpose = 'val'
        else:
            purpose = 'test'
        if not divide_train_val:   # 如果不划分训练集和验证集,则全部写入训练集
            purpose = 'train'
 
        h, w = data['imageHeight'], data['imageWidth']  # 图片的宽度和高度
        # 写入标注文件
        with open(os.path.join(target_path, 'labels', purpose, file_name + '.txt'), 'w') as f:
            for d in data['shapes']:
                label_idx = str(classes.index(d['label']))   # 类别在类别表中的索引顺序
                points = d['points']
                line = label_idx    # 写入类别索引(每一行的第一个数字)
                # 写入坐标点
                for point in points:
                    x = point[0] / w
                    y = point[1] / h
                    x = max(0, min(1, x))
                    y = max(0, min(1, y))
                    x = round(x, 6)
                    y = round(y, 6)
                    line += ' ' + str(x) + ' ' + str(y)
                line += '\n'  # 写入换行符
                f.write(line)
 
        # 如果需要复制图片到images文件夹中,则复制图片到images文件夹中
        if copy_image:
            jpg_file = os.path.join(source_path, file_name + '.jpg')
            png_file = os.path.join(source_path, file_name + '.png')
            if os.path.exists(jpg_file):
                shutil.copy(jpg_file, os.path.join(target_path, 'images', purpose, file_name + '.jpg'))
            if os.path.exists(png_file):
                shutil.copy(png_file, os.path.join(target_path, 'images', purpose, file_name + '.png'))
        file_idx += 1
 
    # 设置文件的处理
    if not os.path.exists(yaml_file):  # 如果不存在yaml文件,则创建一个空文件
        with open(yaml_file, 'w', encoding='utf-8') as f:
            f.write('')
    with open(yaml_file, 'r+', encoding='utf-8') as f:
        data = yaml.safe_load(f) or {}
        data['path'] = target_path
        data['train'] = os.path.join('..', 'images', 'train')
        data['val'] = os.path.join('..','images', 'val')
        data['test'] = os.path.join('..','images', 'test')
        data['nc'] = len(classes)
        data['names'] = classes
        yaml.dump(data, f, allow_unicode=True, default_flow_style=False, sort_keys=False)
 
    print(f"{source_path} 文件夹中的json文件转换完成")
 
if __name__ == '__main__':
    convert_AnyLabeling_to_YOLO('custom_blocks', r'datasets', copy_image=True)

4、训练

不使用预训练模型从头训练:

yolo task=segment mode=train model=yolo11s-seg.yaml data=dataset.yaml epochs=100 imgsz=640 batch=16 device=0,1 workers=2

在已有模型基础上微调训练:

yolo task=segment mode=train model=已有模型.pt data=dataset.yaml epochs=100 imgsz=640 batch=16 device=0,1 workers=2

微调参数,再次优化训练:

yolo task=segment \
    mode=train \
    model=datasets/runs/segment/train5/weights/best.pt \
    data=datasets/dataset.yaml \
    epochs=200 \
    imgsz=640 \
    batch=4 \
    device=0,1 \
    workers=2 \
    lr0=0.001 \
    lrf=0.005 \
    cos_lr=True

在项目的runs目录下的args.yaml文件中,可以看到所有的训练参数

5、训练参数详解

下面是一次训练的参数:

以下是对这些参数的逐行解释:

一、核心任务与模式配置
参数含义与说明
task: segment任务类型:指定为图像分割任务(YOLOv8 支持 detect (检测)、segment (分割)、classify (分类) 等)。
mode: train运行模式:指定为训练模式(其他模式如 val (验证)、predict (预测)、export (导出))。
二、模型与数据配置
参数含义与说明
model: yolov8s-seg.yaml所使用的模型配置文件:YOLOv8-small(s=small)版本的分割模型配置,定义了网络结构、通道数等。
data: dataset.yaml数据集配置文件:指定数据集的路径(训练集 / 验证集 / 测试集)、类别名称、类别数等核心信息,是训练的关键配置。
pretrained: true是否使用预训练权重:true 表示加载官方预训练权重(基于 COCO 数据集),用于迁移学习,提升训练效果和收敛速度;false 则从零开始训练。
三、训练核心参数(迭代、批次、设备)
参数含义与说明
epochs: 10训练轮数:整个训练集被模型学习的次数,10 表示遍历训练集 10 次(轮数越多拟合能力越强,但可能过拟合,需结合早停调整)。
batch: 4批次大小:每次迭代训练时,模型同时处理的图像数量(受 GPU 显存限制,显存越大可设越大,如 8、16;4 是较小的显存友好值)。
imgsz: 640输入图像尺寸:训练时将图像 resize 到 640×640 像素(YOLOv8 默认推荐尺寸,需与数据集图像比例适配,避免失真)。
device: '0'训练设备:指定使用第 0 号 GPU('0'= 单 GPU,'0,1'= 多 GPU,'cpu'=CPU 训练,CPU 速度极慢,不推荐)。
workers: 1数据加载线程数:用于并行读取数据集的线程数(值越大加载越快,受 CPU 核心数限制,默认 1 或 4 即可,避免线程过多占用资源)。
四、训练早停与优化器配置
参数含义与说明
patience: 100早停耐心值:当验证集性能(如 mAP)连续 100 个 epoch 没有提升时,自动停止训练(防止无效迭代,节省时间;值越大越晚停)。
optimizer: auto优化器选择:auto 表示 YOLOv8 自动选择优化器(默认 AdamW,适合大多数场景);也可手动指定sgdadam等。
lr0: 0.01初始学习率:训练起始的学习率(YOLOv8 默认 0.01,是 AdamW 优化器的经典初始值,学习率过大会震荡不收敛,过小会收敛过慢)。
lrf: 0.01学习率最终因子:训练末期的学习率 = lr0 × lrf(0.01 表示最终学习率降到初始的 1%,实现学习率衰减,稳定收敛)。
momentum: 0.937动量(仅 SGD 优化器生效):加速梯度下降,减少震荡,默认 0.937 是经验值。
weight_decay: 0.0005权重衰减:L2 正则化系数,用于抑制过拟合(惩罚模型权重过大,值越大正则化越强,默认 0.0005 平衡拟合与泛化)。
warmup_epochs: 3.0热身轮数:前 3 个 epoch 使用低学习率逐步提升到 lr0(避免初始高学习率破坏预训练权重,稳定训练初期)。
warmup_momentum: 0.8热身阶段动量:热身时的动量值(低于正常 momentum,配合低学习率稳定初期训练)。
warmup_bias_lr: 0.1热身阶段偏置学习率:偏置参数的初始热身学习率(加速偏置参数收敛)。
五、损失函数权重配置(分割任务核心)
参数含义与说明
box: 7.5边界框损失权重:调节检测框位置预测的损失占比(权重越大,模型越重视检测框的精准度)。
cls: 0.5类别损失权重:调节类别预测的损失占比(权重越大,模型越重视类别分类的准确率)。
dfl: 1.5分布焦点损失(Distribution Focal Loss)权重:用于优化边界框回归的损失,提升小目标检测效果。
pose: 12.0姿态损失权重(分割任务中通常无用,仅姿态估计任务生效,此处为默认值,可忽略)。
kobj: 1.0关键点目标损失权重(同上,分割任务无用,默认值)。
overlap_mask: true分割掩码是否允许重叠:true 表示允许多个目标的掩码重叠(符合真实场景,如两个物体部分遮挡)。
mask_ratio: 4掩码下采样比例:将原始掩码下采样 4 倍后计算损失(减少计算量,提升训练速度,不影响最终精度)。
六、数据增强配置(提升泛化能力)
参数含义与说明
hsv_h: 0.015色相(H)增强幅度:随机调整图像色相的范围(0~0.015),提升模型对颜色变化的鲁棒性。
hsv_s: 0.7饱和度(S)增强幅度:随机调整图像饱和度(0~0.7)。
hsv_v: 0.4明度(V)增强幅度:随机调整图像明度(0~0.4)。
degrees: 0.0随机旋转角度:图像随机旋转的最大角度(0.0 表示不旋转,避免分割掩码变形过大)。
translate: 0.1随机平移幅度:图像在水平 / 垂直方向随机平移(最大偏移量为图像尺寸的 10%)。
scale: 0.5随机缩放幅度:图像随机缩放(范围:1-0.5=0.5~1+0.5=1.5 倍),提升模型对目标大小变化的适应力。
shear: 0.0随机剪切幅度:不进行剪切变换(避免掩码失真)。
perspective: 0.0透视变换幅度:不进行透视变换(默认关闭,防止分割目标形状失真)。
flipud: 0.0上下翻转概率:0.0 表示不进行上下翻转(适合目标无上下对称性的场景,如文字、特定物体)。
fliplr: 0.5左右翻转概率:50% 的概率对图像进行左右翻转(最常用的增强手段,不改变目标本质,提升泛化)。
bgr: 0.0BGR 通道反转概率:0.0 表示不反转(YOLOv8 默认使用 RGB 格式,反转无意义)。
mosaic: 1.0Mosaic 增强概率:1.0 表示每次训练都使用 Mosaic(将 4 张图像拼接成 1 张,丰富背景和目标分布,提升模型鲁棒性)。
close_mosaic: 10关闭 Mosaic 的轮数:训练最后 10 个 epoch 关闭 Mosaic(使用原始图像训练,提升检测框和掩码的精准度)。
mixup: 0.0Mixup 增强概率:0.0 表示不使用(将两张图像混合,适合分类任务,分割任务中可能破坏掩码,默认关闭)。
cutmix: 0.0Cutmix 增强概率:0.0 表示不使用(类似 Mixup,分割任务不推荐)。
copy_paste: 0.0复制粘贴增强概率:0.0 表示不使用(将一个目标的掩码复制到另一张图像,分割任务可选开启)。
auto_augment: randaugment自动增强策略:使用 Randaugment(轻量级增强策略,平衡效果与速度)。
erasing: 0.4随机擦除概率:40% 的概率随机擦除图像部分区域(模拟遮挡场景,提升模型抗遮挡能力)。
七、训练保存与输出配置
参数含义与说明
save: true是否保存模型:true 表示训练过程中保存最优模型(基于验证集性能)和最后一轮模型。
save_period: -1模型保存周期:-1 表示只保存最优和最后一轮模型;若设为 n,则每 n 个 epoch 保存一次(避免占用过多存储)。
save_dir: runs\segment\train模型保存路径:训练日志、权重文件、可视化结果等均保存在该目录下(Windows 系统路径格式)。
project: null项目名称:null 表示使用默认项目目录(runs);可自定义项目名,如project: my_seg,则保存路径为my_seg\segment\train
name: train实验名称:当前训练实验的名称,用于区分不同训练任务(如name: train_v1)。
exist_ok: false是否允许覆盖已有目录:false 表示若save_dir已存在,则报错;true 表示覆盖(适合重复训练同一任务)。
plots: true是否生成训练可视化图表:true 表示训练完成后生成损失曲线、mAP 曲线、混淆矩阵等图表(便于分析训练效果)。
八、验证与评估配置
参数含义与说明
val: true训练过程中是否进行验证:true 表示每个 epoch 结束后,在验证集上评估性能(mAP、Precision、Recall 等),用于早停和模型选择。
split: val验证集划分:使用数据集配置文件(dataset.yaml)中定义的val集进行验证(也可设为test用测试集验证)。
save_json: false是否保存 COCO 格式的评估结果:false 表示不保存;true 可用于后续第三方工具分析(如 COCO API)。
conf: null置信度阈值:验证时的目标置信度阈值(null 表示使用默认值,通常 0.001)。
iou: 0.7NMS 的 IOU 阈值:非极大值抑制(去除重复检测框)的 IOU 阈值(0.7 为默认值,IOU>0.7 的重复框会被过滤)。
max_det: 300单张图像最大检测数量:每张图像最多输出 300 个目标的检测框和掩码(足够覆盖大多数场景)。
九、其他辅助配置
参数含义与说明
time: null训练时间限制:null 表示无时间限制;可设为1h2d等,达到时间后停止训练(较少使用)。
cache: false是否缓存数据集:false 表示不缓存;true 会将预处理后的图像缓存到磁盘,加速后续训练(首次训练会慢,后续快)。
verbose: true是否输出详细日志:true 表示训练过程中打印 epoch、损失、mAP 等信息;false 只输出关键信息。
seed: 0随机种子:固定随机种子(0),使训练过程可复现(每次运行结果一致,便于调参对比)。
deterministic: true是否使用确定性算法:true 配合seed保证训练过程完全可复现(避免 GPU 并行计算的随机性)。
single_cls: false是否单类别训练:false 表示多类别训练;true 表示所有目标视为同一类别(仅单类别数据集使用)。
rect: false是否使用矩形训练:false 表示所有图像 resize 到固定尺寸(imgsz×imgsz);true 表示按图像原始比例 resize,减少黑边(提升训练速度,但需适配批次处理)。
cos_lr: false是否使用余弦学习率调度:false 表示使用默认的学习率衰减策略(StepLR);true 用余弦退火调度(适合长训练周期)。
resume: false是否 resume 训练:false 表示从头开始训练;true 表示从上次中断的 epoch 继续训练(需确保save_dir存在 checkpoint 文件)。
amp: true是否使用混合精度训练:true 表示使用 FP16 混合精度(减少 GPU 显存占用,提升训练速度,不损失精度);false 用 FP32(显存占用大,速度慢)。
fraction: 1.0训练数据占比:1.0 表示使用全部训练集;可设为 0.5 表示使用 50% 数据(快速测试训练流程)。
profile: false是否性能分析:false 表示不分析;true 会输出数据加载、前向传播、反向传播的耗时(用于优化训练速度)。
freeze: null冻结网络层:null 表示不冻结;可设为[0,1,2]表示冻结前 3 层(迁移学习时固定底层特征,只训练顶层)。
multi_scale: false是否多尺度训练:false 表示固定 imgsz;true 表示训练时随机选择 imgsz±50% 的尺寸(提升模型对不同尺度目标的适应力,显存占用会波动)。
compile: false是否编译模型:false 表示不编译;true 用 PyTorch 2.0 + 的torch.compile加速训练(需 PyTorch 版本支持)。
dropout: 0.0Dropout 概率:0.0 表示不使用 Dropout(YOLOv8 默认不使用,Dropout 会降低检测 / 分割精度)。
half: false是否使用半精度推理:false 表示不使用(训练时由amp控制,此处为推理参数,训练时无用)。
dnn: false是否使用 OpenCV DNN 推理:false 表示不使用(训练时无用,推理时可选)。
source: null推理数据源:null 表示训练时不进行推理(推理时需指定图像 / 视频路径)。
vid_stride: 1视频帧采样间隔:推理视频时,每 1 帧取 1 帧(训练时无用)。
stream_buffer: false是否流式缓冲:推理时是否缓冲视频流(训练时无用)。
visualize: false是否可视化特征图:false 表示不可视化;true 会输出网络中间层特征图(用于调试模型)。
augment: false推理时是否使用增强:false 表示不使用(训练时增强已生效,推理时用原始图像)。
agnostic_nms: false是否类别无关 NMS:false 表示按类别进行 NMS;true 表示忽略类别,直接对所有检测框 NMS(多类别场景不推荐)。
classes: null筛选类别:null 表示检测所有类别;可设为[0,2]表示只检测第 0、2 类(训练时无用,推理时可选)。
retina_masks: false是否使用 Retina 掩码:false 表示不使用(分割掩码的后处理方式,默认关闭)。
embed: null特征嵌入维度:null 表示不使用(用于迁移学习提取特征,训练时无用)。
show: false是否显示推理结果:false 表示不显示(训练时无用)。
save_frames: false是否保存推理视频帧:false 表示不保存(训练时无用)。
save_txt: false是否保存检测结果到 txt 文件:false 表示不保存(训练时无用,推理时可选)。
save_conf: false是否保存置信度到 txt:false 表示不保存(推理时可选)。
save_crop: false是否保存裁剪的目标区域:false 表示不保存(推理时可选)。
show_labels: true推理时是否显示类别标签:true 表示显示(训练时无用)。
show_conf: true推理时是否显示置信度:true 表示显示(训练时无用)。
show_boxes: true推理时是否显示检测框:true 表示显示(训练时无用)。
line_width: null绘制框 / 掩码的线宽:null 表示自动适配(训练时无用)。
format: torchscript模型导出格式:训练时无用,导出模型时指定为 TorchScript 格式(其他格式如onnxtensorrt等)。
keras: false是否导出为 Keras 格式:false 表示不导出(训练时无用)。
optimize: false导出时是否优化:false 表示不优化(导出 ONNX 等格式时可选)。
int8: false是否导出为 INT8 量化模型:false 表示不量化(量化可减小模型体积,提升推理速度,损失少量精度)。
dynamic: false是否导出动态维度模型:false 表示固定输入尺寸(imgsz×imgsz);true 支持任意尺寸输入(推理时灵活,训练时无用)。
simplify: true导出时是否简化模型:true 表示简化 ONNX 等模型的计算图(减少冗余节点,提升推理速度)。
opset: nullONNX 算子集版本:null 表示自动选择(导出 ONNX 时使用)。
workspace: nullTensorRT 工作空间大小:null 表示默认(导出 TensorRT 时使用)。
nms: false导出时是否内置 NMS:false 表示不内置(推理时手动执行 NMS)。
cfg: null额外配置文件:null 表示不使用(可指定其他细分配置文件,较少用)。
tracker: botsort.yaml跟踪器配置文件:训练时无用,目标跟踪任务(detect+track)时指定跟踪器(如 BotSort)。
总结

        这份配置是 YOLOv8s 分割模型的标准训练配置,核心逻辑是:使用预训练权重迁移学习,10 轮训练,批次 4,输入尺寸 640,启用混合精度和常用数据增强,训练过程中验证并保存最优模型。可根据实际需求调整(如增大batch、增加epochs、开启multi_scale等),重点关注data(数据集配置)、epochs(轮数)、batch(批次)、device(设备)这几个关键参数。

### 关于 YOLO V11 Tiny 的版本介绍 YOLO V11 是 Ultralytics 推出的一个高性能目标检测框架,其设计旨在提升速度与精度之间的平衡[^3]。Tiny 版本通常被用于轻量级场景,在保持一定性能的同时减少计算开销和内存占用。 #### YOLO V11 Tiny 的特点 YOLO V11 Tiny 是 YOLO V11 家族中的一个简化版模型,主要针对资源受限环境进行了优化。它通过降低网络复杂度来实现更快的推理速度,同时尽可能保留较高的检测精度。具体来说: - **参数数量较少**:相比标准版 YOLO V11,Tiny 版本减少了卷积层的数量以及每层的滤波器数目。 - **更少的 FLOPs (浮点运算次数)**:这使得模型更适合部署在嵌入式设备或者移动平台上运行。 - **快速推理时间**:由于结构更加紧凑,因此能够提供更低延迟的服务响应能力。 这些特性使 YOLO V11 Tiny 成为了边缘计算领域内的理想解决方案之一[^1]。 --- ### 如何下载并配置 YOLO V11 Tiny? 要获取 YOLO V11 Tiny 模型及其配套工具链,请按照如下方式操作: #### 步骤 A: 获取预训练权重文件 访问官方仓库或其他可信来源链接下载对应版本的 `.pt` 或其他格式权值文档。例如可以从 GitHub 上找到相关发布页面进行提取。 #### 步骤 B: 创建自定义 YAML 配置文件 如果需要调整输入尺寸、类别数或者其他超参设置,则可以参照模板创建专属自己的 `yaml` 文件。比如下面展示了一个简单的例子供参考: ```yaml # Example configuration file for training a custom dataset with YOLOV11-Tiny. train: ./data/train/images/ val: ./data/validation/images/ names: 0: dog 1: cat nc: 2 # Number of classes depth_multiple: 0.33 # Model depth multiple factor used in tiny variant width_multiple: 0.5 # Channel width scale factor applied specifically within this context here as well according to given information from citation two above [^2]. ``` 上述代码片段展示了如何利用通道宽度比例因子(即 `width_multiple=0.5` 对应于 YOLOv11S),从而构建适合特定应用场景的小型化神经网络体系架构。 #### 步骤 C: 初始化模型实例 加载已有的预训练权重或将新生成好的空白状态保存下来作为后续微调的基础起点。以下是 Python 中初始化过程的一段示范脚本: ```python from ultralytics import YOLO model_path = 'path/to/yolov11_tiny.pt' model = YOLO(model_path) results = model.train(data='ultralytics/cfg/models/11/yolo11_dog.yaml', epochs=100, imgsz=640) ``` 这里我们假设路径变量指向实际存在的本地存储地址;另外还指定了数据集描述符路径以便启动正式的学习流程[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深蓝海拓

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值