YOLOv8改进 | 主干网络 |模糊图像/恶劣天气下的目标检测改进

秋招面试专栏推荐深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有50+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转


尽管基于深度学习的目标检测方法在传统数据集上取得了令人鼓舞的结果,但在恶劣天气条件下捕获的低质量图像中定位目标仍然具有挑战性。现有方法在平衡图像增强和目标检测任务方面存在困难,或者常常忽略对检测有益的潜在信息。为了缓解这个问题,我们提出了一个新颖的图像自适应YOLO(IA-YOLO)框架,其中每张图像都可以自适应地增强以获得更好的检测性能。具体来说,我们呈现了一个可微分图像处理(DIP)模块,以考虑YOLO检测器的不利天气条件,其参数由一个小型卷积神经网络(CNN-PP)预测。我们以端到端的方式联合学习CNN-PP和YOLO,这确保了CNN-PP可以在弱监督的方式下学习适当DIP来增强图像以进行检测。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。对于学有余力的同学,可以挑战进阶模块。文章内容丰富,可以帮助您更好地面对深度学习目标检测YOLO系列的挑战。

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转

目录

1. 原理

2. 将unfog_net添加到YOLOv8中

2.1 unfog_net的代码实现

2.2 更改init.py文件

2.3 添加yaml文件

2.4执行程序

3. 完整代码分享

4. GFLOPs

5. 进阶

6. 总结


1. 原理

论文地址:Image-Adaptive YOLO for Object Detection in Adverse Weather Conditions——点击即可跳转

官方代码:官方代码仓库——点击即可跳转

文中提到的去雾算法主要包括以下几个部分:

1. 大气散射模型 (Atmospheric Scattering Model)

该模型将雾霾图像的形成过程表示为:I(x) = J(x) \cdot t(x) + A \cdot (1 - t(x))其中:

  • ( I(x) ) 是雾霾图像。

  • ( J(x) ) 是场景辐射 (即无雾图像)。

  • ( A ) 是大气光。

  • ( t(x) ) 是传输图。

为了恢复清晰图像 ( J(x) ),关键在于获取大气光 ( A ) 和传输图 ( t(x) )。

2. 暗通道先验 (Dark Channel Prior)

该方法基于以下假设:在无雾图像的某些区域,其至少一个颜色通道具有很低的强度值。公式为:

J{\text{dark}}(x) = \min_C \left( \min{y \in \Omega(x)} J_C(y) \right) = 0 其中 \Omega(x)是位置 ( x ) 附近的一个小补丁,( C ) 是颜色通道。

通过对雾霾图像进行相似的最小化操作,可以估计传输图: t(x) = 1 - \min_C \left( \min_{y \in \Omega(x)} \frac{I_C(y)}{A_C} \right)

3. 可学习参数 \omega

为了控制去雾的程度,引入了一个参数 \omega,其计算公式为: t(x, \omega) = 1 - \omega \min_C \left( \min_{y \in \Omega(x)} \frac{I_C(y)}{A_C} \right)

由于上述操作是可微的,因此可以通过反向传播来优化 \omega,使去雾滤波器更有利于雾霾图像检测。

4. CNN-PP 模块

在摄像机图像信号处理 (ISP) 管道中,通常使用一些可调滤波器来增强图像。本文提出了使用一个小型卷积神经网络 (CNN) 作为参数预测器,以高效地估计超参数。CNN-PP 网络由五个卷积块和两层全连接层组成,用于预测 DIP 模块的参数,从而在去雾时揭示更多的图像细节,有助于后续的检测任务。

2. 将unfog_net添加到YOLOv8中

2.1 unfog_net的代码实现

关键步骤一: 在/ultralytics/ultralytics/nn/modules/下面新建文件unfog.py,粘贴下面的代码

import torch
import torch.nn as nn
import mathclass unfog_net(nn.Module):def __init__(self):super().__init__()self.relu = nn.ReLU(inplace=True)self.e_conv1 = nn.Conv2d(3, 3, 1, 1, 0, bias=True)self.e_conv2 = nn.Conv2d(3, 3, 3, 1, 1, bias=True)self.e_conv3 = nn.Conv2d(6, 3, 5, 1, 2, bias=True)self.e_conv4 = nn.Conv2d(6, 3, 7, 1, 3, bias=True)self.e_conv5 = nn.Conv2d(12, 3, 3, 1, 1, bias=True)def forward(self, x):x1 = self.relu(self.e_conv1(x))x2 = self.relu(self.e_conv2(x1))concat1 = torch.cat((x1, x2), 1)x3 = self.relu(self.e_conv3(concat1))concat2 = torch.cat((x2, x3), 1)x4 = self.relu(self.e_conv4(concat2))concat3 = torch.cat((x1, x2, x3, x4), 1)x5 = self.relu(self.e_conv5(concat3))clean_image = self.relu((x5 * x) - x5 + 1)return clean_imageif __name__ == "__main__":# Generating Sample imageimage_size = (1, 3, 640, 640)image = torch.rand(*image_size)out = unfog_net()out = out(image)print(out.size())

