Yolov8小目标检测-添加模块改进-实验记录

news2024/11/26 17:35:11

简介,本文通过结合了一些先进的算法改进了yolov8小目标检测能力,以下是一些记录。

数据集:足球比赛数据集,里面只有两个类别足球和人。

兄弟姐妹们,如果本文对你有用,点赞收藏一下呗,☺️☺️☺️☺️

import os
from ultralytics import YOLO

model = YOLO('yolov8n.yaml')  # 后缀n就调用n的模型

# Train the model
model.train(data='./ultralytics/datasets/soccer.yaml', epochs=100, imgsz=640)

# val
metrics = model.val()  # no arguments needed, dataset and settings remembered
metrics.box.map    # map50-95
metrics.box.map50  # map50
metrics.box.map75  # map75
metrics.box.maps  


# # predict
# model.predict('datasets/soccernet/tracking/images/test/SNMOT-132/img1', save=True, imgsz=640, conf=0.5)
# results = model('datasets/soccernet/tracking/images/train/SNMOT-061/img1/')
# for result in results:
#     boxes = result.data  # Boxes object for bbox outputs
#     masks = result.masks  # Masks object for segmentation masks outputs
#     keypoints = result.keypoints  # Keypoints object for pose outputs
#     probs = result.probs  # Class probabilities for classification outputs
    
# export
# model.export(format='onnx')

以下是我实验的一些记录:持续更新中~

实验1. baseline: 使用yolov8n.yaml训练

map: 0.371
person: 0.648
soccer: 0.095

实验2. 使用yolov8n-p2.yaml训练,四个头预测目标,大尺寸的特征图P2也预测目标。足球提升4%

复杂度:277 layers, 2926824 parameters, 2926808 gradients, 12.3 GFLOPs
map: 0.387
person: 0.639
soccer: 0.135

实验3. 使用yolov8-p2-exp1-spdconv.yaml训练(注意调用其中的n模型需要这样调用model = YOLO('yolov8n-p2-exp1-spdconv.yaml')),在yolov8后加n即可。把conv修改成spdconv,减少步长和池化对小目标检测的影响,原论文链接 。在实验2的基础上提升了1%

添加新模块的步骤如下:
- 1. 在ultralytics/nn/modules/conv.py下添加,space_to_depth。
在这里插入图片描述
在这里插入图片描述
- 2. 在ultralytics/nn/modules/init.py添加模块在这里插入图片描述
- 3. 在ultralytics/nn/tasks.py添加模块在这里插入图片描述
- 4. 在ultralytics/nn/tasks.py,添加通道数判断,用于后续提取指定序号的模块的输出。在这里插入图片描述
最后新建配置文件yolov8-p2-exp1-spdconv.yaml,放置ultralytics/models/v8/yolov8-p2-exp1-spdconv.yaml,附上我的配置

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P2-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=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]
  s: [0.33, 0.50, 1024]
  m: [0.67, 0.75, 768]
  l: [1.00, 1.00, 512]
  x: [1.00, 1.25, 512]

# YOLOv8.0 backbone, 修改space_to_depth后面模块的输入通道数4倍
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 1]]  # 0-P1/2
  - [-1,1,space_to_depth,[1]]
  - [-1, 1, Conv, [128, 3, 1]]  # 128*4,2-P2/4
  - [-1,1,space_to_depth,[1]]
  - [-1, 3, C2f, [128, True]] # 128*4
  - [-1, 1, Conv, [256, 3, 1]]  # 5-P3/8
  - [-1,1,space_to_depth,[1]]
  - [-1, 6, C2f, [256, True]] # 256*4
  - [-1, 1, Conv, [512, 3, 1]]  # 8-P4/16
  - [-1,1,space_to_depth,[1]]
  - [-1, 6, C2f, [512, True]] # 512*4
  - [-1, 1, Conv, [1024, 3, 1]]  # 11-P5/32
  - [-1,1,space_to_depth,[1]]
  - [-1, 3, C2f, [1024, True]] # 1024*4
  - [-1, 1, SPPF, [1024, 5]]  # 14

