部署DeepSeek模型,进群交流最in玩法!
立即加群
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >微调YOLOv11:实用指南 【详细过程与代码】

微调YOLOv11:实用指南 【详细过程与代码】

作者头像
小白学视觉
发布于 2025-01-07 00:34:12
发布于 2025-01-07 00:34:12
1.3K00
代码可运行
举报
运行总次数:0
代码可运行

1. 引言

本指南旨在引导您为自身任务微调YOLOv11。我将分享我个人认为有效的步骤,附带详细代码、真实案例及实用建议。内容包括:

  • 如何专业地设置您的环境。
  • 准备数据集的确切步骤(因为格式至关重要)。
  • 关键配置与训练策略,以实现最佳性能。
  • 通过试错积累的故障排除技巧。

2. 前提条件与设置

要让YOLOv11运行起来,您需要以下内容:

  • Ultralytics YOLOv11:我们将使用的框架。相信我,它的简洁与灵活性使其成为游戏规则改变者。
  • Python 3.8+:虽然YOLOv11支持更新的版本,但为了兼容性,我建议使用Python 3.8或3.9。
  • PyTorch(1.7.0或更高版本):YOLOv11依赖PyTorch,因此拥有正确的版本至关重要。
  • GPU支持:您需要一个支持CUDA的GPU。我个人使用NVIDIA GPU与CUDA 11.x,它们在训练中表现出色。

安装依赖项 - 安装Ultralytics包:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install ultralytics

3. 准备数据集

数据集格式应如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/dataset
├── images
│   ├── train
│   ├── val
├── labels
│   ├── train
│   ├── val

images文件夹中的每个图像必须在labels文件夹中有一个对应的.txt文件。这些.txt文件应包含YOLO格式的注释:class_id x_center y_center width height,其中值已归一化(0到1)。以下是将注释从COCO格式转换为YOLO格式的Python代码片段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import json
import os

def convert_coco_to_yolo(coco_file, output_dir):
    with open(coco_file) as f:
        data = json.load(f)
    
    for image in data['images']:
        annotations = [ann for ann in data['annotations'] if ann['image_id'] == image['id']]
        label_file = os.path.join(output_dir, f"{image['file_name'].split('.')[0]}.txt")
        with open(label_file, 'w') as f:
            for ann in annotations:
                category_id = ann['category_id'] - 1  # YOLO classes are 0-indexed
                bbox = ann['bbox']
                x_center = (bbox[0] + bbox[2] / 2) / image['width']
                y_center = (bbox[1] + bbox[3] / 2) / image['height']
                width = bbox[2] / image['width']
                height = bbox[3] / image['height']
                f.write(f"{category_id} {x_center} {y_center} {width} {height}\n")

我在多个项目中使用过这个脚本,效果非常好。只需更新coco_file和output_dir路径以匹配您的数据集。

数据增强技术

数据增强有时比收集更多数据更能提升模型性能。多年来,我发现像Mosaic和CutMix这样的高级技术是游戏规则改变者,尤其是对于较小的数据集。对于YOLOv11,我喜欢使用Albumentations。以下是我个人使用的增强管道示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import albumentations as A
from albumentations.pytorch import ToTensorV2

transform = A.Compose([
    A.RandomCrop(width=640, height=640),
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
    A.HueSaturationValue(p=0.2),
    ToTensorV2()
])

通过这种方式,您不仅翻转或裁剪图像,还在教模型处理现实世界中可能遇到的变化。

分割数据集

许多人在处理不平衡数据时,尤其是在训练-验证-测试分割方面遇到困难。我个人使用sklearn自动化此步骤,以确保可重复性。以下是我通常使用的Python代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from sklearn.model_selection import train_test_split
import os
import shutil

def split_dataset(images_dir, labels_dir, output_dir, test_size=0.2, val_size=0.2):
    images = [f for f in os.listdir(images_dir) if f.endswith('.jpg')]
    train_images, test_images = train_test_split(images, test_size=test_size, random_state=42)
    train_images, val_images = train_test_split(train_images, test_size=val_size, random_state=42)

    for subset, subset_images in [('train', train_images), ('val', val_images), ('test', test_images)]:
        os.makedirs(f"{output_dir}/images/{subset}", exist_ok=True)
        os.makedirs(f"{output_dir}/labels/{subset}", exist_ok=True)
        for image in subset_images:
            shutil.copy(f"{images_dir}/{image}", f"{output_dir}/images/{subset}/{image}")
            label_file = image.replace('.jpg', '.txt')
            shutil.copy(f"{labels_dir}/{label_file}", f"{output_dir}/labels/{subset}/{label_file}")

