9.19 GoogLeNet

2023-05-16

GoogLeNet

  • GoogLeNet在2014年ImageNet图像识别挑战赛中大放异彩
  • 虽然NiN现在基本上没有被使用了,但是GoogLeNet现在还是大量地被使用
  • GoogLeNet是第一次做到快100层卷积层(第一个做到超过100层的卷积神经网络,这里不是说有100层深,而是说网络中卷积层的个数超过了100)
  • GoogLeNet名字中的L是大写的,也是为了致敬LeNet,虽然它跟LeNet并没有什么关系
  • GoogLeNet的设计受到了NiN很大的影响,吸收了NiN中串联网络的思想,并在此基础上做了改进

LeNet、AlexNet、VGG和NiN

GoogLeNet

Inception块

GoogLeNet中最重要的是Inception块,在这个块中抽取了不同的通道,不同的通道有不同的设计,如下图所示,Inception块通过四条路经从不同的层面抽取信息,然后在输出通道维合并:

  • 前三条路径使用窗口大小为1 * 1、3 * 3、5 * 5的卷积层,从不同的空间大小中提取信息
  • 中间两条路径在输入上执行1 * 1卷积,以减少通道数,从而降低模型的复杂性
  • 第四条路经使用3 * 3最大汇聚层,然后使用1 * 1卷积层来改变通道数
  • 四条路径都是用合适的填充来使输入和输出的高宽一致
  • 最后每条线路的输出在通道维度上连结,得到Inception块的输出
  • 在Inception块中,通常调整的超参数是每层输出通道数

具体过程:

首先,输入被复制成了四块(之前所遇到的都是一条路直接到最后):

  • 第一条路先进入一个1 *1的卷积层再输出
  • 第二条路先通过一个1 * 1的卷积层对通道做变换,再通过一个pad为1的3 * 3的卷积层,使得输入和输出的高宽相同
  • 第三条路先通过一个1 * 1的卷积层对通道数做变换,不改变高宽,但是再通过一个pad为2的5 * 5的卷积层提取空间信息特征,输入和输出还是等高等宽
  • 第四条路先通过一个pad为1的3 * 3的最大池化层,再通过一个1 * 1的卷积层

因为这四条路都没有改变高宽,最后用一个contact的操作将它们的输出合并起来(不是将四张图片放在一起形成一张更大的图片,而是在输出的通道数上做合并,最终的输出和输入等同高宽,但是输出的通道数更多,因为是四条路输出的通道数合并在一起的),因此,输出的高宽是不变的,改变的只有它的通道数

在这个结构中,基本上各种形状的卷积层和最大池化层等都有了,所以就不用过多地纠结于卷积层尺寸的选择

为什么GoogLeNet这么有效?

  • 滤波器(filter)的组合:可以使用各种不同的滤波器尺寸探索图像,这就意味着不同大小的滤波器可以有效地识别不同范围的图像细节
  • 可以为不同的滤波器分配不同数量的参

Inception块的通道数

  • 第一个Inception块的通道数如下图所示

假设输入的通道数是192,高宽是28 * 28

因为在Inception块中,高宽是不变的,所以上图中只标出了通道数的变化:

  • 通过第一条路时,经过第一个卷积层直接将通道数压缩到了64
  • 经过第二条路时,先经过一个1 * 1的卷积层将通道数从192压缩到了96(这里为什么要压缩到96?因为想要把后一层3 * 3的卷积层的输入数降低,通过降低输入通道数来降低模型的复杂度,因为模型复杂度可以认为是可以学习的参数的个数,卷积层可学习参数的个数是输入通道 * 输出通道 * 卷积核的大小(3 * 3),所以这里要将192压缩为96),然后再经过一个3 * 3的卷积层后,通道数增加到128
  • 经过第三条路时,先通过一个3 * 3的卷积层将通道数压缩到16,再经过一个5 * 5的卷积层(这里分配的通道数并不多)增加到32
  • 经过第四条路时,首先经过一个3 * 3的最大池化层,这里并不会改变通道数,然后经过一个1 * 1的卷积层之后,通道数直接由192降到了32

