fruit_data.yaml

train和valid文件夹的构成:

训练代码:

使用代码:

label标注


我这里是用一个识别水果的作为案例

首先我们来看一下目录:

(这里的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文件

Logo

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

更多推荐