主頁 >  其他 > 深度學習之影像分類(五)--GoogLeNet網路結構

深度學習之影像分類(五)--GoogLeNet網路結構

2021-09-01 15:59:50 其他

深度學習之影像分類(五)GoogLeNet網路結構

目錄

    • 深度學習之影像分類(五)GoogLeNet網路結構
      • 1. 前言
      • 2. Inception 結構
      • 3. 輔助分類器
      • 4. 代碼

本節學習 GoogLeNet 網路結構,學習視頻源于 Bilibili,部分描述參考 大話CNN經典模型:GoogLeNet(從Inception v1到v4的演進),

請添加圖片描述

1. 前言

GoogLeNet 是 2014 年由 Google 團隊提出的,斬獲了當年 ImageNet 競賽中 Classification Task 的第一名,注意是 GoogLeNet,大寫 L 是為了致敬 LeNet,其原始論文為《Going deeper with convolutions》,

如何提升網路性能?一般來說,提升網路性能最直接的辦法就是增加網路深度和寬度,深度指網路層次數量、寬度指神經元數量,但這種方式存在以下問題:

(1)引數太多,如果訓練資料集有限,很容易產生過擬合;

(2)網路越大、引數越多,計算復雜度越大,難以應用;

(3)網路越深,容易出現梯度彌散問題(梯度越往后穿越容易消失),難以優化模型,

解決這些問題的方法當然就是在增加網路深度和寬度的同時減少引數,為了減少引數,自然就想到將全連接變成稀疏連接,但是在實作上,全連接變成稀疏連接后實際計算量并不會有質的提升,因為大部分硬體是針對密集矩陣計算優化的,稀疏矩陣雖然資料量少,但是計算所消耗的時間卻很難減少,

那么,有沒有一種方法既能保持網路結構的稀疏性,又能利用密集矩陣的高計算性能,大量的文獻表明可以將稀疏矩陣聚類為較為密集的子矩陣來提高計算性能,就如人類的大腦是可以看做是神經元的重復堆積,因此,GoogLeNet 團隊提出了 Inception 網路結構,就是構造一種“基礎神經元”結構,來搭建一個稀疏性、高計算性能的網路結構,

該網路的亮點包括:

  • 引入了 Inception 結構,融合不同尺度的特征資訊
  • 使用 1 × 1 1 \times 1 1×1 的卷積核進行降維以及映射處理(VGGNet 中也有使用)
  • 添加兩個輔助分類器幫助訓練(深監督,AlexNet和VGGNet都只有一個輸出層)
  • 丟棄全連接層,使用平均池化層(大大減少模型引數)

GoogLeNet 的網路結構圖如下所示:

請添加圖片描述

請添加圖片描述

引數表中 #1x1,#3x3 reduce 等對應的子模塊如下所示:

請添加圖片描述

不包含輔助分類器的 GoogLeNet 的引數量約為 VGG16 的 1/20,且只相當于Alexnet的 1/12,

請添加圖片描述

2. Inception 結構

在 AlexNet 和 VGGNet 中,網路都是串行結構,將一系列卷積層和池化層進行串聯得到網路結構,但是在 Inception 中出現了并行結構,在圖(a)中,將特征矩陣輸入四個分支進行處理,再將處理結果拼接成輸出特征矩陣,需要注意的是:每個分支所得到的特征矩陣的高和寬必須相同,否則我們沒辦法按照通道進行拼接,在圖(b)中,加上了三個 1 × 1 1 \times 1 1×1 卷積層進行降維處理,注意,在 Inception 的 Maxpool 中 stride = 1,也就是保特征圖大小的池化操作,
請添加圖片描述

假設我們不使用 1 × 1 1 \times 1 1×1 卷積層進行降維,對于輸入通道為 512 的特征圖使用 64 個 5 × 5 5 \times 5 5×5 的卷積核進行卷積,那么引數量為 5 × 5 × 512 × 64 = 819200 5 \times 5 \times 512 \times 64 = 819200 5×5×512×64=819200,如果先使用 1 × 1 1 \times 1 1×1 卷積將通道縮小為 24,再使用 64 個 5 × 5 5 \times 5 5×5 的卷積核進行卷積,則引數量為 1 × 1 × 512 × 24 + 5 × 5 × 24 × 64 = 50688 1 \times 1 \times 512 \times 24 + 5 \times 5 \times 24 \times 64= 50688 1×1×512×24+5×5×24×64=50688,而且,感受野一樣

請添加圖片描述

inception 有什么好處呢?Szegedy從多個角度進行了解釋(參考百度百科):

解釋1:在直觀感覺上在多個尺度上同時進行卷積,能提取到不同尺度的特征,特征更為豐富也意味著最后分類判斷時更加準確,

