收集数据集:
1.使用开源已标记数据集
2.自己网上搜索下载。
3.可以将图片几何变换,类似翻转、裁剪、旋转和平移,就变成多张图片了
标注数据集 :
常用的标注工具有很多,比如LabelImg(易崩溃)
、LabelMe(bug)
、VIA
等,但是这些工具都需要安装使用,我这里给大家介绍一款在线标注数据集的工具Make Sense
,打开即用,非常的便捷,在标注之前,我们来看一下一般情况下遵循的标注规则:
- 目标框必须框住整个目标物体,不能有遗漏和重叠。
- 目标框应该与目标物体尽可能接近,但不能与目标物体重合。
- 目标框的宽度和高度应该为正数,不能为零或负数。
- 如果一张图片中有多个目标物体,每个目标物体应该用一个独立的目标框进行标注,不允许多个目标共用一个框。
- 如果目标物体的形状不规则,可以使用多个框进行标注,但必须框住整个目标物体。
- 目标框的坐标必须在数据集中统一。
中文版网页:
Make Sense - 在线图像标注 - BimAnthttp://makesense.bimant.com/英文版网页:
Make Sensehttps://www.makesense.ai/
标注前请确定:
- 请将标注的图片的格式全部归为一样,不然后续代码运行不能将png和jpe的格式分开
- 请查看项目文件数目和文件命名最后那个数目一样,中间不要纯在相同名称,不同格式,格式也只能有一种
注意这里要在右边选上你的标签,不然是空压缩包
全部标记完成后:
我们点击Action
->
Export Annotation
导出 yolo
格式的标签文件压缩包解压后是这样的:
0表示第一个标签
shuju1是图片
shuju2是解压后的标注文件
但是 YOLOv8
所需要的数据集路径的格式是下面这样子的(YOLOv8
支持不止这一种格式),我们接下来要通过脚本来来划分一下数据集:
├── yolov8_dataset
└── train
└── images (folder including all training images)
└── labels (folder including all training labels)
└── test
└── images (folder including all testing images)
└── labels (folder including all testing labels)
└── valid
└── images (folder including all testing images)
└── labels (folder including all testing labels)
这里使用脚本分类:
# by CSDN 迪菲赫尔曼
import os
import random
import shutil
def copy_files(src_dir, dst_dir, filenames, extension):
os.makedirs(dst_dir, exist_ok=True)
missing_files = 0
for filename in filenames:
src_path = os.path.join(src_dir, filename + extension)
dst_path = os.path.join(dst_dir, filename + extension)
# Check if the file exists before copying
if os.path.exists(src_path):
shutil.copy(src_path, dst_path)
else:
print(f"Warning: File not found for {filename}")
missing_files += 1
return missing_files
def split_and_copy_dataset(image_dir, label_dir, output_dir, train_ratio=0.7, valid_ratio=0.15, test_ratio=0.15):
# 获取所有图像文件的文件名(不包括文件扩展名)
image_filenames = [os.path.splitext(f)[0] for f in os.listdir(image_dir)]
# 随机打乱文件名列表
random.shuffle(image_filenames)
# 计算训练集、验证集和测试集的数量
total_count = len(image_filenames)
train_count = int(total_count * train_ratio)
valid_count = int(total_count * valid_ratio)
test_count = total_count - train_count - valid_count
# 定义输出文件夹路径
train_image_dir = os.path.join(output_dir, 'train', 'images')
train_label_dir = os.path.join(output_dir, 'train', 'labels')
valid_image_dir = os.path.join(output_dir, 'valid', 'images')
valid_label_dir = os.path.join(output_dir, 'valid', 'labels')
test_image_dir = os.path.join(output_dir, 'test', 'images')
test_label_dir = os.path.join(output_dir, 'test', 'labels')
# 复制图像和标签文件到对应的文件夹
train_missing_files = copy_files(image_dir, train_image_dir, image_filenames[:train_count], '.jpg')
train_missing_files += copy_files(label_dir, train_label_dir, image_filenames[:train_count], '.txt')
valid_missing_files = copy_files(image_dir, valid_image_dir, image_filenames[train_count:train_count + valid_count], '.jpg')
valid_missing_files += copy_files(label_dir, valid_label_dir, image_filenames[train_count:train_count + valid_count], '.txt')
test_missing_files = copy_files(image_dir, test_image_dir, image_filenames[train_count + valid_count:], '.jpg')
test_missing_files += copy_files(label_dir, test_label_dir, image_filenames[train_count + valid_count:], '.txt')
# Print the count of each dataset
print(f"Train dataset count: {train_count}, Missing files: {train_missing_files}")
print(f"Validation dataset count: {valid_count}, Missing files: {valid_missing_files}")
print(f"Test dataset count: {test_count}, Missing files: {test_missing_files}")
# 使用例子
image_dir = 'datasets/coco128/images/train2017'//可以使用根本路径
label_dir = 'datasets/coco128/labels/train2017'
output_dir = './my_dataset'//自己建一个文件夹,输出结构文件夹
split_and_copy_dataset(image_dir, label_dir, output_dir)
这个脚本是处理jpg格式的图片文件。如果需要处理其他格式自己修改代码中出现JPG的地方,处理完后的格式为下图所示,
训练模型
在yolo v8的项目文件下建一个新建一个数据集yaml文件
# moncake
train: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\train //路径
val: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\valid
test: D:\Pycharm_Projects\ultralytics\ultralytics\datasets\mooncake\test
nc:1 //这里是下面标签总数
# Classes
names:
0: MoonCake
配置完成后: 在yolov8下打开cmd
激活你配置好的prtorch环境:
使用下面三个命令中一个进行负责到cmd窗口
这里注意将data的参数用根路径索引出来,
yolo train data=D:\Desktop\yolov8\ultralytics-main\datasets\yangdujun.yaml model=yolov8n.pt epochs=100 lr0=0.01 训练
# 从YAML构建一个新模型,从头开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.yaml epochs=100 imgsz=640
# 从预训练的*.pt模型开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.pt epochs=100 imgsz=640
# 从YAML中构建一个新模型,将预训练的权重转移到它并开始训练
yolo detect train data=ultralytics/datasets/MoonCake.yaml model=yolov8n.yaml pretrained=yolov8n.pt epochs=100 imgsz=640
等待完成--------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
测试模型:在 D:\Desktop\yolov8\ultralytics-main\runs\detect路径下会有模型生成,
训练结果文件说明
weights文件夹
best.pt:损失值最小的模型文件
last.pt:训练到最后的模型文件
args.yaml
模型训练的配置参数
confusion_matrix.png - 混淆矩阵
这张图展示了分类模型的性能。每一行代表模型预测的类别,每一列代表实际的类别。对角线上的数值表示模型正确预测的数量。对角线上较深的颜色表示该类别预测正确的数量较多。
confusion_matrix_normalized.png - 标准化混淆矩阵:
与普通混淆矩阵类似,但这里的值显示的是每个类别的预测正确比例。这有助于比较不同类别的预测准确性,尤其是在类别样本数量不平衡的情况下。
F1_curve.png - F1-置信度曲线
此曲线显示了F1得分随着置信度阈值的变化。F1得分是精确度和召回率的调和平均值,曲线的峰值表示给定置信度阈值下精确度和召回率的最佳平衡点。
labels.jpg - 标签分布图和边界框分布图
柱状图显示了不同类别的实例分布数量。散点图则展示了目标检测任务中边界框的空间分布情况,反映了常见的尺寸和长宽比。
labels_correlogram.jpg - 标签相关图
相关图提供了不同类别标签之间的关系,以及它们在图像中位置的相关性。这有助于理解模型在识别不同类别时可能出现的关联或混淆。
P_curve.png - 精确度-置信度曲线
这张曲线图展示了模型预测的精确度随着置信度阈值的变化。精确度是模型预测正确正例与预测为正例总数的比值。
PR_curve.png - 精确度-召回曲线
这张曲线图展示了模型的精确度与召回率之间的关系。理想情况下,模型应在精确度和召回率之间保持良好的平衡。
R_curve.png - 召回-置信度曲线
此曲线图显示了模型的召回率随置信度阈值的变化。召回率是模型正确预测的正例与实际正例总数的比值。
results.png 和 results.csv - 训练结果图表和数据
这些图表和数据文件展示了模型在训练过程中的性能变化,包括损失函数的变化和评估指标(如精确度、召回率和mAP)的变化。
验证模型:
这里我使用命令测试:
yolo predict model=runs/detect/train5/weights/best.pt source=datasets/yangdujun/test/images/1(8).jpg 测试
model=runs/detect/train5/weights/best.pt是训练完成损失度最小的模型
source=datasets/yangdujun/test/images/1(8).jpg 是你要测试的图片跟路径
然后可以在D:\Desktop\yolov8\ultralytics-main\runs\detect\predict 路径下找到你的识别完成的图片
导出模型 :
CLI
指令导出方式:
yolo task=detect mode=export model=runs/detect/train/weights/best.pt
python
指令导出方式:
from ultralytics import YOLO
# Load a model
model = YOLO('yolov8n.pt') # load an official model
model = YOLO('path/to/best.pt') # load a custom trained
# Export the model
model.export(format='onnx')