YOLOv26训练自己的数据集

YOLOv11代码下载

https://github.com/ultralytics/ultralytics

1.数据集制作

1.1 数据集准备

1.2 数据标注

  1. 下载安装Labelimg:Labelimg
    在这里插入图片描述

  2. 新建label文件夹保存标签
    在这里插入图片描述

  3. 打开数据集文件进行标注
    快捷键w进行标注,输入标签名,比如说person,保存,然后继续下一张,直到标注完成。
    在这里插入图片描述
    YOLO格式标签生成的是txt文件
    在这里插入图片描述
    在这里插入图片描述
    VOC格式标签生成的xml文件:
    在这里插入图片描述
    在这里插入图片描述
    包含图片信息和标注的object信息(坐标、类别)
    注意:如果是包含多个类别,请注意每个类型的顺序:比如说 0:类别1,1:类别2.

1.3数据集划分

将数据集划分为训练集、测试集、验证集。训练集:验证集:测试集=8:1:1
在YOLOv11代码ultralytics/目录下新建data.py文件,将数据集的data和label文件夹进行拆分:

import os
import random
import shutil

# 原数据集目录(相对目录)
root_dir = 'datasets/原始数据集'
# 划分比例:训练集:验证集:测试集=8:1:1
train_ratio = 0.8
valid_ratio = 0.1
test_ratio = 0.1

# 设置随机种子
random.seed(42)

# 拆分后数据集目录
split_dir = 'datasets/safe'
os.makedirs(os.path.join(split_dir, 'train/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'train/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'valid/labels'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/images'), exist_ok=True)
os.makedirs(os.path.join(split_dir, 'test/labels'), exist_ok=True)

# 获取图片文件列表
image_files = os.listdir(os.path.join(root_dir, 'images'))
label_files = os.listdir(os.path.join(root_dir, 'labels'))

# 随机打乱文件列表
combined_files = list(zip(image_files, label_files))#图片、标签转化为列表
random.shuffle(combined_files)#打乱
image_files_shuffled, label_files_shuffled = zip(*combined_files)#重新获取

# 根据比例计算划分的边界索引
train_bound = int(train_ratio * len(image_files_shuffled))#图片总数*训练集比例
valid_bound = int((train_ratio + valid_ratio) * len(image_files_shuffled))

# 将图片和标签文件移动到相应的目录
for i, (image_file, label_file) in enumerate(zip(image_files_shuffled, label_files_shuffled)):
    if i < train_bound:
        shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'train/images', image_file))
        shutil.copy(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'train/labels', label_file))
    elif i < valid_bound:
        shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'valid/images', image_file))
        shutil.copy(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'valid/labels', label_file))
    else:
        shutil.copy(os.path.join(root_dir, 'images', image_file), os.path.join(split_dir, 'test/images', image_file))
        shutil.copy(os.path.join(root_dir, 'labels', label_file), os.path.join(split_dir, 'test/labels', label_file))


最后生成的目录文件:
c1c6f8cff01284282a586a430bad9763.png)

1.4 新建.yaml配置文件

在ultralytics/datasets/下新建xx.yaml文件。
在这里插入图片描述

2.网络训练

权重文件

  1. 新建文件夹,放置下载的yolov26权重文件。下载链接
    在这里插入图片描述

在这里插入图片描述

参数配置

  • ultralytics/cfg/default.yaml:这个文件里保存了我们模型训练的所有超参数。

  • 可以复制default.yaml文件,重命名为default1.yaml
    在这里插入图片描述

  • 修改default1.yaml里面的参数,比如说:

    • 一些训练的参数:
# Train settings -------------------------------------------------------------------------------------------------------
model: pt/yolov26n.pt #模型预训练权重路径
data: ultralytics/datasets/safe.yaml  # 数据集配置文件(yarm)文件路径
epochs: 600 # (int) 训练轮次
batch: 16 # batch size
imgsz: 640 # 图像大小
device: 0 # GPU训练还是cpu。(int | str | list) device: CUDA device=0 or [0,1,2,3] or "cpu/mps" or -1 or [-1,-1] to auto-select idle GPUs
workers: 4 # 加载数据集时的线程数
project: safe # 项目名,生成的训练结果会保存在这个目录下
  • 一些数据增强的参数:
scale: 0.5 # (float) image scale (+/- gain)
shear: 0.0 # (float) image shear (+/- deg)
perspective: 0.0 # (float) image perspective (+/- fraction), range 0-0.001
flipud: 0.0 # (float) image flip up-down (probability)
fliplr: 0.5 # (float) image flip left-right (probability)
bgr: 0.0 # (float) image channel BGR (probability)
mosaic: 1.0 # (float) image mosaic (probability)
mixup: 0.0 # (float) image mixup (probability)
cutmix: 0.0 # (float) image cutmix (probability)

训练方式

YOLO命令

  • 可以直接通过YOLO 命令来进行训练。yolo train data=ultralytics/datasets/traffic.yaml model=yolov811.pt epochs=600 lr0=0.01 batch=32
  • 参数必须以 arg=val 对,用等号分割 = 符号,每对之间用空格分隔。不要使用 -- 参数 , 参数之间。

新建py文件运行(推荐)

新建yolo.py进行训练。

  • 在代码根目录新建yolo.py,直接在代码里重写参数,会默认覆盖ultralytics/cfg/default.yaml里面的参数。 这种方式可以对网络结构进行修改。
    (yaml文件和pt文件一一对应,如果想训练YOLO的其他系列,切换模型就可以了。)

有两种训练方式:

  1. 利用预训练权重,比如说yolov11n.pt进行训练
from ultralytics import YOLO
import cv2
from PIL import Image

def tran():
    # 使用预训练权重进行训练
    model = YOLO(model="pt/yolo26n.pt")
    # 开始训练
    model.train(data="ultralytics/datasets/safe.yaml", cfg="ultralytics/cfg/default1.yaml",epochs=300, batch=32,workers=8,device="cpu")
  1. 不使用预训练权重,从零开始训练(如果对网络结构进行了修改,推荐从零开始训练)
    在这里插入图片描述

    # # 不使用预训练权重,从零开始训练(如果对网络结构进行了修改,推荐从零开始训练)
    model = YOLO('ultralytics/cfg/models/26/yolo26.yaml')
    model.train(cfg="ultralytics/cfg/default1.yaml", data="ultralytics/datasets/safe.yaml", epochs=600, close_mosaic=30, batch=4)
    # 这里写的参数会覆盖之前的default.yaml中的参数

3. 网络验证

需要加载训练好的best.pt权重模型,data参数需要传入数据集对应的yaml文件

def val():
    # 在训练数据集上进行验证
    model = YOLO(model='runs/train/weights/best.pt')
    model.val(data='ultralytics/datasets/safe.yaml')

4. 模型预测

需要加载训练好的best.pt权重模型,source参数需要传入你想要预测的图片或者视频或者文件夹

def predict():

    model = YOLO(model="model.pt")#训练完的模型文件路径
    # accepts all formats - image/dir/Path/URL/video/PIL/ndarray. 0 for webcam
    model.predict(source="folder",save=True,save_txt=True)  # #source="folder"预测数据的文件夹路径

    # # from PIL
    # im1 = Image.open("bus.jpg")
    # results = model.predict(source=im1, save=True)  # save plotted images
    #
    # # from ndarray
    # im2 = cv2.imread("bus.jpg")
    # results = model.predict(source=im2, save=True, save_txt=True)  # save predictions as labels
    #
    # # from list of PIL/ndarray
    # results = model.predict(source=[im1, im2])

注意:网络训练和验证、推理(预测)不能同时进行,必须要训练完之后才能进行验证、推理(预测),主函数中只能同时运行一个,其余代码需要注释掉

完整代码:



from ultralytics import YOLO
import cv2
from PIL import Image

def tran():
    # 使用预训练权重进行训练
    model = YOLO(model="pt/yolo26n.pt")
    # 开始训练
    model.train(data="ultralytics/datasets/safe.yaml", cfg="ultralytics/cfg/default1.yaml",epochs=300, batch=32,workers=8,device="cpu")

    # # 不使用预训练权重,从零开始训练(如果对网络结构进行了修改,推荐从零开始训练)
    model = YOLO('ultralytics/cfg/models/26/yolo26.yaml')
    model.train(cfg="ultralytics/cfg/default1.yaml", data="ultralytics/datasets/safe.yaml", epochs=600, close_mosaic=30, batch=4)
    # 这里写的参数会覆盖之前的default.yaml中的参数

def val():
    # 在训练数据集上进行验证
    model = YOLO(model='runs/train/weights/best.pt')
    model.val(data='ultralytics/datasets/safe.yaml')

