Dual Aggregation Transformer for Image Super-Resolution論文總結

題目:Dual Aggregation Transformer(雙聚合Transformer) for Image Super-Resolution(圖像超分辨)

論文(ICCV):Chen_Dual_Aggregation_Transformer_for_Image_Super-Resolution_ICCV_2023_paper.pdf (thecvf.com)

源碼:zhengchen1999/DAT: PyTorch code for our ICCV 2023 paper "Dual Aggregation Transformer for Image Super-Resolution" (github.com)?

Super Resolution:超分辨率(Super-Resolution),簡稱超分(SR)。是指利用光學及其相關光學知識,根據已知圖像信息恢復圖像細節和其他數據信息的過程,簡單來說就是增大圖像的分辨率,防止其圖像質量下降。

?一、摘要

研究背景:Transformer最近在低級視覺任務中獲得了相當大的流行,包括圖像超分辨率(SR)。這些網絡沿著不同的維度、空間或通道利用自注意力,并取得了令人印象深刻的性能。這激勵我們將 Transformer 中的兩個維度結合起來,以獲得更強大的表示能力。

主要工作:基于上述思想,本文提出了一種新的 Transformer 模型,雙聚合 Transformer(DAT),用于 SR 圖像。 DAT? 模塊間 模塊內 雙重方式聚合 跨空間? 跨通道維度?的特征

  • 1. 交替地在連續的 Transformer 塊中應用 空間 和 通道自注意力。該策略使 DAT 能夠捕獲全局上下文并實現?模塊間特征聚合?
  • 2. 提出了自適應交互模塊(AIM)和空間門前饋網絡(SGFN)來實現?模塊內特征聚合?。AIM 從相應維度補充了兩種自注意力機制。
  • 3. 同時,SGFN前饋網絡引入了額外的非線性空間信息

實驗效果:大量實驗表明,DAT方法優于現有方法。

二、引言

圖像超分辨任務的背景、挑戰以及基于CNN網絡的方法的不足(在全局依賴上)—> transformer簡介 + 在超分辨方向上transformer相關的研究工作(主要為自注意力方向,兩個方面:空間層面和通道層面)+ 概括 Spatial window self-attention(SW-SA)和?Channel-wise self-attention (CW-SA) 的作用(對超分辨)—> DAT網絡、AIM模塊和SGFN模塊的設計動機(為了解決哪些問題)、設計思路(如何實現,網絡具體實現是怎么做的)、功能和作用?—> 貢獻:

  • 1.?設計了一種新的圖像SR模型--雙聚合transformer(DAT)。DAT以塊間和塊內雙重方式聚合空間和通道特征,以獲得強大的表示能力。(主要工作概述)
  • 2.?交替采用空間和通道自關注,實現塊間空間和通道特征聚合。此外,還提出了AIM和SGFN來實現塊內特征聚合。(新模塊概述)
  • 3.?進行了大量的實驗,以證明DAT優于最先進的方法,同時保持了較低的復雜性和模型大小。(實驗效果概述)

三、方法

3.1 架構概述??

Dual Aggregation Transformer (DAT) 的網絡體系結構如下圖所示。雙空間transformer模塊 (DSTB)和雙通道transformer模塊 (DCTB)是兩個連續的雙聚合transformer模塊 (DATB)。(DSTB和DCTB只在注意力有所不同,因此將他們都看作DATB模塊)

整個網絡包括三個模塊:淺層特征提取深層特征提取圖像重建

淺層特征提取(淺層卷積):首先,給定一幅低分辨率(LR)輸入圖像?I_{LR}\in R^{H\times W \times 3},使用卷積層對其進行處理并生成淺層特征?F_S

深層特征提取(DSTB +?DCTB + Conv):淺層特征?F_S?在深特征提取模塊內進行處理,以獲得深層特征?F_D \in R^{H\times W \times C}?。該模塊由N1個殘差組(RG)堆疊。每個RG包含n2對雙聚合transformer模塊(DATB)。每個DATB對包含兩個transformer模塊,分別利用空間和通道自注意力。在RG的末尾引入一個卷積層來細化從變壓器塊中提取的特征。此外,對于每個RG,使用殘差連接。

圖像重建(conv + pixel shuffle + conv):在該模塊中,通過 pixel shuffle 方法對深度特征?F_D?進行上采樣。并在上采樣操作之前和之后使用卷積層聚集特征

