YOLOv10改进 | 特殊场景检测篇 | 低照度图像增强网络SCINet改进黑暗目标检测(全网独家首发)

一、本文介绍 

本文给大家带来的改进机制是低照度图像增强网络SCINet,SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。我将该网络集成在YOLOv10的主干上针对于图像的输入进行增强,同时该网络的并不会增加参数和计算量,基本和普通的网络结构保持一致,同时该结构支持自定义调节层数,来控制图像增强的效果 ,非常适合想要在黑夜目标检测领域发表文章的读者,该基本网络不会影响模型的速度。

欢迎大家订阅我的专栏一起学习YOLO!  

 专栏回顾:YOLOv10改进系列专栏——本专栏持续复习各种顶会内容——科研必备 


目录

一、本文介绍 

二、SCINet原理

2.2  SCINet原理

2.3  级联照明学习与权重共享

三、SCINet的核心代码

四、SCINet的添加方式 

4.1 修改一

4.2 修改二 

4.3 修改三 

4.4 修改四 

五、SCINet的yaml文件和运行记录

5.1 SCINet的yaml文件一

5.2 SCINet的训练过程截图 

五、本文总结


二、SCINet原理

论文地址:论文官方地址

代码地址: 代码官方地址


2.2  SCINet原理

SCINet(自校正照明网络)是一种专为低光照图像增强设计的框架。它通过级联照明学习过程和权重共享机制来处理图像,优化了照明部分以提升图像质量。SCINet引入了自校正模块,用于减少计算负担并提高结果的稳定性。此外,其无监督训练损失功能使得模型能够适应不同场景。SCINet还显示出对简单操作设置的稳定性能适应性,以及可以提升现有照明增强工作性能的普适性。

SCINet的基本原理可以分为以下几个主要部分:

1. 级联照明学习与权重共享: SCINet采用了一个级联的照明学习过程,其中各个阶段共享权重。这种设计旨在优化照明组件,从而提升低光照图像的增强效果。

2. 自校正模块: 为了减少计算负担并提高暴露稳定性,SCINet构建了一个自校正模块。这个模块能够使每个阶段的结果收敛,从而在测试阶段仅需使用单个基础块。

3. 无监督训练损失: 作者定义了一种无监督训练损失来约束自校正模块下每个阶段的输出,使模型能够适应多种场景。

注意:YOLO网络只涉及到“级联照明学习与权重共享”,所以本篇文章着重介绍其级联照明学习与权重共享的相关内容。


2.3  级联照明学习与权重共享

级联照明学习与权重共享是SCINet的核心特性之一,主要包含以下几个方面:

1. 级联过程:在级联照明学习中,模型由多个阶段组成,每个阶段都对输入图像的照明进行估计。这种多阶段的处理方式有助于逐步改善图像亮度,每个阶段都在前一个阶段的基础上进一步提升图像质量。

2. 权重共享:在这些阶段中,模型的参数(权重)是共享的。这意味着,尽管每个阶段都执行相似的任务,但它们使用相同的模型参数来执行这些任务。权重共享可以减少模型的整体参数数量,从而减少了模型的复杂性和过拟合的风险。

3. 自校正模块:在每个阶段之后,一个自校正模块被用来校正当前阶段的输出。这一校正确保了随着级联过程的进行,每个阶段的输出逐渐趋于稳定,并且最终输出的质量不会因为过多的处理步骤而退化。

4. 计算效率:由于使用了权重共享,模型在训练时可以有效地学习如何处理低光照图像。在测试阶段,只需使用单个照明估计模块,这大大简化了模型并提高了推理速度。

5. 性能提升:级联照明学习与权重共享的结合使得模型不仅在处理单一图像时表现出色,也能够适应不同的低光照条件和场景,提升了模型的泛化能力和实际应用价值。

下图为大家展示了SCINet的整体框架,特别是在训练阶段包括照明估计和自校正模块两部分。

自校正模块的输出被添加到原始的低光照输入中,作为下一阶段照明估计的输入。这两个模块在整个训练过程中共享参数。在测试阶段,仅使用单个照明估计模块。这与SCINet基本原理的第一点和第二点紧密相关,即级联照明学习过程和权重共享以及自校正模块的设计来减少计算负担并提高结果的稳定性。  


三、SCINet的核心代码

import torch
import torch.nn as nn

__all__ = ['SCINet']