2.2 更改init.py文件

关键步骤二:修改modules文件夹下的__init__.py文件,先导入函数

然后在下面的__all__中声明函数

2.3 添加yaml文件

关键步骤三:在/ultralytics/ultralytics/cfg/models/v8下面新建文件yolov8_unfog.yaml文件,粘贴下面的内容

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-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]  # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPss: [0.33, 0.50, 1024]  # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPsm: [0.67, 0.75, 768]   # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPsl: [1.00, 1.00, 512]   # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPsx: [1.00, 1.25, 512]   # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs# YOLOv8.0n backbone
backbone:# [from, repeats, module, args]- [-1, 1, unfog_net, []]  # 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, Conv, [512, 3, 2]]  # 6-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]]  # 8-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]]  # 10# YOLOv8.0n head
head:- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 7], 1, Concat, [1]]  # cat backbone P4- [-1, 3, C2f, [512]]  # 13- [-1, 1, nn.Upsample, [None, 2, 'nearest']]- [[-1, 5], 1, Concat, [1]]  # cat backbone P3- [-1, 3, C2f, [256]]  # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]]  # cat head P4- [-1, 3, C2f, [512]]  # 19 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]]  # cat head P5- [-1, 3, C2f, [1024]]  # 22 (P5/32-large)- [[16, 19, 22], 1, Detect, [nc]]  # Detect(P3, P4, P5)

温馨提示:因为本文只是对yolov8基础上添加模块,如果要对yolov8n/l/m/x进行添加则只需要指定对应的depth_multiple 和 width_multiple。


# YOLOv8n
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.25  # layer channel multiple
max_channels: 1024 # max_channels# YOLOv8s
depth_multiple: 0.33  # model depth multiple
width_multiple: 0.50  # layer channel multiple
max_channels: 1024 # max_channels# YOLOv8l 
depth_multiple: 1.0  # model depth multiple
width_multiple: 1.0  # layer channel multiple
max_channels: 512 # max_channels# YOLOv8m
depth_multiple: 0.67  # model depth multiple
width_multiple: 0.75  # layer channel multiple
max_channels: 768 # max_channels# YOLOv8x
depth_multiple: 1.33  # model depth multiple
width_multiple: 1.25  # layer channel multiple
max_channels: 512 # max_channels

2.4执行程序

关键步骤五:在ultralytics文件中新建train.py,将model的参数路径设置为yolov8_unfog.yaml的路径即可

from ultralytics import YOLO# Load a model
# model = YOLO('yolov8n.yaml')  # build a new model from YAML
# model = YOLO('yolov8n.pt')  # load a pretrained model (recommended for training)model = YOLO(r'/projects/ultralytics/ultralytics/cfg/models/v8/yolov8_unfog.yaml')  # build from YAML and transfer weights# Train the model
model.train(batch=16)

🚀运行程序,如果出现下面的内容则说明添加成功🚀

                  from  n    params  module                                       arguments                     0                  -1  1      1761  ultralytics.nn.modules.unfog.unfog_net       []                            1                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]                 2                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]                3                  -1  1      7360  ultralytics.nn.modules.block.C2f             [32, 32, 1, True]             4                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]                5                  -1  2     49664  ultralytics.nn.modules.block.C2f             [64, 64, 2, True]             6                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]               7                  -1  2    197632  ultralytics.nn.modules.block.C2f             [128, 128, 2, True]           8                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]              9                  -1  1    460288  ultralytics.nn.modules.block.C2f             [256, 256, 1, True]           10                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]                 11                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          12             [-1, 7]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           13                  -1  1    148224  ultralytics.nn.modules.block.C2f             [384, 128, 1]                 14                  -1  1         0  torch.nn.modules.upsampling.Upsample         [None, 2, 'nearest']          15             [-1, 5]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           16                  -1  1     37248  ultralytics.nn.modules.block.C2f             [192, 64, 1]                  17                  -1  1     36992  ultralytics.nn.modules.conv.Conv             [64, 64, 3, 2]                18            [-1, 13]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           19                  -1  1    123648  ultralytics.nn.modules.block.C2f             [192, 128, 1]                 20                  -1  1    147712  ultralytics.nn.modules.conv.Conv             [128, 128, 3, 2]              21            [-1, 10]  1         0  ultralytics.nn.modules.conv.Concat           [1]                           22                  -1  1    493056  ultralytics.nn.modules.block.C2f             [384, 256, 1]                 23        [16, 19, 22]  1    751507  ultralytics.nn.modules.head.Detect           [1, [64, 128, 256]]           