Q:pixel shuffle 方法是什么?

3.2?Dual Aggregation Transformer Block(雙聚合transformer模塊

DATB有兩種類型:雙空間transformer模塊 (DSTB)雙通道transformer模塊 (DCTB)。?

DSTBDCTB 分別基于?Spatial Window Self-Attention(空間窗口自注意力)?Channel-Wise Self-Attention(逐通道自注意力)通過交替應用 DSTB 和 DCTB ,DAT可以實現空間維度和通道維度之間的塊間特征聚合。此外,還提出了自適應交互模塊(AIM)和空間門前饋網絡(SGFN)來實現模塊內特征聚合。

1)Spatial Window Self-Attention(空間窗口自注意力)

如圖所示,空間窗口自注意力(SW-SA)計算窗口內的注意。

過程

1. 給定輸入?X \in R^{H \times W \times C},通過線性投影生成查詢Q、鍵K和值V矩陣。該過程被定義為:

其中,W_Q,W_K ,W_V \in R^{C\times C}是省略偏差的線性投影。

2. 隨后,將Q、K和V劃分為不重疊的窗口展平每個包含?N_W?個像素的窗口。將重塑的投影矩陣表示為?Q_s,K_s,V_s\in \mathbb{R}^{\frac{HW}{N_{\omega}} \times N_\omega \times C}。然后,將?Q_s,K_s,V_s?分成 h 個頭:Q_s=[Q^1_s, \cdots ,Q^h_s]K_s=[K^1_s, \cdots ,K^h_s],且?V_s=[V^1_s, \cdots ,V^h_s]?。每個頭的維度為?d=\frac{C}{h}?。第 i 個頭的輸出?Y^i_s?定義為:

其中,D表示相對位置編碼。(自注意力計算)

3. 最后,通過對所有?Y^i_s?的重塑和拼接,得到特征?Y_s\in \mathbb{R}^{H\times W\times C}。?這一過程的公式如下:

其中,W_P\in \mathbb{R}^{C\times C}?是融合所有特征的線性投影。(這里提到默認使用Swin transformer中的移位窗口操作來捕捉更多的空間信息)

代碼實現