总的来说,上图中标记为白色的卷积层可以认为是用来改变通道数的,要么改变输入要么改变输出标记为蓝色的卷积层可以认为是用来抽取信息的,第1条路中标记为蓝色的卷积层不抽取空间信息,只抽取通道信息,第2、3条路中标记为蓝色的卷积层是用来抽取空间信息的,第4条路中标记为蓝色的最大池化层也是用来抽取空间信息的,增强鲁棒性

经过Inception块之后,最后输出的通道数由输入的192变成了64+128+32+32=256,每个通道都会识别一些特定的模型,所以应该把重要的通道数留给重要的通道(这里的意思应该是类似于:输入进来之后被复制成了四份,然后经过四条不同的路,最终进行通道数的合并,在输出通道数固定的情况下,四条路的最终输出的通道数是不一样的,所以可以将有限的输出通道数分配给不同的路径,有一点像权重,就比如上图中给第二条路分配了128个输出通道数,接近一半的通道数都留给了3 * 3的卷积层,因为3 * 3的卷积层计算量不大同时能够很好地抽取信息,剩下通道数的一半分给了1 * 1的卷积层,然后再剩下给第3、4条路平分),大致的设计思路就是这样,但是具体所使用的数值也是调出来的

为什么要用Inception块?

  • 假设输入是64,输出是128
  • 如果使用Inception的话,模型参数大概有0.16M
  • 如果只用3 * 3的卷积而不用Inception块的话,模型参数大概有0.44M
  • 如果只用5 * 5的卷积而不用Inception块的话,模型参数大概有1.22M(卷积窗口变大了,所以模型参数变多了)
  • 由此可以得出,Inception通过各种块的设计以及通过1 * 1的卷积层来降低通道数,从而使得参数数量和计算量大幅度减少
  • Inception的优点:不仅增加了网络结构的多样性(有大量不同设置的卷积层),而且参数数量和计算量都显著降低了

GoogLeNet架构

  • GoogLeNet一共使用了9个Inception块全局平均汇聚层(避免在最后使用全连接层)的堆叠来生成估计值,第一个模块类似于AlexNet和LeNet,Inception块的组合从VGG继承
  • Inception块之间的最大汇聚层可以降低维度
  • GoogLeNet由大量的Inception块组成,如上图所示,总共分成了5个stage(有点类似于VGG,高宽减半一次为1个stage)
  • GoogLeNet中总共有9个Inception块,主要集中在stage 3(2个)、stage 4(5个)和stage 5(2个)
  • GoogLeNet中大量地使用了1 * 1的卷积,把它当成全连接来使用,来做通道数的变换(受到NiN的影响)
  • GoogLeNet中也使用了全局平均池化层
  • 因为最后没有设置Inception块使得最后的输出通道数等于标签的类别数,所以在倒数第二步做完全局平均池化之后会拿到一个长为通道数的向量,最后再通过一个全连接层映射到标号所要的类别数(这里并没有强求最后的输出通道数一定要等于标签类别数,做了简化,更加灵活)

具体结构:

1、Stage 1:

第一个模块使用了一个卷积层和一个最大池化层:

  • 第一个模块先使用了一个64通道7 * 7的卷积层(stride = 2,padding = 3)
  • 然后使用了一个3 * 3的最大池化层(stride = 2,padding = 1)

2、Stage 2:

第二个模块使用了两个卷积层和一个最大池化层

  • 第一个卷积层是64通道1 * 1的卷积层
  • 第二个卷积层是192通道的3 * 3的卷积层(stride = 3,padding = 1)
  • 最大池化层的窗口大小为3 * 3(stride = 2,padding = 1)

3、Stage 3:

第三个模块串联了两个完整的Inception块和一个最大池化层

  • 第一个Inception块的输出通道数为:64 + 128 + 32 + 32 = 256,四条路经之间的输出通道数量比是:64 :128 :32 :32 = 2 :4 :1 :1。第二条和第三条路径首先将输入通道的数量分别由192减少到96和16,然后连接第二个卷积层(Inception(192,64,(96,128),(16,32),32))
  • 第二个Inception块的输出通道数增加到128 + 192 + 96 + 64 = 480,四条路经之间的输出通道数量比为128 :192 :96 :64 = 4 :6 :3 :2,第二条和第三条路径首先将输入通道数量分别由256减少到128和32,然后连接第二个卷积层(Inception(256,128,(128,192),(32,96),64))
  • 最大池化层的窗口大小为3 * 3(stride = 2,padding = 1)

