芜湖大赛-算法赛道-基于视觉的反无人机检测与预警(出题方:大连理工大学)
评测标准
针对参赛队伍提交的算法模型,组委会将从准确性、效率、资源消耗等维度进行综合评估,常用量化指标包括:
-
检测性能指标
(1)Precision / Recall(精确率 / 召回率):用于评估误报与漏报情况;
(2)F1-score:综合考察模型平衡性。
-
跟踪与行为识别指标(复赛/决赛)
(1) MOTA、IDF1:评估多目标跟踪准确性;
(2) 行为识别准确率 / 预警正确率:评估异常行为识别与预警机制的有效性;
(3) 预警延迟:衡量系统响应的实时性。
-
模型运行效率与复杂度
(1) 推理速度(FPS):模型在指定设备上的帧处理速度;
(2) 模型大小(MB):模型存储所需空间;
(3) 参数量(Params)与FLOPs:衡量计算资源消耗和推理复杂度;
yolov11-n-C3k2-WL

import sys
import os
#sys.path.append('.') # 将当前目录添加到系统路径
from ultralytics.models.yolo.model import YOLO
def train_yolo12():
# 1. 加载模型配置文件(yolo12.yaml)
model = YOLO("/mnt/Virgil/YOLO/yolo11-SOD/ultralytics/cfg/models/11/yolo11-C3k2-WT.yaml") # 从当前目录加载模型结构
# model = YOLO("C3k2-fix.yaml", task='detect') # 从当前目录加载模型结构
# 2. 手动加载预训练权重(yolo12n.pt)
model.load("yolo11n.pt") # 确保权重文件在当前目录或指定路径
# 3. 配置训练参数
results = model.train(
# data="ppq_dataset.yaml", # 数据集配置文件
data="/mnt/Virgil/YOLO/drone_dataset/drone_dataset.yaml", # 数据集配置文件
imgsz=640, # 输入图像尺寸
epochs=140, # 训练轮次
batch=32, # 批次大小(根据GPU内存调整)
workers=0, # 数据加载线程数(设为0避免多线程问题)
pretrained=False, # 已手动加载权重,此处设为False
device='0', # 指定使用GPU 0(空字符串为自动选择)
seed=0, # 随机种子,确保结果可复现
optimizer='SGD', # 优化器选择
amp=False, # 关闭混合精度训练
project='runs/C3k2-WT', # 训练结果保存项目名
resume=False, # 不恢复训练
name='C3k2-WT', # 训练任务名称
# warmup_epochs=2, # 前2个epoch使用较小学习率预热
# patience=20 # 早停机制,连续20个epoch无提升则停止
)
return results
if __name__ == "__main__":
train_yolo12()


YOLO(You Only Look Once)是一种目标检测算法,在训练完成后会输出一系列文件,这些文件用于评估模型性能、观察训练过程中的状态等,以下是对图中常见输出文件的解释:
-
weights文件夹 通常存放训练好的模型权重文件,可能包含不同训练阶段(比如最后一轮训练得到的权重,以及中间表现最好的权重等 )的.pt文件。在后续使用模型进行推理、预测目标时,就会加载这个文件夹中的权重文件。 -
args.yaml记录了训练时使用的所有参数配置,包括数据集路径、模型架构、训练轮数(epochs)、批量大小(batch size)、学习率、数据增强方式等。它有助于复现训练过程,或者在后续分析时了解训练的具体设置。 -
混淆矩阵相关文件 -
confusion_matrix.png和confusion_matrix_n...:混淆矩阵是评估分类和目标检测模型性能的重要工具。它展示了模型预测结果与真实标签之间的关系,每一行代表真实类别,每一列代表预测类别。通过混淆矩阵,可以直观地看出模型在不同类别上的分类准确性,以及错分类的情况。
-
性能曲线相关文件
F1_curve.png:F1值是精确率(Precision)和召回率(Recall)的调和平均值,F1曲线展示了在不同阈值下模型的F1值变化情况,帮助找到最佳的预测阈值。P_curve.png:精确率曲线,显示了模型预测为正类的样本中,真正正类的比例随某个条件(如置信度阈值)变化的情况。PR_curve.png:精确率 - 召回率曲线,以召回率为横轴,精确率为纵轴,直观展示模型在不同召回率水平下的精确率表现,用于评估模型的性能优劣。R_curve.png:召回率曲线,反映了模型能够正确检测出的正样本占所有正样本的比例随某个条件变化的趋势。
-
标签相关文件
labels_correlogram.jpg:可能展示了标签之间的相关性,帮助了解数据集中不同目标类别之间的出现关系,比如某些类别是否经常同时出现等。labels.jpg:可能是数据集中标签分布的可视化文件,比如不同类别目标在数据集中出现的数量统计图表,有助于判断数据集是否存在类别不均衡问题。
-
results.csv和results.pngresults.csv:以表格形式记录了训练过程中的各种指标数据,比如每个训练轮次(epoch)的损失值(包括目标检测损失、分类损失等)、验证集上的精确率、召回率、F1值等,方便进行详细的数据对比和分析。results.png:通常是对results.csv中数据的可视化,以折线图等形式展示训练和验证过程中关键指标的变化趋势,便于直观地观察模型的训练效果和是否出现过拟合等情况。
-
训练和验证批次相关图片文件
train_batch*.jpg:展示了训练过程中部分批次(batch)的图像及其对应的真实标签,通过这些图片可以观察模型在训练时输入数据的样子,以及标注情况是否正确。
val_batch*_labels.jpg和val_batch*_pred.jpg:分别展示了验证集上部分批次图像的真实标签和模型预测结果。对比这两种图片,可以直观地评估模型的预测效果,比如查看模型是否正确检测出目标、定位是否准确等。
yolov11-n-C3k2-DBB
训练集用了大概1万7千张