# YOLOv8.0-p2 head
head:
  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 10], 1, Concat, [1]]  # cat backbone P4
  - [-1, 3, C2f, [512]]  # 17

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 7], 1, Concat, [1]]  # cat backbone P3
  - [-1, 3, C2f, [256]]  # 20 (P3/8-small)

  - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
  - [[-1, 4], 1, Concat, [1]]  # cat backbone P2
  - [-1, 3, C2f, [128]]  # 23 (P2/4-xsmall)

  - [-1, 1, Conv, [128, 3, 1]]
  - [-1,1,space_to_depth,[1]]
  - [[-1, 20], 1, Concat, [1]]  # cat head P3
  - [-1, 3, C2f, [256]]  # 27 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 1]]
  - [-1,1,space_to_depth,[1]]
  - [[-1, 17], 1, Concat, [1]]  # cat head P4
  - [-1, 3, C2f, [512]]  # 31 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 1]]
  - [-1,1,space_to_depth,[1]]
  - [[-1, 14], 1, Concat, [1]]  # cat head P5
  - [-1, 3, C2f, [1024]]  # 35 (P5/32-large)

  - [[23, 27, 31, 35], 1, Detect, [nc]]  # Detect(P2, P3, P4, P5)

复杂度:285 layers, 3330792 parameters, 3330776 gradients, 20.2 GFLOPs
map: 0.398
person: 0.652
soccer: 0.144

实验4. 使用CoTAttention替换bottleneck里面的conv。配置文件yolov8-p2-exp2-cotattention.yaml。

  • 添加模块步骤与上述相似,这里就贴几张图。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
复杂度:349 layers, 2436264 parameters, 2436248 gradients, 10.9 GFLOPs
map: 0.374
person: 0.63
soccer: 0.118

实验5. 去除深层的网络,配置见图。在这里插入图片描述

复杂度:218 layers, 1094118 parameters, 1094102 gradients, 10.8 GFLOPs
map: 0.374
person: 0.631
soccer: 0.117

实验6. 实验5的基础上,yolov8n改成v8s,相当于加深了通道数。加深了网络提升了精度,意料之中,但是gflops增加的太多了。

复杂度:218 layers, 3734518 parameters, 3734502 gradients, 31.3 GFLOPs
map: 0.399
person: 0.648
soccer: 0.15

实验7. 因为小目标一般都是浅层特征图预测的,所以提升backbone的浅层的block数目,减少了深层次block的数目。

在这里插入图片描述

复杂度:298 layers, 2957800 parameters, 2957784 gradients, 13.1 GFLOPs
map: 0.389
person: 0.642
soccer: 0.136

实验8. 参考tinydet,主要思想卷积的时候stride=2会导致特征mismatch,因此卷积后加一个avg pooling来避免这种情况。代码如图:

在这里插入图片描述

复杂度:278 layers, 2927544 parameters, 2927528 gradients, 16.5 GFLOPs
map: 0.396
person: 0.653
soccer: 0.139

实验9. 待定~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029115.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云可观测性:提升云环境中应用程序可靠性

随着云计算的兴起和广泛应用,越来越多的企业将其应用程序和服务迁移到云环境中。在这个高度动态的环境中,确保应用程序的可靠性和可管理性成为了一个迫切的需求。云可观测性作为一种解决方案,针对这一需求提供了有效的方法和工具。本文将介绍…

单臂路由的配置

目录 单臂路由 单臂路由是什么 为什么要用单臂路由 单臂路由的注意事项 单臂路由的原理 单臂路由的优缺点 单臂路由的实验 ensp Cisco H3C 单臂路由是什么 单臂路由是一种特殊的路由器,它的设计目的是实现在一个路由器的一个接口上通过配置子接口&#xf…

森林防火可视化智能监管与风险预警系统解决方案

一、方案背景 森林火灾是世界八大自然灾害之一,具有发生面广、突发性强、破坏性大、危险性高、处置扑救特别困难等特点,严重危及人民生命财产和森林资源安全,甚至引发生态灾难。有效预防和及时控制森林火灾是保护国家生态建设成果、推进生态…

【实战案例】技术转项目经理容易踩的坑,我都踩了

“带团队容易,带好团队难。” 这是身边一位项目经理近期在团队管理方面的深刻感悟。目前,他手上的一个项目被迫暂停了,项目团队也散了。下面给大家简要分享下这个项目案例。 【案例分享】 小李负责的是一个二次开发的项目,所涉及…

新型智慧公厕“1+3+N”架构,平台、系统、应用的创新

近年来,随着人民生活水平的提高,人们对公共设施的要求也越来越高。其中,如厕问题一直是人们关注的焦点,但传统的公厕设施已经不能满足人们对干净、舒适、安全的需求,这促使了新型智慧公厕的诞生与应用,以如…

Puppeter与Electron的结合,使用Electron创建可视化界面

前言 上一篇文章:Puppeteer基础入门、常见应用、利用谷歌插件编写Puppeteer脚本,简单介绍了Puppeteer的基本使用,以及如何编写一个脚本。 但是呢脚本的运行需要在node环境里,开发人员可能没什么问题。但是如果你写的这个脚本要给…

Aspose转pdf乱码问题