4、Stage 4:

第四个模块串联了5个Inception块和一个最大池化层

  • 第一个Inception块的输出通道数为:192 + 208 + 48 + 64 = 512(Inception(480,192,(96,208),(16,48),64))
  • 第二个Inception块的输出通道数为:160 + 224 + 64 + 64 =512(Inception(512,160,(112,224),(24,64),64))
  • 第三个Inception块的输出通道数为:128 + 256 + 64 + 64 = 512(Inception(512,128,(128,256),(24,64),64))
  • 第四个Inception块的输出通道数为:112 + 288 + 64 + 64 =528 (Inception(512,112,(144,288),(32,64),64))
  • 第五个Inception块的输出通道数为:256 + 320 +128 + 128 = 832(Inception(528,256,(160,320),(32,128),128 ))

以上这些路径的通道数分配和和第三模块中的类似

  • 第一条路经仅含1 * 1的卷积层
  • 含3 * 3卷积层的第二条路径输出最多通道
  • 含5 * 5卷积层的第三条路经
  • 含3 * 3最大汇聚层的第四条路经
  • 第二、第三条路径都会先按比例减小通道数

5、Stage 5:

第五个模块中有两个Inception块和一个输出层:

  • 第一个Inception块的输出通道数为:256 + 320 + 128 +128 = 832(Inception(832,256,(160,320),(32,128),128))
  • 第二个Inception块的输出通道数为:384 + 384 + 128 +128 = 1024(Inception(832,384,(192,384),(48,128),128))
  • 输出层和NiN一样使用全局平均汇聚层,将每个通道的高和宽变成1
  • 最后将输出变成二维数组,再接上一个输出个数为标签类别数的全连接层 nn.Linear(1024,10)

以上这些路径通道数的分配思路和第三、第四模块一致

stage 1 & stage 2

对比GoogLeNet和AlexNet

  • GoogLeNet的窗口更小,最终的高宽更大,使得这之后能够使用更深的网络

stage 3

  • stage 3使用了2个Inception块,高宽从28 * 28变成了14 *14,但是通道数从192变成了480
  • 这两个Inception块的通道数的分配是不一样的

    GoogLeNet P1 - 17:04

    

stage 4 & stage 5

Inception的变种

Inception-BN(V2):使用batch normalization

Inception-V3:修改了Inception块

  • 替换5 * 5为多个3 * 3卷积层
  • 替换5 * 5为多个1 * 7和7 * 1卷积层
  • 替换3 * 3为多个1 * 3和3 * 1卷积层
  • 更深

  • 上图中右边是原始的Inception块,左边是Inception V3块

  • 上图中右边是原始的Inception块,左边是Inception V3块

  • 上图中右边是原始的Inception块,左边是Inception V3块

  • Inception V3的模型效果如上图所示
  • 图中X轴表示处理的速度(log分布,越往右越快),从图中可以看出Inception V3还算是比较慢,每秒钟大概能够跑800个样本(仅仅是预测,训练的话会更慢)
  • 图中Y轴表示精度,可以看出Inception V3的精度还是比较高的,在ImageNet上的精度达到了0.8左右,虽然它所占用的内存比较多(图中园区那的大小表示所占用的内存的大小),运算比较慢,但是它的精度是完胜VGG的(和现在的一些网络比较起来其实没有太大的优势,但是当年的效果还是很好的)

Inception V4:使用残差连接

总结

  • Inception块有四条不同超参数的卷积层和池化层的路来抽取不同的信息(等价于一个有4条路径的子网络,通过不同窗口形状的卷积层和最大汇聚层来并行抽取信息,并使用1 * 1卷积层减少每像素级别上的通道维数从而降低模型的复杂度),它的一个主要优点是模型参数小,计算复杂度低
  • GoogLeNet使用了9个Inception块(每个Inception块中有6个卷积层,所有Inception块中一共有54个卷积层),这些Inception块与其他层(卷积层、全连接层)串联起来,其中Inception块的通道数分配之比是在Imagenet数据集上通过大量的实验得来的
  • GoogLeNet是第一个达到上百层的网络,但是不是深度是100,直到ResNet的出现才达到了模型的深度达到100层,这里的上百层指的是通过设计并行的通道来使得模型达到数百层
  • Inception后续也有一系列的改进,GoogLeNet V3和GoogLeNet V4目前依旧在被使用,GoogLeNet一开始的精度其实不高,在BN、V3、V4之后精度才慢慢提升上去了,现在也是比较常用的模块,它以较低的计算复杂度提供了类似的测试精度
  • GoogLeNet的问题是特别复杂,通道数的设置没有一定的选择依据,以及内部构造比较奇怪,这也是GoogLeNet不那么受欢迎的原因所在

