YOLOv5图像分割--SegmentationModel类代码详解(上)

简介: 笔记

15.png

SegmentationModel类


定义model将会调用models/yolo.py中的类SegmentationModel。该类是继承父类--DetectionModel类。


class SegmentationModel(DetectionModel):  # SegmentationModel这个类是继承了DetectionModel这个类
    # YOLOv5 segmentation model
    def __init__(self, cfg='yolov5s-seg.yaml', ch=3, nc=None, anchors=None):
        super().__init__(cfg, ch, nc, anchors)

DetectionModel类


因此直接去看下DetectionModel这个类代码,同时也能发现这个类又是继承BaseModel这个类。这里先看一下DetectionModel,后面再看BaseModel这个类。这个类的功能可以根据yaml文件定义网络【定义网络的函数为parse_model()】,在分割任务中,anchors为None。


class DetectionModel(BaseModel):  # 继承BaseModel这个类
    # YOLOv5 detection model
    def __init__(self, cfg='yolov5s.yaml', ch=3, nc=None, anchors=None):  # model, input channels, number of classes
        super().__init__()
        if isinstance(cfg, dict):
            self.yaml = cfg  # model dict
        else:  # is *.yaml
            import yaml  # for torch hub
            self.yaml_file = Path(cfg).name
            with open(cfg, encoding='ascii', errors='ignore') as f:
                self.yaml = yaml.safe_load(f)  # model dict
        # Define model
        ch = self.yaml['ch'] = self.yaml.get('ch', ch)  # input channels
        if nc and nc != self.yaml['nc']:
            LOGGER.info(f"Overriding model.yaml nc={self.yaml['nc']} with nc={nc}")
            self.yaml['nc'] = nc  # override yaml value
        if anchors:
            LOGGER.info(f'Overriding model.yaml anchors with anchors={anchors}')
            self.yaml['anchors'] = round(anchors)  # override yaml value
        self.model, self.save = parse_model(deepcopy(self.yaml), ch=[ch])  # model, savelist


得到的model如下,这里需要注意的是此时的self指SegmentationModel类。

