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)


目录
相关文章
|
算法 计算机视觉
OpenCV(三十七):拟合直线、三角形和圆形
OpenCV(三十七):拟合直线、三角形和圆形
679 0
|
编解码 缓存 并行计算
YOLOv5入门实践(4)——手把手教你训练自己的数据集
YOLOv5入门实践(4)——手把手教你训练自己的数据集
3082 0
YOLOv5入门实践(4)——手把手教你训练自己的数据集
|
8月前
|
机器学习/深度学习 数据可视化 机器人
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
扩散模型和流匹配是生成高分辨率数据(如图像和机器人轨迹)的先进技术。扩散模型通过逐步去噪生成数据,其代表应用Stable Diffusion已扩展至机器人学领域形成“扩散策略”。流匹配作为更通用的方法,通过学习时间依赖的速度场将噪声转化为目标分布,适用于图像生成和机器人轨迹生成,且通常以较少资源实现更快生成。 本文深入解析流匹配在图像生成中的应用,核心思想是将图像视为随机变量的实现,并通过速度场将源分布转换为目标分布。文中提供了一维模型训练实例,展示了如何用神经网络学习速度场,以及使用最大均值差异(MMD)改进训练效果。与扩散模型相比,流匹配结构简单,资源需求低,适合多模态分布生成。
613 13
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
5112 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
机器学习/深度学习 人工智能 前端开发
转载:【AI系统】AI编译器前瞻
本文基于《The Deep Learning Compiler: A Comprehensive Survey》调研,对比了TVM、nGraph、TC、Glow和XLA五个热门AI编译器,介绍了它们的特点与优势。文章还探讨了AI编译器面临的挑战,如动态Shape问题、Python编译静态化、硬件性能优化等,并展望了AI编译器的未来发展方向,包括自动并行、自动微分和Kernel自动生成等技术。
转载:【AI系统】AI编译器前瞻
|
XML JSON 数据可视化
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
本文介绍了labelImg和labelme两款图像标注工具的安装、使用、数据转换和验证方法,适用于目标检测和图像分割任务,支持YOLO等数据集格式。
3669 2
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
|
机器学习/深度学习 数据可视化 PyTorch
YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py
YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py
3146 1
YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py
|
XML 编解码 数据挖掘
YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml
YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml
3259 1
YOLOv5源码逐行超详细注释与解读(5)——配置文件yolov5s.yaml
|
机器学习/深度学习 人工智能 计算机视觉
【YOLOv8-seg】实战一:手把手教你使用YOLOv8实现实例分割
【YOLOv8-seg】实战一:手把手教你使用YOLOv8实现实例分割
7237 0
【YOLOv8-seg】实战一:手把手教你使用YOLOv8实现实例分割
|
PyTorch Serverless 算法框架/工具
YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py
YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py
4233 0
YOLOv5源码逐行超详细注释与解读(6)——网络结构(1)yolo.py