TPH-YOLOv5 | 基于Transformer的YOLOv5小目标检测器 | 四头加注意力

news2024/11/20 4:24:12

在这里插入图片描述
论文地址:https://arxiv.org/pdf/2108.11539.pdf
项目地址:https://github.com/cv516Buaa/tph-yolov5

在无人机捕获的场景中进行对象检测是最近的一项热门任务。由于无人机总是在不同的高度航行,物体尺度变化剧烈,给网络优化带来了负担。此外,高速和低空飞行会在密集的物体上带来运动模糊,这给物体识别带来了很大的挑战。为了解决上述两个问题,我们提出了 TPH-YOLOv5。在 YOLOv5 的基础上,我们增加了一个预测头来检测不同尺度的物体。然后我们用 Transformer Prediction Heads (TPH) 替换原来的预测头,以利用自注意力机制探索预测潜力。我们还集成了卷积块注意模型 (CBAM),以在具有密集对象的场景中找到注意区域。为了进一步改进我们提出的 TPH-YOLOv5,我们提供了许多有用的策略,例如数据增强、多尺度测试、多模型集成和利用额外的分类器。对数据集 VisDrone2021 的广泛实验表明,TPH-YOLOv5 具有良好的性能,在无人机捕获的场景中具有令人印象深刻的可解释性。在 DET-test-challenge 数据集上,TPH-YOLOv5 的 AP 结果为 39.18%,比之前的 SOTA 方法(DPNetV3)好 1.81%。在 VisDrone Challenge 2021 中,TPHYOLOv5 获得第 5 名,并与第 1 名模型(AP 39.43%)取得了良好的匹配结果。与基线模型(YOLOv5)相比,TPH-YOLOv5 提高了约 7%,令人鼓舞且具有竞争力

解决的问题

TPH-YOLOv5旨在解决无人机影像中存在的两个问题:

  • 因无人机在不同的高度飞行,物体的尺度变化剧烈。
  • 高速和低空飞行对排列密集的物体带来了运动模糊。

主要改进

TPH-YOLOv5是在YOLOv5的基础上做了下列改进:

  • 新增了一个检测头来检测更小尺度的物体。
  • 用transformer prediction heads(TPH)替换原来的预测头部。
  • 将CBAM集成到YOLOv5中,帮助网络在大区域覆盖的图像中找到感兴趣的区域。
  • 其它一系列小tricks。

TPH-YOLOv5网络结构如下

在这里插入图片描述

TPH模块

作者使用了一个Transformer Encoder来代替一些卷积和CSP结构,将Transformer在视觉中应用,也是目前的主流趋势,Transformer具有独特的注意力机制,效果比原先更好。
在这里插入图片描述

CBAM模块

在这里插入图片描述


我发现作者公布的代码和图中的代码不一样,所以自己按照上面的图复现了一个,除了检测头以外,完全按照原文内容,这里我们可以参考这篇文章的结构改进自己的模型。因为这些模块我们文件里已经有了,所以我们直接改配置文件就可以了。

# YOLOv5 🚀 by Ultralytics, GPL-3.0 license
# 迪菲赫尔曼 https://blog.csdn.net/weixin_43694096?spm=1000.2115.3001.5343

# Parameters
nc: 80  # number of classes
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
anchors:
  - [19,27,  44,40,  38,94]  # P3/8
  - [96,68,  86,152,  180,137]  # P4/16
  - [140,301,  303,264,  238,542]  # P5/32
  - [436,615,  739,380,  925,792]  # P6/64

# YOLOv5 backbone
backbone:
  # [from, number, module, args]
  [[-1, 1, Focus, [64, 3]],       # 0-P1/2
   [-1, 1, Conv, [128, 3, 2]],    # 1-P2/4
   [-1, 3, C3, [128]],
   [-1, 1, Conv, [256, 3, 2]],    # 3-P3/8
   [-1, 9, C3, [256]],
   [-1, 1, Conv, [512, 3, 2]],    # 5-P4/16
   [-1, 9, C3, [512]],
   [-1, 1, Conv, [768, 3, 2]],    # 7-P5/32
   [-1, 1, SPP, [1024, [3, 5, 7]]],
   [-1, 3, C3TR, [1024, False]],  # 9
  ]