YOLOv8_unfog summary: 232 layers, 3,012,804 parameters, 3,012,788 gradients, 9.6 GFLOPs

3. 完整代码分享

https://pan.baidu.com/s/1rllteHxV2b8myqeuGYzOkg?pwd=yrp2

提取码: yrp2 

4. GFLOPs

关于GFLOPs的计算方式可以查看:百面算法工程师 | 卷积基础知识——Convolution

未改进的YOLOv8n GFLOPs

img

改进后的GFLOPs

5. 进阶

可以结合损失函数或者卷积模块进行多重改进

6. 总结

去雾算法的主要原理基于大气散射模型,通过估计场景辐射(无雾图像)、大气光和传输图来恢复清晰图像。暗通道先验假设无雾图像的某些区域至少有一个颜色通道的强度值很低,利用此假设可以估计传输图。为了控制去雾程度,引入了可学习参数,使去雾滤波器更适合检测任务。CNN-PP模块通过五个卷积块和两个全连接层,预测DIP模块的超参数,使图像处理自适应图像的亮度、颜色和雾霾程度。最终,处理后的图像被输入YOLOv8检测网络,通过多尺度特征图进行预测,提高目标检测的精度,特别是在恶劣天气条件下。

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

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

相关文章

【你也能从零基础学会网站开发】 启动SQL Server 2000服务管理与常用核心组件介绍

🚀 个人主页 极客小俊 ✍🏻 作者简介:程序猿、设计师、技术分享 🐋 希望大家多多支持, 我们一起学习和进步! 🏅 欢迎评论 ❤️点赞💬评论 📂收藏 📂加关注 SQL Server 20…

Nginx介绍、安装、使用

更多优质内容欢迎访问我的个人博客网站:www.zpf0000.com Nginx官网 官网:nginx news 什么是Nginx? Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访…

TIMO后台管理系统:基于SpringBoot2.0的模块化快速开发平台

摘要 随着软件技术的快速发展,后台管理系统的构建成为企业级应用的重要组成部分。本文旨在介绍TIMO后台管理系统的设计与实现,该系统基于Spring Boot 2.0、Spring Data JPA、Thymeleaf和Shiro等主流技术构建,采用模块化设计以简化开发和维护…

02 线性模型

目录 1. Logistic 回归 2. Softmax回归 3. 感知器 4. 支持向量机 5. 总结 线性模型是机器学习中常用的一类预测模型。这类模型假设输出变量(目标)与输入变量(特征)之间存在线性关系。 本文主要介绍四种不同线性分类模型&…

Java面试八股之Redis怎么实现消息队列

Redis怎么实现消息队列 Redis实现消息队列主要依赖于其内置的数据结构,如List、Pub/Sub(发布/订阅)和Stream。下面将分别介绍这三种方式及其特点: 1. List实现消息队列 Redis的List是一个双向链表,支持快速的头部和…

【Linux/Windows】Wireshark抓包工具下载、安装、使用、数据分析、常用知识点

文章目录 Linux版下载Windows版下载Wireshark使用Wireshark测试Tcp三次握手Wireshark常见过滤条件本篇小结 更多相关内容可查看 在一个阳光明媚的周五清晨,一起快乐的玩耍一下Wireshark Linux版下载 1.使用yum安装wireshark yum -y install wireshark2.使用yum安…

TDC 5.0:多集群统一纳管,构建一体化大数据云平台

近期,星环科技数据云平台Transwarp Data Cloud(简称TDC)5.0版本正式发布,TDC5.0架构屏蔽底层多个TDH集群的差异,采用统一操作模式,新增一个多集群抽象与管理层,能够实现多集群网络互通、跨集群资…

