《YOLO 标注训练全攻略》
- 一、YOLO 训练概述
- (一)YOLO 的广泛应用
- (二)标注训练的意义
- 二、数据准备阶段
- (一)数据收集与划分
- (二)图像标注工具
- (三)数据增强(可选)
- (四)划分训练集和验证集
- 三、YOLO 训练阶段
- (一)安装依赖环境
- (二)调整训练参数
- (三)开始训练
- 四、模型评估与预测
- (一)图像检测
- (二)模型效果评估
一、YOLO 训练概述
YOLO(You Only Look Once)作为一种先进的目标检测算法,在计算机视觉领域占据着重要地位。其标注训练更是整个流程中的关键环节,具有重大的意义和广泛的应用场景。
(一)YOLO 的广泛应用
YOLO 在目标检测领域优势显著,以其高效性和准确性而流行。例如,在安防监控中,YOLO 可以实时检测和识别人员、车辆等,速度可达每秒几十帧甚至更高。在自动驾驶领域,YOLO 能够快速准确地识别道路上的车辆、行人、交通标志等,为自动驾驶系统提供关键的环境感知信息,极大地提高了驾驶安全性和智能化水平。在工业自动化方面,YOLO 可用于制造线上检测产品缺陷或进行质量控制,提高生产效率和产品质量。此外,YOLO 在零售分析、无人机、医疗影像分析等领域也有着广泛的应用。
(二)标注训练的意义
进行 YOLO 标注训练具有重要意义。通过标注训练,可以根据特定的需求定制化检测任务。比如,对于特定的工业产品检测,通过对大量产品图像进行标注训练,可以让 YOLO 模型准确识别出产品的缺陷类型和位置,满足工业生产中的质量控制需求。在医疗影像分析中,针对特定的疾病诊断需求,可以对大量医疗影像进行标注训练,使 YOLO 模型能够辅助医生快速准确地检测出病灶,提高诊断效率和准确性。总之,标注训练能够让 YOLO 更好地适应不同的应用场景,满足各种特定需求。
二、数据准备阶段
(一)数据收集与划分
数据收集的途径:
可以利用网络上的开源数据集,如 COCO、Pascal VOC 等,这些数据集经过大量的标注和验证,具有较高的质量和多样性。
自己采集数据也是一种有效的方式,可以通过摄像头、传感器或其他设备采集图像或视频,根据特定的应用场景进行定制化的数据收集。例如在工业自动化领域,可以在生产线上采集产品图像;在安防监控中,可以通过安装监控摄像头获取实时视频流并提取图像。
数据集合成也是一种扩充数据集的方法,可以使用图像合成工具生成合成数据,以增加数据的多样性和数量。
数据集的划分:
通常将数据集划分为训练集、验证集和测试集。常见的划分比例为 80% 的数据用于训练,10% 用于验证,10% 用于测试。这样的划分可以在训练过程中评估模型的性能,并在测试集上最终验证模型的泛化能力。
(二)图像标注工具
安装 labelimg:
在 cmd 中输入 “pip install labelimg -i https://pypi.tuna.tsinghua.edu.cn/simple” 进行安装。安装结束后,在 cmd 中输入 “labelimg” 即可打开。
切换为 YOLO 格式进行标注:
在工具栏中 “保存” 按钮的正下方,单击 “PascalVOC” 按钮切换到 YOLO 格式。在 data/predefined_classes.txt 定义将用于培训的课程列表。可以使用 Open/OpenDIR 处理单个或多个图像。完成单个图像后,单击保存。YOLO 格式的 txt 文件将与图像同名保存在同一文件夹中,同时还会生成一个名为 “classes.txt” 的文件,定义了 YOLO 标签所引用的类名列表。
(三)数据增强(可选)
数据增强的方法和作用:
数据增强的方法包括随机剪裁、随机翻转、随机颜色变化、随机加噪、随机模糊等。这些方法可以增加数据的多样性,使模型学习到更多的特征,提高模型的泛化能力。
例如,随机剪裁可以随机从输入图像中剪裁出一块区域并将其作为新的输入,增加数据的多样性;随机翻转可以随机将输入图像左右或上下翻转,使模型学习到不同方向的特征;随机颜色变化可以随机调整输入图像的对比度、亮度和饱和度,使模型对不同颜色的光照条件具有更强的适应性。
代码实现示例:
以 HSV 变换为例,代码实现如下:
# 文件位置:utils/datasets.py
# 色域空间增强 Augment colorspace:H 色调、S 饱和度、V 亮度
# 通过一些随机值改变 hsv,实现数据增强
augment_hsv(img, hgain=hyp['hsv_h'], sgain=hyp['hsv_s'], vgain=hyp['hsv_v'])
# 被调用的函数位置:utils/augmentations.py
def augment_hsv(im, hgain=0.5, sgain=0.5, vgain=0.5):
# HSV color-space augmentation
if hgain or sgain or vgain:
r = np.random.uniform(-1,1, 3) * [hgain, sgain, vgain] + 1 # random gains
hue, sat, val = cv2.split(cv2.cvtColor(im, cv2.COLOR_BGR2HSV))
dtype = im.dtype # uint8
x = np.arange(0,256, dtype=r.dtype)
lut_hue = ((x * r[0]) % 180).astype(dtype)
lut_sat = np.clip(x * r[1],0, 255).astype(dtype)
lut_val = np.clip(x * r[2],0, 255).astype(dtype)
im_hsv = cv2.merge((cv2.LUT(hue, lut_hue), cv2.LUT(sat, lut_sat), cv2.LUT(val, lut_val)))
cv2.cvtColor(im_hsv, cv2.COLOR_HSV2BGR, dst=im) # no return needed
(四)划分训练集和验证集
通过脚本划分:
下面是随机划分训练集和验证集的脚本代码,只需要填充好 image_dir、label_dir(标注好的图片和标签路径),train_image_dir、train_label_dir、val_image_dir、val_label_dir(生成训练集、验证集的图片和标签路径),还可以自己调整 train_val_split 的值来调整训练集和验证集的划分比例。
"""随机划分训练集和验证集"""
import os
import random
from shutil import copyfile
# 输入路径
image_dir = r'G:\\yolov8\\data\\images' # 替换成你的图像文件夹路径
label_dir = r'G:\\yolov8\\data\\label' # 替换成你的标签文件夹路径
# 输出路径
train_image_dir = r'G:\\yolov8\\ultralytics-main\\ultralytics-main\\my_data\\detection\\train\\images'
train_label_dir = r'G:\\yolov8\\ultralytics-main\\ultralytics-main\\my_data\\detection\\train\\labels'
val_image_dir = r'G:\\yolov8\\ultralytics-main\\ultralytics-main\\my_data\\detection\\val\\images'
val_label_dir = r'G:\\yolov8\\ultralytics-main\\ultralytics-main\\my_data\\detection\\val\\labels'
# 创建输出文件夹
os.makedirs(train_image_dir, exist_ok=True)
os.makedirs(train_label_dir, exist_ok=True)
os.makedirs(val_image_dir, exist_ok=True)
os.makedirs(val_label_dir, exist_ok=True)
# 划分数据集的比例
train_val_split = 0.8
# 获取图像文件列表
image_files = os.listdir(image_dir)
random.shuffle(image_files)
# 计算划分的索引
split_index = int(len(image_files) * train_val_split)
# 划分训练集和验证集
train_image_files = image_files[:split_index]
val_image_files = image_files[split_index:]
# 复制图像文件并相应地复制标签文件
def copy_images_and_labels(image_files, source_image_dir, source_label_dir, dest_image_dir, dest_label_dir):
for image_file in image_files:
# 复制图像文件
source_image_path = os.path.join(source_image_dir, image_file)
dest_image_path = os.path.join(dest_image_dir, image_file)
copyfile(source_image_path, dest_image_path)
# 复制对应的标签文件
label_file = os.path.splitext(image_file)[0] + '.txt'
source_label_path = os.path.join(source_label_dir, label_file)
dest_label_path = os.path.join(dest_label_dir, label_file)
copyfile(source_label_path, dest_label_path)
# 复制训练集图像和标签
copy_images_and_labels(train_image_files, image_dir, label_dir, train_image_dir, train_label_dir)
# 复制验证集图像和标签
copy_images_and_labels(val_image_files, image_dir, label_dir, val_image_dir, val_label_dir)
划分比例的选择:
常见的划分比例为 80% 的数据用于训练,10% 用于验证,10% 用于测试。这个比例可以根据数据量和任务的特性进行调整。如果数据量较大,可以适当增加验证集和测试集的比例,以更好地评估模型的性能和泛化能力;如果数据量较小,可以适当减少验证集和测试集的比例,以保证有足够的数据用于训练。
三、YOLO 训练阶段
(一)安装依赖环境
安装 YOLO 训练所需的依赖环境是确保训练顺利进行的重要步骤。首先,需要安装 torch 和 torchvision。可以通过以下命令进行安装:
pip install torch
pip install torchvision
此外,还需要配置项目所需的其他软件包。根据项目的要求,可以在项目的根目录下找到 requirements.txt 文件,通过以下命令安装其中列出的软件包:
pip install -r requirements.txt
(二)调整训练参数
训练参数的调整对于获得良好的训练效果至关重要。以下是一些常见的训练参数及其调整方法:
迭代次数:迭代次数决定了模型训练的轮数。一般来说,迭代次数越多,模型的性能越好,但训练时间也会相应增加。可以根据任务的复杂性和数据量的大小来调整迭代次数。如果数据量较小,可以适当减少迭代次数,以避免过拟合;如果数据量较大,可以适当增加迭代次数,以提高模型的性能。例如,对于一个简单的目标检测任务,数据量较小,可以将迭代次数设置为 50 到 100 次;对于一个复杂的目标检测任务,数据量较大,可以将迭代次数设置为 500 到 1000 次。
批次大小:批次大小决定了每次训练时输入模型的样本数量。批次大小越大,模型的训练速度越快,但也需要更多的内存。如果显卡的显存较小,可以适当减小批次大小,以避免内存不足的问题;如果显卡的显存较大,可以适当增加批次大小,以提高训练速度。一般来说,批次大小可以设置为 8、16、32、64 等。例如,如果显卡的显存为 4GB,可以将批次大小设置为 8 或 16;如果显卡的显存为 8GB 或以上,可以将批次大小设置为 32 或 64。
(三)开始训练
在完成依赖环境的安装和训练参数的调整后,可以开始运行 train.py 文件进行训练。在终端中进入项目的根目录,输入以下命令:
python train.py --data [your_data.yaml] --weight [pretrained_weight.pt] --cfg [model_config.yaml] --batch-size [batch_size] --epochs [epochs]
其中,[your_data.yaml] 是你自己创建的数据集配置文件,[pretrained_weight.pt] 是预训练权重文件,[model_config.yaml] 是模型配置文件,[batch_size] 是批次大小,[epochs] 是迭代次数。
在训练过程中,可以通过终端输出查看训练进度和结果。训练进度会显示当前的迭代次数、损失值、学习率等信息。训练结果会在训练结束后输出,包括模型的精度、召回率、F1 值等指标。此外,还可以通过保存的训练日志文件查看训练过程中的详细信息。
训练结束后,可以在指定的输出目录中找到保存的模型文件和训练结果文件。这些文件可以用于模型的推理和预测,以及进一步的分析和评估。
四、模型评估与预测
(一)图像检测
使用 detect.py 文件进行图像检测是评估模型性能的重要手段之一。首先,可以对 detect.py 文件中的参数进行修改以满足特定的检测需求。例如,可以调整 conf_thres(置信度阈值)和 iou_thres(做 NMS 的 IOU 阈值)。一般情况下,作者设置的默认值为 conf_thres=0.25 和 iou_thres=0.45。如果检测框出现重复的情况,可以考虑提高置信区间,降低 IOU,如将 conf_thres 从默认的 0.25 提高到 0.3,将 iou_thres 从默认的 0.45 降低到 0.2。
在主函数中,可以将传参过程改为默认的值,如需修改可在 detect() 函数中传入参数即可。比如想要修改 con_fthres=0.25 的值,可以这样修改:
def detect(source,save_img=False,conf_thres1):
# 将命令行传参,改为了使用主函数将参数传入
agnostic_nms=False
augment=False
classes=None
conf_thres=conf_thres1
在主函数中调用时只需要把相应的参数值传入即可:
if __name__ == '__main__':
source='inference/images/test5.jpg'
detect(source,conf_thres1=0.20)
将自己所要检测的图片放入主目录 inference/images 目录下,并将其地址在 source 中进行修改,即可运行进行此照片的检测。运行结束后会在 runs/detect 中新产生的一个文件夹 exp 中保存识别的结果。
(二)模型效果评估
根据预测结果评估模型的性能可以通过多种指标来进行。例如,可以使用平均精度均值(mAP)来衡量模型的准确率。mAP@0.5 表示在 IOU 阈值为 0.5 的情况下,mAP 的值为多少。一般来说,mAP@0.5 即为评价 YOLO 模型的指标之一。此外,还可以通过查看混淆矩阵、精确率(Precision)、召回率(Recall)、F1-score 等指标来评估模型的性能。
混淆矩阵以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值。通过计算 TP(将正类预测为正类数)、FN(将正类预测为负类)、FP(将负类预测为正类数)、TN(将负类预测为负类数)的值,可以进一步计算精确率和召回率。
精确率 Precision=TP / (TP+FP),在预测是 Positive 所有结果中,预测正确的比重。召回率 recall=TP / (TP+FN),在真实值为 Positive 的所有结果中,预测正确的比重。F1-score 被定义为查准率和召回率的调和平均数,最大为 1,最小为 0。
如果模型的性能不理想,可以通过调整参数来提高模型精度。例如,可以进行数据增强,增加更多的数据可以提高 YOLO 的准确性。这可以通过使用各种数据增强技术来实现,例如旋转、平移、翻转、缩放等。还可以调整超参数,如学习率、权重衰减和批次大小等。通过对这些超参数进行优化,可以提高算法的准确性。我们可以使用自动化工具如网格搜索、贝叶斯优化等来寻找最佳超参数组合。此外,还可以修改损失函数、进行模型集成、分类器融合、多尺度训练、网络架构优化以及使用后处理技术等方法来提高模型的准确性。