VGG (Visual Geometry Group) :深度卷积神经网络的图像识别利器

news2025/1/20 4:29:26

前言

在深度学习的蓬勃发展历程中,卷积神经网络(Convolutional Neural Network,CNN)为图像识别领域带来了革命性的突破。而 VGG(Visual Geometry Group)作为其中的杰出代表,凭借其简洁而高效的网络结构,在图像识别任务中展现出了卓越的性能,成为了深度学习领域的经典模型之一。

一、VGG 的诞生背景

在 VGG 出现之前,虽然 CNN 已经在图像识别领域取得了一定成果,但网络结构相对较为简单,难以处理复杂的图像特征。随着研究的深入,研究者们意识到增加网络深度可能是提升模型性能的关键。VGG 便是在这样的背景下应运而生,由牛津大学视觉几何组(Visual Geometry Group)的 Karen Simonyan 和 Andrew Zisserman 提出。它通过堆叠多个卷积层和池化层,构建了一个深度可达 16 - 19 层的网络结构,为图像识别带来了全新的思路和方法。

二、VGG 的网络结构

(一)VGG 的基本组成模块

VGG 网络主要由卷积层(Convolutional Layer)、池化层(Pooling Layer)和全连接层(Fully - Connected Layer)组成。
卷积层:
卷积层是 VGG 网络提取图像特征的核心组件。它通过卷积核在图像上滑动,对图像进行卷积操作,从而提取出图像中的各种特征。VGG 网络中使用的卷积核大小主要为 3x3,这种小尺寸的卷积核具有诸多优势。一方面,3x3 的卷积核在计算量上相对较小,有助于减少模型的参数量;另一方面,多个 3x3 卷积核的堆叠可以达到与大尺寸卷积核相同的感受野,同时还能增加网络的非线性表达能力。例如,两个 3x3 卷积核的堆叠相当于一个 5x5 卷积核的感受野,三个 3x3 卷积核的堆叠相当于一个 7x7 卷积核的感受野。
在这里插入图片描述

在 VGG 网络中,卷积层的配置通常是多个 3x3 卷积核的连续堆叠。例如,在一些模块中,会连续使用 2 个或 3 个 3x3 卷积核,然后接一个池化层。这种配置方式使得网络能够逐步提取图像的低级到高级特征。
池化层:
池化层主要用于对卷积层输出的特征图进行下采样,降低特征图的尺寸,从而减少计算量和参数量。同时,池化层还能在一定程度上增强模型对图像平移、旋转等变换的鲁棒性。VGG 网络中主要使用的是最大池化(Max Pooling),其池化核大小一般为 2x2,步长为 2。在网络中,池化层通常紧跟在卷积层之后,每隔几个卷积层就会出现一个池化层,通过这种方式逐步降低特征图的分辨率。
在这里插入图片描述

全连接层:
全连接层位于网络的最后部分,主要用于对提取到的特征进行分类或回归。在 VGG 网络中,通常有 3 个全连接层,其中前两个全连接层的神经元数量为 4096,最后一个全连接层的神经元数量根据具体的分类任务而定。例如,在 ImageNet 数据集的 1000 类分类任务中,最后一个全连接层的神经元数量为 1000。全连接层通过将前面卷积层和池化层提取到的特征进行整合,最终输出分类结果。
在这里插入图片描述

(二)不同版本的 VGG 网络结构

VGG 网络有多个不同的版本,其中最常用的是 VGG16 和 VGG19,它们的主要区别在于网络的深度和卷积层的数量。
在这里插入图片描述

