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)


目录
打赏
0
0
0
0
78
分享
相关文章
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
527 0
YOLOv5改进 | 检测头篇 | 增加辅助检测头利用AFPN改进Head(附详细修改教程)
YOLOv5改进 | 检测头篇 | 增加辅助检测头利用AFPN改进Head(附详细修改教程)
775 0
YOLOv5入门实践(4)——手把手教你训练自己的数据集
YOLOv5入门实践(4)——手把手教你训练自己的数据集
2841 0
YOLOv5入门实践(4)——手把手教你训练自己的数据集
【机器学习】过拟合和欠拟合怎么判断,如何解决?(面试回答)
本文介绍了如何通过观察训练误差和验证误差来判断模型是否出现过拟合或欠拟合,并提供了相应的解决方案,包括增加数据、调整模型复杂度、使用正则化技术等。
995 1
【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】(1)
【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】
【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】(1)
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
2931 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】(2)
【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问