def predict():

    model = YOLO(model="model.pt")#训练完的模型文件路径
    # accepts all formats - image/dir/Path/URL/video/PIL/ndarray. 0 for webcam
    model.predict(source="folder",save=True,save_txt=True)  # #source="folder"预测数据的文件夹路径

    # # from PIL
    # im1 = Image.open("bus.jpg")
    # results = model.predict(source=im1, save=True)  # save plotted images
    #
    # # from ndarray
    # im2 = cv2.imread("bus.jpg")
    # results = model.predict(source=im2, save=True, save_txt=True)  # save predictions as labels
    #
    # # from list of PIL/ndarray
    # results = model.predict(source=[im1, im2])

if __name__ == '__main__':
    tran()


5. 训练结果

tensorboard

找到tensorboard文件所在路径
在这里插入图片描述

  • 查看训练命令: tensorboard --logdir=tensorboard文件路径
  • tensorboard记录了很多训练曲线,可以直接下载图片,也可以导出数据为csv格式,自己通过python绘图绘制曲线(推荐)
    在这里插入图片描述

Yolo训练自带结果

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

预测图片效果

在这里插入图片描述
在这里插入图片描述

6.目标计数

统计图片中的某个类别的数量:

#图片计数
import cv2
from ultralytics import YOLO

def count_specific_class(image_path, output_img_path, model_path, target_classes=[0]):
    model = YOLO(model_path)
    img = cv2.imread(image_path)
    results = model(img, classes=target_classes)[0]  # cls_id 换成你的类别ID
    obj_num = len(results.boxes)

    res_img = results.plot()
    cv2.imwrite(output_img_path, res_img)
    print(f"指定类别目标数量:{obj_num}")
    cv2.destroyAllWindows()

if __name__ == "__main__":
    # 示例:只统计类别0的目标
    count_specific_class("图片路径", "保存路径", "runs/train/weights/best.pt", target_classes=[0])#.pt文件替换为训练好的权重文件

统计视频中的检测目标数量:

import cv2

from ultralytics import solutions

# 视频计数
def count_objects_in_region(video_path, output_video_path, model_path):
    """Count objects in a specific region within a video."""
    cap = cv2.VideoCapture(video_path)
    assert cap.isOpened(), "Error reading video file"
    w, h, fps = (int(cap.get(x)) for x in (cv2.CAP_PROP_FRAME_WIDTH, cv2.CAP_PROP_FRAME_HEIGHT, cv2.CAP_PROP_FPS))
    video_writer = cv2.VideoWriter(output_video_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (w, h))

    region_points = [(20, 400), (1080, 400), (1080, 360), (20, 360)]
    counter = solutions.ObjectCounter(show=True, region=region_points, model=model_path)

    while cap.isOpened():
        success, im0 = cap.read()
        if not success:
            print("Video frame is empty or processing is complete.")
            break
        results = counter(im0)
        video_writer.write(results.plot_im)

    cap.release()
    video_writer.release()
    cv2.destroyAllWindows()


count_objects_in_region("path/to/video.mp4", "output_video.avi", "yolo26n.pt")

7.热力图可视化

用来显示某一层网络之后的输出特征图。

#图片heatmap
import cv2
from ultralytics import solutions

# 图片路径、输出路径、模型、指定检测类别
img_path = "bus.jpg"
save_path = "heatmap_result.jpg"
model_path = "runs/train/weights/best.pt"#训练好的权重路径
# classes 填你需要的类别ID
target_classes = [0, 2]

# 读取图片
im0 = cv2.imread(img_path)
# 初始化热力图工具
heatmap = solutions.Heatmap(
    show=True,
    model=model_path,
    classes=target_classes
)

# 生成热力图
result_img = heatmap(im0)

# 保存结果图片
cv2.imwrite(save_path, result_img)
print(f"热力图已保存至: {save_path}")

cv2.destroyAllWindows()

视频热力图:

#视频heatmap
import cv2

from ultralytics import solutions

cap = cv2.VideoCapture("path/to/video.mp4")
heatmap = solutions.Heatmap(show=True, model="yolo26n.pt", classes=[0, 2])

while cap.isOpened():
    success, im0 = cap.read()
    if not success:
        break
    results = heatmap(im0)
cap.release()
cv2.destroyAllWindows()

需要修改对应的权重文件

热力图结果:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值