昇思25天學習打卡營第7天|Pix2Pix實現圖像轉換

文章目錄

      • 昇思MindSpore應用實踐
        • 基于MindSpore的Pix2Pix圖像轉換
          • 1、Pix2Pix 概述
          • 2、U-Net架構
            • 定義UNet Skip Connection Block
          • 2、生成器部分
          • 3、基于PatchGAN的判別器
          • 4、Pix2Pix的生成器和判別器初始化
          • 5、模型訓練
          • 6、模型推理
      • Reference

昇思MindSpore應用實踐

本系列文章主要用于記錄昇思25天學習打卡營的學習心得。

基于MindSpore的Pix2Pix圖像轉換
1、Pix2Pix 概述

Pix2Pix 是一個專門為圖像到圖像的轉換任務設計的網絡,可以實現語義/標簽到真實圖片、灰度圖到彩色圖、航空圖到地圖、白天到黑夜、線稿圖到實物圖的轉換。Pix2Pix是將條件GAN(CGAN)應用于有監督(需要成對的輸入素描圖像Sketch和真實圖像GT,來訓練網絡)的圖像到圖像翻譯的經典之作,和所有的GANs一樣,模型同樣包括:生成器判別器兩個部分。

CGAN:CGAN(條件GAN) 的目標是生成與給定條件匹配的數據樣本。這些條件可以是標簽、部分實例標注數據或任何其他形式的多模態輔助信息。CGAN 通過將條件并入網絡的生成器和判別器中來指導數據生成過程。
在這里插入圖片描述
相比普通的生成對抗損失:
L G A N ( G , D ) = E y [ l o g ( D ( y ) ) ] + E ( x , z ) [ l o g ( 1 ? D ( x , z ) ) ] L_{GAN}(G,D)=\mathbb{E}_{y}[log(D(y))]+\mathbb{E}_{(x,z)}[log(1-D(x,z))] LGAN?(G,D)=Ey?[log(D(y))]+E(x,z)?[log(1?D(x,z))]

  • x x x:代表觀測圖像的數據。
  • z z z:代表隨機噪聲的數據。
  • y = G ( x , z ) y=G(x,z) y=G(x,z):生成器網絡,給出由觀測圖像 x x x與隨機噪聲 z z z生成的“假”圖片,其中 x x x來自于訓練數據而非生成器。
  • D ( x , G ( x , z ) ) D(x,G(x,z)) D(x,G(x,z)):判別器網絡,給出圖像判定為真實圖像的概率,其中 x x x來自于訓練數據, G ( x , z ) G(x,z) G(x,z)來自于生成器。

CGAN多了來自于觀測圖像的條件 x x x(因此Pix2Pix訓練時采用有監督的方式,需要標注好的語義數據,如下圖中的
Map2Aerial數據集、Anime Sketch Colorization Pair 素描生成動漫數據集),
在這里插入圖片描述
在這里插入圖片描述

CGAN的目標可以表示為:

L C G A N ( G , D ) = E ( x , y ) [ l o g ( D ( x , y ) ) ] + E ( x , z ) [ l o g ( 1 ? D ( x , G ( x , z ) ) ) ] L_{CGAN}(G,D)=\mathbb{E}_{(x,y)}[log(D(x,y))]+\mathbb{E}_{(x,z)}[log(1-D(x,G(x,z)))] LCGAN?(G,D)=E(x,y)?[log(D(x,y))]+E(x,z)?[log(1?D(x,G(x,z)))]

Pix2Pix 還包括 L1 損失,幫助生成器產生結構上接近真實圖像的結果,這一點在圖像翻譯任務中尤為重要:
L L 1 ( G ) = E ( x , y , z ) [ ∣ ∣ y ? G ( x , z ) ∣ ∣ 1 ] L_{L1}(G)=\mathbb{E}_{(x,y,z)}[||y-G(x,z)||_{1}] LL1?(G)=E(x,y,z)?[∣∣y?G(x,z)1?]

進而得到最終目標:

a r g min ? G max ? D L C G A N ( G , D ) + λ L L 1 ( G ) arg\min_{G}\max_{D}L_{CGAN}(G,D)+\lambda L_{L1}(G) argGmin?Dmax?LCGAN?(G,D)+λLL1?(G)