运行此脚本,您的数据集将被整齐地分割为训练集、验证集和测试集。我一直使用这种方法,它非常可靠。

专业提示:在格式化和增强数据集后,始终可视化一些样本。标签或增强中的简单错误可能导致模型性能不佳。像cv2.imshow或matplotlib这样的工具可以快速轻松地完成此操作。

4. 配置YOLOv11进行微调

微调YOLOv11需要精确性,这就是配置文件的作用。我了解到理解这些文件中的参数至关重要——一个被忽视的设置可能会严重影响性能。让我们来看看在为您项目配置YOLOv11时真正重要的内容。

关键配置参数

YOLOv11使用YAML配置文件来定义数据集路径、类别和其他关键设置。以下是一个简单但有效的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
path: ../datasets  # Path to dataset root directory
train: images/train  # Path to training images
val: images/val  # Path to validation images
nc: 3  # Number of classes
names: ['class1', 'class2', 'class3']  # Class names
  • path:确保此路径指向数据集的根文件夹。一次数据集放错位置让我花费了数小时调试!
  • nc和names:仔细检查这些。类别数量与标签不匹配会导致训练失败。
  • 其他参数:在训练脚本中试验img_size、epochs和batch size等设置,因为这些不能直接在YAML文件中定义。

以下是一个额外的YAML参数,如果您使用自定义数据集,可能需要它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
test: images/test  # Optional: Test dataset path

5. 训练YOLOv11模型

训练YOLOv11是乐趣的开始。我仍然记得第一次加载预训练模型时,看到它仅通过几次调整就能很好地泛化。以下是您可以开始的确切方法:

加载预训练权重

YOLOv11模型在COCO上预训练,使其成为极好的起点。加载模型非常简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from ultralytics import YOLO

model = YOLO('yolov8n.pt')  # Load YOLOv8 Nano pretrained weights

我建议从yolov11n.pt或yolov11s.pt开始进行快速实验,尤其是如果您使用像RTX 3060这样的标准GPU。

训练模型

一旦您的数据集和配置文件准备就绪,就可以开始训练了。以下是一个简单的训练脚本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.train(data='custom_dataset.yaml',  # Path to YAML config
            epochs=50,                  # Number of epochs
            imgsz=640,                  # Image size
            batch=16,                   # Batch size
            device=0)                   # GPU device index

专业提示:从较少的epoch开始,并尽早评估结果。根据我的经验,迭代比盲目进行长时间训练更好。

高级训练参数

微调以下参数可以显著提升性能:

  • 学习率:YOLOv11默认使用OneCycleLR调度,但您可以通过lr0调整最大学习率。
  • 优化器:坚持使用默认的SGD,或尝试AdamW以获得更平滑的收敛。
  • 增强:YOLOv11默认应用基本增强,但您可以通过augment=True启用高级技术。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.train(data='custom_dataset.yaml',
            epochs=50,
            imgsz=640,
            lr0=0.01,  # Starting learning rate
            optimizer='AdamW',
            augment=True)

监控训练

以下是您可以实时监控训练的方法:

  • TensorBoard:它内置于YOLOv11。只需添加project和name参数:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.train(data='custom_dataset.yaml',
            project='YOLOv8-Experiments',
            name='run1',
            exist_ok=True)

运行tensorboard --logdir YOLOv11-Experiments以可视化损失曲线、指标等。

  • Weights and Biases (wandb):如果您像我一样喜欢详细的实验跟踪,将YOLOv11连接到wandb:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install wandb

然后,登录wandb并启用跟踪:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.train(data='custom_dataset.yaml', 
            project='YOLOv8-Wandb', 
            name='run1',
            wandb=True)

提示:密切关注您的mAP(平均平均精度)值。训练期间突然下降通常表明过拟合或增强问题。通过这种方法,您将为顺利的训练体验做好准备。我个人发现,花时间调整参数和监控进度在最终结果中会带来巨大的回报。

6. 评估模型

验证模型

一旦训练完成,评估您的微调模型就像运行.val()函数一样简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
results = model.val()
print(results)

YOLOv11提供了多个指标,但您需要关注的两个是:

  • mAP@0.5:IoU阈值为0.5时的平均平均精度。
  • mAP@0.5:0.95:跨多个IoU阈值的平均精度。

根据我的经验,强大的mAP@0.5:0.95分数表明您的模型泛化良好。例如,在最近的一个项目中,调整增强管道使该分数提高了7%——这是一个巨大的胜利!

可视化性能

数字很好,但视觉效果讲述真实的故事。YOLOv11在验证期间生成预测,使您能够轻松发现模型表现出色(或挣扎)的地方。使用这些可视化来识别:

  • 错误分类的对象。
  • 重叠的边界框。

