摘要:GoogLeNet(也称为Inception-v1)是由Google研究团队在2014年提出的一种深度卷积神经网络(CNN),在当年的ImageNet大规模视觉识别挑战赛(ILSVRC 2014)中获得了第一名。以下是GoogLeNet的原理、意义及代码实现的
GoogLeNet(也称为Inception-v1)是由Google研究团队在2014年提出的一种深度卷积神经网络(CNN),在当年的ImageNet大规模视觉识别挑战赛(ILSVRC 2014)中获得了第一名。以下是GoogLeNet的原理、意义及代码实现的详细说明:
Inception模块
GoogLeNet共有22层,由9个Inception v1模块和5个池化层,以及其他一些卷积层和全连接层构成。网络有3个输出层,其中两个是辅助分类层,用于改善梯度流动和提升训练效果。
GoogLeNet的核心创新是引入了Inception模块。这种模块通过并行的方式,同时使用不同大小的卷积核(如1x1, 3x3, 5x5卷积核)和池化操作来提取特征。这种方法允许网络在不同的尺度上捕捉信息,增强了模型的表达能力。
Inception模块的工作原理是将不同尺寸的卷积核和池化层的输出合并起来,这样可以在不同的尺度上捕捉图像的特征。每个Inception模块包含四个分支:
1x1卷积分支:这个分支使用1x1卷积核进行降维和映射处理;
3x3卷积分支:这个分支首先使用1x1卷积核进行降维,然后使用3x3卷积核进行特征提取;
5x5卷积分支:这个分支首先使用1x1卷积核进行降维,然后使用5x5卷积核进行特征提取;
池化分支:这个分支使用3x3的最大池化操作,然后使用1x1卷积核进行降维。
具体网络结构
1.初始卷积层:
使用7x7卷积核,步长为2,64个通道,输出为112x112x64。进行ReLU操作后,使用3x3最大池化,步长为2,输出为56x56x64。
2.第二层卷积层:
使用3x3卷积核,步长为1,192个通道,输出为56x56x192。进行ReLU操作后,使用3x3最大池化,步长为2,输出为28x28x192。
3.Inception模块:
Inception 3a层:分为四个分支,采用不同尺度的卷积核进行处理。
64个1x1卷积核,然后ReLU,输出28x28x64。
96个1x1卷积核后接128个3x3卷积核,然后ReLU,输出28x28x128。
16个1x1卷积核后接32个5x5卷积核,然后ReLU,输出28x28x32。
3x3最大池化后接32个1x1卷积核,然后ReLU,输出28x28x32。
Inception 3b层:结构与Inception 3a层类似,但输入通道数为256,输出通道数调整为相应的值。
4.后续Inception模块:
Inception 4a、4b、4c层:结构与前两层类似,但输入和输出通道数根据网络结构进行调整。
Inception 5a、5b层:结构与前两层类似,但输入和输出通道数根据网络结构进行调整。
5最终池化层和全连接层:
使用全局平均池化层,输出为1x1x1024。
使用dropout层,dropout率为0.4。
使用全连接层,输出为1000个类别。
代码实现
以下是GoogLeNet的PyTorch代码实现示例:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Inception(nn.Module):
def __init__(self, in_channels):
super(Inception, self).__init__
self.branch1x1 = nn.Conv2d(in_channels, 64, kernel_size=1)
self.branch5x5 = nn.Sequential(
nn.Conv2d(in_channels, 48, kernel_size=1),
nn.Conv2d(48, 64, kernel_size=5, padding=2)
)
self.branch3x3 = nn.Sequential(
nn.Conv2d(in_channels, 64, kernel_size=1),
nn.Conv2d(64, 96, kernel_size=3, padding=1)
)
self.branch_pool = nn.Sequential(
nn.AvgPool2d(kernel_size=3, stride=1, padding=1),
nn.Conv2d(in_channels, 32, kernel_size=1)
)
def forward(self, x):
branch1x1 = self.branch1x1(x)
branch5x5 = self.branch5x5(x)
branch3x3 = self.branch3x3(x)
branch_pool = self.branch_pool(x)
outputs = [branch1x1, branch5x5, branch3x3, branch_pool]
return torch.cat(outputs, dim=1)
class GoogLeNet(nn.Module):
def __init__(self):
super(GoogLeNet, self).__init__
self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3)
self.max_pool1 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.conv2 = nn.Conv2d(64, 192, kernel_size=3, padding=1)
self.max_pool2 = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)
self.inception3a = Inception(192)
self.inception3b = Inception(256)
self.inception4a = Inception(480)
self.inception4b = Inception(512)
self.inception4c = Inception(512)
self.inception5a = Inception(512)
self.inception5b = Inception(512)
self.avg_pool = nn.AdaptiveAvgPool2d((1, 1))
self.dropout = nn.Dropout(0.4)
self.fc = nn.Linear(1024, 1000)
x = self.conv1(x)
x = self.max_pool1(x)
x = self.conv2(x)
x = self.max_pool2(x)
x = self.inception3a(x)
x = self.inception3b(x)
下图是运用魔乐社区来进行GoogLeNet目标检测
魔乐社区融合openmind可以在社区中实现简单的googlenet的复现,并且可以根据魔乐社区中提供的数据集下载到本地然后训练模型,或者根据自己的数据集来训练更适合自己所需的模型。
首先我们要从魔乐社区中下载模型
以此版本为例
可以根据自己的需要,从多种方式下载
使用的方法很简单,简单分为两种
(1)直接使用:我们可以直接在模型主页点击Use in openmind,由于openmind与魔乐社区的高度融合,我们可以直接在开发环境里使用对应的openmind library来加载所需要的模型,下图为示例
(2)下载到本地:此方法可以直接将模型下载到本地,只需要使用git工具即可将社区中的模型下载到本地使用以及微调
点击下载模型
可见,下载方式也很多
使用git工具下载之后,可以在下载路径中找到,然后就可以直接使用了。
体验空间
在魔乐社区中有实现模型的体验空间,用于对上述目标检测的体验,在页面内上传图片就可以自动检测出图片中物品的类别。此种视觉识别模型能够通过输入的图像数据来识别物体,例如自动驾驶汽车上面搭载的视觉识别系统,只有成熟的视觉识别模型才能为行驶车辆提供安全的保护。
图中上传了一张汽车的照片,自动识别出了这是一辆汽车。
上传不同类型的车辆,同样可以识别出来。
上传一量更大的车同样可以识别出来是车的类别。
体验空间链接如下:DataFun/Googlenet | 魔乐社区
下图为在测试集上的效果,置信度也较高
YOLOv8通过引入多尺度特征融合、注意力机制和可变形卷积等技术,显著提升了小目标的检测性能。未来的研究可以进一步探索更高效的特征融合方法和更强大的注意力机制,以应对日益复杂的检测场景。而在魔乐社区上,可以直接下载预训练模型和权重,方便开发者直接使用和预测,或者直接对模型进行调整和改进,以便适应更复杂的数据集。
来源:DataFunTalk