圖像轉換問題本質上其實就是像素到像素的映射問題,Pix2Pix使用完全一樣的網絡結構和目標函數,僅更換不同的訓練數據集就能分別實現以上的任務。

2、U-Net架構

U-Net架構:Pix2Pix 使用 U-Net 架構作為其生成器,在傳統的編解碼網絡結構基礎上加入了跳躍連接的方式,可以更好地捕捉圖像的細節和上下文信息,適合于圖像到圖像的翻譯任務。相比于普通的編解碼結構(Encoder-Decoder),U-Net在編碼器和解碼器之間引入了跳躍連接,極大地改善了梯度流:
在這里插入圖片描述

定義UNet Skip Connection Block
import mindspore
import mindspore.nn as nn
import mindspore.ops as opsclass UNetSkipConnectionBlock(nn.Cell):def __init__(self, outer_nc, inner_nc, in_planes=None, dropout=False,submodule=None, outermost=False, innermost=False, alpha=0.2, norm_mode='batch'):super(UNetSkipConnectionBlock, self).__init__()down_norm = nn.BatchNorm2d(inner_nc)up_norm = nn.BatchNorm2d(outer_nc)use_bias = Falseif norm_mode == 'instance':down_norm = nn.BatchNorm2d(inner_nc, affine=False)up_norm = nn.BatchNorm2d(outer_nc, affine=False)use_bias = Trueif in_planes is None:in_planes = outer_ncdown_conv = nn.Conv2d(in_planes, inner_nc, kernel_size=4,stride=2, padding=1, has_bias=use_bias, pad_mode='pad')down_relu = nn.LeakyReLU(alpha)up_relu = nn.ReLU()if outermost:up_conv = nn.Conv2dTranspose(inner_nc * 2, outer_nc,kernel_size=4, stride=2,padding=1, pad_mode='pad')down = [down_conv]up = [up_relu, up_conv, nn.Tanh()]model = down + [submodule] + upelif innermost:up_conv = nn.Conv2dTranspose(inner_nc, outer_nc,kernel_size=4, stride=2,padding=1, has_bias=use_bias, pad_mode='pad')down = [down_relu, down_conv]up = [up_relu, up_conv, up_norm]model = down + upelse:up_conv = nn.Conv2dTranspose(inner_nc * 2, outer_nc,kernel_size=4, stride=2,padding=1, has_bias=use_bias, pad_mode='pad')down = [down_relu, down_conv, down_norm]up = [up_relu, up_conv, up_norm]model = down + [submodule] + upif dropout:model.append(nn.Dropout(p=0.5))self.model = nn.SequentialCell(model)self.skip_connections = not outermostdef construct(self, x):out = self.model(x)if self.skip_connections:out = ops.concat((out, x), axis=1)return out
2、生成器部分

原始CGAN的輸入是條件x和噪聲z兩種信息,這里的生成器只使用了條件信息,因此不能生成多樣性的結果。因此Pix2Pix在訓練和測試時都使用了dropout,這樣可以生成多樣性的結果。

通過MindSpore實現基于U-Net的生成器:

class UNetGenerator(nn.Cell):def __init__(self, in_planes, out_planes, ngf=64, n_layers=8, norm_mode='bn', dropout=False):super(UNetGenerator, self).__init__()unet_block = UNetSkipConnectionBlock(ngf * 8, ngf * 8, in_planes=None, submodule=None,norm_mode=norm_mode, innermost=True)for _ in range(n_layers - 5):unet_block = UNetSkipConnectionBlock(ngf * 8, ngf * 8, in_planes=None, submodule=unet_block,norm_mode=norm_mode, dropout=dropout)unet_block = UNetSkipConnectionBlock(ngf * 4, ngf * 8, in_planes=None, submodule=unet_block,norm_mode=norm_mode)unet_block = UNetSkipConnectionBlock(ngf * 2, ngf * 4, in_planes=None, submodule=unet_block,norm_mode=norm_mode)unet_block = UNetSkipConnectionBlock(ngf, ngf * 2, in_planes=None, submodule=unet_block,norm_mode=norm_mode)self.model = UNetSkipConnectionBlock(out_planes, ngf, in_planes=in_planes, submodule=unet_block,outermost=True, norm_mode=norm_mode)def construct(self, x):return self.model(x)
3、基于PatchGAN的判別器