def img2windows(img, H_sp, W_sp):    # 劃分窗口"""Input: Image (B, C, H, W)Output: Window Partition (B', N, C)"""B, C, H, W = img.shapeimg_reshape = img.view(B, C, H // H_sp, H_sp, W // W_sp, W_sp)img_perm = img_reshape.permute(0, 2, 4, 3, 5, 1).contiguous().reshape(-1, H_sp* W_sp, C)return img_permclass Spatial_Attention(nn.Module):""" Spatial Window Self-Attention.It supports rectangle window (containing square window).Args:dim (int): Number of input channels.idx (int): The indentix of window. (0/1)split_size (tuple(int)): Height and Width of spatial window.dim_out (int | None): The dimension of the attention output. Default: Nonenum_heads (int): Number of attention heads. Default: 6attn_drop (float): Dropout ratio of attention weight. Default: 0.0proj_drop (float): Dropout ratio of output. Default: 0.0qk_scale (float | None): Override default qk scale of head_dim ** -0.5 if setposition_bias (bool): The dynamic relative position bias. Default: True"""def __init__(self, dim, idx, split_size=[8,8], dim_out=None, num_heads=6, attn_drop=0., proj_drop=0., qk_scale=None, position_bias=True):super().__init__()self.dim = dimself.dim_out = dim_out or dimself.split_size = split_sizeself.num_heads = num_headsself.idx = idxself.position_bias = position_biashead_dim = dim // num_heads    # 每個頭的維度self.scale = qk_scale or head_dim ** -0.5if idx == 0:H_sp, W_sp = self.split_size[0], self.split_size[1]elif idx == 1:W_sp, H_sp = self.split_size[0], self.split_size[1]else:print ("ERROR MODE", idx)exit(0)self.H_sp = H_spself.W_sp = W_spif self.position_bias:self.pos = DynamicPosBias(self.dim // 4, self.num_heads, residual=False)# generate mother-setposition_bias_h = torch.arange(1 - self.H_sp, self.H_sp)position_bias_w = torch.arange(1 - self.W_sp, self.W_sp)biases = torch.stack(torch.meshgrid([position_bias_h, position_bias_w]))biases = biases.flatten(1).transpose(0, 1).contiguous().float()self.register_buffer('rpe_biases', biases)# get pair-wise relative position index for each token inside the windowcoords_h = torch.arange(self.H_sp)coords_w = torch.arange(self.W_sp)coords = torch.stack(torch.meshgrid([coords_h, coords_w]))coords_flatten = torch.flatten(coords, 1)relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :]relative_coords = relative_coords.permute(1, 2, 0).contiguous()relative_coords[:, :, 0] += self.H_sp - 1relative_coords[:, :, 1] += self.W_sp - 1relative_coords[:, :, 0] *= 2 * self.W_sp - 1relative_position_index = relative_coords.sum(-1)self.register_buffer('relative_position_index', relative_position_index)self.attn_drop = nn.Dropout(attn_drop)def im2win(self, x, H, W):    # 將Q、K和V劃分為不重疊的窗口, (B N C) --> (num_win num_heads H_sp* W_sp C//num_heads)B, N, C = x.shapex = x.transpose(-2,-1).contiguous().view(B, C, H, W)x = img2windows(x, self.H_sp, self.W_sp)x = x.reshape(-1, self.H_sp* self.W_sp, self.num_heads, C // self.num_heads).permute(0, 2, 1, 3).contiguous()return xdef forward(self, qkv, H, W, mask=None):"""Input: qkv: (B, 3*L, C), H, W, mask: (B, N, N), N is the window sizeOutput: x (B, H, W, C)"""q,k,v = qkv[0], qkv[1], qkv[2]B, L, C = q.shapeassert L == H * W, "flatten img_tokens has wrong size"# partition the q,k,v, image to windowq = self.im2win(q, H, W)k = self.im2win(k, H, W)v = self.im2win(v, H, W)q = q * self.scaleattn = (q @ k.transpose(-2, -1))  # B head N C @ B head C N --> B head N N# calculate drpeif self.position_bias:pos = self.pos(self.rpe_biases)# select position biasrelative_position_bias = pos[self.relative_position_index.view(-1)].view(self.H_sp * self.W_sp, self.H_sp * self.W_sp, -1)relative_position_bias = relative_position_bias.permute(2, 0, 1).contiguous()attn = attn + relative_position_bias.unsqueeze(0)N = attn.shape[3]# use mask for shift windowif mask is not None:nW = mask.shape[0]attn = attn.view(B, nW, self.num_heads, N, N) + mask.unsqueeze(1).unsqueeze(0)attn = attn.view(-1, self.num_heads, N, N)attn = nn.functional.softmax(attn, dim=-1, dtype=attn.dtype)attn = self.attn_drop(attn)x = (attn @ v)x = x.transpose(1, 2).reshape(-1, self.H_sp* self.W_sp, C)  # B head N N @ B head N C# merge the window, window to imagex = windows2img(x, self.H_sp, self.W_sp, H, W)  # B H' W' Creturn x

2)Channel-Wise Self-Attention逐通道自注意力

通道自注意力(channel-wise self-attention, CW-SA)中的自注意力機制是沿著通道維度進行的。?

方法:按通道劃分為頭部,并分別對每個頭部進行注意力計算。

過程:給定輸入X,應用線性投影來生成查詢、鍵和值矩陣,并將它們重塑為?\mathbb{R}^{HW\times C}?大小。用?Q_c, K_c?和?V_c?表示重構矩陣。與SW-SA中的操作相同,將投影向量分成 h 個頭。則第 i 頭的通道自注意力過程可計算為:

其中,Y^i_c \in \mathbb{R}^{HW\times d}?是第 i 個頭的輸出,α 是可學習的參數,用于在softmax函數之前調整內積。最后,通過對所有?Y^i_c?進行重塑和拼接(這里與空間窗口自注意力操作相同),得到注意力特征?Y_c \in \mathbb{R}^{H\times W \times C}