def train_yolo12():
# 1. 加载模型配置文件(yolo12.yaml)
model = YOLO("/mnt/Virgil/YOLO/yolo11-SOD/ultralytics/cfg/models/11/yolo11-C3k2-DBB.yaml") # 从当前目录加载模型结构
# 2. 手动加载预训练权重(yolo12n.pt)
model.load("yolo11l.pt") # 确保权重文件在当前目录或指定路径
# 3. 配置训练参数
results = model.train(
data="/mnt/Virgil/YOLO/drone_dataset/drone_dataset.yaml", # 数据集配置文件
imgsz=640, # 输入图像尺寸
epochs=160, # 训练轮次
batch=12, # 批次大小(根据GPU内存调整)
workers=0, # 数据加载线程数(设为0避免多线程问题)
pretrained=False, # 已手动加载权重,此处设为False
device='0', # 指定使用GPU 0(空字符串为自动选择)
seed=0, # 随机种子,确保结果可复现
optimizer='SGD', # 优化器选择
amp=False, # 关闭混合精度训练
project='runs/C3k2-DBB', # 训练结果保存项目名
resume=False, # 不恢复训练
name='C3k2-DBB', # 训练任务名称
# warmup_epochs=2, # 前2个epoch使用较小学习率预热
patience=20 # 早停机制,连续20个epoch无提升则停止
)
return results

在testA2000张跑的结果提交得到的分数

可视化了一下结果,发现非常准,我看都很准但置信度分数score都是0.7左右。
尝试把csv文件中的score列全部调整为1,看看线上测评分数有没有上升。但反而更低了。

不信邪,把昨天提交的0.8多分数的DBB_result.csv文件重新提交一份,看看分数更低。奇怪了

这么小的目标都能检测出来,但分数还这么低,why?



yolov11-l
同样的数据集训练,但是由于将模型scale从n换成了l,参数量变大很多,之前的配置显存不够用了,就改变了一些超参数。
def train_yolo12():
# 1. 加载模型配置文件(yolo12.yaml)
model = YOLO("/mnt/Virgil/YOLO/yolo11-SOD/ultralytics/cfg/models/11/yolo11l.yaml") # 从当前目录加载模型结构
# 2. 手动加载预训练权重(yolo12n.pt)
model.load("yolo11l.pt") # 确保权重文件在当前目录或指定路径
# 3. 配置训练参数
results = model.train(
data="/mnt/Virgil/YOLO/drone_dataset/drone_dataset.yaml", # 数据集配置文件
# imgsz=1280, # 输入图像尺寸
imgsz=640, # 输入图像尺寸
epochs=300, # 训练轮次
batch=0.8, # 批次大小(根据GPU内存调整)
workers=0, # 数据加载线程数(设为0避免多线程问题)
pretrained=False, # 已手动加载权重,此处设为False
device='0', # 指定使用GPU 0(空字符串为自动选择)
seed=0, # 随机种子,确保结果可复现
optimizer='SGD', # 优化器选择
amp=True, # 混合精度训练
project='runs/yolo11l_drone', # 训练结果保存项目名
resume=False, # 不恢复训练
name='yolo11l_drone', # 训练任务名称
warmup_epochs=2, # 前2个epoch使用较小学习率预热
patience=15, # 早停机制,连续epoch无提升则停止
# 数据增强
augment=True, # 启用默认增强组合
mosaic=1.0, # 马赛克增强强度(0-1)
mixup=0.2, # 混合增强概率
)
return results



