YOLOv8目标检测创新改进与实战案例专栏
专栏目录: YOLOv8有效改进系列及项目实战目录 包含卷积,主干 注意力,检测头等创新机制 以及 各种目标检测分割项目实战案例
专栏链接: YOLOv8基础解析+创新改进+实战案例
介绍
摘要
摘要. 凭借出色的速度和准确性平衡,最前沿的YOLO框架已经成为目标检测最有效的算法之一。然而,使用YOLO网络进行脑肿瘤检测的性能鲜有研究。我们提出了一种基于通道Shuffle重参数化卷积的YOLO新架构(RCS-YOLO)。我们介绍了RCS和RCS的一次性聚合(RCS-OSA),将特征级联和计算效率结合起来,以提取更丰富的信息并减少时间消耗。在脑肿瘤数据集Br35H上的实验结果表明,所提出的模型在速度和准确性上超越了YOLOv6、YOLOv7和YOLOv8。值得注意的是,与YOLOv7相比,RCS-YOLO的精度提高了1%,推理速度提高了60%,达到每秒114.8张图像的检测速度(FPS)。我们提出的RCS-YOLO在脑肿瘤检测任务上实现了最先进的性能。代码可在 https://github.com/mkang315/RCS-YOLO 获取。
文章链接
论文地址:论文地址
代码地址:代码地址
基本原理
RCS-OSA(Reparameterized Convolution based on channel Shuffle-One Shot Aggregation)是一个用于提高对象检测速度和准确性的模块,尤其在医疗图像的对象检测中表现突出。它结合了RepVGG/RepConv和ShuffleNet的优点,通过结构化重参数化和通道混洗来优化卷积操作,从而在训练阶段提供更多特征信息,并在推理阶段减少计算复杂性和内存消耗。
组件
1. RepVGG/RepConv ShuffleNet
- 通道分割(Channel Split):输入张量在通道维度上分割为两个等尺寸的张量。
- 多分支训练(Multi-branch Training):一个张量通过身份分支(Identity Branch)、1x1卷积和3x3卷积进行训练。在推理阶段,这些操作被转换为3x3 RepConv,通过结构重参数化实现。
- 通道混洗(Channel Shuffle):在训练结束后,张量在通道维度上进行混合,以增强信息融合。这一操作在低计算复杂性下实现了不同通道特征之间的深度信息交换 。
2. RCS-Based One-Shot Aggregation(RCS-OSA)
- 特征堆叠(Stacked Features):RCS模块反复堆叠以确保特征的重用和相邻层之间的信息流动。在网络的不同位置设置不同数量的堆叠模块 。
- 单次聚合路径(One-Shot Aggregate Path):仅维持三个特征级联,以减少网络计算负担和内存占用 。
- 多尺度特征融合(Multi-scale Feature Fusion):通过RCS-OSA + 上采样和RCS-OSA + RepVGG/RepConv下采样,对不同尺寸的特征图进行对齐,实现信息交换 。
- 内存访问成本(Memory Access Cost):RCS-OSA维持输入通道和最小输出通道的数量,从而降低内存访问成本 。
工作机制
- 训练阶段:RCS模块通过多分支拓扑架构学习丰富的特征信息,进行身份映射、1x1卷积和3x3卷积的训练。
- 推理阶段:通过结构重参数化,将多分支架构简化为单分支架构,从而减少内存消耗并加快推理速度。
- 特征融合:通过通道混洗和特征堆叠,实现高效的特征信息交流和多尺度特征融合,从而在对象检测中提高精度和速度 。
核心代码
from models.common import Conv
import torch.nn as nn
import torch
import torch.nn.functional as F
import numpy as np
import math
# 构建RepVGG块的辅助函数
# -----------------------------
def conv_bn(in_channels, out_channels, kernel_size, stride, padding, groups=1):
# 创建一个顺序容器
result = nn.Sequential()
# 添加卷积层
result.add_module('conv', nn.Conv2d(in_channels=in_channels, out_channels=out_channels,
kernel_size=kernel_size, stride=stride, padding=padding, groups=groups,
bias=False))
# 添加批量归一化层
result.add_module('bn', nn.BatchNorm2d(num_features=out_channels))
return result
# SEBlock类用于实现Squeeze-and-Excitation模块
class SEBlock(nn.Module):
def __init__(self, input_channels):
super(SEBlock, self).__init__()
# SE模块的中间层神经元数量
internal_neurons = input_channels // 8
# 下采样卷积层
self.down = nn.Conv2d(in_channels=input_channels, out_channels=internal_neurons, kernel_size=1, stride=1,
bias=True)
# 上采样卷积层
self.up = nn.Conv2d(in_channels=internal_neurons, out_channels=input_channels, kernel_size=1, stride=1,
bias=True)
self.input_channels = input_channels
def forward(self, inputs):
# 全局平均池化
x = F.avg_pool2d(inputs, kernel_size=inputs.size(3))
# 下采样
x = self.down(x)
# ReLU激活
x = F.relu(x)
# 上采样
x = self.up(x)
# Sigmoid激活
x = torch.sigmoid(x)
# 调整张量形状以匹配输入
x = x.view(-1, self.input_channels, 1, 1)
# 输入与权重相乘
return inputs * x
task与yaml配置
详见: https://blog.csdn.net/shangyanaf/article/details/140457853