Sequential(

 (0): Conv(

   (conv): Conv2d(3, 32, kernel_size=(6, 6), stride=(2, 2), padding=(2, 2), bias=False)

   (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (1): Conv(

   (conv): Conv2d(32, 64, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)

   (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (2): C3(

   (cv1): Conv(

     (conv): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(64, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(32, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (3): Conv(

   (conv): Conv2d(64, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)

   (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (4): C3(

   (cv1): Conv(

     (conv): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(128, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

     (1): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (5): Conv(

   (conv): Conv2d(128, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)

   (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (6): C3(

   (cv1): Conv(

     (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

     (1): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

     (2): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (7): Conv(

   (conv): Conv2d(256, 512, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)

   (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (8): C3(

   (cv1): Conv(

     (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (9): SPPF(

   (cv1): Conv(

     (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(1024, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): MaxPool2d(kernel_size=5, stride=1, padding=2, dilation=1, ceil_mode=False)

 )

 (10): Conv(

   (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

   (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (11): Upsample(scale_factor=2.0, mode=nearest)

 (12): Concat()

 (13): C3(

   (cv1): Conv(

     (conv): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(512, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (14): Conv(

   (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

   (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (15): Upsample(scale_factor=2.0, mode=nearest)

 (16): Concat()

 (17): C3(

   (cv1): Conv(

     (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(256, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(64, 64, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (18): Conv(

   (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)

   (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (19): Concat()

 (20): C3(

   (cv1): Conv(

     (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(256, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(128, 128, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (21): Conv(

   (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(2, 2), padding=(1, 1), bias=False)

   (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

   (act): SiLU()

 )

 (22): Concat()

 (23): C3(

   (cv1): Conv(

     (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv2): Conv(

     (conv): Conv2d(512, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (cv3): Conv(

     (conv): Conv2d(512, 512, kernel_size=(1, 1), stride=(1, 1), bias=False)

     (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

     (act): SiLU()

   )

   (m): Sequential(

     (0): Bottleneck(

       (cv1): Conv(

         (conv): Conv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), bias=False)

         (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

       (cv2): Conv(

         (conv): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

         (bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

         (act): SiLU()

       )

     )

   )

 )

 (24): Segment(

   (m): ModuleList(

     (0): Conv2d(128, 351, kernel_size=(1, 1), stride=(1, 1))

     (1): Conv2d(256, 351, kernel_size=(1, 1), stride=(1, 1))

     (2): Conv2d(512, 351, kernel_size=(1, 1), stride=(1, 1))

   )

   (proto): Proto(

     (cv1): Conv(

       (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

       (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

       (act): SiLU()

     )

     (upsample): Upsample(scale_factor=2.0, mode=nearest)

     (cv2): Conv(

       (conv): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), bias=False)

       (bn): BatchNorm2d(128, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

       (act): SiLU()

     )

     (cv3): Conv(

       (conv): Conv2d(128, 32, kernel_size=(1, 1), stride=(1, 1), bias=False)

       (bn): BatchNorm2d(32, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

       (act): SiLU()

     )

   )

 )

)


然后继续看下面的代码,m=self.model[-1]是获取上面定义model的最后一个模块即Segment类【这个类又继承Detect类,这个】,所以此时的m类型为Segment类。然后看forward 的lambda表达式那行, 由于通过isinstance判断m为Segment为True,所以此时调用SegmentationModel类的forward函数,并且可以回看前面SegmentationModel这个类发现没有重新父类DetectionModel的forward函数,所以这里直接调用父类的forward即可。  

        # Build strides, anchors
        m = self.model[-1]  # Detect()
        if isinstance(m, (Detect, Segment)):
            s = 256  # 2x min stride
            m.inplace = self.inplace
            forward = lambda x: self.forward(x)[0] if isinstance(m, Segment) else self.forward(x)


目录
相关文章
|
20天前
|
机器学习/深度学习 开发工具 计算机视觉
YOLOv8 目标检测 | 自定义数据集
YOLOv8 目标检测 | 自定义数据集
|
机器学习/深度学习 编解码 算法
yolo原理系列——yolov1--yolov5详细解释
yolo原理系列——yolov1--yolov5详细解释
940 0
yolo原理系列——yolov1--yolov5详细解释
|
4天前
|
算法 文件存储 计算机视觉
【YOLOv8改进】MobileNetV3替换Backbone (论文笔记+引入代码)
YOLO目标检测专栏探讨了MobileNetV3的创新改进,该模型通过硬件感知的NAS和NetAdapt算法优化,适用于手机CPU。引入的新架构包括反转残差结构和线性瓶颈层,提出高效分割解码器LR-ASPP,提升了移动设备上的分类、检测和分割任务性能。MobileNetV3-Large在ImageNet上准确率提升3.2%,延迟降低20%,COCO检测速度增快25%。MobileNetV3-Small则在保持相近延迟下,准确率提高6.6%。此外,还展示了MobileNetV3_InvertedResidual模块的代码实现。
|
4天前
|
机器学习/深度学习 编解码 计算机视觉
【YOLOv8改进】 SPD-Conv空间深度转换卷积,处理低分辨率图像和小对象问题 (论文笔记+引入代码)
YOLO目标检测专栏探讨了CNN在低分辨率和小目标检测中的局限性,提出SPD-Conv新架构,替代步长卷积和池化层,通过空间到深度层和非步长卷积保持细粒度信息。创新点包括消除信息损失、通用设计和性能提升。YOLOv5和ResNet应用SPD-Conv后,在困难任务上表现优越。详情见YOLO有效改进系列及项目实战目录。
|
13天前
|
机器学习/深度学习 数据采集 PyTorch
YOLO3的代码例子
YOLO3的代码例子
|
20天前
|
编解码 并行计算 测试技术
如何使用 YOLOv5 获得最佳 mAP 和最佳训练结果
如何使用 YOLOv5 获得最佳 mAP 和最佳训练结果
413 0
|
20天前
|
存储 自动驾驶 安全
基于 YOLOv8 的图像分割 demo
基于 YOLOv8 的图像分割 demo
|
11月前
|
机器学习/深度学习 PyTorch 算法框架/工具
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成 上
|
11月前
|
机器学习/深度学习 PyTorch 算法框架/工具
使用PyTorch构建卷积GAN源码(详细步骤讲解+注释版) 02人脸图片生成下
生成器的结构应与鉴别器相逆,因此生成器不再使用卷积操作,而是使用卷积的逆向操作,我们称之为转置卷积(transposed convolution)。
|
11月前
|
机器学习/深度学习 PyTorch 语音技术
使用PyTorch构建卷积神经网络(CNN)源码(详细步骤讲解+注释版) 01 手写数字识别
在使用PyTorch构建GAN生成对抗网络一文中,我们使用GAN构建了一个可以生成人脸图像的模型。但尽管是较为简单的模型,仍占用了1G左右的GPU内存,因此需要探索更加节约资源的方式。

热门文章

最新文章