VGG16:
VGG16 的网络结构相对较为简洁,总共有 16 层,包括 13 个卷积层和 3 个全连接层。其网络结构如下:
输入层:接收大小为 224x224x3 的彩色图像。
卷积层:
第一个卷积模块:由 2 个 3x3 卷积层组成,每个卷积层的输出通道数为 64,然后接一个 2x2 的最大池化层。
第二个卷积模块:由 2 个 3x3 卷积层组成,输出通道数为 128,接着是一个 2x2 的最大池化层。
第三个卷积模块:由 3 个 3x3 卷积层组成,输出通道数为 256,再连接一个 2x2 的最大池化层。
第四个卷积模块:同样由 3 个 3x3 卷积层组成,输出通道数为 512,随后是一个 2x2 的最大池化层。
第五个卷积模块:还是 3 个 3x3 卷积层,输出通道数为 512,最后接一个 2x2 的最大池化层。
全连接层:
第一个全连接层有 4096 个神经元,使用 ReLU 激活函数。
第二个全连接层也有 4096 个神经元,同样使用 ReLU 激活函数。
最后一个全连接层根据分类任务的类别数而定,例如在 ImageNet 数据集上为 1000 个神经元,使用 Softmax 激活函数进行分类。
VGG19:
VGG19 在 VGG16 的基础上进一步增加了网络深度,总共有 19 层,包括 16 个卷积层和 3 个全连接层。与 VGG16 相比,VGG19 在一些卷积模块中增加了卷积层的数量。其网络结构如下:
输入层:同样接收 224x224x3 的彩色图像。
卷积层:
第一个卷积模块:2 个 3x3 卷积层,输出通道数 64,接 2x2 最大池化层。
第二个卷积模块:2 个 3x3 卷积层,输出通道数 128,接 2x2 最大池化层。
第三个卷积模块:4 个 3x3 卷积层,输出通道数 256,接 2x2 最大池化层。
第四个卷积模块:4 个 3x3 卷积层,输出通道数 512,接 2x2 最大池化层。
第五个卷积模块:4 个 3x3 卷积层,输出通道数 512,接 2x2 最大池化层。
全连接层:与 VGG16 相同,包括 3 个全连接层,前两个全连接层有 4096 个神经元,最后一个全连接层根据分类任务确定神经元数量,在 ImageNet 数据集上为 1000 个神经元,使用 Softmax 激活函数。

(三)VGG 网络结构代码实现(以 PyTorch 为例)

import torch
import torch.nn as nn


class VGG(nn.Module):
    def __init__(self, features, num_classes=1000):
        super(VGG, self).__init__()
        self.features = features
        self.avgpool = nn.AdaptiveAvgPool2d((7, 7))
        self.classifier = nn.Sequential(
            nn.Linear(512 * 7 * 7, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(True),
            nn.Dropout(),
            nn.Linear(4096, num_classes)
        )

    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x


def make_layers(cfg, batch_norm=False):
    layers = []
    in_channels = 3
    for v in cfg:
        if v == 'M':
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
            if batch_norm:
                layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]
            else:
                layers += [conv2d, nn.ReLU(inplace=True)]
            in_channels = v
    return nn.Sequential(*layers)


cfgs = {
    'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'B': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
    'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M']
}


def vgg11(batch_norm=False):
    return VGG(make_layers(cfgs['A'], batch_norm=batch_norm))


def vgg13(batch_norm=False):
    return VGG(make_layers(cfgs['B'], batch_norm=batch_norm))


def vgg16(batch_norm=False):
    return VGG(make_layers(cfgs['D'], batch_norm=batch_norm))


def vgg19(batch_norm=False):
    return VGG(make_layers(cfgs['E'], batch_norm=batch_norm))

在上述代码中,首先定义了VGG类,它包含了特征提取部分features和分类部分classifier。make_layers函数用于根据配置信息构建卷积层和池化层。cfgs字典中定义了不同版本 VGG 网络的配置信息,通过调用vgg11、vgg13、vgg16和vgg19函数可以创建不同深度的 VGG 网络模型。

三、VGG 在图像识别中的应用

(一)ImageNet 数据集上的表现