判別器使用的PatchGAN結構,可看做卷積。
生成的矩陣中的每個點代表原圖的一小塊區域(patch)。通過矩陣中的各個值來判斷原圖中對應每個Patch的真假。

import mindspore.nn as nnclass ConvNormRelu(nn.Cell):def __init__(self,in_planes,out_planes,kernel_size=4,stride=2,alpha=0.2,norm_mode='batch',pad_mode='CONSTANT',use_relu=True,padding=None):super(ConvNormRelu, self).__init__()norm = nn.BatchNorm2d(out_planes)if norm_mode == 'instance':norm = nn.BatchNorm2d(out_planes, affine=False)has_bias = (norm_mode == 'instance')if not padding:padding = (kernel_size - 1) // 2if pad_mode == 'CONSTANT':conv = nn.Conv2d(in_planes, out_planes, kernel_size, stride, pad_mode='pad',has_bias=has_bias, padding=padding)layers = [conv, norm]else:paddings = ((0, 0), (0, 0), (padding, padding), (padding, padding))pad = nn.Pad(paddings=paddings, mode=pad_mode)conv = nn.Conv2d(in_planes, out_planes, kernel_size, stride, pad_mode='pad', has_bias=has_bias)layers = [pad, conv, norm]if use_relu:relu = nn.ReLU()if alpha > 0:relu = nn.LeakyReLU(alpha)layers.append(relu)self.features = nn.SequentialCell(layers)def construct(self, x):output = self.features(x)return outputclass Discriminator(nn.Cell):def __init__(self, in_planes=3, ndf=64, n_layers=3, alpha=0.2, norm_mode='batch'):super(Discriminator, self).__init__()kernel_size = 4layers = [nn.Conv2d(in_planes, ndf, kernel_size, 2, pad_mode='pad', padding=1),nn.LeakyReLU(alpha)]nf_mult = ndffor i in range(1, n_layers):nf_mult_prev = nf_multnf_mult = min(2 ** i, 8) * ndflayers.append(ConvNormRelu(nf_mult_prev, nf_mult, kernel_size, 2, alpha, norm_mode, padding=1))nf_mult_prev = nf_multnf_mult = min(2 ** n_layers, 8) * ndflayers.append(ConvNormRelu(nf_mult_prev, nf_mult, kernel_size, 1, alpha, norm_mode, padding=1))layers.append(nn.Conv2d(nf_mult, 1, kernel_size, 1, pad_mode='pad', padding=1))self.features = nn.SequentialCell(layers)def construct(self, x, y):x_y = ops.concat((x, y), axis=1)output = self.features(x_y)return output
4、Pix2Pix的生成器和判別器初始化

實例化Pix2Pix生成器和判別器:

import mindspore.nn as nn
from mindspore.common import initializer as initg_in_planes = 3
g_out_planes = 3
g_ngf = 64
g_layers = 8
d_in_planes = 6
d_ndf = 64
d_layers = 3
alpha = 0.2
init_gain = 0.02
init_type = 'normal'net_generator = UNetGenerator(in_planes=g_in_planes, out_planes=g_out_planes,ngf=g_ngf, n_layers=g_layers)
for _, cell in net_generator.cells_and_names():if isinstance(cell, (nn.Conv2d, nn.Conv2dTranspose)):if init_type == 'normal':cell.weight.set_data(init.initializer(init.Normal(init_gain), cell.weight.shape))elif init_type == 'xavier':cell.weight.set_data(init.initializer(init.XavierUniform(init_gain), cell.weight.shape))elif init_type == 'constant':cell.weight.set_data(init.initializer(0.001, cell.weight.shape))else:raise NotImplementedError('initialization method [%s] is not implemented' % init_type)elif isinstance(cell, nn.BatchNorm2d):cell.gamma.set_data(init.initializer('ones', cell.gamma.shape))cell.beta.set_data(init.initializer('zeros', cell.beta.shape))net_discriminator = Discriminator(in_planes=d_in_planes, ndf=d_ndf,alpha=alpha, n_layers=d_layers)
for _, cell in net_discriminator.cells_and_names():if isinstance(cell, (nn.Conv2d, nn.Conv2dTranspose)):if init_type == 'normal':cell.weight.set_data(init.initializer(init.Normal(init_gain), cell.weight.shape))elif init_type == 'xavier':cell.weight.set_data(init.initializer(init.XavierUniform(init_gain), cell.weight.shape))elif init_type == 'constant':cell.weight.set_data(init.initializer(0.001, cell.weight.shape))else:raise NotImplementedError('initialization method [%s] is not implemented' % init_type)elif isinstance(cell, nn.BatchNorm2d):cell.gamma.set_data(init.initializer('ones', cell.gamma.shape))cell.beta.set_data(init.initializer('zeros', cell.beta.shape))class Pix2Pix(nn.Cell):"""Pix2Pix模型網絡"""def __init__(self, discriminator, generator):super(Pix2Pix, self).__init__(auto_prefix=True)self.net_discriminator = discriminatorself.net_generator = generatordef construct(self, reala):fakeb = self.net_generator(reala)return fakeb
5、模型訓練