解釋2:利用稀疏矩陣分解成密集矩陣計算的原理來加快收斂速度,舉個例子下圖左側是個稀疏矩陣(很多元素都為 0,不均勻分布在矩陣中),和一個 2x2 的矩陣進行卷積,需要對稀疏矩陣中的每一個元素進行計算;如果像下圖右圖那樣把稀疏矩陣分解成2個子密集矩陣,再和 2x2 矩陣進行卷積,稀疏矩陣中 0 較多的區域就可以不用計算,計算量就大大降低,這個原理應用到 inception 上就是要在特征維度上進行分解!傳統的卷積層的輸入資料只和一種尺度(比如 3x3 )的卷積核進行卷積,輸出固定維度(比如 256 個特征)的資料,所有 256 個輸出特征基本上是均勻分布在 3x3 尺度范圍上,這可以理解成輸出了一個稀疏分布的特征集;而 inception 模塊在多個尺度上提取特征(比如 1x1,3x3,5x5 ),輸出的 256 個特征就不再是均勻分布,而是相關性強的特征聚集在一起(比如 1x1 的 96 個特征聚集在一起,3x3 的 96 個特征聚集在一起,5x5 的 64 個特征聚集在一起),這可以理解成多個密集分布的子特征集,這樣的特征集中因為相關性較強的特征聚集在了一起,不相關的非關鍵特征就被榷訓,同樣是輸出 256 個特征,Inception 方法輸出的特征“冗余”的資訊較少,用這樣的“純”的特征集層層傳遞最后作為反向計算的輸入,自然收斂的速度更快,

請添加圖片描述

解釋3:Hebbin 赫布原理,Hebbin 原理是神經科學上的一個理論,解釋了在學習的程序中腦中的神經元所發生的變化,用一句話概括就是 fire togethter, wire together ,赫布認為 “兩個神經元或者神經元系統,如果總是同時興奮,就會形成一種‘組合’,其中一個神經元的興奮會促進另一個的興奮”,比如狗看到肉會流口水,反復刺激后,腦中識別肉的神經元會和掌管唾液分泌的神經元會相互促進,“纏繞”在一起,以后再看到肉就會更快流出口水,用在 Inception 結構中就是要把相關性強的特征匯聚到一起,這有點類似上面的解釋2,把 1x1,3x3,5x5 的特征分開,因為訓練收斂的最終目的就是要提取出獨立的特征,所以預先把相關性強的特征匯聚,就能起到加速收斂的作用,

3. 輔助分類器

在 GoogLeNet 中有兩個結構一模一樣的輔助分類器,分別對 Inception 4a 和 Inception 4d 的輸出結果進行,Inception 4a 的輸出尺寸為 14 × 14 × 512 14 \times 14 \times 512 14×14×512,Inception 4d 的輸出尺寸為 14 × 14 × 528 14 \times 14 \times 528 14×14×528

輔助分類器其結構如右圖所示,首先經過平均池化下采樣,池化核大小為 5 × 5 5 \times 5 5×5,stride = 3,padding = 0,所以對于 Inception 4a 的輸出特征矩陣變為了 4 × 4 × 512 4 \times 4 \times 512 4×4×512;對于 Inception 4d 的輸出特征矩陣變為了 4 × 4 × 528 4 \times 4 \times 528 4×4×528,然后通過 1 × 1 1 \times 1 1×1 卷積降維到 128 個通道,并使用 ReLU 激活函式,展平后使用 1024 個節點的全連接層以及 ReLU 函式(對應于右圖第一個 FC),然后經過一個 0.7 dropout ratio 的 Dropout 層,防止過擬合,然后經過 1000 個節點的輸出全連接層,

請添加圖片描述

4. 代碼

import torch.nn as nn
import torch
import torch.nn.functional as F