一、问题描述 ​ 在centos服务器使用aspose.word转换word文件为pdf的时候显示中文乱码(如图),但是在win服务器上使用可以正常转换 二、问题原因 由于linux服务器缺少对应的字库导致文件转换出现乱码的 三、解决方式 1.将window中字体(c:\windows\fonts)放到linux…

软件过程能力成熟度评估——CSMM认证

CSMM认证又称为“软件过程能力过程成熟度评估”,由中国电子技术标准化研究院联合五十余家产学研用相关方结合我国实际,自主制定的团体标准,于2021年6月8号发布,目的是为了帮助国内软件企业对自身的软件能力进行评估和判断&#xf…

Redis实战(10)-一条命令在Redis是如何执行的?

Redis Server一旦和某客户端建立连接,就会在事件驱动框架中注册可读事件,对应客户端的命令请求。 整个命令处理过程可分阶段: 命令解析,processInputBufferAndReplicate命令执行,processCommand结果返回,…

APEX:开启Android系统新篇章的应用扁平化技术

APEX:开启Android系统新篇章的应用扁平化技术 Android Pony Express (APEX) 是在 Android Q 中引入的一种容器格式,用于安装流程中较低级系统模块的更新。该格式方便了系统组件的更新,这些组件不适合标准的 Android 应用程序模型。一些示例组…

计算机系大学生,可以通过Java做什么副业?这篇文章给你答案!

文章目录 前言发现副业机会提高效率面向人群 如何开启自己的副业价格优势需要课设的人多吗怎么宣传生成器的使用 生成器介绍安装功能介绍文档查询功能生成的JavaWeb系统示例生成的C#生成的Javaswing生成的VueER图 、UML、功能图..生成的C、C系统 前言 计算机系科班出身的学生&a…

轻量服务器2核与1核的区别

​ 1.核心数量 轻量服务器2核与1核最明显的区别在于核心数量。1核服务器只有一个处理器核心,而2核服务器有两个处理器核心。这使得2核服务器在处理数据时能够同时执行更多的任务。 2.并行处理能力 由于只有1个核心,1核服务器不具备并行处理任务的能力。而…

天津专升本文化课考试计算机应用基础考试大纲(2023年9月修订)

天津市高等院校“高职升本科”招生统一考试计算机应用基础考试大纲(2023年9月修订) 一、考试性质 天津市高等院校“高职升本科”招生统一考试是由合格的高职高专毕业生参加的选拔性 考试。高等院校根据考生的成绩,按照已确定的招生计划&am…

低功耗蓝牙物联网:未来连接的无限可能

物联网是连接各种设备和传感器的网络,其目的是实现信息的交换和共享,提高效率并优化生活。在这个领域,低功耗蓝牙(BLE)正在发挥着越来越重要的作用。 低功耗蓝牙是一种无线通信技术,它的主要特点是低功耗和…

HarmonyOS之 组件的使用

一 容器 1.1 容器分类 Column表示沿垂直方向布局的容器。Row表示沿水平方向布局的容器。 1.2 主轴和交叉轴 主轴:在Column容器中的子组件是按照从上到下的垂直方向布局的,其主轴的方向是垂直方向;在Row容器中的组件是按照从左到右的水平方向…

TiDB 7.1.0 LTS 特性解读丨关于资源管控 (Resource Control) 应该知道的 6 件事

TiDB 7.1.0 LTS 在前段时间发布,相信很多同学都已经抢先使用了起来,甚至都已然经过一系列验证推向了生产环境。面对 TiDB 7.1 若干重要特性,新 GA 的资源管控 (Resource Control) 是必须要充分理解、测试的一个重量级特性。对于常年奋斗在一线…

编译vtk源码

vtk和opengl关系 VTK(Visualization Toolkit)和OpenGL(Open Graphics Library)都是用于图形可视化和渲染的重要工具,但它们在图形编程中的角色和关系略有不同。 OpenGL: OpenGL是一种开放的图形库和API&a…

uniapp自定义播放器

问题描述:我是真无语啊,就是有一个目录切换的地方,然后切换音频,结果你猜怎么着,嘿,音频他不播放了。也就是下面这个方法都不进去了打印的时候,音频播放都播放不了了,我尝试了销毁在…

前端提交规范 ESLint + Prettier + husky + lint-staged

如何统一代码风格,规范提交呢? 推荐使用前端规范全家桶 ESLint Prettier husky lint-staged。 eslint (github.com/eslint/esli…)JavaScript 代码检测工具,检测并提示错误或警告信息prettier (github.com/prettier/pr…) 代码自动化格式…

【面试题】Js数组去重都有哪些方法?

前端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 表妹一键制作自己的五星红旗国庆头像,超好看 1. indexOf 定义: indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置…