訓練分為兩個主要部分:訓練判別器和訓練生成器;
訓練判別器的目的是最大程度地提高判別圖像真偽的概率;
訓練生成器是希望能產生更好的虛假圖像;
在這兩個部分中,分別獲取訓練過程中的損失,并在每個周期結束時進行統計。

通過MindSpore進行訓練:

import numpy as np
import os
import datetime
from mindspore import value_and_grad, Tensorepoch_num = 3
ckpt_dir = "results/ckpt"
dataset_size = 400
val_pic_size = 256
lr = 0.0002
n_epochs = 100
n_epochs_decay = 100def get_lr():lrs = [lr] * dataset_size * n_epochslr_epoch = 0for epoch in range(n_epochs_decay):lr_epoch = lr * (n_epochs_decay - epoch) / n_epochs_decaylrs += [lr_epoch] * dataset_sizelrs += [lr_epoch] * dataset_size * (epoch_num - n_epochs_decay - n_epochs)return Tensor(np.array(lrs).astype(np.float32))dataset = ds.MindDataset("./dataset/dataset_pix2pix/train.mindrecord", columns_list=["input_images", "target_images"], shuffle=True, num_parallel_workers=1)
steps_per_epoch = dataset.get_dataset_size()
loss_f = nn.BCEWithLogitsLoss()
l1_loss = nn.L1Loss()def forword_dis(reala, realb):lambda_dis = 0.5fakeb = net_generator(reala)pred0 = net_discriminator(reala, fakeb)pred1 = net_discriminator(reala, realb)loss_d = loss_f(pred1, ops.ones_like(pred1)) + loss_f(pred0, ops.zeros_like(pred0))loss_dis = loss_d * lambda_disreturn loss_disdef forword_gan(reala, realb):lambda_gan = 0.5lambda_l1 = 100fakeb = net_generator(reala)pred0 = net_discriminator(reala, fakeb)loss_1 = loss_f(pred0, ops.ones_like(pred0))loss_2 = l1_loss(fakeb, realb)loss_gan = loss_1 * lambda_gan + loss_2 * lambda_l1return loss_gand_opt = nn.Adam(net_discriminator.trainable_params(), learning_rate=get_lr(),beta1=0.5, beta2=0.999, loss_scale=1)
g_opt = nn.Adam(net_generator.trainable_params(), learning_rate=get_lr(),beta1=0.5, beta2=0.999, loss_scale=1)grad_d = value_and_grad(forword_dis, None, net_discriminator.trainable_params())
grad_g = value_and_grad(forword_gan, None, net_generator.trainable_params())def train_step(reala, realb):loss_dis, d_grads = grad_d(reala, realb)loss_gan, g_grads = grad_g(reala, realb)d_opt(d_grads)g_opt(g_grads)return loss_dis, loss_ganif not os.path.isdir(ckpt_dir):os.makedirs(ckpt_dir)g_losses = []
d_losses = []
data_loader = dataset.create_dict_iterator(output_numpy=True, num_epochs=epoch_num)for epoch in range(epoch_num):for i, data in enumerate(data_loader):start_time = datetime.datetime.now()input_image = Tensor(data["input_images"])target_image = Tensor(data["target_images"])dis_loss, gen_loss = train_step(input_image, target_image)end_time = datetime.datetime.now()delta = (end_time - start_time).microsecondsif i % 2 == 0:print("ms per step:{:.2f}  epoch:{}/{}  step:{}/{}  Dloss:{:.4f}  Gloss:{:.4f} ".format((delta / 1000), (epoch + 1), (epoch_num), i, steps_per_epoch, float(dis_loss), float(gen_loss)))d_losses.append(dis_loss.asnumpy())g_losses.append(gen_loss.asnumpy())if (epoch + 1) == epoch_num:mindspore.save_checkpoint(net_generator, ckpt_dir + "Generator.ckpt")

