概述
目标检测领域取得了巨大进步,其中 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7 在实时检测方面表现出色。尽管这些模型在通用目标检测数据集上表现卓越,但在 HRSC2016-MS(高分辨率舰船数据集) 上对 YOLOv12 进行微调时,却面临着独特的挑战。
本文提供了一个详细的端到端流程,用于在 HRSC2016-MS 上微调 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7。它涵盖了数据集预处理(基本的洗牌和将数据集划分为训练集、测试集和验证集)、训练、评估以及对它们性能的对比分析。重点关注领域包括:
- 处理数据集偏差以提高小目标检测能力。
- 洗牌数据集以确保适当的泛化能力。
- 在验证集 / 测试集上对比 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7。
- 可视化检测结果以比较模型性能。
此外,本文强调了理解数据集结构和偏差的重要性。研究人员花费大量时间进行数据集准备和适当的训练 - 验证 - 测试划分,以增强模型的泛化能力并避免误导性结果。通过解决 HRSC2016-MS 中的这些挑战,我们展示了适当的数据准备和结构化如何直接提高模型的准确性。
一、HRSC2016-MS 数据集
HRSC2016-MS 是一个海上目标检测数据集,包含舰船的航拍图像。该数据集仅有一个类别,即 舰船。它包含各种舰船大小、密度和方向,使其成为目标检测模型的一个具有挑战性的数据集。
1.1 为何引入 HRSC2016-MS?
在 HRSC2016-MS 之前,已经存在 HRSC2016 数据集,其中包含用于检测任务的舰船图像。然而,HRSC2016-MS 的作者引入了这个修改后的数据集,以解决原始数据集的几个关键限制:
增强多尺度表示
- 原始 HRSC2016 数据集中的舰船尺度相对相似,未能充分表示 多尺度变化。
- HRSC2016-MS 引入了更广泛的舰船尺寸,确保在实际应用中具有更好的泛化能力。
提高数据集多样性
- 原始 HRSC2016 数据集缺乏 舰船杂乱程度和尺度过渡的足够变化。
- HRSC2016-MS 引入了 更密集的舰船,提高了数据集在小目标检测方面的实用性。
更具挑战性的目标分布
- 原始数据集在每张图像中的舰船方向和密度变化较少。
- HRSC2016-MS 旨在 增加数据集的复杂性,使其成为高级目标检测模型的一个更好的基准。
1.2 原始数据集结构
首次下载时,数据集具有以下结构:
HRSC2016-MS/
├── AllImages/ # 包含所有图像(未按训练 / 验证 / 测试划分)
├── Annotations/ # 每张图像的 VOC XML 注释
└── ImageSets/├── train.txt # 训练图像文件名列表├── val.txt # 验证图像文件名列表├── test.txt # 测试图像文件名列表└── trainval.txt # 开发者测试的训练和验证图像组合列表
1.3 原始数据集的问题
非 YOLO 兼容的注释
- 数据集使用 VOC 风格的 XML 注释,需要转换为 YOLO 格式。
非 YOLO 兼容的目录结构
- 所有图像都存储在 AllImages/ 而不是按训练集、验证集和测试集划分。
- 数据集包含 文本文件(train.txt、val.txt、test.txt、trainval.txt),其中仅包含 图像文件名,使其 与 YOLO 和 DarkNet 不兼容。
有偏的训练 - 测试划分
- 数据集总共包含 1680 张图像,理想情况下,测试集应包含文件名为 1-1680 范围内的图像。然而,在分析原始 HRSC2016-MS 数据集中的标签文件名后,我们发现 测试集包含文件名为大约 1-650 范围内的连续图像。这表明 图像在训练集、测试集和验证集之间的分布不当,可能会导致潜在的偏差并影响模型性能。
- 测试集包含较小、密集的舰船,与训练集和验证集相比。
- 这导致了 泛化能力差,模型在 检测小舰船 方面存在困难。
二、数据集转换与预处理
为了解决原始数据集的问题,我们手动将数据集转换并重新构建为 YOLO 和 DarkNet 兼容的格式。所有数据集转换和预处理代码都可以直接下载。
2.1 将注释从 XML 转换为 YOLO(.txt)格式
- 从 XML 文件中提取边界框坐标(xmin、ymin、xmax、ymax),并将其转换为 YOLO(.txt)格式:<class_id> <x_center> <y_center>
- 我们没有使用旋转边界框注释,只是为了使评估过程更简单一些。
2.2 洗牌整个数据集以实现泛化
- 由于测试集主要包含小而密集的舰船,使用原始数据集进行训练会导致泛化能力差。
- 我们 合并、洗牌并重新划分 数据集,以确保以下几点:
- 在训练集、验证集和测试集中平衡分布小舰船和大舰船。
- 防止对特定目标尺寸产生过拟合。
- 这里呈现的结果只是一个 基线。鉴于数据集划分的固有随机性,其他研究人员可能会观察到 略有不同的结果;有些人可能会取得 更好的结果,而另一些人可能会得到 略差的结果。为了确保透明度和可重复性,我们还将提供我们在实验中使用的 确切数据集划分,它将以 zip 文件 的形式提供参考。
2.3 为 YOLO 重新构建数据集
经过处理后,数据集被构建并转换为 YOLO 特定的格式,如下所示:
HRSC-YOLO/
├── train/
│ ├── images/ # 训练图像
│ └── labels/ # 训练标签,以 YOLO 格式
├── val/
│ ├── images/ # 验证图像
│ └── labels/ # 验证标签,以 YOLO 格式
└── test/├── images/ # 测试图像└── labels/ # 测试标签,以 YOLO 格式
2.4 为 DarkNet 重新构建数据集
DarkNet 需要不同的结构,其中 每个图像及其对应的标签文件存储在一起。格式如下:
darknet_dataset/
├── train/
│ ├── image1.JPG
│ └── image1.txt
├── valid/
│ ├── image2.JPG
│ └── image2.txt
└── test/├── image3.JPG└── image3.txt
三、在 HRSC2016-MS 数据集上微调 YOLOv12
3.1 模型配置
- 使用 YOLOv12(Ultralytics 实现)。
- 设置 图像大小为 640×640,以实现最佳性能。
3.2 训练流程
- 设置 批量大小为 8,训练周期数为 100。
- 使用 马赛克增强,使模型能够接触到 不同尺度下的小目标。
- 自适应学习率调度 有助于防止过拟合。
def train_yolov12(epochs=100, batch_size=8):model = YOLO(yolov12_model_path)model.train(data=data_yaml, epochs=epochs, batch=batch_size, imgsz=640, device='cuda', workers=4, save=True, save_period=10)model.val()print(model)print("YOLOv12 训练在 HRSC2016-MS 上完成。")
3.3 评估指标
- 跟踪 mAP@50、mAP@75 和 mAP@[50:95]。
- 对比了在原始数据集和预处理数据集上训练后的性能,观察结果如下。
模型 - YOLOv12 | mAP@50 | mAP@75 | mAP@[50:95] |
---|---|---|---|
在原始数据集上训练 | 74.9% | 61.5% | 54.5% |
在洗牌后的数据集上训练 | 85.2% | 75.1% | 66.3% |
四、在 HRSC2016-MS 数据集上微调 YOLOv11
- 采用了与 YOLOv12 相同的训练流程。
- 对比了 YOLOv11 在原始数据集和预处理数据集上的性能。
- 使用条形图对比了 mAP 分数,观察结果如下。
模型 - YOLOv11 | mAP@50 | mAP@75 | mAP@[50:95] |
---|---|---|---|
在原始数据集上训练 | 75.3% | 61.6% | 55.0% |
在洗牌后的数据集上训练 | 86.2% | 75.8% | 67.0% |
五、在 HRSC2016-MS 上微调基于 Darknet 的 YOLOv7
DarkNet 是开发 YOLO(You Only Look Once)目标检测模型家族的原始框架。与 Ultralytics 的 YOLO 模型实现不同,基于 Darknet 的 YOLOv7 需要特定的目录结构、配置文件以及手动定义的数据集路径。本节详细介绍了如何在 HRSC2016-MS 数据集上设置、训练和评估基于 Darknet 的 YOLOv7。
我们将提供一个 Jupyter 笔记本,可以在 VS Code 编辑器 中轻松执行。该笔记本将指导您完成 数据准备、预处理以及生成 DarkNet 所需的配置和文本文件,以启动训练过程。然而,需要注意的是,对于实际训练部分,不建议在代码编辑器中启动 DarkNet 训练。这是由于训练过程中产生的 大量输出 可能会导致 代码编辑器窗口崩溃。
因此,仅对于训练和评估部分,建议在终端中执行训练和评估命令,而不是在任何代码编辑器中执行它们。笔记本中已提供了适当的操作说明。在实际应用中,建议仔细遵循这些说明。
5.1 设置 DarkNet
-
克隆 DarkNet 仓库
克隆 DarkNet 仓库到本地目录。git clone https://github.com/AlexeyAB/darknet.git
-
编译 DarkNet
使用 CUDA 和 OpenCV 支持编译 DarkNet。可以参考我们关于 YOLOv4 和 Darknet 用于坑洼检测 的文章中的逐步过程,以构建 Darknet。文章链接如下:构建 Darknet 参考文章
5.2 下载基于 YOLOv7 的 DarkNet 预训练权重
为了在 HRSC2016-MS 上微调基于 Darknet 的 YOLOv7,我们使用预训练权重作为起点。使用以下命令下载 YOLOv7 DarkNet 权重:
cd /path/to/darknet
wget https://github.com/AlexeyAB/darknet/releases/download/yolov4/yolov7x.conv.147
wget https://github.com/AlexeyAB/darknet/releases/download/yolov4/yolov7x.weights
将权重保存在 darknet/
目录中。实际上,从现在开始,所有命令都必须在克隆的 Darknet 目录中的 darknet
子目录中执行。
5.3 Darknet 所需的文本文件
DarkNet 需要 明确的文本文件 指定图像的路径。
- train.txt → 包含用于训练的图像的绝对路径。
- valid.txt → 包含用于验证的图像的绝对路径。
- test.txt → 包含用于评估的图像的绝对路径。
为了生成这些文本文件,我们将编写一个 Python 脚本,然后执行该脚本。脚本如下:
# prepare_darknet_image_txt_paths.py
import os# 设置数据集路径
DATA_ROOT_TRAIN = '/path/to/train/directory'
DATA_ROOT_VALID = '/path/to/valid/directory'
DATA_ROOT_TEST = '/path/to/test/directory'# 获取图像文件名
train_image_files = [f for f in os.listdir(DATA_ROOT_TRAIN) if f.endswith('.jpg') or f.endswith('.png')]
valid_image_files = [f for f in os.listdir(DATA_ROOT_VALID) if f.endswith('.jpg') or f.endswith('.png')]
test_image_files = [f for f in os.listdir(DATA_ROOT_TEST) if f.endswith('.jpg') or f.endswith('.png')]# 写入 train.txt
with open('train.txt', 'w') as f:for file_name in train_image_files:f.write(os.path.join(DATA_ROOT_TRAIN, file_name) + '\n')# 写入 valid.txt
with open('valid.txt', 'w') as f:for file_name in valid_image_files:f.write(os.path.join(DATA_ROOT_VALID, file_name) + '\n')# 写入 test.txt
with open('test.txt', 'w') as f:for file_name in test_image_files:f.write(os.path.join(DATA_ROOT_TEST, file_name) + '\n')
在 darknet
目录中运行以下命令以执行脚本:
python prepare_darknet_image_txt_paths.py
5.4 DarkNet 配置文件
DarkNet 还需要 三个自定义配置文件:
- obj.names(ship.names)→ 类别名称文件
- obj.data(hrsc2016-ms-yolov7.data)→ 训练数据文件
- 自定义.cfg文件(yolov7-darknet-hrsc2016-ms.cfg)→ 用于定义特定于该数据集的基于 YOLOv7 的 Darknet 架构
5.4.1 准备自定义基于 Darknet 的 YOLOv7 类别名称文件
echo "ship" > build/darknet/x64/data/ship.names
5.4.2 准备自定义基于 Darknet 的 YOLOv7 训练数据文件
在开始训练过程之前,确保已经创建了一个名为 backup_2000
的目录。
echo "classes = 1" > build/darknet/x64/data/hrsc2016-ms-yolov7.data
echo "train = train.txt" >> build/darknet/x64/data/hrsc2016-ms-yolov7.data
echo "valid = valid.txt" >> build/darknet/x64/data/hrsc2016-ms-yolov7.data
echo "names = build/darknet/x64/data/ship.names" >> build/darknet/x64/data/hrsc2016-ms-yolov7.data
echo "backup = backup_2000" >> build/darknet/x64/data/hrsc2016-ms-yolov7.data
5.4.3 准备自定义基于 Darknet 的 YOLOv7 测试数据文件
在开始推理和测试过程之前,建议创建一个名为 backup_test_2000
的目录。
echo "classes = 1" > build/darknet/x64/data/ship_test.data
echo "train = train.txt" >> build/darknet/x64/data/ship_test.data
echo "valid = test.txt" >> build/darknet/x64/data/ship_test.data
echo "names = build/darknet/x64/data/ship.names" >> build/darknet/x64/data/ship_test.data
echo "backup = backup_test_2000" >> build/darknet/x64/data/ship_test.data
5.4.4 准备自定义基于 Darknet 的 YOLOv7 配置文件
我们将创建一个自定义配置文件,其中大部分内容与默认的 yolov7x.cfg
相同(因为我们正在比较大型 YOLO 模型),但需要根据我们的数据集修改一些参数。
# yolov7-darknet-hrsc2016-ms.cfg
[net]
# Testing
# batch=64
# subdivisions=64
# Training
batch=64
subdivisions=64
width=640
height=640
channels=3
momentum=0.9
decay=0.0005
angle=0
saturation = 1.5
exposure = 1.5
hue=.1
learning_rate=0.00261
burn_in=1000
max_batches = 2000
policy=steps
steps=1600,1800
scales=.1,.1# 其他层的配置保持不变,仅修改以下部分
[convolutional]
size=1
stride=1
pad=1
filters=18
activation=logistic[yolo]
mask = 6,7,8
anchors = 12,16, 19,36, 40,28, 36,75, 76,55, 72,146, 142,110, 192,243, 459,401
classes=1
5.5 训练基于 Darknet 的 YOLOv7
提醒:仅在终端中运行以下命令。
以下终端命令启动基于 Darknet 的 YOLOv7 模型的训练过程,并在训练结束后计算 mAP@50 分数。
./darknet detector train build/darknet/x64/data/hrsc2016-ms-yolov7.data cfg/yolov7-darknet-hrsc2016-ms.cfg yolov7x.conv.147 -map -dont_show
5.6 评估指标:基于 YOLOv7 的 Darknet
我们将使用以下终端命令在验证集上获得 mAP 分数,IoU 阈值为 0.75。我们只需在命令中更改 iou_thresh 值,即可根据需要设置 IoU 阈值。
./darknet detector map build/darknet/x64/data/ship_test.data cfg/yolov7-darknet-hrsc2016-ms.cfg backup_2000/yolov7-darknet-hrsc2016-ms_final.weights -iou_thresh 0.75
如果需要在测试集上计算 mAP 分数,我们只需修改 ship_test.data
配置文件。只需将 “valid” 参数值从 “valid.txt” 更改为 “test.txt”。
使用以下命令生成训练模型对提供的图像的检测结果。注意在命令中指定包含要检测图像的目录路径。输出将包含模型为传递的图像预测的边界框的位置。
./darknet detector test build/darknet/x64/data/hrsc2016-ms-yolov7.data cfg/yolov7-darknet-hrsc2016-ms.cfg backup_2000/yolov7-darknet-hrsc2016-ms_final.weights -dont_show -ext_output < test.txt > results_darknet_test.txt
5.7 可视化检测结果
为了可视化检测结果,我们需要修改 Darknet 内部的 Python 脚本 darknet_images.py
。打开该文件并添加以下两行代码,以便将标注后的图像保存到目录中。
output_image_path = os.path.join("yolov7_darknet_test_results", image_name.split(os.path.sep)[-1])
cv2.imwrite(output_image_path, image)
修改后的 darknet_images.py
文件如下:
# 修改后的 darknet_images.py
import cv2
import os# 添加这两行代码
output_image_path = os.path.join("yolov7_darknet_test_results", image_name.split(os.path.sep)[-1])
cv2.imwrite(output_image_path, image)
运行以下命令以执行脚本并保存检测结果:
python darknet_images.py --data_file build/darknet/x64/data/ship_test.data --input /path/to/test/images --config_file cfg/yolov7-darknet-hrsc2016-ms.cfg --weights backup_2000/yolov7-darknet-hrsc2016-ms_final.weights --thresh 0.25 --ext_output --save_labels --dont_show
现在,我们已经完成了所有实验。是时候比较微调模型的性能了。
六、比较 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7 的 mAP 分数
预处理后的数据集上的 mAP 分数明显高于原始数据集,如本文前面所示。基于评估指标 mAP@50、mAP@75 和 mAP@[50:95],在预处理后的数据集上的最终比较如下。
在验证集上
模型 | mAP@50 | mAP@75 | mAP@[50:95] |
---|---|---|---|
YOLOv7 (DarkNet) | 85.6% | 71.9% | 61.56% |
YOLOv11 | 83.7% | 72.2% | 63.8% |
YOLOv12 | 83% | 71.8% | 63.5% |
在测试集上
模型 | mAP@50 | mAP@75 | mAP@[50:95] |
---|---|---|---|
YOLOv7 (DarkNet) | 88.2% | 75.6% | 65.5% |
YOLOv11 | 86.2% | 75.8% | 67.0% |
YOLOv12 | 85.2% | 75.1% | 66.3% |
七、训练和损失图的可视化
YOLOv12
YOLOv11
基于 Darknet 的 YOLOv7
八、在一些图像上的推理结果
所有三个模型在给定的真实值图像上表现出类似的性能。Darknet 在识别被其他模型遗漏或检测不准确的小目标方面表现出更高的准确性。
所有评估的模型在检测密集和小目标方面表现出色。然而,YOLOv11 出现了重叠检测,这可能表明存在冗余或检测精度较低。总体而言,这些模型在检测任务中表现出不同程度的重叠和精度。
YOLOv12 是唯一能够在真实值图像中检测到标记目标的模型。总体而言,所有模型在目标检测方面表现出类似的性能。然而,YOLOv11 继续产生重叠检测,这表明可能存在冗余或检测精度降低。
该图像是一个理想的测试案例,特别是在密集和小目标场景中评估目标检测模型。初步比较可能表明 YOLOv12 基于检测数量优于其他模型。然而,详细分析揭示了许多 YOLOv12 检测是重叠的、冗余的或误检。基于 Darknet 的 YOLOv7 尽管检测到的目标较少,但显示出更高的准确性,误检和重叠最少。一个健全的评估必须考虑精度、召回率和误检率,而不仅仅是依赖于检测数量。
关键要点
- mAP@50 分数表明基于 Darknet 的 YOLOv7 在基本目标定位(检测舰船)方面表现出色,但在更严格的定位约束下可能表现不佳。
- YOLOv11 在高 IoU 阈值(mAP@75 和 mAP@[50:95])下表现优于其他模型。这意味着 YOLOv11 在目标定位和更精确的边界框方面优于其他模型。
- YOLOv12 在 mAP 分数评估指标中从未超过其他模型,但它在实际推理性能方面表现出色,这可能是由于它在密集环境中对舰船特征提取能力更强。
- HRSC2016-MS 数据集从预处理(主要是洗牌)中受益。洗牌和重新构建数据集提高了泛化能力,使所有模型都能更有效地检测到小舰船。
- 模型性能取决于数据集。尽管 YOLOv12 是最新的模型,但它在任何 mAP 分数评估指标中都没有占据主导地位。基于 Darknet 的 YOLOv7 在 mAP@50 方面表现出色,表明旧架构在特定数据集中仍然具有竞争力。
结论
本研究对在 HRSC2016-MS 数据集上微调 YOLOv12、YOLOv11 和基于 Darknet 的 YOLOv7 进行了深入分析,重点关注提高航拍舰船图像中小目标的检测能力。原始数据集的洗牌和重新构建在提高模型性能方面发挥了关键作用,因为初始的训练 - 测试划分存在偏差,影响了泛化能力。
YOLOv11 在更严格的 IoU 阈值(mAP@75 和 mAP@[50:95])下表现优于所有模型,使其成为精确边界框预测的最佳选择。尽管 YOLOv12 在 mAP 分数评估指标中没有占据主导地位,但它在实际推理性能方面表现出色,表明定性检测有效性超出了数值 mAP 值的范围。
原文地址:https://learnopencv.com/fine-tuning-yolov12/#circle=on