VGG 在 ImageNet 大规模视觉识别挑战赛(ILSVRC)中表现出色。ImageNet 数据集包含了 1000 个类别,超过 1400 万张图像,是图像识别领域的重要基准数据集。VGG16 和 VGG19 在 ImageNet 数据集上的分类准确率达到了较高水平,证明了其在处理大规模图像分类任务时的有效性。通过在 ImageNet 上的训练,VGG 学习到了丰富的图像特征,这些特征对于各种图像识别任务都具有重要的参考价值。

(二)其他图像识别任务中的应用

除了在 ImageNet 数据集上的图像分类任务,VGG 还被广泛应用于其他图像识别任务,如目标检测、图像分割等。
目标检测:在目标检测任务中,VGG 常被用作骨干网络(Backbone Network),用于提取图像的特征。例如,在 R - CNN(Regions with CNN features)系列目标检测算法中,VGG 被用于提取候选区域的特征,然后通过分类器和回归器对目标进行分类和定位。具体来说,首先通过选择性搜索(Selective Search)等方法生成一系列候选区域,然后将这些候选区域输入到 VGG 网络中提取特征,最后利用全连接层和分类器对特征进行分类,确定候选区域中是否包含目标以及目标的类别,同时使用回归器对目标的位置进行精确调整。
图像分割:在图像分割任务中,VGG 也发挥了重要作用。例如,在全卷积网络(Fully Convolutional Networks,FCN)中,VGG 的卷积层被用于提取图像的特征,然后通过反卷积层(Deconvolutional Layer)将低分辨率的特征图上采样到与输入图像相同的分辨率,从而实现对图像中每个像素的分类,完成图像分割任务。VGG 的深度特征能够有效地捕捉图像中的语义信息,为图像分割提供了有力的支持。

(三)代码示例:使用 VGG16 进行图像分类(以 PyTorch 和 CIFAR - 10 数据集为例)

import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader
from torchsummary import summary


# 数据预处理
transform = transforms.Compose([
    transforms.Resize((224, 224)),
    transforms.ToTensor(),
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))
])

# 加载CIFAR - 10数据集
train_dataset = datasets.CIFAR10(root='./data', train=True,
                                 download=True, transform=transform)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)

test_dataset = datasets.CIFAR10(root='./data', train=False,
                                download=True, transform=transform)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

# 创建VGG16模型
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model = vgg16(batch_norm=True).to(device)

# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.001, momentum=0.9)

# 模型训练
for epoch in range(10):
    running_loss = 0.0
    for i, data in enumerate(train_loader, 0):
        inputs, labels = data[0].to(device), data[1].to(device)

        optimizer.zero_grad()

        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()
        if i % 100 == 99:
            print('[%d, %5d] loss: %.3f' % (epoch + 1, i + 1, running_loss / 100))
            running_loss = 0.0

# 模型测试
correct = 0
total = 0
with torch.no_grad():
    for data in test_loader:
        images, labels = data[0].to(device), data[1].to(device)
        outputs = model(images)
        _, predicted = torch.max(outputs.data, 1)
        total += labels.size(0)
        correct += (predicted == labels).sum().item()

print('Accuracy of the network on the test images: %d %%' % (100 * correct / total))

在上述代码中,首先对 CIFAR - 10 数据集进行了预处理,包括调整图像大小、转换为张量以及归一化等操作。然后加载训练集和测试集,并创建了使用批归一化的 VGG16 模型。接着定义了交叉熵损失函数和随机梯度下降优化器,进行模型的训练。在训练过程中,每 100 个批次打印一次损失值。最后在测试集上对模型进行测试,计算模型的准确率。

四、VGG 的优势与局限性

(一)优势

结构简洁:VGG 的网络结构非常简洁,主要由 3x3 卷积核和 2x2 池化核组成,易于理解和实现。这种简洁的结构使得 VGG 在深度学习领域得到了广泛的应用和研究,也为后续的网络结构设计提供了重要的参考。
深度优势:通过增加网络深度,VGG 能够学习到更复杂的图像特征,从而提高模型的性能。实验表明,在一定范围内,随着网络深度的增加,模型的准确率也会相应提高。例如,VGG16 和 VGG19 在 ImageNet 数据集上的表现明显优于一些较浅的网络结构。
泛化能力强:VGG 在大规模数据集上训练后,具有较强的泛化能力,能够在不同的图像识别任务中取得较好的效果。无论是在图像分类、目标检测还是图像分割等任务中,VGG 都能够有效地提取图像特征,为后续的任务处理提供有力支持。