class Adaptive_Channel_Attention(nn.Module):# The implementation builds on XCiT code https://github.com/facebookresearch/xcit""" Adaptive Channel Self-AttentionArgs:dim (int): Number of input channels.num_heads (int): Number of attention heads. Default: 6qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: Trueqk_scale (float | None): Override default qk scale of head_dim ** -0.5 if set.attn_drop (float): Attention dropout rate. Default: 0.0drop_path (float): Stochastic depth rate. Default: 0.0"""def __init__(self, dim, num_heads=8, qkv_bias=False, qk_scale=None, attn_drop=0., proj_drop=0.):super().__init__()self.num_heads = num_headsself.temperature = nn.Parameter(torch.ones(num_heads, 1, 1))self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias)self.attn_drop = nn.Dropout(attn_drop)self.proj = nn.Linear(dim, dim)self.proj_drop = nn.Dropout(proj_drop)self.dwconv = nn.Sequential(nn.Conv2d(dim, dim, kernel_size=3, stride=1, padding=1,groups=dim),nn.BatchNorm2d(dim),nn.GELU())self.channel_interaction = nn.Sequential(nn.AdaptiveAvgPool2d(1),nn.Conv2d(dim, dim // 8, kernel_size=1),nn.BatchNorm2d(dim // 8),nn.GELU(),nn.Conv2d(dim // 8, dim, kernel_size=1),)self.spatial_interaction = nn.Sequential(nn.Conv2d(dim, dim // 16, kernel_size=1),nn.BatchNorm2d(dim // 16),nn.GELU(),nn.Conv2d(dim // 16, 1, kernel_size=1))def forward(self, x, H, W):"""Input: x: (B, H*W, C), H, WOutput: x: (B, H*W, C)"""B, N, C = x.shapeqkv = self.qkv(x).reshape(B, N, 3, self.num_heads, C // self.num_heads) # 按通道劃分頭部qkv = qkv.permute(2, 0, 3, 1, 4)q, k, v = qkv[0], qkv[1], qkv[2]q = q.transpose(-2, -1)k = k.transpose(-2, -1)v = v.transpose(-2, -1)v_ = v.reshape(B, C, N).contiguous().view(B, C, H, W)q = torch.nn.functional.normalize(q, dim=-1)k = torch.nn.functional.normalize(k, dim=-1)attn = (q @ k.transpose(-2, -1)) * self.temperatureattn = attn.softmax(dim=-1)attn = self.attn_drop(attn)# attention outputattened_x = (attn @ v).permute(0, 3, 1, 2).reshape(B, N, C)# convolution outputconv_x = self.dwconv(v_)# Adaptive Interaction Module (AIM)# C-Map (before sigmoid)attention_reshape = attened_x.transpose(-2,-1).contiguous().view(B, C, H, W)channel_map = self.channel_interaction(attention_reshape)# S-Map (before sigmoid)spatial_map = self.spatial_interaction(conv_x).permute(0, 2, 3, 1).contiguous().view(B, N, 1)# S-Iattened_x = attened_x * torch.sigmoid(spatial_map)# C-Iconv_x = conv_x * torch.sigmoid(channel_map)conv_x = conv_x.permute(0, 2, 3, 1).contiguous().view(B, N, C)x = attened_x + conv_xx = self.proj(x)x = self.proj_drop(x)return x

??

3)Adaptive Interaction Module(自適應交互模塊)?

? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ?

下分支:由于自注意力專注于捕捉全局特征,納入了一個平行于自注意力模塊的卷積分支(DW-Conv),局部性引入Transformer。?

問題

  • 1. 簡單地添加卷積分支不能有效地融合全局和局部特征。
  • 2. 盡管SW-SA和CW-SA交替執行可以同時捕獲空間和通道特征,但不同維度的信息仍然不能在單個自注意力中有效利用。

目的:為克服這些問題,本文提出了自適應交互模塊(AIM),根據自注意力機制的類型,從空間或通道維度自適應地重新加權兩個分支的特征。

過程:首先,對 V 進行并行深度卷積(DW-Conv),以建立自注意力和卷積之間的直接聯系。卷積輸出為?Y_w \in \mathbb{R}^{H\times W\times C}?。然后引入AIM,對兩個特征進行自適應調整。具體而言,AIM包括兩個交互操作:空間交互(S-I)?和?通道交互(C-I)。給定兩個輸入特征,A\in \mathbb{R}^{H\times W\times C}?和?B \in \mathbb{R}^{H\times W\times C}空間交互計算一個輸入的空間注意力圖( 記為S-Map,大小為?\mathbb{R}^{H\times W\times 1}?)。通道交互計算通道注意力圖( 記為C-Map,大小為?\mathbb{R}^{1\times 1 \times C}?)。以 B 為例,公式表達如下:

其中?H_{GP}?表示全局平均池,f(\cdot )?表示Sigmoid函數,\sigma(\cdot )?表示GELU函數。W(\cdot )?表示用于縮小或放大通道維度的逐點卷積的權重。W1和W2的縮放比率分別為 r1,C/r1。W3的縮放比率為r2,并且W4膨脹比率為 r2。

隨后,相互將注意力圖應用于另一個輸入,從而實現交互。這一過程的公式如下:

其中,⊙表示逐元素乘法。

最后,基于AIM,在SW-SA和CW-SA的基礎上,設計了兩種新的自注意力機制AS-SA和AC-SA。對于SW-SA,我們引入了兩個分支之間的通道-空間相互作用。對于CW-SA,我們采用空間-信道交互。給定輸入?X \in \mathbb{R}^{H\times W\times C},過程定義為:

其中,Y_sY_c?和?Y_w是上面定義的SW-SA、CW-SA和DW-Conv的輸出。

4)Spatial-Gate Feed-Forward Network(空間門前饋網絡)

?問題

  • 1.?前饋網絡(FFN)難以捕獲空間信息。
  • 2. 此外,通道中的冗余信息阻礙了特征表達能力。

解決方法:提出了空間門前饋網絡(SGFN),將空間門(SG)引入到FFN中

結構:SG模塊是一個簡單的門機制,由深度卷積逐元素乘法組成。沿著通道維度,將特征映射分為卷積支路乘法支路兩部分。總體而言,給定輸入?\hat{X}\in \mathbb{R}^{H\times W\times C}SGFN計算公式如下:

