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(三十七):拟合直线、三角形和圆形
644 0
|
编解码 缓存 并行计算
YOLOv5入门实践(4)——手把手教你训练自己的数据集
YOLOv5入门实践(4)——手把手教你训练自己的数据集
3039 0
YOLOv5入门实践(4)——手把手教你训练自己的数据集
|
Ubuntu Linux
ubuntu打开usb摄像头
ubuntu打开usb摄像头
1485 0
|
7月前
|
机器学习/深度学习 数据可视化 机器人
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
扩散模型和流匹配是生成高分辨率数据(如图像和机器人轨迹)的先进技术。扩散模型通过逐步去噪生成数据,其代表应用Stable Diffusion已扩展至机器人学领域形成“扩散策略”。流匹配作为更通用的方法,通过学习时间依赖的速度场将噪声转化为目标分布,适用于图像生成和机器人轨迹生成,且通常以较少资源实现更快生成。 本文深入解析流匹配在图像生成中的应用,核心思想是将图像视为随机变量的实现,并通过速度场将源分布转换为目标分布。文中提供了一维模型训练实例,展示了如何用神经网络学习速度场,以及使用最大均值差异(MMD)改进训练效果。与扩散模型相比,流匹配结构简单,资源需求低,适合多模态分布生成。
490 13
比扩散策略更高效的生成模型:流匹配的理论基础与Pytorch代码实现
|
机器学习/深度学习 JSON 算法
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-Seg模型进行图像分割的完整流程,包括图像分割的基础知识、YOLOv5-Seg模型的特点、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。通过实例代码,指导读者从自定义数据集开始,直至模型的测试验证,适合深度学习领域的研究者和开发者参考。
4721 3
实例分割笔记(一): 使用YOLOv5-Seg对图像进行分割检测完整版(从自定义数据集到测试验证的完整流程)
|
XML JSON 数据可视化
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
本文介绍了labelImg和labelme两款图像标注工具的安装、使用、数据转换和验证方法,适用于目标检测和图像分割任务,支持YOLO等数据集格式。
3345 2
数据集学习笔记(六):目标检测和图像分割标注软件介绍和使用,并转换成YOLO系列可使用的数据集格式
|
机器学习/深度学习 算法 PyTorch
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
本文详细介绍了使用YOLOv5-7.0版本进行目标检测的完整流程,包括算法介绍、环境搭建、数据集准备、模型训练、验证、测试以及评价指标。YOLOv5以其高精度、快速度和模型小尺寸在计算机视觉领域受到广泛应用。
5615 0
目标检测实战(五): 使用YOLOv5-7.0版本对图像进行目标检测完整版(从自定义数据集到测试验证的完整流程)
|
机器学习/深度学习 算法 Go
YOLOv5网络结构解析
YOLOv5网络结构解析
|
算法 Go vr&ar
YOLOv8模型yaml结构图理解(逐层分析)
YOLOv8模型yaml结构图理解(逐层分析)
18111 0
|
机器学习/深度学习 数据可视化 PyTorch
YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py
YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py
3068 1
YOLOv5源码逐行超详细注释与解读(2)——推理部分detect.py