# YOLOv5 head
head:
  [[-1, 1, Conv, [768, 1, 1]],  # 10
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #11
   [[-1, 6], 1, Concat, [1]],   # 12 cat backbone P5
   [-1, 3, C3, [768, False]],   # 13
   [-1, 1, CBAM, [768]],        # 14

   [-1, 1, Conv, [512, 1, 1]],  # 15
   [-1, 1, nn.Upsample, [None, 2, 'nearest']], #16
   [[-1, 4], 1, Concat, [1]],   # 17 cat backbone P4
   [-1, 3, C3, [512, False]],   #  18
   [-1, 1, CBAM, [512]],        # 19

   [-1, 1, Conv, [256, 1, 1]],  # 20
   [-1, 1, nn.Upsample, [None, 2, 'nearest']],  #21
   [[-1, 2], 1, Concat, [1]],   # 22 cat backbone P3
   [-1, 3, C3TR, [256, False]], # 23 (P3/8-small)
   [-1, 1, CBAM, [256]],        # 24

   [-1, 1, Conv, [256, 3, 2]],  # 25
   [[-1, 20], 1, Concat, [1]],  # cat head P4 #26
   [-1, 3, C3TR, [512, False]], # 27 (P4/16-medium)
   [-1, 1, CBAM, [512]],        # 28

   [-1, 1, Conv, [512, 3, 2]],  # 29
   [[-1, 15], 1, Concat, [1]],  # 30 cat head P5
   [-1, 3, C3TR, [768, False]], # 31 (P5/32-large)
   [-1, 1, CBAM, [768]],        # 32

   [-1, 1, Conv, [768, 3, 2]],  # 33
   [[-1, 10], 1, Concat, [1]],  # 34  cat head P6
   [-1, 3, C3TR, [1024, False]],# 35 (P6/64-xlarge)

   [[23, 27, 31, 35], 1, Detect, [nc, anchors]],  # Detect(P3, P4, P5, P6)
  ]
模型参数量parameters计算量GFLOPs
TPH-YOLOv51000951034.8

本人更多Yolov5实战内容导航🍀

  1. 手把手带你调参Yolo v5 (v6.2)(推理)🌟强烈推荐

  2. 手把手带你调参Yolo v5 (v6.2)(训练)🚀

  3. 手把手带你调参Yolo v5 (v6.2)(验证)

  4. 如何快速使用自己的数据集训练Yolov5模型

  5. 手把手带你Yolov5 (v6.2)添加注意力机制(一)(并附上30多种顶会Attention原理图)🌟强烈推荐

  6. 手把手带你Yolov5 (v6.2)添加注意力机制(二)(在C3模块中加入注意力机制)

  7. Yolov5如何更换激活函数?

  8. Yolov5如何更换BiFPN?

  9. Yolov5 (v6.2)数据增强方式解析

  10. Yolov5更换上采样方式( 最近邻 / 双线性 / 双立方 / 三线性 / 转置卷积)

  11. Yolov5如何更换EIOU / alpha IOU / SIoU?

  12. Yolov5更换主干网络之《旷视轻量化卷积神经网络ShuffleNetv2》🍀

  13. YOLOv5应用轻量级通用上采样算子CARAFE

  14. 空间金字塔池化改进 SPP / SPPF / SimSPPF / ASPP / RFB / SPPCSPC / SPPFCSPC🚀

  15. 用于低分辨率图像和小物体的模块SPD-Conv🍀

  16. GSConv+Slim-neck 减轻模型的复杂度同时提升精度🍀

  17. 头部解耦 | 将YOLOX解耦头添加到YOLOv5 | 涨点杀器🍀


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

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

相关文章

NMEA协议解析

文章目录一、NMEA0183协议1、NMEA基本框架2、常用语句1)GNGGA2)GNGLL3)GNGSA4)GPGSV5)GNRMC6)GNVTG7)GNZDA8)PAIRCLK等二、异或校验和代码1、网址在线计算BCC2、BCC校验和代码一、NM…

Java语言中的异常处理

异常处理 在java语言中,很机智的将异常作为对象来处理,而且定义一个基类java.lang.Throwable作为所有异常类的父类。在这许多类中一般分为两大类: 错误类(Error)和异常类(Expception)。 如图: 注&#xf…

iNOF在现实网络中的运用,以带反射器的iONF为例

定义 iNOF(Intelligent Lossless NVMe Over Fabric,智能无损存储网络)是指通过对接入主机的快速管控,将智能无损网络应用到存储系统,实现计算和存储网络融合的技术。 目的 网络转发设备用于传输流量,不同类…

竞争不是内卷,用头脑学习,而非时间

文章目录 用头脑学习,而非时间 前言 一、自由竞争不是内卷 二、内卷都在哪些行业 三、高效学习来大数据梦想联盟 用头脑学习,而非时间 前言 大多数人不懂,不会,不做,才是你的机会,你得行动&#xff…

【Queue】- 从源码分析ArrayDeque及其常用方法

文章目录概述ArrayDeque基础知识ArrayDeque内部结构ArrayDeque的构造方法ArrayDeque的扩容操作ArrayDeque常用方法将ArrayDeque作为双端队列使用时public void addFirst(E e)public void addLast(E e)public boolean offerFirst(E e)public boolean offerLast(E e)public E pol…

动态SLAM论文归纳

持续更新,持续更新 2022 Multi-modal Semantic SLAM for Complex Dynamic Environments 作者:Han Wang, Jing Ying Ko and Lihua Xie, Fellowcode:https://github.com/wh200720041/MMS_SLAM视频:https://www.youtube.com/watch…

web自动化测试——入门篇01