一文搞懂Java中的双亲委派

一天正在宿舍里忙着写代码。突然,老师给我布置了一项新任务:优化他正在开发的项目中的类加载机制。我对类加载器了解不多,开始翻阅各种资料,逐渐了解了Java中的类加载器机制。尤其是当读到双亲委派模型时,脑海中豁然开…

【鸿蒙学习笔记】舜和酒店项目开发

这里写目录标题 前期准备1. 环境准备2. 开发工具准备 创建项目1. 使用 deveco-studio 创建 ShunHeHotel 项目2. 把ShunHeHotel 项目使用git进行版本控制3. 提交第1个commit,Alt0 → 输入commit message → 提交4. 查看已经提交的第一个提交5. gitcode 创建同名远程项…

微信小程序毕业设计-选课系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

杭州外贸网站建设 最好用wordpress模板来搭建

防护服wordpress外贸网站模板 消防服、防尘服、隔热服、防化服、防静电服、电焊服wordpress外贸网站模板。 https://www.jianzhanpress.com/?p4116 工业品wordpress外贸网站模板 机械及行业设备、五金工具、安全防护、包装、钢铁、纺织皮革等工业品wordpress外贸网站模板。…

家庭主妇人格独立问题,不断成长自己,保持人格独立

86天 周六反省 家庭主妇人格独立问题; 深刻反省自己,成长、改变自己;身体有毛病就去治疗,心上有问题就去改正;多年形成的习惯需要下功夫填坑 无论在哪个时刻我们都应该成长自己、人格独立,和爱人一起成长…

卷积神经网络【CNN】--池化层的原理详细解读

池化层(Pooling Layer)是卷积神经网络(CNN)中的一个关键组件,主要用于减少特征图(feature maps)的维度,同时保留重要的特征信息。 一、池化层的含义 池化层在卷积神经网络中扮演着降…

mac如何合并pdf文件到一个文件 macpdf合并 Mac如何合并pdf文件

在数字化的今天,pdf文件因其跨平台、格式统一等优势,已经成为工作、学习和生活中不可或缺的文件格式。然而,当我们需要合并多个pdf文件时,可能会感到有些无从下手。本文将为你详细介绍几种简单实用的合并pdf的方法,让你…

使用Tailwind CSS实现响应式面板

本文由ScriptEcho平台提供技术支持 项目地址:传送门 代码应用场景 此代码旨在用作 Web 应用程序或软件平台的仪表板界面。它提供结构化布局,包含多个部分,用于显示关键统计数据、最近活动和用户管理功能。仪表板旨在提供基本数据的全面概述…

第十四届蓝桥杯省赛C++B组H题【整数删除】题解(AC)

题目大意 依次删除长度为 n n n 的数组中的 k k k 个最小值,在删除一个数后,该数的相邻数加上它的值,输出最终数组。 解题思路 数组中删除一个数的复杂度为 O ( n ) O(n) O(n),故我们可以考虑用链表进行维护,这样…

3112. 访问消失节点的最少时间 Medium

给你一个二维数组 edges 表示一个 n 个点的无向图,其中 edges[i] [ui, vi, lengthi] 表示节点 ui 和节点 vi 之间有一条需要 lengthi 单位时间通过的无向边。 同时给你一个数组 disappear ,其中 disappear[i] 表示节点 i 从图中消失的时间点&#xff0…

【hadoop大数据集群 2】

【hadoop大数据集群 2】 文章目录 【hadoop大数据集群 2】1. 虚拟机克隆2. 时间同步3. 环境变量配置、启动集群、关闭集群 1. 虚拟机克隆 克隆之后一定要重新生成新虚拟机唯一的MAC地址和UUID等,确保新虚拟机与源虚拟机在网络拓扑中不发生冲突。 注意1.生成新的MA…

【C++】C++设计远程桌面软件的技术详解

在当今的数字化时代,远程桌面技术已成为企业远程办公、技术支持、教育培训等领域不可或缺的一部分。它允许用户从任何地点通过互联网安全地访问和控制远程计算机,就像直接坐在那台计算机前一样。C作为一种高效、灵活且性能强大的编程语言,非常…

C++ 继承详解:从基础到深入

继承是面向对象编程中最强大的功能之一,它不仅促进了代码的重用,还帮助我们构建复杂的系统。在C中,通过继承,我们可以创建一个新的类(称为派生类)来扩展现有类(基类)的功能。本文将全…