YOLOV11改进1-检测头篇

embedded/2025/2/12 2:43:41/

文章目录

  • 前言
  • 一、YAML修改
  • 二、模型训练
    • 1.数据集准备
    • 2.环境准备
    • 3.训练
      • 3.1原结构训练
      • 3.2更改后的模型
  • 三.效果对比
    • 1.原始结构
    • 2.修改后的结果
    • 3.详细对比
  • 总结


前言

    目标检测领域里,小目标一直是一个难点问题,虽然我们可以用YOLO+SAHI的方式进行滑动窗口推理以提升准确率,但是他的耗时会线性增强,毕竟一张大图会被切成很多小图去推理,所以在很多场景下无法得到应用。这里,我们从探测头入手,在原有的基础上在增加一个探测头以用于检测小目标。本篇以YOLOV11作为示例。


一、YAML修改

    YOLO的原理讲解网上一大堆,这里不做说明,想了解的可以去找度娘了解下,这里直接开始修改网络结构。
原始的YAML文件(ultralytics/cfg/models/11/yolo11.yaml)如下:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'# [depth, width, max_channels]n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPss: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPsm: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPsl: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPsx: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs# YOLO11n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 2, C3k2, [256, False, 0.25]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 2, C3k2, [512, False, 0.25]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 2, C3k2, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 2, C3k2, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 2, C2PSA, [1024]] # 10# YOLO11n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 2, C3k2, [512, False]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)

建议将原始的yaml文件copy一份,然后在进行修改,不要直接在原来的yaml中修改
增加检测头不需要要额外添加代码,只需对yaml更改即可,更改后的yaml如下:

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'# [depth, width, max_channels]n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPss: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPsm: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPsl: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPsx: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs# YOLO11n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 2, C3k2, [256, False, 0.25]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 2, C3k2, [512, False, 0.25]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 2, C3k2, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 2, C3k2, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 2, C2PSA, [1024]] # 10# YOLO11n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1, Concat, [1]] # cat backbone P4- [-1, 2, C3k2, [512, False]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1,2], 1, Concat, [1]] # cat head P2- [-1, 2, C3k2, [128, False]] # 19 (P2/4-xsmall)- [-1, 1, Conv, [128, 3, 2]]- [[-1, 16], 1, Concat, [1]] # cat head P3- [-1, 2, C3k2, [256, False]] # 22 (P4/16-medium)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 2, C3k2, [512, False]] # 25 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 2, C3k2, [1024, True]] # 28 (P5/32-large)- [[19, 22, 25, 28], 1, Detect, [nc]] # Detect(P2, P3, P4, P5)

主要的修改部分在head部分,具体如下图:
在这里插入图片描述

到这里我们便完成了结构的修改,接下来我们开始训练。

二、模型训练

1.数据集准备

  数据集的话,我们用常规的VOC或者COCO格式均可。由于我的小目标数据集不方便公开,所以这里就不给链接了,我的数据分布大致如下:
在这里插入图片描述
  由上图可知,我的数据集里都为小目标,你可以想象成在一张640*480大小的图里有一个网球之类(距离较远)的。接下来,我们基于这个数据集看下改进后的效果

2.环境准备

  能进行网络修改,说明搭建一个yolo的环境对你来说不是个问题,这里也不详细展开,只挑重点说明。

  • torch:请根据你的电脑环境安装对应的pytorch版本,注意torchvision版本也要对应上,建议根据pytorch官方文档里进行安装。
  • 在你的虚拟环境里最好不要安装官方封装好的ultralytics包,否则即使你改了代码也不会生效。比如你增加了注意力机制、改了Loss等。
  • 其他依赖直接缺啥装啥即可。

3.训练

这里为了对比,我们分别拿原始结构和更改后的结构进行训练。

3.1原结构训练

yolov11的代码早已封装的很简单,所以直接运行以下代码即可开始训练。请注意,涉及到的模型路径、data.yaml路径、batchsize均需要根据自己的实际情况进行修改。为快速得到结果,这里只训练了100轮。

from ultralytics import YOLOmodel=YOLO(model="./yolo11n.pt")  #加载预训练模型
model.train(data="./mydatasets.yaml",epochs=100,imgsz=[640,640],batch=32) 

部分训练日志如下:
在这里插入图片描述

3.2更改后的模型

更改后的训练代码如下: 和3.1注意事项相同,均需将涉及到的路径改为自己的,这里的yolo11-p2.yaml就是我复制一份修改后的网路结构。