在這里插入圖片描述

6、模型推理

導入模型訓練保存的權重:

from mindspore import load_checkpoint, load_param_into_netparam_g = load_checkpoint(ckpt_dir + "Generator.ckpt")
load_param_into_net(net_generator, param_g)
dataset = ds.MindDataset("./dataset/dataset_pix2pix/train.mindrecord", columns_list=["input_images", "target_images"], shuffle=True)
data_iter = next(dataset.create_dict_iterator())
predict_show = net_generator(data_iter["input_images"])
plt.figure(figsize=(10, 3), dpi=140)
for i in range(10):plt.subplot(2, 10, i + 1)plt.imshow((data_iter["input_images"][i].asnumpy().transpose(1, 2, 0) + 1) / 2)plt.axis("off")plt.subplots_adjust(wspace=0.05, hspace=0.02)plt.subplot(2, 10, i + 11)plt.imshow((predict_show[i].asnumpy().transpose(1, 2, 0) + 1) / 2)plt.axis("off")plt.subplots_adjust(wspace=0.05, hspace=0.02)
plt.show()

圖像翻譯效果如下:
在這里插入圖片描述

Reference

昇思官方文檔-Pix2Pix實現圖像轉換
昇思大模型平臺
AI 助你無碼看片,生成對抗網絡(GAN)大顯身手

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/39572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/39572.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/39572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

大數據面試題之Flink(3)

如何確定Flink任務的合理并行度? Flink任務如何實現端到端一致? Flink如何處理背(反)壓? Flink解決數據延遲的問題 Flink消費kafka分區的數據時flink件務并行度之間的關系 使用flink-client消費kafka數據還是使用flink-connector消費 如何動態修改Flink的配置&a…

實戰:基于Java的大數據處理與分析平臺

實戰:基于Java的大數據處理與分析平臺 大家好,我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編,也是冬天不穿秋褲,天冷也要風度的程序猿!今天我們將探討如何利用Java構建高效的大數據處理與分析平臺。…

Python基礎003

Python流程控制基礎 1.條件語句 內置函數input a input("請輸入一段內容:") print(a) print(type(a))代碼執行的時候遇到input函數,就會等鍵盤輸入結果,已回車為結束標志,也就時說輸入回車后代碼才會執行 2.順序執行…

pandas數據分析(5)

pandas使用Numpy的np.nan代表缺失數據,顯示為NaN。NaN是浮點數標準中地Not-a-Number。對于時間戳,則使用pd.NaT,而文本使用的是None。 首先構造一組數據: 使用None或者np.nan來表示缺失的值: 清理DataFrame時&#xf…

深度學習之交叉驗證

交叉驗證(Cross-Validation)是一種用于評估和驗證機器學習模型性能的技術,尤其是在數據量有限的情況下。它通過將數據集分成多個子集,反復訓練和測試模型,以更穩定和可靠地估計模型的泛化能力。常見的交叉驗證方法有以…

java設計模式(四)——抽象工廠模式

一、模式介紹 改善在工廠方法模式中,擴展時新增產品類、工廠類,導致項目中類巨多的場面,減少系統的維護成本,且一個工廠可以生成多種產品,而不是同一種的產品,比如一個工廠既可以生產鞋子又可以衣服&#…

解決數據庫PGSQL,在Mybatis中創建臨時表報錯TODO IDENTIFIER,連接池用的Druid。更換最新版本Druid仍然報錯解決

Druid版本1.1.9報錯Caused by: java.sql.SQLException: sql injection violation, syntax error: TODO IDENTIFIER : CREATE TEMPORARY TABLE temp_ball_classify (id int8 NOT NULL,create_time TIMESTAMP,create_by VARCHAR,classify_name VARCHAR) 代碼如下: 測…

四川蔚瀾時代電子商務有限公司打造抖音電商服務新高地

在數字化浪潮洶涌澎湃的今天,電商行業以其獨特的魅力和強大的市場潛力,成為了推動經濟增長的新引擎。四川蔚瀾時代電子商務有限公司,作為這個領域的佼佼者,正以其專業的服務、創新的理念和卓越的實力,引領抖音電商服務…

