专栏名称: 小白学视觉
本公众号主要介绍机器视觉基础知识和新闻,以及在学习机器视觉时遇到的各种纠结和坑的心路历程。
目录
相关文章推荐
有方空间  ·  亚洲最大TOD在中国:广州白云站 / ... ·  昨天  
gooood谷德设计网  ·  联合新作|《只此周庄》剧场立面设计 ·  昨天  
51好读  ›  专栏  ›  小白学视觉

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

小白学视觉  · 公众号  ·  · 2025-01-04 20:05

正文

点击上方 小白学视觉 ”,选择加" 星标 "或“ 置顶

重磅干货,第一时间送达
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包:
pip install ultralytics
3. 准备数据集
数据集格式 应如下所示:
/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代码片段:
import jsonimport 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。 以下是我个人使用的增强管道示例:
import albumentations as Afrom 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代码:
from sklearn.model_selection import train_test_splitimport osimport




    
 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配置文件来定义数据集路径、类别和其他关键设置。以下是一个简单但有效的示例:
path: ../datasets  # Path to dataset root directorytrain: images/train  # Path to training imagesval: images/val  # Path to validation imagesnc: 3  # Number of classesnames: ['class1', 'class2', 'class3']  # Class names
  • path:确保此路径指向数据集的根文件夹。一次数据集放错位置让我花费了数小时调试!
  • nc和names:仔细检查这些。类别数量与标签不匹配会导致训练失败。
  • 其他参数:在训练脚本中试验img_size、epochs和batch size等设置,因为这些不能直接在YAML文件中定义。
以下是一个额外的YAML参数,如果您使用自定义数据集,可能需要它:
test: images/test  # Optional: Test dataset path
5. 训练YOLOv11模型
训练YOLOv11是乐趣的开始。我仍然记得第一次加载预训练模型时,看到它仅通过几次调整就能很好地泛化。以下是您可以开始的确切方法:
加载预训练权重
YOLOv11模型在COCO上预训练,使其成为极好的起点。加载模型非常简单:
from ultralytics import YOLO
model = YOLO('yolov8n.pt') # Load YOLOv8 Nano pretrained weights
我建议从yolov11n.pt或yolov11s.pt开始进行快速实验,尤其是如果您使用像RTX 3060这样的标准GPU。
训练模型
一旦您的数据集和配置文件准备就绪,就可以开始训练了。以下是一个简单的训练脚本:
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启用高级技术。
示例:
model.train(data='custom_dataset.yaml',            epochs=50,            imgsz=640,            lr0=0.01,  # Starting learning rate            optimizer='AdamW',            augment=True)
监控训练
以下是您可以实时监控训练的方法:
  • TensorBoard: 它内置于YOLOv11。 只需添加project和name参数:
model.train(data='custom_dataset.yaml',            project='YOLOv8-Experiments',            name='run1',            exist_ok=True)
运行tensorboard --logdir YOLOv11-Experiments以可视化损失曲线、指标等。
  • Weights and Biases (wandb):如果您像我一样喜欢详细的实验跟踪,将YOLOv11连接到wandb:
pip install wandb
然后,登录wandb并启用跟踪:
model.train(data='custom_dataset.yaml',             project='YOLOv8-Wandb',             name='run1',            wandb=True)
提示:密切关注您的mAP(平均平均精度)值。训练期间突然下降通常表明过拟合或增强问题。 通过这种方法,您将为顺利的训练体验做好准备。我个人发现,花时间调整参数和监控进度在最终结果中会带来巨大的回报。
6. 评估模型
验证模型
一旦训练完成,评估您的微调模型就像运行.val()函数一样简单:
results = model.val()print(results)
YOLOv11提供了多个指标,但您需要关注的两个是:
根据我的经验,强大的[email protected]:0.95分数表明您的模型泛化良好。例如,在最近的一个项目中,调整增强管道使该分数提高了7%——这是一个巨大的胜利!
可视化性能
数字很好,但视觉效果讲述真实的故事。YOLOv11在验证期间生成预测,使您能够轻松发现模型表现出色(或挣扎)的地方。使用这些可视化来识别:
  • 错误分类的对象。
  • 重叠的边界框。
生成混淆矩阵:
model.val(conf=True)
我个人总是先检查混淆矩阵。这是快速识别模型是否混淆相似类别的简单方法——在像COCO这样的数据集中,对象可能在上下文上相似(例如,叉子和勺子),这是一个常见问题。
7. 模型优化部署
您已经训练了一个出色的模型,但真正的考验在于部署。无论是减少边缘设备的延迟还是优化移动设备,YOLOv11都有工具可以帮助。让我分享对我有效的方法。
量化
量化可以大幅减少推理时间,而不会显著降低准确性。 我曾用它将模型部署在像Raspberry Pi这样的资源受限设备上,效果非常好。 以下是如何量化您的YOLOv11模型:
model.export(format='torchscript', optimize=True)
通过optimize=True,YOLOv11在导出期间自动处理量化。
剪枝
有时一个更精简的模型就是您所需要的。我曾通过剪枝将模型大小减少50%,同时保持准确性。YOLOv11使这变得简单:
model.prune(amount=0.5)  # Prune 50% of parameters






请到「今天看啥」查看全文