class SCINet(nn.Module):
    def __init__(self, channels=3, layers=3):
        super(SCINet, self).__init__()

        kernel_size = 3
        dilation = 1
        padding = int((kernel_size - 1) / 2) * dilation

        self.in_conv = nn.Sequential(
            nn.Conv2d(in_channels=3, out_channels=channels, kernel_size=kernel_size, stride=1, padding=padding),
            nn.ReLU()
        )

        self.conv = nn.Sequential(
            nn.Conv2d(in_channels=channels, out_channels=channels, kernel_size=kernel_size, stride=1, padding=padding),
            nn.BatchNorm2d(channels),
            nn.ReLU()
        )

        self.blocks = nn.ModuleList()
        for i in range(layers):
            self.blocks.append(self.conv)

        self.out_conv = nn.Sequential(
            nn.Conv2d(in_channels=channels, out_channels=3, kernel_size=3, stride=1, padding=1),
            nn.Sigmoid()
        )

    def forward(self, input):
        fea = self.in_conv(input)
        for conv in self.blocks:
            fea = fea + conv(fea)
        fea = self.out_conv(fea)

        illu = fea + input
        illu = torch.clamp(illu, 0.0001, 1)

        return illu



if __name__ == "__main__":
    # Generating Sample image
    image_size = (1, 3, 640, 640)
    image = torch.rand(*image_size)

    # Model
    mobilenet_v1 = SCINet(3, 3)

    out = mobilenet_v1(image)
    print(out.size())


四、SCINet的添加方式 

 这个添加方式和之前的变了一下,以后的添加方法都按照这个来了,是为了和群内的文件适配。


4.1 修改一

第一还是建立文件,我们找到如下ultralytics/nn/modules文件夹下建立一个目录名字呢就是'Addmodules'文件夹(用群内的文件的话已经有了无需新建)!然后在其内部建立一个新的py文件将核心代码复制粘贴进去即可。


4.2 修改二 

第二步我们在该目录下创建一个新的py文件名字为'__init__.py'(用群内的文件的话已经有了无需新建),然后在其内部导入我们的检测头如下图所示。


4.3 修改三 

第三步我门中到如下文件'ultralytics/nn/tasks.py'进行导入和注册我们的模块(用群内的文件的话已经有了无需重新导入直接开始第四步即可)

从今天开始以后的教程就都统一成这个样子了,因为我默认大家用了我群内的文件来进行修改!!


4.4 修改四 

按照我的添加在parse_model里添加即可。


五、SCINet的yaml文件和运行记录

5.1 SCINet的yaml文件

此版本训练信息:YOLOv10n-SCINet summary: 397 layers, 2717048 parameters, 2717032 gradients, 9.5 GFLOPs

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv10 object detection model. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov10n.yaml' will call yolov10.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024]

backbone:
  # [from, repeats, module, args]
  - [-1, 1, SCINet, []] # 0-P1/2
  - [-1, 1, Conv, [64, 3, 2]] # 1-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 2-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 4-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, SCDown, [512, 3, 2]] # 6-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, SCDown, [1024, 3, 2]] # 8-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 10
  - [-1, 1, PSA, [1024]] # 11

# YOLOv10.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 7], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 14

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

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 14], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 20 (P4/16-medium)

  - [-1, 1, SCDown, [512, 3, 2]]
  - [[-1, 11], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2fCIB, [1024, True, True]] # 23 (P5/32-large)

  - [[17, 20, 23], 1, v10Detect, [nc]] # Detect(P3, P4, P5)


5.2 SCINet的训练过程截图 


五、本文总结

到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv10改进有效涨点专栏,本专栏目前为新开的平均质量分98分,后期我会根据各种最新的前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~

 专栏回顾:

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 12:52:03       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 12:52:03       71 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 12:52:03       58 阅读
  4. Python语言-面向对象

    2024-07-12 12:52:03       69 阅读

热门阅读

  1. Hive中的数据类型和存储格式总结

    2024-07-12 12:52:03       20 阅读
  2. modern C++:闭包与匿名函数

    2024-07-12 12:52:03       23 阅读
  3. 前缀,中缀,后缀表达式

    2024-07-12 12:52:03       22 阅读
  4. 笔记:如何使用Microsoft.Extensions.Options

    2024-07-12 12:52:03       30 阅读
  5. socket编程(1)

    2024-07-12 12:52:03       30 阅读
  6. stm32flash一键ISP烧录单片机

    2024-07-12 12:52:03       20 阅读
  7. 移动端1px边框的问题

    2024-07-12 12:52:03       20 阅读
  8. C# Tuple元祖简单介绍

    2024-07-12 12:52:03       20 阅读
  9. 蒸馏知识点笔记

    2024-07-12 12:52:03       22 阅读
  10. Linux 基础常用基础命令(CentOS7)-CSDN

    2024-07-12 12:52:03       24 阅读