当前位置: 首页 > news >正文

主干网络篇 | YOLOv5/v7 更换主干网络之 ResNet50/ResNet101 | 对比实验必备

主干网络篇 | YOLOv5/v7 更换主干网络之 ResNet50/ResNet101 | 对比实验必备

1. 简介

ResNet 是近年来最受欢迎的深度卷积神经网络架构之一,它以其优异的性能和鲁棒性而著称。ResNet50 和 ResNet101 是 ResNet 家族中最常用的两个模型,它们分别具有 50 层和 101 层残差块。

YOLOv5 和 YOLOv7 是目前流行的实时目标检测框架,它们以其快速、准确的检测性能而著称。然而,YOLOv5/v7 的默认主干网络通常是轻量级的,例如 Darknet53 或 CSPDarknet53,这可能会导致模型精度略逊于其他更复杂的模型。

将 ResNet50/ResNet101 作为主干网络替换 YOLOv5/v7 中原有骨干网络可以显著提高模型的精度,但同时也增加了模型的计算量。

2. 原理详解

ResNet 的核心思想是通过引入残差连接来解决深度卷积神经网络的梯度消失问题。残差连接可以将输入特征直接传递到输出特征,从而使梯度更容易流过网络。

ResNet 的基本结构如下图所示:

​编辑Opens in a new window​编辑www.researchgate.net

ResNet basic structure

ResNet50 和 ResNet101 的主要区别在于它们残差块的数量。ResNet50 具有 4 个阶段,每个阶段包含 3 个或 4 个残差块。ResNet101 具有 5 个阶段,每个阶段包含 3 个或 4 个残差块。

3. 应用场景解释

将 ResNet50/ResNet101 作为主干网络替换 YOLOv5/v7 中原有骨干网络具有以下优势:

  • 提高模型精度: ResNet50/ResNet101 在 ImageNet 数据集上取得了 76.1% 和 82.1% 的 Top-1 准确率,显著高于 YOLOv5/v7 默认主干网络的精度。
  • 扩展模型应用场景: ResNet50/ResNet101 可以应用于更复杂的场景,例如医学图像分析、遥感图像分析等。

4. 算法实现

将 ResNet50/ResNet101 作为主干网络替换 YOLOv5/v7 中原有骨干网络的具体步骤如下:

  1. 下载 ResNet50/ResNet101 预训练权重: 从 PyTorch 官方网站下载 ResNet50/ResNet101 预训练权重。
  2. 修改 YOLOv5/v7 代码: 修改 YOLOv5/v7 代码,将原有的骨干网络替换为 ResNet50/ResNet101。
  3. 训练模型: 如果需要,可以对模型进行微调以提高性能。

5. 完整代码实现

import torch
import torch.nn as nn
from torchvision.models import resnet50, resnet101


class ResNetBackbone(nn.Module):
    def __init__(self, pretrained=True):
        super(ResNetBackbone, self).__init__()

        if pretrained:
            self.resnet = resnet50(pretrained=True)
        else:
            self.resnet = resnet50()

        self.layer1 = self.resnet.conv1
        self.layer2 = self.resnet.layer1
        self.layer3 = self.resnet.layer2
        self.layer4 = self.resnet.layer3

    def forward(self, x):
        x = self.layer1(x)
        x = self.layer2(x)
        x = self.layer3(x)
        x = self.layer4(x)
        return x


def get_resnet_backbone(pretrained=True):
    return ResNetBackbone(pretrained=pretrained)


def get_backbone(name, **kwargs):
    """Get a backbone by name."""

    if name == 'resnet50':
        return get_resnet_backbone(**kwargs)
    elif name == 'resnet101':
        return get_resnet_backbone(**kwargs)
    else:
        raise ValueError('Unknown backbone name: {}'.format(name))

 

6. 部署测试搭建实现

将 ResNet50/ResNet101 作为主干网络的 YOLOv5/v7 模型可以部署在各种平台上,包括:

  • CPU: ResNet50
        return get_resnet_backbone(**kwargs)
    else:
        raise ValueError('Unknown backbone name: {}'.format(name))

Python

import torch
import torch.nn as nn
from torch.hub import load_state_dict_from_url


class Darknet(nn.Module):
    def __init__(self, pretrained=False, cfg='yolov5s.yaml'):
        super().__init__()
        if pretrained:
            print(f"Loading YOLOv5 {cfg} pretrained model")
            self.model = load_state_dict_from_url(
                f"https://github.com/ultralytics/yolov5/blob/master/models/{cfg}",
                strict=True,
            )
        else:
            print(f"Creating YOLOv5 {cfg} model")
            self.model = torch.hub.load(
                "ultralytics/yolov5", cfg, pretrained=False
            )

    def forward(self, x):
        return self.model(x)


def get_backbone(name, **kwargs):
    """Get a backbone by name."""

    if name == 'darknet53':
        return Darknet(**kwargs)
    elif name == 'cspdarknet53':
        return CSPDarknet(**kwargs)
    else:
        raise ValueError('Unknown backbone name: {}'.format(name))


def get_model(cfg, pretrained=False, backbone='darknet53'):
    """Create a YOLOv5 model."""

    backbone = get_backbone(backbone, pretrained=pretrained)
    model = Model(backbone, cfg)
    return model

 

YOLOv7 完整代码实现

import torch
import torch.nn as nn
from ultralytics.models.common import ConvBNFuse