生成混淆矩阵:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.val(conf=True)

我个人总是先检查混淆矩阵。这是快速识别模型是否混淆相似类别的简单方法——在像COCO这样的数据集中,对象可能在上下文上相似(例如,叉子和勺子),这是一个常见问题。

7. 模型优化部署

您已经训练了一个出色的模型,但真正的考验在于部署。无论是减少边缘设备的延迟还是优化移动设备,YOLOv11都有工具可以帮助。让我分享对我有效的方法。

量化

量化可以大幅减少推理时间,而不会显著降低准确性。我曾用它将模型部署在像Raspberry Pi这样的资源受限设备上,效果非常好。以下是如何量化您的YOLOv11模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.export(format='torchscript', optimize=True)

通过optimize=True,YOLOv11在导出期间自动处理量化。

剪枝

有时一个更精简的模型就是您所需要的。我曾通过剪枝将模型大小减少50%,同时保持准确性。YOLOv11使这变得简单:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.prune(amount=0.5)  # Prune 50% of parameters

过于激进的剪枝可能会损害准确性。我建议从较小的百分比(例如20%)开始,并测试性能。

ONNX/TorchScript转换

将模型导出为ONNX或TorchScript是部署到实际应用中的必备步骤。我曾无数次这样做,将YOLOv11模型集成到API、移动应用,甚至NVIDIA TensorRT以用于边缘设备。以下是将模型导出为ONNX的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model.export(format='onnx')

如果您在TensorRT上部署,此ONNX导出可以是第一步。我发现它在交通监控等实时应用中非常有用。

