深度学习和计算机视觉中的backbone

在深度学习和计算机视觉中,“backbone” 是指深度神经网络的主要部分,通常用于特征提取。骨干网络通过卷积操作提取图像中的低级和高级特征,为后续的特定任务(如分类、检测、分割等)提供丰富的信息。这些骨干网络一般是预训练的,即在大型数据集(如ImageNet)上进行训练,以便在各种下游任务中实现良好的性能。以下是对深度学习和计算机视觉中骨干网络的详细解释:

1. 主要骨干网络

ResNet(残差网络)

ResNet 是一种非常流行的骨干网络,由残差块组成,这些块通过跳跃连接解决了深层网络中的梯度消失问题。ResNet 可以有不同的深度,如 ResNet-18、ResNet-50、ResNet-101 等。以下是 ResNet 的一个基本残差块:

class BasicBlock(nn.Module):def __init__(self, in_channels, out_channels):super(BasicBlock, self).__init__()self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)self.bn1 = nn.BatchNorm2d(out_channels)self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, padding=1)self.bn2 = nn.BatchNorm2d(out_channels)self.relu = nn.ReLU(inplace=True)self.shortcut = nn.Sequential()if in_channels != out_channels:self.shortcut = nn.Sequential(nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1),nn.BatchNorm2d(out_channels))def forward(self, x):out = self.relu(self.bn1(self.conv1(x)))out = self.bn2(self.conv2(out))out += self.shortcut(x)out = self.relu(out)return out
VGG(Visual Geometry Group 网络)

VGG 是另一种经典的骨干网络,结构简单,由多个卷积层和池化层组成。VGG 的特点是使用小的卷积核(3x3)和较深的网络(如 VGG-16、VGG-19)。以下是一个简化的 VGG 模型:

class VGG(nn.Module):def __init__(self):super(VGG, self).__init__()self.features = nn.Sequential(nn.Conv2d(3, 64, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),nn.Conv2d(64, 128, kernel_size=3, padding=1),nn.ReLU(inplace=True),nn.MaxPool2d(kernel_size=2, stride=2),# 继续添加卷积层和池化层)self.classifier = nn.Sequential(nn.Linear(128 * 8 * 8, 4096),nn.ReLU(inplace=True),nn.Linear(4096, 4096),nn.ReLU(inplace=True),nn.Linear(4096, 1000))def forward(self, x):x = self.features(x)x = torch.flatten(x, 1)x = self.classifier(x)return x
MobileNet

MobileNet 是为移动和嵌入式设备设计的轻量级骨干网络。它使用深度可分离卷积来减少计算量和参数数量。以下是一个简单的 MobileNet 模块:

class DepthwiseSeparableConv(nn.Module):def __init__(self, in_channels, out_channels, stride=1):super(DepthwiseSeparableConv, self).__init__()self.depthwise = nn.Conv2d(in_channels, in_channels, kernel_size=3, stride=stride, padding=1, groups=in_channels)self.pointwise = nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1)self.bn = nn.BatchNorm2d(out_channels)self.relu = nn.ReLU(inplace=True)def forward(self, x):x = self.depthwise(x)x = self.pointwise(x)x = self.bn(x)x = self.relu(x)return x

2. 使用骨干网络进行下游任务

图像分类

在图像分类中,通常会使用预训练的骨干网络来提取特征,然后添加一个新的分类头进行特定任务的分类。例如:

import torch
import torch.nn as nn
from torchvision import models# 加载预训练的 ResNet-50 模型
backbone = models.resnet50(pretrained=True)# 修改最后一层,使其适应我们的分类任务
num_features = backbone.fc.in_features
backbone.fc = nn.Linear(num_features, 10)  # 假设我们有 10 个类别# 打印模型架构
print(backbone)
目标检测

在目标检测任务中,如 Faster R-CNN、YOLO、SSD 等,骨干网络用于提取特征图,这些特征图将用于预测边界框和类别。例如,Faster R-CNN 使用骨干网络生成特征图,然后通过区域提议网络(RPN)生成候选区域:

