文章目录
YOLOv11代码下载
https://github.com/ultralytics/ultralytics
1.数据集制作
1.1 数据集准备
- 自制数据集
- 公开数据集:极市平台

1.2 数据标注
-
下载安装Labelimg:Labelimg

-
新建label文件夹保存标签

-
打开数据集文件进行标注
快捷键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))
最后生成的目录文件:

1.4 新建.yaml配置文件
在ultralytics/datasets/下新建xx.yaml文件。

2.网络训练
权重文件
- 新建文件夹,放置下载的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的其他系列,切换模型就可以了。)
有两种训练方式:
- 利用预训练权重,比如说
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")
- 不使用预训练权重,从零开始训练(如果对网络结构进行了修改,推荐从零开始训练)

# # 不使用预训练权重,从零开始训练(如果对网络结构进行了修改,推荐从零开始训练)
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()
需要修改对应的权重文件
热力图结果:



238

被折叠的 条评论
为什么被折叠?