提示:优化后始终对模型进行基准测试。像Python中的timeit或NVIDIA的TensorRT分析器这样的工具可以帮助确保您的模型满足部署要求。通过专注于这些步骤,您将能够高效地部署YOLOv11模型,无论是在云平台、移动设备还是边缘硬件上。我个人发现,这些优化在实现低延迟、高精度的应用中起到了至关重要的作用。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-01-04,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小白学视觉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
用node.js从零开始去写一个简单的爬虫
如果你不会Python语言,正好又是一个node.js小白,看完这篇文章之后,一定会觉得受益匪浅,感受到自己又新get到了一门技能,如何用node.js从零开始去写一个简单的爬虫,十分钟时间就能搞定,步骤其实很简单。node的安装就不一步步的解释了,如果不会可以自行百度。在node开大环境下开始第一步:
王小婷
2018/08/22
1.3K0
用node.js从零开始去写一个简单的爬虫
Node.js 小打小闹之爬虫入门
网络爬虫(英语:web crawler),也叫网络蜘蛛(spider),是一种用来自动浏览万维网的网络机器人。此外爬虫还可以验证超链接和 HTML 代码,用于网络抓取。
阿宝哥
2019/11/05
1.1K0
必应API接口node.js版 - 极客玩家大白
近期,在研究百度、必应、API等的url提交API时,发现有用Go语言做工具的大佬的分享 利用 API 自动向搜索引擎提交网址(Go语言版) - pyList。
Enjoy233
2020/09/17
1.1K0
必应API接口node.js版 - 极客玩家大白
用node撸一个简单的爬虫
一提起爬虫可能大家就会觉得很高大上,就会想起python.呵呵,我们今天偏偏就要颠覆大家的认知,用node不到100行代码擼一个简单的爬虫。天天python,我决定换下口味。
润森
2019/08/30
7050
技术分享:用Node抓站(一)
如果只写怎么抓取网页,肯定会被吐槽太水,满足不了读者的逼格要求,所以本文会通过不断的审视代码,做到令自己满意(撸码也要不断迸发新想法!
疯狂的技术宅
2019/03/28
7340
技术分享:用Node抓站(一)
用TypeScript和library needle来创建视频爬虫程序
使用 TypeScript 和 needle 库创建视频爬虫程序的过程可以按照以下步骤进行。needle 是一个轻量级的 HTTP 请求库,适用于进行网络请求。
华科云商小徐
2025/03/12
1580
用node写个爬虫?看完这篇新手也会
从node问世以后,就不断被JavaScript的忠实追随者拿来干一些原来只有php、Python等后端语言才能干的事情,例如写个爬虫之类的。对于前端er来说,用上一些好用的轮子,你可能十几行代码就可以写一个crawler哦~ 爬虫的思路十分简单: 按照一定的规律发送 HTTP 请求获得页面 HTML 源码(必要时需要加上一定的 HTTP 头信息,比如 cookie 或 referer 之类) 利用正则匹配或第三方模块解析 HTML 代码,提取有效数据 将数据持久化到数据库中 当然爬虫的写法千千万,下面
用户1097444
2022/06/29
8210
用node写个爬虫?看完这篇新手也会
学习服务端JavaScript这个有名的Node.js
参照这个教程:https://github.com/alsotang/node-lessons/tree/master/lesson0
JQ实验室
2022/02/09
1.5K0
学习服务端JavaScript这个有名的Node.js
node.js实现CURL功能
PHP中的CURL功能很好实现,四五行代码封装一下就OK了。node.js中如何实现CURL的功能呢,下面详细介绍。 这里需要用到request这个库,所以先安装此包: npm install request 安装下来之后, 就是代码实现的问题了。示例代码如下(只实现了POST方法): var request = require('request'); request.post( { url:'http://localhost:9095/phpTes
Marser
2018/06/25
5.7K0
Node.js 在 VS Code 中发送 POST 请求
Node.js 的后端貌似更容易解析 Node 中 request 模块发送的 POST 请求,本文记录 node.js VS Code 环境配置和发送 POST 请求的方法。 背景 前端小白,需求是给一个url 发送post 请求,请求中加入: { "username": "your-username", "password": "your-password" } 对 Python 相对比较熟悉,于是先写了如下代码: import requests import json url = "htt
为为为什么
2022/08/10
3.4K0
Node.js 在 VS Code 中发送 POST 请求
利用Node.js实现拉勾网数据爬取
拉勾网作为中国领先的互联网招聘平台,汇集了丰富的职位信息,对于求职者和人力资源专业人士来说是一个宝贵的数据源。通过编写网络爬虫程序,我们可以自动化地收集这些信息,为求职决策和市场研究提供数据支持。Node.js以其非阻塞I/O和事件驱动的特性,成为实现这一目标的理想选择。
小白学大数据
2024/04/01
2250
基于Node.js实现一个小小的爬虫
从拉钩招聘网站中找出“前端开发”这一类岗位的信息,并作相应页面分析,提取出特定的几个部分如岗位名称、岗位薪资、岗位所属公司、岗位发布日期等。并将抓取到的这些信息,展现出来。
书童小二
2018/09/03
1.2K0
基于Node.js实现一个小小的爬虫
node之http模块之爬虫和event
我是歌谣 微信公众号关注前端小歌谣一起学习前端知识 今天继续给大家讲解node中爬虫的讲解
爱学习的前端歌谣
2023/12/10
2070
node之http模块之爬虫和event
用 Javascript 和 Node.js 爬取网页
本文主要针对具有一定 JavaScript 经验的程序员。如果你对 Web 抓取有深刻的了解,但对 JavaScript 并不熟悉,那么本文仍然能够对你有所帮助。
疯狂的技术宅
2020/06/28
10.5K1
如何实现一个简单的Node.js脚手架
对前端、Node操作有一定的了解,同时向了解脚手架开发过程或者需要自己实现一个脚手架的开发者。
黄Java
2018/09/18
1.5K0
如何实现一个简单的Node.js脚手架
node爬虫实践总结
随着web2.0时代的到来,数据的价值愈发体现出来。无论是在目前火热的人工智能方向,还是在产品侧的用户需求分析,都需要获取到大量的数据,而网络爬虫作为一种技术手段,在不违反主体网站基本要求的情况下是获取数据成本最低的手段。与此同时,爬虫技术也飞速发展。
IMWeb前端团队
2019/12/04
1.4K0
一个基于Node.js的小爬虫
用到的模块 mysql http fs cheerio 其中fs 系统自带,不必安装。其余需要运行以下代码安装: npm install -S mysql http cheerio 运行结果 代
无道
2019/11/12
6860
Node.js爬虫之使用cheerio爬取图片
在上一篇文章我们利用Node.js实现了一个基本的爬虫,但是要写很长的正则--实在太累了而且需要对正则绝对熟悉。 在写前端我们都知道jQuery能方便帮我我们进行各种DOM操作,通过DOM操作我们可以方便的获取元素的各种属性,不过jqDOM操作只能运行在客户端,如果服务端有这样的一个工具能帮我们进行DOM操作那不是就解决了之前不断写正则的问题? 当然有---cheerio
切图仔
2022/09/08
1.4K0
Node.js爬虫之使用cheerio爬取图片
入门 node.js 你必须知道的那些事
exports 是 module.exports 的一个引用,意思就是指向同一块内存地址,node 中真正生效的是 module.exports, 修改 exports 本质上也是修改 module.exports 的值,
IT派
2018/07/30
1.2K0
vue之node.js的简单介绍
它是可以运行JavaScript的服务器,用javascript语言编写的后端,只是它的开发语言是JavaScript
用户1214487
2022/03/26
7900
vue之node.js的简单介绍
相关推荐
用node.js从零开始去写一个简单的爬虫
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验