import torch
import torchvision
from torchvision.models.detection import FasterRCNN
from torchvision.models.detection.rpn import AnchorGenerator# 加载预训练的 ResNet-50 模型
backbone = torchvision.models.resnet50(pretrained=True)
backbone = torch.nn.Sequential(*list(backbone.children())[:-2])
backbone.out_channels = 2048# 定义RPN锚点生成器
rpn_anchor_generator = AnchorGenerator(sizes=((32, 64, 128, 256, 512),),aspect_ratios=((0.5, 1.0, 2.0),) * 5
)# 定义特征图裁剪池化
roi_pooler = torchvision.ops.MultiScaleRoIAlign(featmap_names=['0'],output_size=7,sampling_ratio=2
)# 定义 Faster R-CNN 模型
model = FasterRCNN(backbone,num_classes=91,  # COCO 数据集有 80 个类 + 1 个背景类rpn_anchor_generator=rpn_anchor_generator,box_roi_pool=roi_pooler
)# 打印模型架构
print(model)
语义分割

在语义分割任务中,如 UNet、DeepLab 等,骨干网络用于提取多尺度特征,然后通过解码器部分生成像素级别的预测。例如,DeepLab 使用骨干网络提取特征,并通过空洞卷积和解码器进行分割:

import torch
import torch.nn as nn
from torchvision import models# 加载预训练的 ResNet-50 模型
backbone = models.resnet50(pretrained=True)# 修改 ResNet-50,去掉最后的全连接层
backbone = nn.Sequential(*list(backbone.children())[:-2])# 定义 DeepLab 的空洞卷积部分和解码器部分
class DeepLabHead(nn.Sequential):def __init__(self, in_channels, num_classes):super(DeepLabHead, self).__init__(nn.Conv2d(in_channels, 256, kernel_size=3, padding=1, dilation=1),nn.BatchNorm2d(256),nn.ReLU(),nn.Conv2d(256, num_classes, kernel_size=1))# 定义 DeepLab 模型
class DeepLab(nn.Module):def __init__(self, backbone, classifier):super(DeepLab, self).__init__()self.backbone = backboneself.classifier = classifierdef forward(self, x):x = self.backbone(x)x = self.classifier(x)return x# 实例化 DeepLab 模型
model = DeepLab(backbone, DeepLabHead(2048, 21))  # 假设有 21 个分割类
print(model)

结论

在深度学习和计算机视觉中,骨干网络是用于特征提取的核心组件。选择合适的骨干网络并根据具体任务进行调整,是实现高效和准确模型的关键。通过利用预训练的骨干网络,可以加速训练过程,并在各种视觉任务中取得良好的性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电磁兼容整改时磁环怎么选型

电磁兼容整改时磁环怎么选型 磁环的选型错误磁环特性纳米微晶磁环磁环选型示例磁环选型 一条线缆两端都有设备,那磁环应该放在哪里? 我们怎么样来选择这个磁环,通过磁环的吸收作用,让辐射的强度和传导发射的这个强度衰减更大的那我…

OLED C语言编程:深度解析与实战应用

OLED C语言编程:深度解析与实战应用 OLED显示技术以其出色的显示效果和低功耗特性,在现代电子设备中得到了广泛应用。而C语言作为一种高效、灵活的编程语言,自然成为OLED编程的首选。本文将从四个方面、五个方面、六个方面和七个方面&#x…

Linux|虚拟机|Windows 11 家庭版的Hyper虚拟机服务开启

前言: Windows11的版本是比较多的,但有的时候笔记本预装的可能是家庭版,而家庭版的Windows通常是不支持虚拟机的,也就是说Hyper服务根本就看不到 Windows的程序和功能大体如下: 🆗,那么如何开…

最近关于工作与学习的一点思考

文章目录 关于工作关于学习职业规划 关于工作 我2015年大学毕业,工作到现在,差不多九个年头了。最近换工作,有一些沉淀的想法,分享一下我是在淮南读的大学,毕业后就到合肥工作了,直到现在。回过头看&#…

一、初识Qt 之 Hello world

一、初识Qt 之 Hello world 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 初识Qt 之 Hello world文章目录 一、Qt 简介二、Qt 获取安装三、Qt 初步使用四、Qt 之 Hello world1.新建一个项目 总结 一、Qt 简介 C &#xf…

数据库系统概论(超详解!!!)第十节 过程化SQL

1.Transact-SQL概述 SQL(Structure Query Language的简称,即结构化查询语言) 是被国际标准化组织(ISO)采纳的标准数据库语言,目前所有关系数据库管理系统都以SQL作为核心,在JAVA、VC、VB、Delphi等程序设计语言中也可使用SQL,它是…

重生之我想写后端

Vue Element Plus 简单的响应式侧边栏 利用onMounted,初次加载页面的时候,为页面注册一个监听器。 当 ‘resize’ 事件发生时, 触发函数。 此函数里监听窗口大小,当窗口小于 500px 时,改变 isCollpase boolean 值。 …

利用元宇宙NFG+IPO线上营销,打造新商业模型