yolov11-l-C3k2-DBB

yolov8l-p2-1280

import sys
import os
#sys.path.append('.') # 将当前目录添加到系统路径
from ultralytics.models.yolo.model import YOLO
def train_yolo12():
# 1. 加载模型配置文件
model = YOLO("/mnt/Virgil/YOLO/yolov8/ultralytics/cfg/models/v8/yolov8-p2.yaml") # 从当前目录加载模型结构
# 2. 手动加载预训练权重
model.load("yolov8l.pt") # 确保权重文件在当前目录或指定路径
# 3. 配置训练参数
results = model.train(
data="/mnt/Virgil/YOLO/drone_dataset/drone_dataset.yaml", # 数据集配置文件
imgsz=1280, # 输入图像尺寸
# imgsz=640, # 输入图像尺寸
epochs=210, # 训练轮次
batch=0.8, # 批次大小(根据GPU内存调整)
workers=0, # 数据加载线程数(设为0避免多线程问题)
pretrained=False, # 已手动加载权重,此处设为False
device='0', # 指定使用GPU 0(空字符串为自动选择)
seed=0, # 随机种子,确保结果可复现
optimizer='SGD', # 优化器选择
amp=True, # 混合精度训练
project='runs/v8l-p2-1280', # 训练结果保存项目名
resume=False, # 恢复训练
name='v8l-p2-1280', # 训练任务名称
warmup_epochs=2, # 前2个epoch使用较小学习率预热
patience=20, # 早停机制,连续epoch无提升则停止
# 数据增强
augment=True, # 启用默认增强组合
mosaic=1.0, # 马赛克增强强度(0-1)
mixup=0.2, # 混合增强概率
)
return results
if __name__ == "__main__":
train_yolo12()

训练了10h左右,25epoch,分辨率换成1280后,速度明显满了很多,大概满了有五倍。


提交结果如下:

第二天续训。以best为预训练权重,继续训练,数据集把验证集换成了testA补的1000张

import sys
import os
# 获取ultralytics目录的绝对路径
ultralytics_dir = os.path.abspath("/mnt/Virgil/YOLO/yolov8/ultralytics")
# 将ultralytics目录添加到Python搜索路径
if ultralytics_dir not in sys.path:
sys.path.insert(0, ultralytics_dir)
print(f"已添加路径: {ultralytics_dir}")
else:
print(f"路径已存在: {ultralytics_dir}")
# 验证路径是否生效
print("当前Python搜索路径:")
for path in sys.path:
print(path)
from ultralytics.models.yolo.model import YOLO
def train_yolo():
# 1. 加载模型配置文件
model = YOLO("/mnt/Virgil/YOLO/yolov8/ultralytics/cfg/models/v8/yolov8-p2l.yaml")
# 2. 手动加载预训练权重(确保路径正确)
# 修改:使用绝对路径指定YOLOv8的预训练权重
# pretrained_weights = "/mnt/Virgil/YOLO/yolov8/yolov8l.pt" # 需要替换为实际权重文件路径
pretrained_weights = "/mnt/Virgil/YOLO/yolov8/runs/v8l-p2-1280/v8l-p2-1280/weights/best.pt" # 指定上次训练的权重
if os.path.exists(pretrained_weights):
print(f"加载预训练权重: {pretrained_weights}")
model.load(pretrained_weights)
else:
print(f"警告: 预训练权重文件不存在 - {pretrained_weights}")
print("将使用随机初始化权重")
# 3. 配置训练参数
results = model.train(
data="/mnt/Virgil/YOLO/drone_dataset/drone_dataset.yaml",
imgsz=1280,
epochs=190,
batch=0.5,
workers=0, # 增加数据加载线程数提高效率
pretrained=False, # 已手动加载权重
device='0',
seed=0,
optimizer='SGD',
amp=True,
project='runs/v8l-p2-1280',
resume=False,
name='v8l-p2-1280-续',
# warmup_epochs=2,
patience=20,
augment=True,
mosaic=1.0,
mixup=0.2,
)
return results
if __name__ == "__main__":
train_yolo()
训练了8h左右,在testA-补的1000张验证集上效果没有提升。


1215

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



