秋筠872 2025-09-18 11:36 采纳率: 50%
浏览 5
已结题

stripblock,yolo

https://blog.csdn.net/FJN110/article/details/150110136 您好,我认为这篇文章中有一些些小问题。不应该直接在文末添加(因为我想都没想直接全按照您给出的步骤做了,出现了Strip未定义的问题)

img


应该先在nn.module里面添加您给出的代码中除了C2F的部分作为一个.py文件,然后在block.py中import它,再创建c2f,strip_c3k2吧。如果只想搞一个strip块,是不是只需要把您给出的stripblock更名为strip即可?

  • 写回答

6条回答 默认 最新

  • 宝码香车 优质创作者: JavaScript技术领域 2025-09-18 14:40
    关注

    让【宝码香车】来帮您解答,本回答参考DeepSeek编写,并整理提供。

    如果答案让您满意,请采纳、点赞、关注,非常感谢!
    .
    每日一句正能量,让它带给您好心情:生活不会辜负一个用力奔跑的人。
    .

    根据您提供的信息,您遇到的问题是在为YOLO模型添加Strip模块时出现了Strip未定义的错误。这通常是由于模块定义与导入不正确导致的。以下是正确的解决方案:

    问题分析

    原方案直接在block.py文末添加代码,但未提前定义Strip模块,导致在__all__列表中引用时出现NameError

    解决方案

    1. 创建Strip模块定义

    首先,在ultralytics/nn/modules/目录下创建一个新文件(例如strip.py),包含Strip模块的定义:

    import torch
    import torch.nn as nn
    
    
    class Strip(nn.Module):
        def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True):
            super().__init__()
            self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p), groups=g, bias=False)
            self.bn = nn.BatchNorm2d(c2)
            self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())
        
        def forward(self, x):
            return self.act(self.bn(self.conv(x)))
        
        def forward_fuse(self, x):
            return self.act(self.conv(x))
    
    
    def drop_path(x, drop_prob: float = 0., training: bool = False):
        if drop_prob == 0. or not training:
            return x
        keep_prob = 1 - drop_prob
        shape = (x.shape[0],) + (1,) * (x.ndim - 1)
        random_tensor = keep_prob + torch.rand(shape, dtype=x.dtype, device=x.device)
        random_tensor.floor_()
        output = x.div(keep_prob) * random_tensor
        return output
    
    
    class DropPath(nn.Module):
        def __init__(self, drop_prob=None):
            super(DropPath, self).__init__()
            self.drop_prob = drop_prob
    
    
        def forward(self, x):
            return drop_path(x, self.drop_prob, self.training)
    

    2. 修改block.py

    ultralytics/nn/modules/block.py文件中进行以下修改:

    顶部添加导入

    from .strip import Strip, DropPath
    

    __all__列表中添加引用

    __all__ = [
        "Strip",  # 新增Strip模块
        "DSC3k2", # 其他模块...
    ]
    

    3. 关于StripBlock重命名

    如果您只需要一个基础的Strip块,直接将类名定义为Strip(而非StripBlock)是正确的做法。上述代码中的Strip类已满足基础结构要求。

    验证步骤

    1. 确保文件结构正确:
      ultralytics/
      └── nn/
          └── modules/
              ├── block.py
              └── strip.py  # 新建的文件
    
    1. 在Python中测试导入是否正常:
      from ultralytics.nn.modules.block import Strip
      print(Strip(3, 64))  # 应正常输出模块结构
    

    注意事项

    • 如果您的模型需要其他自定义模块(如DSC3k2),需同样在strip.py中定义并在block.py中导入。
    • 确保所有自定义模块的类名与__all__中的名称一致。

    这样修改后,即可避免Strip未定义的错误,并能正确使用自定义模块。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(5条)

报告相同问题?

问题事件

  • 系统已结题 9月26日
  • 已采纳回答 9月18日
  • 创建了问题 9月18日