用AI,每天創作200+優質內容,2分鐘教會你操作!

前段時間發布了這篇“尋找爆款文案及標題的9大渠道,直接搬運都能搞流量!”,里面我講到如何尋找爆款標題。最近不少朋友問我,如何創作這個標題相關的內容。 多數平臺都有風控規則,有些平臺內容也會有字數要求。為了讓大…

SpringBoot 項目整合 MyBatis 框架,附帶測試示例

文章目錄 一、創建 SpringBoot 項目二、添加 MyBatis 依賴三、項目結構和數據庫表結構四、項目代碼1、application.yml2、TestController3、TbUser4、TbUserMapper5、TestServiceImpl6、TestService7、TestApplication8、TbUserMapper.xml9、MyBatisTest 五、瀏覽器測試結果六、…

JavaScript實現時鐘計時

會動的時鐘 1.目標 2.分析 1.最開始頁面不顯示時間,有兩個按鈕 開始 暫停。開始按鈕是可以點擊的,暫停按鈕不能點擊 2.當點擊開始按鈕后,設置開始按鈕不可用,暫停按鈕可用。然后將當前系統時間放到按鈕上面。每隔1秒中更新一下…

TransMIL:基于Transformer的多實例學習

MIL是弱監督分類問題的有力工具。然而,目前的MIL方法通常基于iid假設,忽略了不同實例之間的相關性。為了解決這個問題,作者提出了一個新的框架,稱為相關性MIL,并提供了收斂性的證明。基于此框架,還設計了一…

3.js - 反射率(reflectivity) 、折射率(ior)

沒啥太大的感覺 反射率 reflectivity 概念 反射率:指的是,材質表面反射光線的能力反射率,用于控制材質對環境光,或光源的反射程度反射率越高,材質表面反射的光線越多,看起來就越光亮使用 適用于&#xff0…

【OCPP】ocpp1.6協議第5.1章節Cancel Reservation的介紹及翻譯

目錄 5.1 取消預約Cancel Reservation-概述 Cancel Reservation CancelReservation.req 請求消息 CancelReservation.conf 確認消息 取消預定的流程 應用場景 示例消息 CancelReservation.req 示例 CancelReservation.conf 示例 總結 5.1 取消預約Cancel Reservation…

VScode 常用插件

基礎開發插件 Chinese (Simplified)(簡體中文語言包):這是適用于VS Code的中文(簡體)語言包,適用于英語不太流利的用戶。Auto Rename Tag:這個插件可以同步修改HTML/XML標簽,當用戶修…

【PYG】Cora數據集分類任務計算損失,cross_entropy為什么不能直接替換成mse_loss

cross_entropy計算誤差方式,輸入向量z為[1,2,3],預測y為[1],選擇數為2,計算出一大坨e的式子為3.405,再用-23.405計算得到1.405MSE計算誤差方式,輸入z為[1,2,3],預測向量應該是[1,0,0]&#xff0…

Dify入門指南

一.Dify介紹 生成式 AI 應用創新引擎,開源的 LLM 應用開發平臺。提供從 Agent 構建到 AI workflow 編排、RAG 檢索、模型管理等能力,輕松構建和運營生成式 AI 原生應用,比 LangChain 更易用。一個平臺,接入全球大型語言模型。不同…

CesiumJS【Basic】- #050 繪制掃描線(Primitive方式)

文章目錄 繪制掃描線(Primitive方式)- 需要自定義著色器1 目標2 代碼2.1 main.ts繪制掃描線(Primitive方式)- 需要自定義著色器 1 目標 使用Primitive方式繪制掃描線 2 代碼 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(cesiumConta…

自我反思與暑假及大三上學期規劃

又要放暑假了,依稀記得上個暑假一邊練車,一邊試圖拿捏C語言,第一次感覺暑假也可以如此忙碌。但是開學以后,我并沒有把重心放在期望自己應該做的事情上,更多的時間花費在了處理學院的相關事務。現在看來,大二…

《昇思 25 天學習打卡營第 9 天 | FCN 圖像語義分割 》

活動地址:https://xihe.mindspore.cn/events/mindspore-training-camp 簽名:Sam9029 這一章節 出現了一個 深度學習 中經常出現的概念 全卷積網絡(Fully Convolutional Networks) : 官話:FCN 主要用于圖像分割領域&…