yolov11入门——如何自己训练模型及如何搞出label标注
本文介绍了使用YOLO模型进行水果目标检测的完整流程。首先配置fruit_data.yaml文件,指定训练集和验证集路径,设置3个检测类别(苹果、香蕉、橙子)。训练代码使用YOLOv11n预训练模型,设置50个epoch和640x640图像尺寸。对于数据标注,采用labelImg工具手动标注图像生成YOLO格式的txt文件,解决了工具运行时的类型错误问题。训练完成后,使用best.pt模型进行推理
我这里是用一个识别水果的作为案例
首先我们来看一下目录:

(这里的train_test是我们后续自己构造的数据集,test是用来检验的)
我们首先分析一下这些文件都是来干啥的:
fruit_data.yaml
train: ./fruit/train/images
val: ./fruit/valid/images
split: 0.2 # 自动划分20%数据作为验证集
nc: 3
names: [
'Apple',
'Banana',
'Orange'
]
看看这两个参数:
train 参数 :
- 作用:指定训练数据集的图像文件夹路径。
- 示例中的 ./fruit/train/images 表示训练图像存放在该相对路径下。
- 训练集是模型学习的主要数据来源,模型通过学习这些图像中的特征和标签信息,构建目标检测的能力。
val 参数 :
- 作用:指定验证数据集的图像文件夹路径。
- 示例中的 ./fruit/valid/images 表示验证图像存放在该相对路径下。
- 验证集用于在训练过程中评估模型性能,帮助监控是否出现过拟合(训练集表现好但验证集表现差)或欠拟合(训练集和验证集表现都差)的情况,是调整模型超参数的重要依据。
nc:3对应的是下面name的个数,

也就是这里可以识别的个数
然后我们来看看train和valid文件夹的构成:

可以看到,分别是有images和labels两个文件夹,其中image就是我们的图像,而labels是“标注”
两者一一对应
具体如下:

前面的0指的是第(0+1)个目标,后面则是该目标在对应的图的具体位置(矩形)
训练代码:
from ultralytics import YOLO
if __name__ == '__main__':
# Load a pretrained YOLO11n model
model = YOLO("yolo11n.pt")
# Train the model on the COCO8 dataset for 100 epochs
train_results = model.train(
data="fruit_data.yaml", # Path to dataset configuration file
epochs=50, # Number of training epochs
imgsz=640, # Image size for training
device=0, # Device to run on (e.g., 'cpu', 0, [0,1,2,3])
workers=4, # 禁用多进程
amp=True # 启用自动混合精度
)
# Evaluate the model's performance on the validation set
metrics = model.val()
print("Training completed. Validation metrics:", metrics)
# 暂时注释导出步骤,待训练完成后再执行
# Export the model to ONNX format for deployment
# path = model.export(format="onnx") # Returns the path to the exported model
这里可以根据需要来调整,但是注意,不是训练越多次越好,太多次可能会出现过拟合

这就是我们训练后run文件夹里的东西,就是对我们训练进行数据分析,图形化表示
其中我们要使用训练后的模型就是 best.pt(性能最高),(last.pt是最后一次训练的结果)
使用代码:
import torch
# 加载模型
from ultralytics import YOLO
model = YOLO(r'D:\yolov11\fruit_test\runs\detect\train\weights\best.pt')
# 进行推理
# 批量检测test文件夹中的所有图片并保存结果
results = model(r"D:\yolov11\fruit_test\fruit\test\images", save=True)
# 打印检测结果保存路径
for result in results:
print(f"检测完成: {result.path},结果保存至: {result.save_dir}")
自己使用的时候替换成自己的路径

好的,这样就是一个非常基础的训练了那么问题来了,label标注是怎么来的呢?
label标注
那么如果我们有了图片,怎么样搞出自己的labels呢?
这里我们使用labelImg
pip install labelImg

启动后出现这个界面:

然后选择图片目录,点击下面的create rectbox
但是我自动闪退:

可以看到,这是一个类型错误,即需要的是int,但是给的是float,我原本是打算重新安装和降PyQt5,但是后面发现都不行,所以就根据报错来修改代码:
在canvas.py中,修改如下:
# Paint rect
if self.current is not None and len(self.line) == 2:
left_top = self.line[0]
right_bottom = self.line[1]
rect_width = right_bottom.x() - left_top.x()
rect_height = right_bottom.y() - left_top.y()
p.setPen(self.drawing_rect_color)
brush = QBrush(Qt.BDiagPattern)
p.setBrush(brush)
p.drawRect(int(left_top.x()), int(left_top.y()), int(rect_width), int(rect_height))
#p.drawRect(left_top.x(), left_top.y(), rect_width, rect_height)
if self.drawing() and not self.prev_point.isNull() and not self.out_of_pixmap(self.prev_point):
p.setPen(QColor(0, 0, 0))
p.drawLine(int(self.prev_point.x()), 0, int(self.prev_point.x()), int(self.pixmap.height()))
#p.drawLine(self.prev_point.x(), 0, self.prev_point.x(), self.pixmap.height())
p.drawLine(int(0), int(self.prev_point.y()), int(self.pixmap.width()), int(self.prev_point.y()))
#p.drawLine(0, self.prev_point.y(), self.pixmap.width(), self.prev_point.y())
具体位置为约代码520行,也可以去看报错信息的位置
修改后即可成功点击create rectbox
但是在运行过程中,发现还有一个地方出错,定位后为lablImg (那个小一点的I是i的大写)
def scroll_request(self, delta, orientation):
units = - delta / (8 * 15)
bar = self.scroll_bars[orientation]
bar.setValue(int(bar.value() + bar.singleStep() * units))
#bar.setValue(bar.value() + bar.singleStep() * units)
约在代码的965行
ok,让我们labelImg启动程序,然后open dir 打开我们的images文件
eg:

这里我们可以看到右边侧栏往下数第8位,我这里显示yolo
他这里有3种模式,我因为就是单纯想要导出txt文件,选择yolo,还有xml格式可以选择

画图,写标签即可

成功搞出txt文件
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐



所有评论(0)