(二)局限性

计算量和参数量大:由于 VGG 的网络深度较大,其计算量和参数量也相对较大。这使得 VGG 在训练和推理过程中需要消耗大量的计算资源和时间,对硬件设备的要求较高。例如,VGG16 的参数量达到了 1.38 亿,这在实际应用中可能会受到硬件条件的限制。
容易过拟合:在数据集规模有限的情况下,VGG 容易出现过拟合现象。这是因为 VGG 的网络结构较为复杂,具有较强的拟合能力,如果训练数据不足,模型可能会过度学习训练数据中的噪声和细节,导致在测试集上的泛化性能下降。为了缓解过拟合问题,通常需要采用一些正则化方法,如 Dropout、L2 正则化等。

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

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

相关文章

【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格

音乐流派分类 – 自动化分类不同音乐风格 在本教程中,我们将开发一个深度学习项目,用于自动化地从音频文件中分类不同的音乐流派。我们将使用音频文件的频率域和时间域低级特征来分类这些音频文件。 对于这个项目,我们需要一个具有相似大小和相似频率范围的音频曲目数据集…

HTML基础与实践

目录 HTML 结构 认识 HTML 标签 HTML 文件基本结构 标签层次结构 快速生成代码框架 HTML 常见标签 注释标签 标题标签: h1-h6 段落标签: p 换行标签: br 格式化标签 图片标签: img 超链接标签: a ​编辑链接的几种形式: 表格标签 基本使用 合并单元格 …

差分(前缀和的逆运算)

作用: 在 [ l ,r ] 数组中,对全部数字c 思路 原数组a 构造差分数组b使得a[i]b1b2b3...bi; a数组是b数组的前缀和,b1b2b3...bnan b[i] a[i]-a[i-1]; 在d21,那在前缀和时,这些a都1 在数组中,要l~r这段数c 在l处c后&#xff0c…

学习记录1

[SUCTF 2019]EasyWeb 直接给了源代码&#xff0c;分析一下 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if…

走出实验室的人形机器人,将复刻ChatGPT之路?

1月7日&#xff0c;在2025年CES电子展现场&#xff0c;黄仁勋不仅展示了他全新的皮衣和采用Blackwell架构的RTX 50系列显卡&#xff0c;更进一步展现了他对于机器人技术领域&#xff0c;特别是人形机器人和通用机器人技术的笃信。黄仁勋认为机器人即将迎来ChatGPT般的突破&…

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…

左神算法基础提升--3

文章目录 Manacher 算法经典算法Manacher算法原理 单调栈或单调队列 Manacher 算法 经典算法 在每学习Manacher算法之前我们可能会使用一种比较经典暴力的算法&#xff1a;遍历str字符串&#xff0c;将字符串中的每个字符作为对称点&#xff0c;向两边扩散找到回文字段&#x…

usb通过hdc连接鸿蒙next的常用指令

参考官方 注册报名https://www.hiascend.com/developer/activities/details/44de441ef599450596131c8cb52f7f8c/signup?channelCodeS1&recommended496144 hdc-调试命令-调测调优-系统 - 华为HarmonyOS开发者https://developer.huawei.com/consumer/cn/doc/harmonyos-guid…

windows远程桌面连接限定ip

1&#xff0c;Windows防火墙->高级设置->远程桌面 - 用户模式(TCP-In)->作用域->远程IP地址 2&#xff0c;启用规则

ASP.NET Core - 配置系统之自定义配置提供程序