其中,W^1_p?和?W^2_p?表示線性投影,σ 表示Gelu函數,W_d?表示深度卷積的可學習參數。X'_1?和?X'_2?\in \mathbb{R}^{H\times W\times \frac{C'}{2}}?空間中,其中 C' 表示SGFN中的隱維度。

四、實驗

訓練設置:本文訓練了 patch 大小為64×64,批次大小為32的模型。訓練迭代次數為500K。通過ADAM優化器( β1=0.9和β2=0.99 ),通過最小化 L1 損失來優化模型。將學習速率設置為2×10?4,并以[250K,400K,450K,475K]為標記減半。此外,在訓練期間,隨機使用90?、180?和270?的旋轉和水平翻轉來增強數據。本文的模型是基于4個A100圖形處理器的PyTorch實現的。

數據集:DIV2K 和 Flickr2K用于訓練,以及五個基準數據集:Set5、Set14、B100、Urban100和Manga109用于測試。分別在×2、×3、×4三種尺度下進行了實驗。

評估指標:PSNR 和 SSIM,這兩個度量是在YCbCR空間的Y通道( 即,亮度 )上計算的。

4.1?消融實驗

為了調查交替使用SW-SA和CW-SA的策略的效果,本文進行了幾個實驗:

  • 1. 表的第一行和第二行表示用 CW-SA 或 SW-SA 替換 DAT 中的所有注意模塊,其中SW-SA采用8x8窗口大小。(單一模塊)
  • 2. 第三行表示在 DAT 中的連續transformer模塊中交替應用兩個SA。此外,在SA中,所有模型都采用規則的FFN,而不采用AIM。(本文方法)

比較這三種模型,可以觀察到,使用SW-SA的模型的性能優于使用CW-SA的模型。此外,交替應用兩個SA可以獲得33.34dB的最佳性能。這表明,同時利用通道信息和空間信息是精確圖像恢復的關鍵。?

4.2 與最先進的方法進行比較

定量比較:同時,除了在Urban100數據集(×4)上的PSNR值與CAT-A相比外,DAT的性能要好于以前的方法。具體地說,與SwinIR和CAT-A相比(比較對象,DAT在Manga109數據集(×2)(數據集)獲得了顯著的增益,分別獲得了0.41db和0.23db的改進(提升比例)。此外,小視覺模型DAT-S也取得了與以往方法相當或更好的性能。所有這些定量結果表明,聚合塊間和塊內的空間和通道信息可以有效地提高圖像重建質量結論。?

定性比較:在一些具有挑戰性的場景中,以前的方法可能會遇到模糊偽影、扭曲或不準確的紋理恢復(對比方法定性描述)。與之形成鮮明對比的是,本文的方法有效地減少了偽影,保留了更多的結構和更精細的細節(本文方法定性描述)。這主要是因為本文的方法通過從不同維度提取復雜特征,具有更強的表示能力(結論)。

五、結論

主要工作:本文提出了一種新的圖像SR變換模型--雙聚集變換(DAT)。DAT以塊間和塊內雙重方式聚合空間和信道特征,以獲得強大的表示能力(概述,方法 + 作用)

  • 1. 具體地說,連續的transformer模塊交替地應用空間窗口和通道方式的自注意力。DAT可以通過這種替代策略對全局依賴關系進行建模,并實現空間維度和通道維度之間的塊間特征聚合。
  • 2. 此外,還提出了自適應交互模塊(AIM)和空間門前饋網絡(SGFN)來增強每個塊并實現兩維之間的塊內特征聚合。目的從相應維度強化兩種自我注意機制的建模能力。(逐模塊細化概述,方法 + 作用
  • 3. 同時,SGFN利用非線性空間信息對前饋網絡進行補充。

實驗結果:大量的實驗表明,DAT的性能優于以往的方法。

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

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

相關文章

IM 是什么?

在當今數字化的時代,即時通訊(IM)已經滲透到人們的日常生活和企業的工作環境中。IM技術的快速i發展為人們提供了一種高效、便捷的溝通方式,不僅推動了社會的信息化進程,也提升了企業的協同效率和競爭力。 作為企業級I…

【GD32】01-GPIO通用輸入輸出

GD32 閑話說在前頭 這里又開一個系列啦。 原因就是之前買了立創開發板的9.9的GD32E230C8T6的板子,買都買了就跟著立創開發板學習一下(屬于是一次性支持了兩個國產品牌了,立創和兆易創新)。并且我還買了GD32F407VET6的板子&…

資金流分析下的企業供貨關系強度模型

圖技術 利用neo4j、networkx、dgl、python做圖分析挖掘 【1】最短路徑算法dijkstra 【2】基于networkx的隱性集團關系識別模型 【3】基于Neo4j的擔保社群型態分析挖掘 【4】基于python求有向無環圖中target到其他節點全路徑 【5】有向圖中任意兩點的路徑 【6】圖基礎入門 【7】…

項目管理中控制質量的工具與技術

項目管理中控制質量的工具與技術 控制質量的工具與技術包括多種方法,旨在確保產品或服務達到既定的質量標準。關于具體的工具格式和樣式,以下是一些示例: 統計技術: 這是一種將質量控制要素的數據轉化為實際控制手段的技術。通…

Visual Studio和Visual Studio Code適用于哪些編程語言

Visual Studio和Visual Studio Code都適用于多種編程語言,它們的適用編程語言如下: Visual Studio適用于: C#Visual Basic .NETF#CJavaScriptTypeScriptPythonHTML/CSSJava(通過插件支持) Visual Studio Code適用于…

Jtti:哪些方法可以降低美國CN2服務器的延遲?

降低美國CN2服務器的延遲可以采取多種方法,以下是一些常用的方法: 1.選擇優質的網絡提供商和服務商:選擇具有高質量網絡和優質服務的網絡提供商和服務商是降低延遲的關鍵。確保您選擇的網絡提供商具有可靠的基礎設施和優質的網絡連接&#xf…

C++:關于圓形魚眼半全景圖轉為等距圓柱投影圖

C:空間坐標映射到球面坐標/全景圖_如何將球體坐標映射到球面uv-CSDN博客 C:關于360全景圖像和立方體6面全景圖像的相互轉換_彩色全景拆解正方體6個面-CSDN博客 之前記錄了立方體和360全景之間的轉換,這次記錄下魚眼圖與360全景圖之間的轉換…

C++ STL的鎖介紹

在 C Standard Template Library (STL) 中&#xff0c;有幾個鎖的實現&#xff0c;這些都位于 <mutex> 頭文件。以下是一些常見的鎖及其功能&#xff1a; std::mutex&#xff1a;最基本的互斥鎖&#xff0c;不可遞歸使用。該鎖提供了獨占的非公平鎖定能力。 std::mutex…

處理瀏覽器緩存問題

處理瀏覽器緩存問題 main.js router.onError((error) > {hasRefreshed false;console.log("異常" error.message);let ind0 error.message.indexOf(Loading chunk chunk-)let ind2 error.message.indexOf(failed.)if(ind0 ! -1 && ind2 !-1){console.…

spring-boot-starter-validation校驗框架

介紹 Spring Boot Starter Validation是一個Spring Boot模塊&#xff0c;用于簡化應用程序中的驗證功能。它包含以下依賴&#xff1a; Hibernate Validator&#xff1a;Hibernate Validator是JavaBean Validation&#xff08;JSR 380&#xff09;規范的參考實現&#xff0c;提…

信創應用軟件之辦公流版簽

信創應用軟件之辦公流版簽 文章目錄 信創應用軟件之辦公流版簽概述流式文件版式文件電子簽章廠商金山辦公永中-永中Office中標-中標普華Office福昕科技e簽寶法大大 概述 辦公流版簽軟件主要包括辦公中常用到的流式軟件、版式軟件以及電子簽章。 版式文件和流式文件都是文書類…

軟件體系結構總結

文章目錄 一、軟件體系結構概述1.1 基本概念1.1.1 背景1.1.2 定義1.1.3 系統1.1.3.1 定義1.1.3.2 特性1.1.3.3 系統的體系結構 1.1.4 軟件設計的層次性1.1.5 體系結構的類別&#xff08;類型&#xff09;1.1.6 重要性&#xff08;意義&#xff09; 1.2 模塊及其設計1.2.1 定義1…

HTTP超時時間設置

在進行超時時間設置之前我們需要了解一次http請求經歷的過程 瀏覽器進行DNS域名解析&#xff0c;得到對應的IP地址根據這個IP&#xff0c;找到對應的服務器建立連接&#xff08;三次握手&#xff09;建立TCP連接后發起HTTP請求&#xff08;一個完整的http請求報文&#xff09;服…

[單機]完美國際_V155_GM工具_VM虛擬機

[端游] 完美國際單機版V155一鍵端PC電腦網絡游戲完美世界幻海凌云家園 本教程僅限學習使用&#xff0c;禁止商用&#xff0c;一切后果與本人無關&#xff0c;此聲明具有法律效應&#xff01;&#xff01;&#xff01;&#xff01; 教程是本人親自搭建成功的&#xff0c;絕對是…

出海企業哪種組網方案更省事?

對于出海企業而言&#xff0c;建立跨地區的數據傳輸和協同工作至關重要&#xff0c;以提升運營效率。因此&#xff0c;網絡構建變得迫在眉睫。通過構建企業組網&#xff0c;企業能夠加強與海外分支、客戶和合作伙伴之間的聯系&#xff0c;加速海外業務的發展。 然而&#xff0c…

Stable Diffusion教程|圖生圖原理和實戰

Stable Diffusion憑借其卓越的圖生圖功能&#xff0c;極大地提升了圖像生成的可控性與輸出品質&#xff0c;賦予用戶前所未有的個性化創作風格表達能力。這一革新特性使得Stable Diffusion不僅能精準地捕捉用戶的藝術愿景&#xff0c;更能以數字化手段孕育出新穎且極具創意的畫…

【Java 8】Lambda: mAA::get 返回函數式接口實例

正文 代碼介紹&#xff1a;分別有兩個函數式接口Lazy跟LazyDependencyCreator&#xff0c;一個HashMap存儲<Object, LazyDependencyCreator>鍵值對。重點在于mProviders.put(AA.class,mAA::get)&#xff0c;看了很久都沒看懂&#xff0c;mAA::get返回的不是mAA本身嗎&am…

部署私有YUM源

需將對應版本DVD下載至本機&#xff0c;并保證本機可訪問互聯網&#xff0c;下載需要的rpm包。 下載DVD并進行掛載 mkdir /data/iso -pmkdir /data/yum -pcd /datawget http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Everything-1511.isomount -o loop -t…

知識付費app源碼快速發布app定制開發一站式定制開發平臺,開辦技術學校的風險有哪些?如何防范?

現在越來越多的人看好培訓行業&#xff0c;投資者們或選擇加盟&#xff0c;或選擇創業&#xff0c;不管哪一種都是投資&#xff0c;投資就會有風險&#xff0c;那么技術學校在辦學過程中&#xff0c;有哪些風險呢? 1、學生人身傷害事故的風險 技術學校的學生&#xff0c;不是同…

java接口介紹

在Java中,接口(interface)是一種特殊的引用類型,它是一種抽象的規范,用于定義一組方法的集合,但不提供方法的具體實現。接口定義了一種契約,規定了類應該具有的方法,但不規定方法的具體實現。一個類可以實現一個或多個接口,從而獲得接口中定義的所有方法。 接口在Jav…