from ultralytics import YOLOmodel=YOLO(model="./ultralytics/cfg/models/11/updete/yolo11-p2.yaml").load("./yolo11n.pt")  
model.train(data="./mydatasets.yaml",epochs=100,imgsz=[640,640],batch=32) 

部分训练日志如下:
在这里插入图片描述
由红框可见,我们的修改是生效的。

三.效果对比

1.原始结构

原始结构的训练结果如下图:
在这里插入图片描述
PR结果图如下:
在这里插入图片描述

2.修改后的结果

修改后的训练结果如下所示:
在这里插入图片描述
PR结果图如下所示:
在这里插入图片描述
由图可见,涨点是非常明显的。

3.详细对比

网络结构模型大小训练时间PRmap50map50-95
原始结构5.5M0.338 h0.7290.2180.290.114
增加探测头5.8M0.501 h0.8180.3530.4190.171

  由此可知,追加探测头后,模型的性能均得到了大幅提升,同时它也引入了新的问题,那就是模型参数量变大、训练时间变长。所以,如果你的场景对模型大小有严格要求,还需在此基础上进行模型轻量化尝试,如剪枝、量化等。


总结

以上就是本篇的全部内容,如有问题,欢迎评论区交流,或+企鹅群:995760755交流;如觉得有用,欢迎三连


http://www.ppmy.cn/embedded/160138.html

相关文章

【论文分享】Ultra-AV: 一个规范化自动驾驶汽车纵向轨迹数据集

和大家分享一份最近的工作! 统一自动驾驶纵向轨迹数据集(Ultra-AV) 摘要 自动驾驶车辆在交通运输领域展现出巨大潜力,而理解其纵向驾驶行为是实现安全高效自动驾驶的关键。现有的开源AV轨迹数据集在数据精炼、可靠性和完整性方…

SpringMVC SpringMVC响应 一、数据处理及跳转

1. 结果跳转方式 ①.ModelAndView 设置ModelAndView对象 , 根据view的名称 , 和视图解析器跳到指定的页面 <bean id"templateResolver" class"org.thymeleaf.spring4.templateresolver.SpringResourceTemplateResolver"><property name"p…

Java设计模式:行为型模式→状态模式

Java 状态模式详解 1. 定义 状态模式&#xff08;State Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象在内部状态改变时改变其行为。状态模式通过将状态需要的行为封装在不同的状态类中&#xff0c;实现对象行为的动态改变。该模式的核心思想是分离不同状态…

机器学习基本概念(附代码)

一、算法与模型的关系 在机器学习领域&#xff0c;算法和模型是两个核心概念。算法是一种偏抽象的概念&#xff0c;它定义了计算机解决问题的步骤和流程。而模型则是更加具体的概念&#xff0c;通过代码实现特定算法来完成任务。数学上&#xff0c;一个简单的模型可以表示为 y…

Kafka SSL(TLS)安全协议

文章目录 Kafka SSL&#xff08;TLS&#xff09;安全协议1. Kafka SSL 的作用1.1 数据加密1.2 身份认证1.3 数据完整性1.4 防止中间人攻击1.5 确保安全的分布式环境1.6 防止拒绝服务&#xff08;DoS&#xff09;攻击 2. Kafka SSL 配置步骤&#xff08;1&#xff09;创建 SSL 证…

基于RTOS的STM32游戏机

1.游戏机的主要功能 所有游戏都来着B站JL单片机博主开源 这款游戏机具备存档与继续游戏功能&#xff0c;允许玩家在任何时候退出当前游戏并保存进度&#xff0c;以便日后随时并继续之前的冒险。不仅如此&#xff0c;游戏机还支持多任务处理&#xff0c;玩家可以在退出当前游戏…

第P7周-Pytorch实现马铃薯病害识别(VGG16复现)

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 目标 马铃薯病害数据集&#xff0c;该数据集包含表现出各种疾病的马铃薯植物的高分辨率图像&#xff0c;包括早期疫病、晚期疫病和健康叶子。它旨在帮助开发和…

实验四 XML

实验四 XML 目的&#xff1a; 1、安装和使用XML的开发环境 2、认识XML的不同类型 3、掌握XML文档的基本语法 4、了解DTD的作用 5、掌握DTD的语法 6、掌握Schema的语法 实验过程&#xff1a; 1、安装XML的编辑器&#xff0c;可以选择以下之一 a)XMLSpy b)VScode&#xff0c;Vs…