ASP.NET Core - 配置系统之自定义配置提供程序 4. 自定义配置提供程序IConfigurationSourceIConfigurationProvider 4. 自定义配置提供程序 在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现&…

光谱相机如何还原色彩

多光谱通道采集 光谱相机设有多个不同波段的光谱通道&#xff0c;可精确记录每个波长的光强信息。如 8 到 16 个甚至更多的光谱通道&#xff0c;每个通道负责特定波长范围的光信息记录。这使得相机能分辨出不同光谱组合产生的相同颜色感知&#xff0c;而传统相机的传感器通常只…

论文速读|NoteLLM: A Retrievable Large Language Model for Note Recommendation.WWW24

论文地址&#xff1a;https://arxiv.org/abs/2403.01744 bib引用&#xff1a; misc{zhang2024notellmretrievablelargelanguage,title{NoteLLM: A Retrievable Large Language Model for Note Recommendation}, author{Chao Zhang and Shiwei Wu and Haoxin Zhang and Tong Xu…

【跟着官网学技术系列之MySQL】第7天之创建和使用数据库1

前言 在当今信息爆炸的时代&#xff0c;拥有信息检索的能力很重要。 作为一名软件工程师&#xff0c;遇到问题&#xff0c;你会怎么办&#xff1f;带着问题去搜索引擎寻找答案&#xff1f;亦或是去技术官网&#xff0c;技术社区去寻找&#xff1f; 根据个人经验&#xff0c;一…

ComfyUI 矩阵测试指南:用三种方法,速优项目效果

在ComfyUI中&#xff0c;矩阵测试也叫xyz图表测试&#xff0c;作用是通过控制变量的方式来对Lora模型以及各种参数开展测试&#xff0c;并进行有效区分。其中测试方法有很多种&#xff0c;可以通过借助插件也可以自行搭建工作流实现&#xff0c;下面介绍3种方式&#xff1a; 1…

Day 9 卡玛笔记

这是基于代码随想录的每日打卡 151. 反转字符串中的单词 给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 **…

音视频入门基础:RTP专题(4)——FFmpeg源码中,判断某文件是否为SDP文件的实现

一、引言 执行《音视频入门基础&#xff1a;RTP专题&#xff08;2&#xff09;——使用FFmpeg命令生成RTP流》中的“媒体文件转推RTP的FFmpeg命令”会生成一个SDP文件&#xff0c;该文件内容如下&#xff1a; v0 o- 0 0 IN IP4 127.0.0.1 sNo Name t0 0 atool:libavformat 61…

数据结构——队列和栈的面试题分析

之前我们写过了有效括号的分析了&#xff0c;接下来&#xff0c;我们继续来学习一下&#xff0c;有关栈和队列之间的相关转换的题目吧。 栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 这里我们使用c语言的形式来写&#xff0c;所以我们先自己模拟一…

消息队列实战指南:三大MQ 与 Kafka 适用场景全解析

前言&#xff1a;在当今数字化时代&#xff0c;分布式系统和大数据处理变得愈发普遍&#xff0c;消息队列作为其中的关键组件&#xff0c;承担着系统解耦、异步通信、流量削峰等重要职责。ActiveMQ、RabbitMQ、RocketMQ 和 Kafka 作为市场上极具代表性的消息队列产品&#xff0…

Web前端------表单标签

一.表单标签介绍 1.认识表单 表单---类似于日常生活中的申请单 都是去填写一些信息去申请某个功能&#xff0c;例如&#xff1a;账号密码昵称&#xff0c;登陆网站 2.常见标签 常见的标签 <form></form> 表单标签&#xff0c;所有表单信息都包含在这个标签内…

20250118-读取并显示彩色图像以及提取彩色图像的 R、G、B 分量

读取并显示彩色图像以及提取彩色图像的 R、G、B 分量 import cv2 #彩图R、G、B的提取 import torch from PIL import Image from matplotlib import pyplot as plt import numpy as np读取并显示彩色图像的三种方法&#xff1a; img_path "./data/yndx"1.1 使用 …