代码实现:

import torch
from torch import nn
from torch.nn import functional as F
from d2l import torch as d2l

class Inception(nn.Module):
    def __init__(self, in_channels, c1, c2, c3, c4, **kwargs): # c1为第一条路的输出通道数、c2为第二条路的输出通道数     
        super(Inception, self).__init__(**kwargs) # python中*vars代表解包元组,**vars代表解包字典,通过这种语法可以传递不定参数。**kwage是将除了前面显式列出的参数外的其他参数, 以dict结构进行接收.                                                    
        self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)
        self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)
        self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
        self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)
        self.p3_2 = nn.Conv2d(c3[0],c3[1],kernel_size=5,padding=2)
        self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
        self.p4_2 = nn.Conv2d(in_channels,c4,kernel_size=1)
        
    def forward(self, x):
        p1 = F.relu(self.p1_1(x))  # 第一条路的输出
        p2 = F.relu(self.p2_2(F.relu(self.p2_1(x)))) # 第二条路的输出
        p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))
        p4 = F.relu(self.p4_2(self.p4_1(x)))
        return torch.cat((p1, p2, p3, p4), dim=1)

lr, num_epochs, batch_size =0.1, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size,resize=96)  
d2l.train_ch6(net,train_iter,test_iter,num_epochs,lr,d2l.try_gpu())

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