随着互联网技术的飞速发展,商业模式和创新方式层出不穷。特别是在移动电商和区块链技术的双重推动下,市场格局正在经历一场深刻的变革。然而,随着竞争加剧和监管收紧,如何构建一个既能吸引用户又能保持系统稳定的商业模型&#xf…

Chapter 5 Current Mirrors and Biasing Techniques

Chapter 5 Current Mirrors and Biasing Techniques 这一章介绍电流镜 5.1 Basic Current Mirrors MOS工作在饱和区, 表现为一个电流源. 考虑电源变化, PVT波动, 我们会首先产生一路精准电流源, 再复制这路电流. 如何复制呢? 电流转电压再转电流就行了, 如下图所示 考虑到…

Kivy.uix.textinput

一个小小的输入框,纵上下数页文档已不能全不概括,当去源码慢慢寻找,才知道其中作用,才能运用灵活。 Text Input — Kivy 2.3.0 documentation # -*- encoding: utf-8 -*-Text Input .. versionadded:: 1.0.4.. image:: images/te…

windows安装nodeJs,以及常用操作

1. 官网(Node.js — Run JavaScript Everywhere (nodejs.org))下载想要安装的node版本 的安装包完成安装 2.环境变量设置: 系统变量: Path新增:D:\Program Files\nodejs (node安装目录) 3.设置淘宝源: npm config set registr…

传感器和变送器的区别介绍

从它的名称来看,传与感二字。传是指传输,感是指感知。实际上是先有感知,其次转换,最后传输。因此传输是目的,转换是手段,感知是基础。把能够将被测变量(温度、压力、液位、流量)感知…

Python操作系统交互的15个实用命令

对于Python初学者而言,掌握如何使用Python与操作系统进行交互是一项非常实用的技能。这不仅能够让你的脚本更加灵活强大,还能在自动化任务处理、文件管理等方面大显身手。下面,我们将通过10个简单到复杂的实例,逐步引导你学习如何…

港湾周评|李小加“刀刃向内”裁员

《港湾商业观察》李镭 近年来争议颇大的滴灌通风波不断。 在交100万付费上班不久,最新又被曝出裁员。这位前港交所总裁、金融圈鼎鼎大名的李小加,没想到成立不足三年便迎来了重大挑战。 日前,滴灌通确认了公司组织架构已经调整&#xff0c…

Flutter 中的 SliderTheme 小部件:全面指南

Flutter 中的 SliderTheme 小部件:全面指南 Flutter 是一个创新的 UI 工具包,它允许开发者通过 Dart 语言来创建美观、高效的移动和 Web 应用。在 Flutter 的交互组件中,滑块(Slider)是一种常用的控件,用于…

【教程】如何实现WordPress网站降级(用于解决插件和主题问题)

在最新可用版本上运行WordPress安装、插件和主题是使用该平台的关键最佳实践。还建议使用最新版本的PHP。但是,在某些情况下,这是不谨慎或不可能的。 如果您发现自己处于这种情况,您可能需要撤消更新并降级您的WordPress网站(或其中的一部分)。幸运的是,有一些方法可用于…

对已运行的kafka集群添加副本

在已经运行的kafka集群中(业务主题已创建),如果一开始配置的默认副本是1,则后续再去修改配置文件为3,也只是针对后续新增的主题有效。原先主题不会生效。需要通过json文件去修改。 先创建__consumer_offsets主题的JSO…

深入浅出Java多线程

系列文章目录 文章目录 系列文章目录前言一、多线程基础概念介绍线程的状态转换图线程的调度一些常见问题 二、Java 中线程的常用方法介绍Java语言对线程的支持Thread常用的方法三、线程初体验(编码示例) 前言 前些天发现了一个巨牛的人工智能学习网站&…

【验证码识别】Yolov8入门到实战点选验证码数据集分类训练,孪生训练,导出onnx,搭建部署接口

【验证码识别】Yolov8入门到实战点选验证码数据集分类训练,孪生训练,导出onnx,搭建部署接口 文章目录 【验证码识别】Yolov8入门到实战点选验证码数据集分类训练,孪生训练,导出onnx,搭建部署接口声明一、标…

scButterfly:单细胞跨模态翻译

技术限制导致了高噪声的多模态数据。尽管已经提出了计算方法来跨模态翻译单细胞数据,但是这些方法的泛化性仍然受到制约。scButterfly是一种基于双重对齐变分自编码器和数据增强方案的多功能单细胞跨模态翻译方法。通过对多个数据集进行全面的实验,证明了…