class GoogLeNet(nn.Module):
    def __init__(self, num_classes=1000, aux_logits=True, init_weights=False):
        super(GoogLeNet, self).__init__()
        self.aux_logits = aux_logits

        self.conv1 = BasicConv2d(3, 64, kernel_size=7, stride=2, padding=3)
        self.maxpool1 = nn.MaxPool2d(3, stride=2, ceil_mode=True)

        self.conv2 = BasicConv2d(64, 64, kernel_size=1)
        self.conv3 = BasicConv2d(64, 192, kernel_size=3, padding=1)
        self.maxpool2 = nn.MaxPool2d(3, stride=2, ceil_mode=True)

        self.inception3a = Inception(192, 64, 96, 128, 16, 32, 32)
        self.inception3b = Inception(256, 128, 128, 192, 32, 96, 64)
        self.maxpool3 = nn.MaxPool2d(3, stride=2, ceil_mode=True)

        self.inception4a = Inception(480, 192, 96, 208, 16, 48, 64)
        self.inception4b = Inception(512, 160, 112, 224, 24, 64, 64)
        self.inception4c = Inception(512, 128, 128, 256, 24, 64, 64)
        self.inception4d = Inception(512, 112, 144, 288, 32, 64, 64)
        self.inception4e = Inception(528, 256, 160, 320, 32, 128, 128)
        self.maxpool4 = nn.MaxPool2d(3, stride=2, ceil_mode=True)

        self.inception5a = Inception(832, 256, 160, 320, 32, 128, 128)
        self.inception5b = Inception(832, 384, 192, 384, 48, 128, 128)

        if self.aux_logits:
            self.aux1 = InceptionAux(512, num_classes)
            self.aux2 = InceptionAux(528, num_classes)

        self.avgpool = nn.AdaptiveAvgPool2d((1, 1))
        self.dropout = nn.Dropout(0.4)
        self.fc = nn.Linear(1024, num_classes)
        if init_weights:
            self._initialize_weights()

    def forward(self, x):
        # N x 3 x 224 x 224
        x = self.conv1(x)
        # N x 64 x 112 x 112
        x = self.maxpool1(x)
        # N x 64 x 56 x 56
        x = self.conv2(x)
        # N x 64 x 56 x 56
        x = self.conv3(x)
        # N x 192 x 56 x 56
        x = self.maxpool2(x)

        # N x 192 x 28 x 28
        x = self.inception3a(x)
        # N x 256 x 28 x 28
        x = self.inception3b(x)
        # N x 480 x 28 x 28
        x = self.maxpool3(x)
        # N x 480 x 14 x 14
        x = self.inception4a(x)
        # N x 512 x 14 x 14
        if self.training and self.aux_logits:    # eval model lose this layer
            aux1 = self.aux1(x)

        x = self.inception4b(x)
        # N x 512 x 14 x 14
        x = self.inception4c(x)
        # N x 512 x 14 x 14
        x = self.inception4d(x)
        # N x 528 x 14 x 14
        if self.training and self.aux_logits:    # eval model lose this layer
            aux2 = self.aux2(x)

        x = self.inception4e(x)
        # N x 832 x 14 x 14
        x = self.maxpool4(x)
        # N x 832 x 7 x 7
        x = self.inception5a(x)
        # N x 832 x 7 x 7
        x = self.inception5b(x)
        # N x 1024 x 7 x 7

        x = self.avgpool(x)
        # N x 1024 x 1 x 1
        x = torch.flatten(x, 1)
        # N x 1024
        x = self.dropout(x)
        x = self.fc(x)
        # N x 1000 (num_classes)
        if self.training and self.aux_logits:   # eval model lose this layer
            return x, aux2, aux1
        return x

    def _initialize_weights(self):
        for m in self.modules():
            if isinstance(m, nn.Conv2d):
                nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
                if m.bias is not None:
                    nn.init.constant_(m.bias, 0)
            elif isinstance(m, nn.Linear):
                nn.init.normal_(m.weight, 0, 0.01)
                nn.init.constant_(m.bias, 0)


class Inception(nn.Module):
    def __init__(self, in_channels, ch1x1, ch3x3red, ch3x3, ch5x5red, ch5x5, pool_proj):
        super(Inception, self).__init__()

        self.branch1 = BasicConv2d(in_channels, ch1x1, kernel_size=1)

        self.branch2 = nn.Sequential(
            BasicConv2d(in_channels, ch3x3red, kernel_size=1),
            BasicConv2d(ch3x3red, ch3x3, kernel_size=3, padding=1)   # 保證輸出大小等于輸入大小
        )

        self.branch3 = nn.Sequential(
            BasicConv2d(in_channels, ch5x5red, kernel_size=1),
            BasicConv2d(ch5x5red, ch5x5, kernel_size=5, padding=2)   # 保證輸出大小等于輸入大小
        )

        self.branch4 = nn.Sequential(
            nn.MaxPool2d(kernel_size=3, stride=1, padding=1),
            BasicConv2d(in_channels, pool_proj, kernel_size=1)
        )

    def forward(self, x):
        branch1 = self.branch1(x)
        branch2 = self.branch2(x)
        branch3 = self.branch3(x)
        branch4 = self.branch4(x)

        outputs = [branch1, branch2, branch3, branch4]
        return torch.cat(outputs, 1)


class InceptionAux(nn.Module):
    def __init__(self, in_channels, num_classes):
        super(InceptionAux, self).__init__()
        self.averagePool = nn.AvgPool2d(kernel_size=5, stride=3)
        self.conv = BasicConv2d(in_channels, 128, kernel_size=1)  # output[batch, 128, 4, 4]

        self.fc1 = nn.Linear(2048, 1024)
        self.fc2 = nn.Linear(1024, num_classes)

    def forward(self, x):
        # aux1: N x 512 x 14 x 14, aux2: N x 528 x 14 x 14
        x = self.averagePool(x)
        # aux1: N x 512 x 4 x 4, aux2: N x 528 x 4 x 4
        x = self.conv(x)
        # N x 128 x 4 x 4
        x = torch.flatten(x, 1)
        x = F.dropout(x, 0.5, training=self.training)
        # N x 2048
        x = F.relu(self.fc1(x), inplace=True)
        x = F.dropout(x, 0.5, training=self.training)
        # N x 1024
        x = self.fc2(x)
        # N x num_classes
        return x


class BasicConv2d(nn.Module):
    def __init__(self, in_channels, out_channels, **kwargs):
        super(BasicConv2d, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, **kwargs)
        self.relu = nn.ReLU(inplace=True)

    def forward(self, x):
        x = self.conv(x)
        x = self.relu(x)
        return x

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/296684.html

標籤:其他

上一篇:上班劃水,給男朋友做個數字炸彈游戲

下一篇:動手學深度學習(二十六)——影像增廣(一生二,二生三,三生萬物?)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more