9.19 GoogLeNet 的相关文章

  • vs2019未能正确加载解决方案的项目

    网上朋友们说是路径出了问题 xff0c 需要修改 vcxproj文件的内容 xff0c 我试了一下没成功 最后发现 xff0c 所以打不开 xff0c 是因为我下载了别人的项目 xff0c 用解压软件解压后直接打开了 sln 当我把解压后的
  • 自我提升解决bug的能力(一)

    我和大家分享一个我的自我提升解决bug的能力 满满的干货 一名优秀的程序员会具备较强解决bug的能力 如果你觉得自己不够优秀 xff0c 解决bug能力不足 xff0c 学习处于被动的状态 那我要大声的告诉你请不要迷茫 xff0c 陷入低沉
  • 论文笔记:VIBE: Video Inference for Human Body Pose and Shape Estimation

    要解决的问题 有3D关键点标注的数据集太少 xff0c 所以我们想生成这样的数据集 所以我们提出了一个 利用视频进行动作估计的新方法 xff0c 解决了数据集缺乏和预测准确率不佳的问题 主要创新点 利用 对抗式生成网络 来区分 真实人类动作
  • 2022年春招实习十四面(嵌入式面经)(已完结)

    文章目录 前言CVTE xff08 嵌入式软件 xff09 CVTE一面 xff08 嵌入式软件开发 xff09 时长 xff1a 50分钟CVTE二面 xff08 55分钟 xff09 阿里菜鸟网络 xff08 嵌入式软件 xff09 阿
  • 二分算法简单介绍

    二分算法 xff0c 顾名思义 就是把一组有序数据的搜索区域缩小一半 下面给大家举例说明一下 如何确定被缩小的搜索区间 原理分析 拿一个有序的整形数组来举例 int a 10 61 1 2 3 4 5 6 7 8 9 10 xff0c 在初
  • 论文投稿指南——中文核心期刊

    gt gt gt 深度学习Tricks xff0c 第一时间送达 lt lt lt 目录 xff08 一 xff09 国内三大核心 1 中文社会科学引文索引 xff08 CSSCI 南大核心 xff09 2 中国科学引文数据库 xff08
  • linux opendir(打开目录函数) readdir(读取目录函数) closedir(关闭目录函数)

    Linux下opendir readdir 和closedir 这三个函数主要用来遍历目录 在使用这三个函数前必须先包括以下两个头文件 xff1a include lt sys types h gt include lt dirent h
  • Cmakelists.txt 的基本框架

    执行 cmake 表示在当前目录下执行 cmake cmake 表示在前一级目录下执行 cmake make 在当前目录下执行 make 语法 1 设置 cmake 版本需求 cmake minimum required VERSION 2
  • UartAssist - 串口调试助手。

    由于项目需要用到串口 xff0c 所以我就找到一个简单易上手的串口调试助手 串口调试助手 1 助手界面 xff1a 2 设置串口 xff0c 点击 打开 3 设置发送区和接收区参数 4 输入发送内容 xff0c 点击 发送 即可
  • 网络摄像机rtsp地址详解。

    RTSP xff08 Real Time Streaming Protocol xff09 xff0c RFC2326 xff0c 实时流传输协议 xff0c 是TCP IP协议体系中的一个应用层协议 xff0c 由哥伦比亚大学 网景和Re
  • Qt 登陆界面实现

    简单的QT用户登录界面 一 项目描述 在登录界面输入用户名和密码正确之后才进入欢迎界面 用户名 xff1a xiaoxian 密码 xff1a 1240 二 效果图 三 源代码 loginform span class token punc
  • FFMPEG保存视频流数据至本地(rtsp转mp4)

    将rtsp流中的h264视频流在没解码之前获取下来 xff0c 并保存到本地文件mp4中的h264流中 xff0c h264 gt mp4 网络摄像机rtsp地址详解 流程图 xff1a 源码 xff1a span class token
  • Qt + FFmpeg实现播放器(FFmpeg可以解码的格式基本都可以播放)。

    一 开发环境的准备 Linux下移植ffmpeg开源库 二 代码实现播放功能 1 打开音视频流并获取音视频流信息 xff1b 2 查找视频流位置以及查找并打开视频解码器 xff1b 3 视频解码的同时处理图片像素数据 xff1b 4 最后要
  • SecureCRT 下的串口不能输入指令。

    1 在 SecureCRT 下的串口不能输入指令 解决方法 xff1a Session Options gt Connection gt Serial gt Flow Control xff0c 将原先默认选中的 RTS CTS取消掉即可
  • Qt实现简单密码登陆界面

    效果图 xff1a 代码实现 span class token macro property span class token directive hash span span class token directive keyword i
  • error: ‘uint8_t’,‘uint32_t’ does not name a type

    c 43 43 里用了c的代码 xff0c 确切的说 xff0c 是引用了c写的x264 h xff0c 结果报错了 xff1a 解决方法 xff1a span class token macro property span class t