😏作者简介:博主是一位测试管理者,同时也是一名对外企业兼职讲师。 📡主页地址:【Austin_zhai】 🙆目的与景愿:旨在于能帮助更多的测试行业人员提升软硬技能,分享行业相关最新信息。…

并发编程中的原子性,可见性,有序性问题

前言:大家好,我是小威,24届毕业生,在一家满意的公司实习。本篇文章是关于并发编程中出现的原子性,可见性,有序性问题。 本篇文章记录的基础知识,适合在学Java的小白,也适合复习中&am…

PyTorch(三)TensorBoard 与 Transforms

文章目录Log一、TensorBoard1. TensorBoard 的安装2. SummaryWriter 的使用① add_scalar() 的使用a. 参数说明b. 函数使用c. 使用 Tensorboard② add_image() 的使用a. 参数说明b. 使用 numpy.array() 对 PIL 图片进行转换c. 使用函数d. 改变 global_step二、Transforms1. Tra…

数据结构 | 时间复杂度与空间复杂度

… 🌳🌲🌱本文已收录至:数据结构 | C语言 更多知识尽在此专栏中! 🎉🎉🎉欢迎点赞、收藏、关注 🎉🎉🎉文章目录🌳前言🌳正…

【C++初阶】类和对象(二)

大家好我是沐曦希💕 类和对象1.类的6个默认成员函数2.构造函数2.1 概念2.2 特性3.析构函数3.1 概念3.2 特性4.拷贝构造函数4.1 概念4.2 特征1.类的6个默认成员函数 空类:类中一个成员都没有 可是空类真的什么都没有吗? 并不是,任…

STM32关于UART的接收方式

STM32的 UART 一般分为定长接收和不定长接收 定长接收: HAL_UART_Receive():只能接收固定长度的数据,如果超过固定长度的数据只能接收对应长度,如果小于固定长度则不会接收 HAL_UART_Receive_IT():中断方式接收,每接收一个字节…

CSS 2 CSS 选择器 - 5 2.8 伪选择器 2.8.1 伪类选择器【根据特定状态选取元素】

CSS 文章目录CSS2 CSS 选择器 - 52.8 伪选择器2.8.1 伪类选择器【根据特定状态选取元素】2 CSS 选择器 - 5 2.8 伪选择器 2.8.1 伪类选择器【根据特定状态选取元素】 【什么是伪类】 伪类用于定义元素的特殊状态。 例如,它可以用于: 设置鼠标悬停在…

如何删除ZIP压缩包的密码?

ZIP是比较常用的压缩文件格式,有时候因为工作需要很多人还会给压缩包设置打开密码。那如果后续不需要密码保护了要如何删除密码呢?密码忘记了还能删除吗? 首先来说说第一种情况,也就是知道密码但后续不需要密码保护,只…

1. 初识Python

1. Pythond 简介 Python 语言由荷兰的 Guido Van Rossum (吉多范罗苏姆, 江湖人称龟叔) 在1989年圣诞节期间为了打发圣诞节的无趣而开发的一个脚本解释语言.Python 源代码遵循 GPL(GNU General Public License)开源协议, 也就是说你可以免费使用和传播它, 而不用担心版权的问…

libusb系列-005-部分API简介

libusb系列-005-部分API简介 文章目录libusb系列-005-部分API简介摘要libusb_initlibusb_open_device_with_vid_pidlibusb_kernel_driver_activelibusb_detach_kernel_driverlibusb_claim_interfacelibusb_release_interfacelibusb_attach_kernel_driverlibusb_closelibusb_exi…

【论文翻译】分布式并发控制中时间戳排序算法与本地计数器同步的改进方法

An Advanced Approach of Local Counter Synchronization to Timestamp Ordering Algorithm in Distributed Concurrency Control DOI目录1 介绍2 时间戳排序算法3 本地计数器同步的一种高级方法3.1 改进更新本地计数器的广播消息方式3.2 减少广播消息中的数据传输费用4 结论参…

时间复杂度与空间复杂度

文章目录1.什么是数据结构2.什么是算法3.如何学好数据结构呢3.1写代码3.2 多去动手画图4.算法效率4.1如何评判一个算法的好与坏呢4.2算法的复杂度5.时间复杂度5.1 概念5.2大O渐进法6常见的时间复杂度6.1常数阶6.2线性阶6.3 对数阶6.4平方阶6.5函数调用6.5.1普通调用6.5.2递归调…

1024程序节|Android框架之一 BRVAH【BaseRecyclerViewAdapterHelper】使用demo

文章目录🍓🍓BRVAH 上部🍄🍓动态图结果展示🍄🍄myAdapter.java【第一个布局适配器】🍄🍄youAdapter.java【第二个布局适配器】🍄🍄MainActivity.java【主活动…

【Android】自制静音App,解决他人手机外放问题

契源 看到一个粉丝留言,吐槽舍友深夜手机外放,打扰别人休息,想设计一款软件阻止舍友行径。于是我就来简单设计一下。 需求实现分析 实际上,我之前有篇博文提到过一个类似的Android APP,主要功能是将手机声音强制开到…