目标检测-YOLOv4
YOLOv4介绍
YOLOv4 是 YOLO 系列的第四个版本,继承了 YOLOv3 的高效性,并通过大量优化和改进,在目标检测任务中实现了更高的精度和速度。相比 YOLOv3,YOLOv4 在框架设计、特征提取、训练策略等方面进行了全面升级。它在保持实时检测的同时,显著提升了检测性能,尤其在复杂场景中的表现尤为出色。
相比 YOLOv3 的改进与优势
-
改进的 Backbone (CSPDarknet-53)
YOLOv4 使用了 CSPDarknet-53 作为其主干网络 (Backbone)。CSPNet(Cross Stage Partial Network)通过部分特征的逐层传递减少了冗余梯度信息,提高了推理速度和精度。此外,它能够有效降低内存占用,使得网络更加轻量化。 -
PANet (Path Aggregation Network)
YOLOv4 引入了 PANet 来替代 YOLOv3 中的 FPN (Feature Pyramid Networks)。PANet 更有效地聚合不同尺度的特征,增强了特征表达能力,尤其对小目标检测性能提升明显。 -
Mish 激活函数
YOLOv4 使用 Mish 激活函数代替 YOLOv3 中的 Leaky ReLU。Mish 激活函数可以提供更平滑的梯度传递,提升了模型的学习能力和泛化性。 -
自适应输入分布 (Mosaic Data Augmentation)
在数据增强方面,YOLOv4 引入了 Mosaic Data Augmentation,这种技术通过将四张不同的图片拼接在一起进行训练,使得模型能够更好地适应不同尺寸、位置和背景的物体,从而提高泛化能力。 -
CIoU Loss
YOLOv4 使用了 CIoU Loss(Complete IoU Loss),相比 YOLOv3 使用的 IoU Loss,CIoU 更好地考虑了边界框的重叠度、中心点距离以及长宽比,使得目标定位更加精确。 -
DropBlock Regularization
为了防止过拟合,YOLOv4 引入了 DropBlock 正则化方法,这是一种空间正则化技术,可以在卷积层中随机去除一部分神经元,以增强模型的泛化能力。 -
自适应权重计算 (SAM, Self-Adversarial Training)
SAM (Spatial Attention Module) 提升了网络的注意力机制,使模型更好地聚焦于重要的特征部分。此外,YOLOv4 还引入了 Self-Adversarial Training 作为一种新型的自对抗训练方法,增强了模型的鲁棒性。
核心代码展示
以下是 YOLOv4 的核心部分代码,包括主干网络 CSPDarknet-53 和 PANet 构建模块。
import torch
import torch.nn as nn# 1. Mish 激活函数
class Mish(nn.Module):def forward(self, x):return x * torch.tanh(nn.functional.softplus(x))# 2. 卷积块,包含卷积、BN 和 Mish 激活函数
class ConvBlock(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride, padding):super(ConvBlock, self).__init__()self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, bias=False)self.bn = nn.BatchNorm2d(out_channels)self.activation = Mish()def forward(self, x):return self.activation(self.bn(self.conv(x)))# 3. CSP 模块
class CSPBlock(nn.Module):def __init__(self, in_channels, out_channels, num_blocks):super(CSPBlock, self).__init__()half_channels = out_channels // 2self.conv1 = ConvBlock(in_channels, half_channels, 1, 1, 0)self.conv2 = ConvBlock(in_channels, half_channels, 1, 1, 0)self.res_blocks = nn.Sequential(*[ResidualBlock(half_channels) for _ in range(num_blocks)])self.conv3 = ConvBlock(half_channels * 2, out_channels, 1, 1, 0)def forward(self, x):x1 = self.conv1(x)x2 = self.conv2(x)x1 = self.res_blocks(x1)return self.conv3(torch.cat([x1, x2], dim=1))# 4. PANet 下采样模块
class PANetDownsample(nn.Module):def __init__(self, in_channels, out_channels):super(PANetDownsample, self).__init__()self.conv = ConvBlock(in_channels, out_channels, 3, 2, 1) # 步长为 2,进行下采样def forward(self, x):return self.conv(x)# 5. YOLOv4 Backbone: CSPDarknet53
class CSPDarknet53(nn.Module):def __init__(self):super(CSPDarknet53, self).__init__()self.conv1 = ConvBlock(3, 32, 3, 1, 1)self.conv2 = ConvBlock(32, 64, 3, 2, 1)self.csp_block1 = CSPBlock(64, 128, 2)self.csp_block2 = CSPBlock(128, 256, 8)self.csp_block3 = CSPBlock(256, 512, 8)self.csp_block4 = CSPBlock(512, 1024, 4)def forward(self, x):x = self.conv1(x)x = self.conv2(x)x = self.csp_block1(x)x_52x52 = self.csp_block2(x)x_26x26 = self.csp_block3(x_52x52)x_13x13 = self.csp_block4(x_26x26)return x_52x52, x_26x26, x_13x13# 6. YOLOv4 Head: PANet
class PANet(nn.Module):def __init__(self, num_classes):super(PANet, self).__init__()self.num_classes = num_classes# 下采样和卷积操作self.downsample_52x52 = PANetDownsample(256, 512)self.downsample_26x26 = PANetDownsample(512, 1024)# 最终输出预测层 (每个尺度的 YOLO head)self.yolo_head_52x52 = YOLOHead(256, num_classes)self.yolo_head_26x26 = YOLOHead(512, num_classes)self.yolo_head_13x13 = YOLOHead(1024, num_classes)def forward(self, x_52x52, x_26x26, x_13x13):x_26x26 = self.downsample_52x52(x_52x52) + x_26x26x_13x13 = self.downsample_26x26(x_26x26) + x_13x13yolo_output_52x52 = self.yolo_head_52x52(x_52x52)yolo_output_26x26 = self.yolo_head_26x26(x_26x26)yolo_output_13x13 = self.yolo_head_13x13(x_13x13)return [yolo_output_52x52, yolo_output_26x26, yolo_output_13x13]# 7. YOLOv4 完整模型
class YOLOv4(nn.Module):def __init__(self, num_classes):super(YOLOv4, self).__init__()self.backbone = CSPDarknet53()self.panet = PANet(num_classes)def forward(self, x):x_52x52, x_26x26, x_13x13 = self.backbone(x)return self.panet(x_52x52, x_26x26, x_13x13)# YOLO Head 定义
class YOLOHead(nn.Module):def __init__(self, in_channels, num_classes):super(YOLOHead, self).__init__()self.conv = ConvBlock(in_channels, in_channels * 2, 3, 1, 1)self.pred = nn.Conv2d(in_channels * 2, 3 * (num_classes + 5), 1, 1, 0)def forward(self, x):x = self.conv(x)return self.pred(x)
代码解释
-
Mish 激活函数
Mish 激活函数取代了 YOLOv3 中的 Leaky ReLU,它的平滑梯度使得模型训练更加稳定。 -
CSPDarknet-53
YOLOv4 使用 CSPDarknet-53 作为主干网络,它引入
了 CSPNet 架构,在每个残差块中进行特征分割和融合,降低了内存消耗并提升了特征提取的效率。
-
PANet
PANet 的引入通过强化不同尺度的特征聚合,提升了小目标的检测效果。它替代了 YOLOv3 中的 FPN。 -
YOLOHead
YOLOv4 中的检测头与 YOLOv3 类似,但在每个尺度上进行了更多的特征卷积操作,以提高预测的准确度。
结论
YOLOv4 相比 YOLOv3 进行了多个方面的改进,包括主干网络的升级、特征聚合模块的优化、激活函数的替换、以及新型的正则化和损失函数的引入。这些改进使得 YOLOv4 在保持实时检测能力的同时,提升了检测的精度和鲁棒性。
相关文章:
目标检测-YOLOv4
YOLOv4介绍 YOLOv4 是 YOLO 系列的第四个版本,继承了 YOLOv3 的高效性,并通过大量优化和改进,在目标检测任务中实现了更高的精度和速度。相比 YOLOv3,YOLOv4 在框架设计、特征提取、训练策略等方面进行了全面升级。它在保持实时检…...
一台笔记本电脑的硬件都有哪些以及对应的功能
一台笔记本电脑的硬件通常包括多个关键组件,这些组件共同协作,确保电脑的正常运行。以下是笔记本电脑的主要硬件及其功能: 1. 中央处理器(CPU) 功能:CPU 是电脑的“大脑”,负责处理所有的计算…...
【程序分享1】第一性原理计算 + 数据处理程序
【1】第一性原理计算 数据处理程序 SMATool 程序:VASP QE 零温 有限温度 拉伸、剪切、双轴、维氏硬度的计算 ElasTool v3.0 程序:材料弹性和机械性能的高效计算和可视化工具包 VELAS 程序:用于弹性各向异性可视化和分析 Phasego 程序…...
【数据结构】栈与队列OJ题(用队列实现栈)(用栈实现队列)
目录 1.用队列实现栈oj题 对比 一、初始化 二、出栈 三、入栈 四、取队头元素: 2.用栈实现队列 一、定义 二、入队列 三、出队列 四、队头 五、判空 前言:如果想了解什么是栈和队列请参考上一篇文章进来一起把【数据结构】的【栈与队列】狠…...
element-ui打包之后图标不显示,woff、ttf加载404
1、bug 起因 昨天在 vue 项目中编写 element-ui 的树形结构的表格,发现项目中无法生效,定位问题之后发现项目使用的 element-ui 的版本是 2.4.11 。看了官方最新版本是 2.15.14,然后得知 2.4.11 版本是不支持表格树形结构的。于是决定升级 el…...
探究零工市场小程序如何改变传统兼职模式
近年来,零工市场小程序正逐渐改变传统的兼职模式,为求职者和雇主提供了一个更为高效、便捷的平台。本文将深入探讨零工市场小程序如何影响传统兼职模式,以及它带来的优势和挑战。 一、背景与挑战 传统的兼职市场往往存在信息不对称的问题&am…...
MySQL数据库安装(详细)—>Mariadb的安装(day21)
该网盘链接有效期为7天,有需要评论区扣我: 通过网盘分享的文件:mariadb-10.3.7-winx64.msi 链接: https://pan.baidu.com/s/1-r_w3NuP8amhIEedmTkWsQ?pwd2ua7 提取码: 2ua7 1 双击打开安装软件 本次安装的是mariaDB,双击打开mar…...
微信小程序实践案例
参考视频: https://www.bilibili.com/video/BV1834y1676P/?p36&spm_id_frompageDriver&vd_sourceb604c19516c17da30b6b1abb6c4e7ec0 前期准备 1、新建三个页面 "pages": ["pages/home/home","pages/message/message",&quo…...
DataLoader使用
文章目录 一、认识dataloader二、DataLoader整合数据集三、使用DataLoader展示图片方法四、去除结尾不满足batch_size设值图片的展示 一、认识dataloader DataLoader 用于封装数据集,并提供批量加载数据的迭代器。它支持自动打乱数据、多线程数据加载等功能。datas…...
CSS学习11--版心和布局流程以及几种分布的例子
版心和布局流程 一、版心二、布局流程三、一列固定宽度且居中四、两列左窄右宽五、通栏平均分布型 一、版心 版心:是指网页主题内容所在的区域。一般在浏览器窗口水平居中位置,常见的宽度值为960px、980px、1000px、1200px等。 二、布局流程 为了提高…...
NetSuite AI 图生代码
去年的ChatGPT热潮期间,我们写过一篇文章说GTP辅助编程的事。 NetSuite GPT的辅助编程实践_如何打开netsuite: html script notes的视图-CSDN博客文章浏览阅读2.2k次,点赞4次,收藏3次。作为GPT综合症的一种表现,我们今朝来探究下…...
Java - BigDecimal计算中位数
日常开发中,如果使用数据库来直接查询一组数据的中位数,就比较简单,直接使用对应的函数就可以了,例如: SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(目标列名 ORDER BY 目标列名),,,Count(1)/2),,,-1) AS 目标列名_…...
Tensorflow2如何读取自制数据集并训练模型?-- Tensorflow自学笔记13
一. 如何自制数据集? 1. 目录结构 以下是自制数据集-手写数字集, 保存在目录 mnist_image_label 下 2. 数据存储格式 2.1. 目录mnist_train_jpeg_60000 下存放的是 60000张用于测试的手写数字 如 : 0_5.jpg, 表示编号为0,标签为5的图片 6_1.jpg, 表示…...
JVM系列(七) -对象的内存分配流程
一、摘要 在之前的文章中,我们介绍了类加载的过程、JVM 内存布局和对象的创建过程相关的知识。 本篇综合之前的知识,重点介绍一下对象的内存分配流程。 二、对象的内存分配原则 在之前的 JVM 内存结构布局的文章中,我们介绍到了 Java 堆的内存布局,由 年轻代 (Young Ge…...
Apache Ignite 在处理大规模数据时有哪些优势和局限性?
Apache Ignite 在处理大规模数据时的优势和局限性可以从以下几个方面进行分析: 优势 高性能:Ignite 利用内存计算的优势,实现了极高的读写性能,通过分布式架构,它可以将数据分散到多个节点上,从而实现了并…...
怎么利用NodeJS发送视频短信
随着5G时代的来临,企业的数字化转型步伐日益加快,视频短信作为新兴的数字营销工具,正逐步展现出其大的潜力。视频群发短信以其独特的形式和内容,将图片、文字、视频、声音融为一体,为用户带来全新的直观感受࿰…...
WebAPI(三)、 DOM 日期对象Date;获取事件戳;根据节点关系查找节点
文章目录 DOM1. 日期对象(1)、日期对象方法(2)、时间戳(3)、下课倒计时 2. 节点操作(1)、 查找节点(根据节点关系找)(2)、 增加节点:创建create、追加append、克隆clone(3)、 删除节点remove DOM 1. 日期对象 日期对象就是用来表示时间的对…...
012.Oracle-索引
我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…...
SSL 证书 | 免费获取与自动续期全攻略
前言 随着互联网的不断发展,网站的安全性越来越受到人们的关注。 SSL证书 作为一种保障网站安全的重要手段,已经成为了许多网站的必备配置。 以前阿里云每个账号能生成二十个期限 1 年的免费 SSL 证书,一直用,还挺香࿰…...
达梦数据库管理员常用SQL(一)
达梦数据库管理员常用SQL(一) 数据库基本信息数据库参数信息表空间信息日志文件信息进程和线程信息会话连接信息SQL执行信息等待事件信息事务和锁信息数据库基本信息 --查询数据库内部版本号 select id_code; select build_version from v$instance; select * from v$versi…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