随机推荐

  • gitlab 同时拉取整个项目

    一 xff1a 下载repo工具包 下载地址 xff1a GitHub NeutionWei repo unzip repo 刚下载的repo包解压 xff0c 其中的repo只是一个几百行的脚本 xff0c 需要repo init才可以获
  • CMakeLists.txt详解

    一 xff1a CMakeLists txt文件是cmake用来生成Makefile文件需要的一个描述编译链接的规则文件 学习cmake需要提前了解gcc等编译命令 xff0c 先来解释一条最简单的命令 gcc source c o bin
  • opencv估计两图的三维坐标变换矩阵

    cv estimateAffine3D MatFrom MatTo Transfrom inlier Transform得到的是重MatFrom到MatTo的变换矩阵 inlier给一个空矩阵就可以 MatFrom和MatTo都是点的矩阵
  • shell脚本详解

    通俗来讲shell脚本就是把shell命令放在一个 脚本 中 xff0c 脚本的第一行 xff01 bin bash 意思为这个脚本指定一款在 bin 下名叫bash的shell解释器 xff0c 来解释接下来的任何命令 xff0c 如果我
  • 车载以太网测试规范tc8下载地址

    网上只要搜到下载就要积分 xff0c VIP xff0c 其实他们也是从别处免费下载的 xff0c 拿到别处骗钱 xff0c 话不多说下载地址如下 xff1a Open Alliance 不用谢 xff01
  • ARP包解析及工作原理

    ARP数据包42字节 参照以下例子 xff1a 前12字节为以太网的目的地址 54 89 98 0f 2b be 和源地址 54 89 98 5b 5b 8a xff0c 当目的地址全为1时是以太网广播地址 xff0c 此时ARP还未建立缓
  • Jetson Xavier NX刷机安装Ubuntu20.04,配置CUDA,cuDNN,Pytorch等环境教程(英伟达官方源安装,理论适用其它Jetson设备)

    一 准备工作 硬件 xff1a Jetson Xavier NX开发板 xff08 笔者购入为带128g内存条的EMMC版 xff09 跳线帽 xff08 杜邦线 xff09 microUSB转USB数据线 电源线 软件 xff1a Ubu
  • Hadoop伪分布搭建完整步骤

    1 新建虚拟机配置网络并测试网络连接 1 鼠标单击左侧虚拟机名称 xff0c 接着单击菜单栏 编辑 xff0c 在下拉菜单中选择 虚拟网络适配器 xff0c 如图 1 2 20 所示 4 在打开的 虚拟网络编辑器 对话框 xff0c 单击
  • linux--top命令查看系统所有详情

    Linux系统可以通过top 命令查看系统的CPU 内存 运行时间 交换分区 执行的线程等信息 通过top命令可以有效的发现系统的缺陷出在哪里 是内存不够 CPU处理能力不够 IO读写过高 一 top命令的第一行 top 19 56 47
  • OPENMV巡线

    将openmv图片划分成三个ROI区域 import sensor image time lcd from pyb import UART from pyb import LED ROIS 61 0 0 160 40 0 6 0 40 16
  • C++学习笔记

    一 一些重要的常见知识点 1 函数的分文件编写 xff1a h的头文件 xff08 写函数声明 xff09 cpp的源文件 xff08 写函数功能实现 xff09 2 空指针和野指针 xff1a 0 255的内存是系统所占有的 96 int
  • 使用XTDrone遇到的问题的解决

    在使用XTDrone时 xff0c 遇到了px4包找不到的问题 xff1a RLException mavros posix sitl launch is neither a launch file in package 使用官方配置文档h
  • 树莓派书籍全方位推荐

    相关书籍 python编程篇1 Python硬件开发树莓派从入门到实践 内容简介作者简介 2 Python树莓派开发从入门到精通内容简介编辑推荐 3 树莓派Python编程入门与实战书籍简介 4 树莓派Python编程指南内容简介作者简介
  • 总结几个比较常用的数学公式(新手入门)

    合理的公式可以帮助我们优化代码 xff0c 比如可以减少遍历的次数 xff0c 减少思考的难度 xff0c 提高算法效率 xff0c 此文章将持续更新 一 换底公式 Logab 61 logxb logxa 换底公式虽然不常用 xff0c
  • 【Linux/C/C++】面试题总结

    1 static关键字的作用 答 xff1a 在C语言中 xff0c 局部变量不会在诞生时被编译器自动初始化 xff0c 且生命周期终止于该变量所在的函数结束时 通过使用static关键字修饰局部变量 xff0c 可以使编译器自动为其赋初始
  • 匿名上位机V7与stm32通信协议

    一 xff0c 通信介绍 1 通信帧格式介绍 为了适应多种数据类型的传输 xff0c 保证高效的通信效率 xff0c 所有数据的通信 xff0c 均需要遵守本通信帧格式 本格式在 确保通信高效 源码简单 可移植性高的基础上 xff0c 实现
  • 酒店管理系统( JAVA)

    最近在学JAVA的数组学完之后做了一个简易的酒店管理系统 xff0c 酒店管理系统应该包含三部分 xff0c 第一部分是我们酒店管理系统的主题 xff0c 第二部分是我们酒店里的信息 xff0c 第三部分则是我们的房间信息 xff0c 具体
  • Ubuntu20.04下使用Qt5.15.2编译qgc源码

    下载QGC源码 可以在QGC官网按照教程根据自己的需求来下载源码QGC git clone recursive j8 https github com mavlink qgroundcontrol git git submodule upd
  • #ROS通讯机制:参数服务器

    参数服务器修改小海龟背景色 1 进入工作空间的src目录新建工作包 lzw08 64 ubuntu span class token operator span span class token operator span cd ros w
  • 9.19 GoogLeNet

    GoogLeNet GoogLeNet在2014年ImageNet图像识别挑战赛中大放异彩虽然NiN现在基本上没有被使用了 xff0c 但是GoogLeNet现在还是大量地被使用GoogLeNet是第一次做到快100层卷积层 xff08 第