class Darknet(nn.Module):
    def __init__(self, pretrained=False, cfg='yolov7.yaml'):
        super().__init__()
        if pretrained:
            print(f"Loading YOLOv7 {cfg} pretrained model")
            self.model = load_state_dict_from_url(
                f"https://github.com/ultralytics/yolov7/blob/master/models/{cfg}",
                strict=True,
            )
        else:
            print(f"Creating YOLOv7 {cfg} model")
            self.model = torch.hub.load(
                "ultralytics/yolov7", cfg, pretrained=False
            )

    def forward(self, x):
        return self.model(x)


def get_backbone(name, **kwargs):
    """Get a backbone by name."""

    if name == 'cspdarknet53':
        return CSPDarknet(**kwargs)
    elif name == 'cspdarknet53_v2':
        return CSPDarknetV2(**kwargs)
    else:
        raise ValueError('Unknown backbone name: {}'.format(name))


def get_model(cfg, pretrained=False, backbone='cspdarknet53'):
    """Create a YOLOv7 model."""

    backbone = get_backbone(backbone, pretrained=pretrained)
    model = Model(backbone, cfg)
    return model

 

HGNetv2 完整代码实现

import paddle
import paddle.nn as nn
from ppcv.modeling import backbones


class HGNetv2(nn.Layer):
    def __init__(self, channels=[64, 128, 256, 512, 1024]):
        super(HGNetv2, self).__init__()

        self.stages = nn.Sequential(
            _hgnet_stage(channels[0], name='stage1'),
            _hgnet_stage(channels[1], name='stage2'),
            _hgnet_stage(channels[2], name='stage3'),
            _hgnet_stage(channels[3], name='stage4'),
            _hgnet_stage(channels[4], name='stage5'),
        )

    def forward(self, x):
        return self.stages(x)


def _hgnet_stage(filters, name):
    return nn.Sequential(
        _hgnet_block(filters, name=name + '_block1'),
        _hgnet_block(filters, name=name + '_block2'),
        _hgnet_block(filters, name=name + '_block3'),
    )

6. 部署测试搭建实现

将 ResNet50/ResNet101 作为主干网络的 YOLOv5/v7 模型可以部署在各种平台上,包括:

  • CPU: ResNet50/ResNet101 的推理速度较慢,在 CPU 上部署可能会比较慢。
  • GPU: 在 GPU 上部署 ResNet50/ResNet101 可以获得更高的性能。
  • 服务器: ResNet50/ResNet101 可以部署在服务器上,用于处理大规模的目标检测任务。

部署测试搭建的具体步骤取决于所使用的平台和硬件。以下是一些通用的步骤:

  1. 安装依赖库: 安装 PyTorch、YOLOv5/v7 等必要的库。
  2. 下载模型权重: 下载训练好的 ResNet50/ResNet101 YOLOv5/v7 模型权重。
  3. 转换模型格式: 如果需要,将模型权重转换为目标平台的格式。
  4. 部署模型: 将模型部署到目标平台上。
  5. 测试模型: 测试模型的性能和精度。

7. 文献材料链接

  • Deep Residual Learning for Image Recognition
  • YOLOv5: An Enhanced Version of YOLOv3
  • PP-LCNet: An Efficient Convolutional Neural Network for Image Classification

8. 应用示例产品

将 ResNet50/ResNet101 作为主干网络的 YOLOv5/v7 模型已经应用于各种产品和场景中,例如:

  • 智能安防: ResNet50/ResNet101 可以用于智能安防系统,进行实时的人脸识别、物体识别等。
  • 自动驾驶: ResNet50/ResNet101 可以用于自动驾驶系统,进行障碍物检测、车道线识别等。
  • 医学图像分析: ResNet50/ResNet101 可以用于医学图像分析,进行病灶检测、器官分割等。

9. 总结

将 ResNet50/ResNet101 作为主干网络替换 YOLOv5/v7 中原有骨干网络可以显著提高模型的精度,但同时也增加了模型的计算量。

10. 影响

ResNet 的出现对深度卷积神经网络架构设计产生了深远的影响,它证明了通过引入残差连接可以有效地提高模型的性能和鲁棒性。

11. 未来扩展

未来,可以继续探索更有效的 ResNet 变体,并将其应用于更多类型的模型和任务中。

 

相关文章:

  • RIP路由协议汇总、版本兼容、定时器、协议优先级配置(华为)
  • hive拉链表详解
  • 制作WIFI二维码,实现一键扫描连接WIFI
  • 【无线传感网】LEACH路由算法
  • 动态 SQL
  • qt登录和闹钟实现
  • 修改SpringBoot项目配置文件
  • Python爬虫框架:Scrapy、EasySpider与FEAPDER的比较与实践
  • Vue70-路由的几个注意点
  • 计算机网络 MAC地址表管理
  • Zookeeper基础教程
  • 千年古城的味蕾传奇-平凉锅盔
  • HAL库开发--串口
  • windows安装spark
  • 浏览器支持http-flv协议
  • 网络虚拟化考题
  • 番外篇 | YOLOv8算法解析和实战应用:车辆检测 + 车辆追踪 + 行驶速度计算
  • Redis高并发高可用
  • 山东济南比较出名的起名大师的老师,中国最厉害的改名大师颜廷利:短命的小草,年年自损;长寿的大树,万古长青。。。(升命学说)
  • 华为Atlas NPU ffmpeg 编译安装
  • 冯德莱恩:欧美贸易谈判前不会前往美国会见特朗普
  • 19个剧团15台演出,上海民营院团尝试文旅融合新探索
  • 新村回响:一周城市生活
  • 前4个月我国货物贸易进出口同比增长2.4%,增速较一季度加快1.1个百分点
  • 妻子藏匿一岁幼儿一年多不让丈夫见,法院发出人格权侵害禁令
  • 北京:下调个人住房公积金贷款利率