YOLOv8改进:融合Gold-YOLO Neck(RepGDNeck)


非常重要

由于ulralytics在不断更新,所以下列直接替换可能会导致一系列的错误,所以建议大家在尝试之前先新建一个虚拟环境,然后安装ultralytics 8.0.164版本的,最新版本安装后续会出错。因为咱新建了一个新虚拟环境,所以咱没必要备份,直接跳过备份做下面,但别忘了先引入mmcv库。

讲解视频链接(2024.1.22更新)

基于YOLOV8,从零开始搭建的GOLD-YOLO颈部的一个视频讲解(但是讲解能力有限,可能讲解的并不是太好)
https://space.bilibili.com/368873460/channel/seriesdetail?sid=3921374

前言

备份!备份!备份!!!
替换文件前记得先备份
例如:
在这里插入图片描述


一、ultralytics\ultralytics\nn\modules

在这里插入图片描述
gold_yolo.py复制到ultralytics\ultralytics\nn\modules下,_init_.py进行替换(该备份备份)
复制后的文件夹目录
在这里插入图片描述

from mmcv.cnn import ConvModule, build_norm_layer

由于gold_yolo中存在这一句代码,我们需要引入mmcv库

pip install -U openmim
mim install mmcv

二、ultralytics\ultralytics\nn

tasks.py复制到该ultralytics\ultralytics\nn下
在这里插入图片描述

三、ultralytics\cfg\models\v8

yolov8n_gold_yolo_neck_v2.yaml复制到该ultralytics\cfg\models\v8下
注意:记得先改文件中的nc参数,改为你的数据集的类别
在这里插入图片描述
在这里插入图片描述

四、训练

from ultralytics import YOLO

if __name__ == '__main__':
    model = YOLO('yolov8n_gold_yolo_neck_v2.yaml')
    results = model.train(data='coco128.yaml', epochs=5, deterministic=False)

deterministic设置为False,不然会报下面的警告

D:\anaconda3\envs\yolov8\lib\site-packages\torch\autograd\__init__.py:200: UserWarning: upsample_bilinear2d_backward_out_cuda does not have a deterministic implementation, but you set 'torch.use_deterministic_algorithms(True, warn_only=True)'. You can file an issue at https://github.com/pytorch/pytorch/issues to help us prioritize adding deterministic support for this operation. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\Context.cpp:75.)
  Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass
D:\anaconda3\envs\yolov8\lib\site-packages\torch\autograd\__init__.py:200: UserWarning: adaptive_avg_pool2d_backward_cuda does not have a deterministic implementation, but you set 'torch.use_deterministic_algorithms(True, warn_only=True)'. You can file an issue at https://github.com/pytorch/pytorch/issues to help us prioritize adding deterministic support for this operation. (Triggered internally at C:\actions-runner\_work\pytorch\pytorch\builder\windows\pytorch\aten\src\ATen\Context.cpp:75.)
  Variable._execution_engine.run_backward(  # Calls into the C++ engine to run the backward pass

意思是upsample_bilinear2d_backward_out_cuda和adaptive_avg_pool2d_backward_cuda都不是采用一个确定性的算法实现对应gold_yolo.py中的nn.functional.adaptive_avg_pool2d和F.interpolate(xxx, size=(H, W), mode='bilinear', align_corners=False)也就是说,结果不可复现,代码每次运行的结果都有所不同,但最终结果是差不多的。

                   from  n    params  module                                       arguments                     
  0                  -1  1       464  ultralytics.nn.modules.conv.Conv             [3, 16, 3, 2]                 
  1                  -1  1      4672  ultralytics.nn.modules.conv.Conv             [16, 32, 3, 2]                
  2                  -1  1      7360  ultralytics.nn.modules.block.C2f             [32, 32, 1, True]             
  3                  -1  1     18560  ultralytics.nn.modules.conv.Conv             [32, 64, 3, 2]                
  4                  -1  2     49664  ultralytics.nn.modules.block.C2f             [64, 64, 2, True]             
  5                  -1  1     73984  ultralytics.nn.modules.conv.Conv             [64, 128, 3, 2]               
  6                  -1  2    197632  ultralytics.nn.modules.block.C2f             [128, 128, 2, True]           
  7                  -1  1    295424  ultralytics.nn.modules.conv.Conv             [128, 256, 3, 2]              
  8                  -1  1    460288  ultralytics.nn.modules.block.C2f             [256, 256, 1, True]           
  9                  -1  1    164608  ultralytics.nn.modules.block.SPPF            [256, 256, 5]                 
 10       [2, 4, 6, -1]  1         0  ultralytics.nn.modules.gold_yolo.Low_FAM     []                            
 11                  -1  1    343296  ultralytics.nn.modules.gold_yolo.Low_IFM     [480, 96, 3, 192]             
 12                  -1  1         0  ultralytics.nn.modules.gold_yolo.Split       [[128, 64]]                   
 13                   9  1     33024  ultralytics.nn.modules.gold_yolo.SimConv     [256, 128, 1, 1]              
 14          [4, 6, -1]  1     57856  ultralytics.nn.modules.gold_yolo.Low_LAF     [128, 128]                    
 15            [-1, 12]  1     49920  ultralytics.nn.modules.gold_yolo.Inject      [128, 128, 0]                 
 16                  -1  1    658432  ultralytics.nn.modules.gold_yolo.RepBlock    [128, 128, 4]                 
 17                  -1  1      8320  ultralytics.nn.modules.gold_yolo.SimConv     [128, 64, 1, 1]               
 18          [2, 4, -1]  1     14592  ultralytics.nn.modules.gold_yolo.Low_LAF     [64, 64]                      
 19            [-1, 12]  1     12672  ultralytics.nn.modules.gold_yolo.Inject      [64, 64, 1]                   
 20                  -1  1    165376  ultralytics.nn.modules.gold_yolo.RepBlock    [64, 64, 4]                   
 21         [-1, 16, 9]  1         0  ultralytics.nn.modules.gold_yolo.High_FAM    [1, 'torch']                  
 22                  -1  1    989696  ultralytics.nn.modules.gold_yolo.High_IFM    [2, 448, 8, 4, 1, 2, 0, 0, [0.1, 2]]
 23                  -1  1    172416  torch.nn.modules.conv.Conv2d                 [448, 384, 1, 1, 0]           
 24                  -1  1         0  ultralytics.nn.modules.gold_yolo.Split       [[128, 256]]                  
 25            [20, 17]  1         0  ultralytics.nn.modules.gold_yolo.High_LAF    []                            
 26            [-1, 24]  1     49920  ultralytics.nn.modules.gold_yolo.Inject      [128, 128, 0]                 
 27                  -1  1    658432  ultralytics.nn.modules.gold_yolo.RepBlock    [128, 128, 4]                 
 28            [-1, 13]  1         0  ultralytics.nn.modules.gold_yolo.High_LAF    []                            
 29            [-1, 24]  1    198144  ultralytics.nn.modules.gold_yolo.Inject      [256, 256, 1]                 
 30                  -1  1   2627584  ultralytics.nn.modules.gold_yolo.RepBlock    [256, 256, 4]                 
 31        [20, 27, 30]  1    897664  ultralytics.nn.modules.head.Detect           [80, [64, 128, 256]]          
YOLOv8n_gold_YOLO_neck_v2 summary: 498 layers, 8210000 parameters, 8209984 gradients

Neck visio

这里附上一张Neck部分执行流程图。
在这里插入图片描述
进一步了解Neck部分各个模块可参考: Gold-YOLO RepGDNeck类解析

资源下载

戳这里下载blog中所需资源

参考资料

(1)Gold-YOLO源码
(1)Gold-YOLO论文
(3)YOLO v8源码
(4)ModuleNotFoundError: No module named ‘mmcv‘

实验结果(23.11.28更新)

这里阐明下我自己的实验结果
数据集TT100K_2021数据集(这是一个交通标志数据集,原本有232类交通标志。但是原始交通标志类别数目极不均衡,我只提取了大于等于100个实例数的交通标志,共有45类)
用于对比的模型配置文件YOLOv8n_tt100k_mt100_P2.yaml(解释一下哈:YOLOv8n:采用YOLOv8n做基准,tt100k_mt100:选择大于等于100(more than 100)的实例数的tt100k数据集,P2: 这个其实很简单的,原本的YOLOv8n.yaml不是输出P3/P4/P5嘛,就在上面一层仿照弄一个P2层,最后多输出一个P2,因为tt100k数据集的图片都是2048*2048的,交通标志大都比较小,多输出P2,就是为了得到更大的特征图,保留小目标的特征。
在这里插入图片描述

model cfgbatchimgszprecisionrecallmap50map50-95GPU
YOLOv8n_tt100k_mt100_P2326400.80.70.7840.5982080Ti,11G
YOLOv8n_tt100k_mt100_P2420480.9090.8850.9440.7492080Ti,11G
yolov8n_gold_yolo_neck_v2486400.7570.6260.7140.5472080Ti,11G
yolov8n_gold_yolo_neck_v21620480.9410.9120.9620.766A40,48G

由于显存的原因,这里并没有严格按照单一变量原则来。

<think>好的,我现在需要解决用户在PyTorch训练过程中遇到的警告问题,具体是关于adaptive_avg_pool2d_backward_cuda没有确定性实现的警告。首先,我得理解这个警告的原因。根据用户提供的引用内容,特别是引用[1]和[4],问题出在启用了确定性算法模式,但当前的操作(adaptive_avg_pool2d_backward_cuda)没有确定性的实现。这通常发生在使用如自适应平均池化这样的操作时,尤其是在反向传播过程中。PyTorch的确定性模式要求所有操作都有确定性的实现,以确保每次运行结果一致,但某些CUDA操作可能不支持这一点。 接下来,我需要整理解决这个问题的方法。根据引用中的解决方案,主要方法有两个:关闭确定性算法或者替换相关模块。关闭确定性算法比较简单,直接在代码中设置torch.use_deterministic_algorithms(False)。不过用户可能希望保持一定的确定性,所以另一个方法是替换自适应池化层为固定尺寸的池化,比如全局平均池化,这样可能避免该问题。此外,引用[4]提到在模型中使用注意力机制时可能出现这个问题,所以需要检查是否有相关模块使用了自适应池化。 然后要考虑用户可能的应用场景,比如他们可能在训练目标检测模型(如YOLO)时添加了注意力机制(如CA或CBAM),这可能导致该问题。需要建议用户检查模型结构中的池化层,并进行相应的修改。另外,需要提醒用户即使关闭了确定性模式,可能会影响结果的可复现性,但大多数情况下影响不大。 最后,生成相关问题,帮助用户深入理解问题,比如如何保持确定性、替代池化方法、检查模型结构等。确保回答结构清晰,步骤明确,并正确引用提供的资料。</think>### 解决方案 PyTorch训练时出现`adaptive_avg_pool2d_backward_cuda`没有确定性实现的警告,通常是因为启用了确定性算法(`torch.use_deterministic_algorithms(True)`),但某些CUDA操作(如自适应池化的反向传播)未提供确定性实现。以下是具体解决步骤: --- #### **方法1:关闭确定性算法** 直接关闭全局确定性算法模式(推荐临时解决方案): ```python import torch torch.use_deterministic_algorithms(False) # 关闭确定性模式 ``` **适用场景**:不需要严格保证训练结果可复现时。 **注意事项**:关闭后可能引入少量随机性,但对大多数任务影响较小[^1][^4]。 --- #### **方法2:替换自适应池化层** 如果模型中使用了`nn.AdaptiveAvgPool2d`,可尝试替换为固定尺寸的池化层(如全局平均池化): ```python # 原代码可能包含: self.pool = nn.AdaptiveAvgPool2d((1, 1)) # 修改为: self.pool = nn.AvgPool2d(kernel_size=input_shape) # 手动指定输入尺寸 ``` **适用场景**:需要保留确定性模式且模型允许修改池化方式时[^4]。 --- #### **方法3:限制随机性来源** 若必须保留确定性模式,可通过以下操作减少其他随机性: 1. 固定随机种子: ```python torch.manual_seed(0) np.random.seed(0) random.seed(0) ``` 2. 设置CUDA卷积算法为确定性模式: ```python torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False ``` **注意事项**:即使如此,`adaptive_avg_pool2d`仍可能触发警告,需结合方法2使用[^3]。 --- ### **原因分析** 1. **确定性模式冲突**:PyTorch的确定性算法要求所有操作(尤其是反向传播)均有确定实现,但CUDA某些操作(如自适应池化)未满足此条件[^3]。 2. **注意力机制影响**:使用CBAM、CA等注意力机制时,内部的自适应池化层可能引发此问题[^2]。 ---
评论 102
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值