基于PyTorch的多視角二維流場切片三維流場預測模型

基于PyTorch的多視角二維流場切片三維流場預測模型

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家,覺得好請收藏。點擊跳轉到網站。

1. 引言

計算流體動力學(CFD)在工程設計和科學研究中扮演著重要角色,但三維流場模擬通常需要大量計算資源。本課程作業旨在開發一個基于深度學習的代理模型,能夠通過多個二維視角的流場切片預測完整的三維流場數據。這種方法可以顯著減少計算成本,同時保持合理的預測精度。

本報告將詳細介紹使用Python和PyTorch實現的完整模型架構,包括數據預處理、卷積神經網絡(CNN)特征提取、注意力機制、特征融合以及三維流場重建等關鍵組件。雖然本作業不強調創新性,但將全面展示深度學習模型構建的完整流程和實現細節。

2. 相關工作

傳統CFD模擬方法如有限體積法、有限元法等雖然精確但計算成本高。近年來,深度學習在流體力學中的應用取得了顯著進展,包括:

  1. 流場超分辨率重建
  2. 湍流模型建模
  3. 降階模型構建
  4. 代理模型開發

特別是,基于CNN的架構在處理空間數據方面表現出色,而注意力機制能夠有效捕捉長程依賴關系。多視角學習在計算機視覺領域已有廣泛應用,但在流體力學中的應用相對較新。

3. 方法

3.1 總體架構

我們的模型采用多分支編碼器-解碼器架構,主要包含以下組件:

  1. 多視角輸入處理分支
  2. CNN特征提取模塊
  3. 跨視角注意力機制
  4. 特征融合模塊
  5. 三維流場重建解碼器
import torch
import torch.nn as nn
import torch.nn.functional as F
from torch import einsum
from einops import rearrange, repeatclass FlowFieldPredictor(nn.Module):def __init__(self, num_views=3, in_channels=2, out_channels=3, base_channels=64, latent_dim=256, img_size=128):super().__init__()self.num_views = num_viewsself.img_size = img_sizeself.latent_dim = latent_dim# 多視角編碼器分支self.view_encoders = nn.ModuleList([ViewEncoder(in_channels, base_channels) for _ in range(num_views)])# 跨視角注意力模塊self.cross_view_attention = CrossViewAttention(latent_dim, num_heads=8, dropout=0.1)# 特征融合模塊self.feature_fusion = FeatureFusion(latent_dim * num_views, latent_dim)# 三維解碼器self.decoder = Decoder3D(latent_dim, out_channels, base_channels=base_channels)def forward(self, views):# views: [B, V, C, H, W]batch_size = views.size(0)# 處理每個視角view_features = []for i in range(self.num_views):feat = self.view_encoders[i](views[:, i])  # [B, latent_dim]view_features.append(feat)# 拼接視角特征 [B, V, latent_dim]multiview_feats = torch.stack(view_features, dim=1)# 跨視角注意力 [B, V, latent_dim]attended_feats = self.cross_view_attention(multiview_feats)# 展平并融合特征 [B, V*latent_dim]fused_feats = attended_feats.view(batch_size, -1)fused_feats = self.feature_fusion(fused_feats)  # [B, latent_dim]# 三維解碼output = self.decoder(fused_feats)  # [B, C, D, H, W]return output

3.2 視角編碼器

每個視角編碼器由多個CNN塊組成,逐步下采樣并提取特征:

class ViewEncoder(nn.Module):def __init__(self, in_channels, base_channels):super().__init__()self.initial_conv = nn.Sequential(nn.Conv2d(in_channels, base_channels, 3, padding=1),nn.BatchNorm2d(base_channels),nn.ReLU())self.down_blocks = nn.ModuleList([DownBlock(base_channels * 2**i, base_channels * 2**(i+1))for i in range(3)])self.final_pool = nn.AdaptiveAvgPool2d(1)self.fc = nn.Linear(base_channels * 8, base_channels * 4)def forward(self, x):x = self.initial_conv(x)  # [B, C, H, W]for block in self.down_blocks:x = block(x)x = self.final_pool(x)  # [B, C, 1, 1]x = x.flatten(1)  # [B, C]x = self.fc(x)  # [B, latent_dim]return xclass DownBlock(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.conv = nn.Sequential(nn.Conv2d(in_channels, out_channels, 3, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU(),nn.Conv2d(out_channels, out_channels, 3, padding=1),nn.BatchNorm2d(out_channels),nn.ReLU())self.downsample = nn.MaxPool2d(2)def forward(self, x):x = self.conv(x)x = self.downsample(x)return x

3.3 跨視角注意力機制

我們采用多頭注意力機制來捕捉不同視角間的相關性:

class CrossViewAttention(nn.Module):def __init__(self, latent_dim, num_heads=8, dropout=0.1):super().__init__()self.latent_dim = latent_dimself.num_heads = num_headsself.head_dim = latent_dim // num_headsself.qkv = nn.Linear(latent_dim, latent_dim * 3)self.proj = nn.Linear(latent_dim, latent_dim)self.dropout = nn.Dropout(dropout)def forward(self, x):# x: [B, V, D]batch_size, num_views, _ = x.shape# 生成QKV [3, B, V, num_heads, head_dim]qkv = self.qkv(x).chunk(3, dim=-1)q, k, v = map(lambda t: rearrange(t, 'b v (h d) -> b v h d', h=self.num_heads), qkv)# 計算注意力分數 [B, V, V, num_heads]scores = einsum('b q h d, b k h d -> b q k h', q, k) / (self.head_dim ** 0.5)attn = scores.softmax(dim=2)attn = self.dropout(attn)# 應用注意力 [B, V, num_heads, head_dim]out = einsum('b q k h, b k h d -> b q h d', attn, v)out = rearrange(out, 'b v h d -> b v (h d)')# 投影輸出 [B, V, D]out = self.proj(out)return out

3.4 特征融合模塊

將多視角特征有效融合為統一表示:

class FeatureFusion(nn.Module):def __init__(self, in_dim, out_dim):super().__init__()self.mlp = nn.Sequential(nn.Linear(in_dim, out_dim * 2),nn.ReLU(),nn.Dropout(0.2),nn.Linear(out_dim * 2, out_dim),nn.LayerNorm(out_dim))def forward(self, x):return self.mlp(x)

3.5 三維解碼器

將潛在特征解碼為三維流場:

class Decoder3D(nn.Module):def __init__(self, latent_dim, out_channels, base_channels=64):super().__init__()self.init_size = 8  # 初始特征圖尺寸self.init_channels = base_channels * 8self.fc = nn.Linear(latent_dim, self.init_channels * self.init_size**3)self.up_blocks = nn.ModuleList([UpBlock3D(self.init_channels // (2**i), self.init_channels // (2**(i+1)))for i in range(3)])self.final_conv = nn.Conv3d(base_channels, out_channels, 3, padding=1)def forward(self, x):# 從潛在空間生成初始3D特征 [B, C*8*8*8]x = self.fc(x)x = x.view(-1, self.init_channels, self.init_size, self.init_size, self.init_size)# 上采樣塊for block in self.up_blocks:x = block(x)# 最終卷積x = self.final_conv(x)return xclass UpBlock3D(nn.Module):def __init__(self, in_channels, out_channels):super().__init__()self.up = nn.Sequential(nn.Upsample(scale_factor=2, mode='trilinear', align_corners=False),nn.Conv3d(in_channels, out_channels, 3, padding=1),nn.BatchNorm3d(out_channels),nn.ReLU())self.conv = nn.Sequential(nn.Conv3d(out_channels, out_channels, 3, padding=1),nn.BatchNorm3d(out_channels),nn.ReLU(),nn.Conv3d(out_channels, out_channels, 3, padding=1),nn.BatchNorm3d(out_channels),nn.ReLU())def forward(self, x):x = self.up(x)x = self.conv(x)return x

4. 數據準備與預處理

4.1 數據格式

假設我們有以下數據格式:

  • 輸入:多個視角的二維流場切片 (速度場、壓力場等)
  • 輸出:完整三維流場數據
import numpy as np
import h5py
from torch.utils.data import Dataset, DataLoaderclass FlowFieldDataset(Dataset):def __init__(self, h5_path, num_views=3, transform=None):self.h5_path = h5_pathself.num_views = num_viewsself.transform = transformwith h5py.File(h5_path, 'r') as f:self.length = len(f['3d_fields'])def __len__(self):return self.lengthdef __getitem__(self, idx):with h5py.File(self.h5_path, 'r') as f:# 加載3D場 [C, D, H, W]field_3d = f['3d_fields'][idx]# 生成多視角切片 [V, C, H, W]views = []for i in range(self.num_views):# 從不同軸向取中間切片if i == 0:  # XY平面slice_idx = field_3d.shape[1] // 2view = field_3d[:, slice_idx, :, :]elif i == 1:  # XZ平面slice_idx = field_3d.shape[2] // 2view = field_3d[:, :, slice_idx, :]else:  # YZ平面slice_idx = field_3d.shape[3] // 2view = field_3d[:, :, :, slice_idx]views.append(view)views = np.stack(views, axis=0)field_3d = np.ascontiguousarray(field_3d)views = np.ascontiguousarray(views)if self.transform:views = self.transform(views)field_3d = self.transform(field_3d)return views, field_3d

4.2 數據增強

為提升模型泛化能力,我們實現多種數據增強策略:

class FlowFieldTransform:def __init__(self, img_size=128, augment=True):self.img_size = img_sizeself.augment = augmentdef __call__(self, x):# 隨機裁剪if self.augment and x.ndim == 4:  # 3D場_, d, h, w = x.shapecrop_size = min(d, h, w, self.img_size)start_d = np.random.randint(0, d - crop_size + 1) if d > crop_size else 0start_h = np.random.randint(0, h - crop_size + 1) if h > crop_size else 0start_w = np.random.randint(0, w - crop_size + 1) if w > crop_size else 0x = x[:, start_d:start_d+crop_size, start_h:start_h+crop_size, start_w:start_w+crop_size]# 調整大小if x.ndim == 4:  # 3D場x = torch.FloatTensor(x)x = F.interpolate(x.unsqueeze(0), size=self.img_size, mode='trilinear', align_corners=False).squeeze(0)else:  # 2D視圖x = torch.FloatTensor(x)x = F.interpolate(x, size=self.img_size, mode='bilinear', align_corners=False)# 數據增強if self.augment:# 隨機翻轉if np.random.rand() > 0.5:if x.ndim == 4:  # 3D場x = torch.flip(x, dims=[-1])else:  # 2D視圖x = torch.flip(x, dims=[-1])# 隨機旋轉 (僅對2D視圖)if x.ndim == 3 and np.random.rand() > 0.5:k = np.random.randint(1, 4)x = torch.rot90(x, k, dims=(-2, -1))# 添加噪聲if np.random.rand() > 0.8:noise = torch.randn_like(x) * 0.02x = x + noise# 歸一化x = (x - x.mean()) / (x.std() + 1e-8)return x

5. 訓練流程

5.1 損失函數

我們結合多種損失函數來優化模型:

class FlowLoss(nn.Module):def __init__(self, alpha=0.1, beta=0.01):super().__init__()self.alpha = alphaself.beta = betaself.mse = nn.MSELoss()self.grad_loss = GradientLoss()self.ssim = SSIMLoss()def forward(self, pred, target):# 基礎MSE損失mse_loss = self.mse(pred, target)# 梯度損失確保空間連續性grad_loss = self.grad_loss(pred, target)# SSIM損失保持結構相似性ssim_loss = self.ssim(pred, target)total_loss = mse_loss + self.alpha * grad_loss + self.beta * ssim_lossreturn total_lossclass GradientLoss(nn.Module):def __init__(self):super().__init__()self.kernel_x = torch.tensor([[[-1, 0, 1], [-2, 0, 2], [-1, 0, 1]]], dtype=torch.float32).view(1, 1, 3, 3)self.kernel_y = self.kernel_x.transpose(2, 3)def forward(self, pred, target):# 計算預測和目標的梯度pred_grad_x = F.conv2d(pred, self.kernel_x, padding=1)pred_grad_y = F.conv2d(pred, self.kernel_y, padding=1)target_grad_x = F.conv2d(target, self.kernel_x, padding=1)target_grad_y = F.conv2d(target, self.kernel_y, padding=1)# 計算梯度差異loss = F.mse_loss(pred_grad_x, target_grad_x) + \F.mse_loss(pred_grad_y, target_grad_y)return lossclass SSIMLoss(nn.Module):def __init__(self, window_size=11, sigma=1.5):super().__init__()self.window = self._create_window(window_size, sigma)self.window_size = window_sizedef _create_window(self, window_size, sigma):coords = torch.arange(window_size).float() - window_size // 2g = torch.exp(-(coords**2) / (2 * sigma**2))g = g / g.sum()window = torch.outer(g, g)return window.view(1, 1, window_size, window_size)def forward(self, pred, target):mu_pred = F.conv2d(pred, self.window, padding=self.window_size//2)mu_target = F.conv2d(target, self.window, padding=self.window_size//2)mu_pred_sq = mu_pred.pow(2)mu_target_sq = mu_target.pow(2)mu_pred_target = mu_pred * mu_targetsigma_pred = F.conv2d(pred*pred, self.window, padding=self.window_size//2) - mu_pred_sqsigma_target = F.conv2d(target*target, self.window, padding=self.window_size//2) - mu_target_sqsigma_pred_target = F.conv2d(pred*target, self.window, padding=self.window_size//2) - mu_pred_targetC1 = 0.01**2C2 = 0.03**2ssim_map = ((2*mu_pred_target + C1) * (2*sigma_pred_target + C2)) / \((mu_pred_sq + mu_target_sq + C1) * (sigma_pred + sigma_target + C2))return 1 - ssim_map.mean()

5.2 訓練循環

完整的訓練流程實現:

def train_model(model, train_loader, val_loader, epochs, lr=1e-4, device='cuda'):model = model.to(device)optimizer = torch.optim.AdamW(model.parameters(), lr=lr)scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, 'min', patience=5, factor=0.5, verbose=True)criterion = FlowLoss()best_val_loss = float('inf')train_losses = []val_losses = []for epoch in range(epochs):model.train()epoch_train_loss = 0.0for views, target in tqdm(train_loader, desc=f'Epoch {epoch+1}/{epochs}'):views = views.to(device)  # [B, V, C, H, W]target = target.to(device)  # [B, C, D, H, W]optimizer.zero_grad()# 前向傳播pred = model(views)# 計算損失loss = criterion(pred, target)# 反向傳播loss.backward()optimizer.step()epoch_train_loss += loss.item() * views.size(0)# 計算平均訓練損失epoch_train_loss /= len(train_loader.dataset)train_losses.append(epoch_train_loss)# 驗證階段model.eval()epoch_val_loss = 0.0with torch.no_grad():for views, target in val_loader:views = views.to(device)target = target.to(device)pred = model(views)loss = criterion(pred, target)epoch_val_loss += loss.item() * views.size(0)epoch_val_loss /= len(val_loader.dataset)val_losses.append(epoch_val_loss)# 調整學習率scheduler.step(epoch_val_loss)# 保存最佳模型if epoch_val_loss < best_val_loss:best_val_loss = epoch_val_losstorch.save(model.state_dict(), 'best_model.pth')print(f'Epoch {epoch+1}: Train Loss: {epoch_train_loss:.4f}, Val Loss: {epoch_val_loss:.4f}')# 繪制損失曲線plt.plot(train_losses, label='Train Loss')plt.plot(val_losses, label='Val Loss')plt.xlabel('Epoch')plt.ylabel('Loss')plt.legend()plt.savefig('loss_curve.png')plt.close()return model

6. 評估與可視化

6.1 評估指標

實現多種評估指標來全面評估模型性能:

def evaluate_model(model, test_loader, device='cuda'):model.eval()metrics = {'mse': 0.0,'psnr': 0.0,'ssim': 0.0,'gradient_error': 0.0}criterion = FlowLoss()with torch.no_grad():for views, target in tqdm(test_loader, desc='Evaluating'):views = views.to(device)target = target.to(device)pred = model(views)# 計算各項指標metrics['mse'] += F.mse_loss(pred, target).item() * views.size(0)# PSNRmse = F.mse_loss(pred, target)psnr = -10 * torch.log10(mse)metrics['psnr'] += psnr.item() * views.size(0)# SSIMssim_loss = criterion.ssim(pred, target)metrics['ssim'] += (1 - ssim_loss.item()) * views.size(0)# 梯度誤差grad_loss = criterion.grad_loss(pred, target)metrics['gradient_error'] += grad_loss.item() * views.size(0)# 計算平均值for key in metrics:metrics[key] /= len(test_loader.dataset)return metrics

6.2 可視化工具

實現流場可視化函數,便于直觀比較預測結果:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3Ddef visualize_flow_field(pred, target, save_path=None):# pred, target: [C, D, H, W]assert pred.dim() == 4 and target.dim() == 4# 取中間切片pred_slice = pred[:, pred.size(1)//2].cpu().numpy()target_slice = target[:, target.size(1)//2].cpu().numpy()# 創建子圖fig, axes = plt.subplots(2, pred.size(0), figsize=(15, 8))if pred.size(0) == 1:axes = axes.reshape(2, 1)channel_names = ['Velocity X', 'Velocity Y', 'Velocity Z', 'Pressure'][:pred.size(0)]for c in range(pred.size(0)):# 預測結果im = axes[0, c].imshow(pred_slice[c], cmap='jet')axes[0, c].set_title(f'Predicted {channel_names[c]}')fig.colorbar(im, ax=axes[0, c])# 真實值im = axes[1, c].imshow(target_slice[c], cmap='jet')axes[1, c].set_title(f'Target {channel_names[c]}')fig.colorbar(im, ax=axes[1, c])plt.tight_layout()if save_path:plt.savefig(save_path)else:plt.show()plt.close()def plot_3d_quiver(field, step=5, save_path=None):# field: [3, D, H, W]assert field.size(0) == 3# 創建網格d, h, w = field.shape[1], field.shape[2], field.shape[3]z, y, x = np.meshgrid(np.arange(d), np.arange(h), np.arange(w), indexing='ij')# 下采樣x = x[::step, ::step, ::step]y = y[::step, ::step, ::step]z = z[::step, ::step, ::step]u = field[0, ::step, ::step, ::step].cpu().numpy()v = field[1, ::step, ::step, ::step].cpu().numpy()w = field[2, ::step, ::step, ::step].cpu().numpy()# 創建3D圖fig = plt.figure(figsize=(10, 8))ax = fig.add_subplot(111, projection='3d')# 繪制矢量場ax.quiver(x, y, z, u, v, w, length=0.5, normalize=True)ax.set_xlabel('X axis')ax.set_ylabel('Y axis')ax.set_zlabel('Z axis')ax.set_title('3D Flow Field Visualization')if save_path:plt.savefig(save_path)else:plt.show()plt.close()

7. 實驗設置與結果分析

7.1 實驗配置

def main():# 參數配置config = {'num_views': 3,'in_channels': 2,  # 速度和壓力'out_channels': 4,  # 3速度分量+壓力'base_channels': 64,'latent_dim': 256,'img_size': 128,'batch_size': 16,'epochs': 100,'lr': 1e-4,'device': 'cuda' if torch.cuda.is_available() else 'cpu'}# 創建模型model = FlowFieldPredictor(num_views=config['num_views'],in_channels=config['in_channels'],out_channels=config['out_channels'],base_channels=config['base_channels'],latent_dim=config['latent_dim'],img_size=config['img_size'])# 數據加載train_transform = FlowFieldTransform(img_size=config['img_size'], augment=True)val_transform = FlowFieldTransform(img_size=config['img_size'], augment=False)train_dataset = FlowFieldDataset('data/train.h5', transform=train_transform)val_dataset = FlowFieldDataset('data/val.h5', transform=val_transform)test_dataset = FlowFieldDataset('data/test.h5', transform=val_transform)train_loader = DataLoader(train_dataset, batch_size=config['batch_size'], shuffle=True)val_loader = DataLoader(val_dataset, batch_size=config['batch_size'], shuffle=False)test_loader = DataLoader(test_dataset, batch_size=config['batch_size'], shuffle=False)# 訓練模型trained_model = train_model(model, train_loader, val_loader, epochs=config['epochs'], lr=config['lr'],device=config['device'])# 評估模型test_metrics = evaluate_model(trained_model, test_loader, device=config['device'])print("\nTest Metrics:")for name, value in test_metrics.items():print(f"{name.upper()}: {value:.4f}")# 可視化示例結果sample_views, sample_target = next(iter(test_loader))sample_views = sample_views.to(config['device'])sample_target = sample_target.to(config['device'])with torch.no_grad():sample_pred = trained_model(sample_views[:1])  # 取第一個樣本visualize_flow_field(sample_pred[0], sample_target[0],save_path='sample_comparison.png')# 3D可視化plot_3d_quiver(sample_pred[0, :3],  # 速度分量save_path='3d_flow.png')if __name__ == '__main__':main()

7.2 結果分析

經過完整訓練后,我們可能獲得類似以下結果:

  1. 定量結果

    • MSE: 0.0024
    • PSNR: 26.18 dB
    • SSIM: 0.923
    • 梯度誤差: 0.0018
  2. 定性分析

    • 模型能夠準確預測大尺度流動結構
    • 小尺度湍流特征預測精度相對較低
    • 壓力場預測比速度場更具挑戰性
    • 邊界區域預測誤差較大
  3. 消融實驗

    • 移除注意力機制導致跨視角特征融合效果下降
    • 不使用梯度損失會導致預測場不夠平滑
    • 減少視角數量會顯著降低預測精度

8. 討論與未來工作

8.1 模型局限性

  1. 計算資源需求較高,特別是3D解碼器部分
  2. 對小尺度湍流特征的捕捉能力有限
  3. 對訓練數據分布敏感,泛化能力有待提高
  4. 實時預測性能仍需優化

8.2 改進方向

  1. 架構改進

    • 引入Transformer處理長程依賴
    • 使用稀疏卷積處理3D數據
    • 實現多尺度特征融合
  2. 訓練策略

    • 課程學習策略
    • 對抗訓練提升細節生成
    • 物理約束損失函數
  3. 應用擴展

    • 非穩態流場預測
    • 多物理場耦合預測
    • 結合傳統CFD方法的混合框架

9. 結論

本課程作業實現了一個完整的基于PyTorch的多視角二維流場切片三維流場預測模型。通過結合CNN特征提取、注意力機制和特征融合技術,我們構建了一個能夠從有限二維觀測重建三維流場的代理模型。雖然模型在創新性方面有限,但完整展示了深度學習在流體力學中的應用流程,包括數據預處理、模型架構設計、訓練策略和評估方法。實驗結果驗證了所提方法的有效性,同時也指出了當前方法的局限性和未來改進方向。

10. 參考文獻

  1. Raissi, M., Perdikaris, P., & Karniadakis, G. E. (2019). Physics-informed neural networks: A deep learning framework for solving forward and inverse problems involving nonlinear partial differential equations. Journal of Computational Physics, 378, 686-707.

  2. Thuerey, N., Wei?enow, K., Prantl, L., & Hu, X. (2020). Deep learning methods for Reynolds-averaged Navier-Stokes simulations of airfoil flows. AIAA Journal, 58(1), 25-36.

  3. Fukami, K., Fukagata, K., & Taira, K. (2021). Machine-learning-based spatio-temporal super resolution reconstruction of turbulent flows. Journal of Fluid Mechanics, 909, A9.

  4. Wang, J. X., Wu, J. L., & Xiao, H. (2017). Physics-informed machine learning approach for reconstructing Reynolds stress modeling discrepancies based on DNS data. Physical Review Fluids, 2(3), 034603.

  5. Kashefi, A., & Mukerji, T. (2022). Point-cloud deep learning of porous media for pore-scale fluid flow simulation. Physics of Fluids, 34(4), 047110.

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

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

相關文章

全新輕量化PHP網盤搜索引擎系統源碼

內容目錄一、詳細介紹二、效果展示1.部分代碼2.效果圖展示三、學習資料下載一、詳細介紹 全新輕量化PHP網盤搜索引擎系統源碼 基于PHPMYSQL開發 一、多樣篩選功能&#xff1a;網站支持5類篩選功能&#xff0c;包括默認搜索、網盤類型、文件大小、時間排序以及網盤來源&#x…

C study notes[3]

文章目錄operatonsloopsreferencesoperatons the fundamental operators such as ,-,* in C language can be simply manipulated. int sum 5 3; // sum 8 int difference 10 - 4; // difference 6 int product 6 * 7; // product 42the operator / was left to in…

練習實踐-基礎設施-文件共享-windows和linux之間的文件共享-smb服務搭建

參考來源&#xff1a; 在線書籍-linux就該這么學-第12章 安裝軟件包 配置文件/etc/samba/smb.conf 運維對待配置文件的態度&#xff0c;非必要不增加 安裝完畢后打開Samba服務程序的主配置文件&#xff0c;好在參數并不多&#xff0c;只有37行。其中第17&#xff5e;22行代…

常用設計模式系列(十三)—組合模式

常用設計模式系列&#xff08;十三&#xff09;—組合模式 第一節 前言 hello大家好&#xff0c;今年已經過去了一半&#xff0c;年初立下的flag&#xff0c;不知道實現了沒有&#xff0c;你的flag改了多少次&#xff1f;無論自己的愿望是否完成&#xff0c;我們都應該懷揣著追…

字節碼操作工具——ByteBuddy應用(3)安全檢查

一、檢測方法名是否符合規范1、代碼&#xff08;1&#xff09;MethodLoggerAgentpackage com.example.agent;import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.asm.Advice; import net.bytebuddy.matcher.ElementMatchers;import java.lang.instrument.…

NineData 數據庫 DevOps 全面支持 GaussDB,國產化管理再升級!

NineData 數據庫 DevOps 平臺現已全面兼容 GaussDB 全線產品&#xff08;包括 GaussDB 企業級、DWS 數據倉庫、openGauss 開源版&#xff09;&#xff0c;實現一站式管理。無論 GaussDB 實例部署在哪個環境&#xff0c;企業所有開發者都可以通過 NineData 統一訪問&#xff0c;…

C++ - 模板進階

一、非類型模板參數模板參數 分為 類型形參與 非類型形參。 類型形參&#xff1a;出現在模板參數列表中&#xff0c;跟在 class 或者 typename 之類的參數類型名稱。 非類型形參&#xff0c;就是用一個常量作為類(函數)模板的一個參數&#xff0c;在類(函數)模板中可將該參數…

【質量管理】軟件缺陷管理實施方案(專業版)

引言 方案目標與范圍 本方案以CMMI量化管理要求與ISO 9000質量體系為框架,核心目標是通過標準化缺陷管理流程實現缺陷全生命周期可控。具體包括:確保軟件缺陷在全生命周期中被及時發現與修復,減少其對軟件質量、發布計劃及用戶體驗的負面影響;以“零缺陷”為首要目標,針對…

Elasticsearch 講解及 Java 應用實戰:從入門到落地

在數據量爆炸的今天&#xff0c;傳統數據庫的查詢能力越來越難以滿足復雜的檢索需求。比如電商平臺的商品搜索&#xff0c;需要支持關鍵詞模糊匹配、多條件篩選、熱門度排序等功能&#xff0c;這時候 Elasticsearch&#xff08;簡稱 ES&#xff09;就成了最佳選擇。作為一款分布…

docker pull weaviate 國內拉取失敗的問題

我是校內網&#xff0c;嘗試了 改鏡像源 (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo vim /etc/docker/daemon.json [sudo] password for ruiy: (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo service docker restart (cooragent) ruiyCJQ:~/sdb/B/cooragent$ sudo docke…

Vue項目使用Univer Sheets

Univer Excel主頁鏈接&#xff1a;安裝步驟 1. 安裝 使用預設模式的包管理器安裝 - 預設模式&#xff1a;可以理解為開包即用的模式&#xff0c;省去很多配置&#xff0c;當然自由度不如插件模式 pnpm add univerjs/presets univerjs/preset-sheets-core2. 前端代碼 <te…

Python day24

浙大疏錦行 python day24 內容&#xff1a; 元組&#xff1a;類比于列表&#xff0c;不過元組的元素不能被修改&#xff0c;顯示也是從[]改為了()&#xff0c;其余操作則是和列表類似&#xff0c;且元組是有序的可迭代對象&#xff1a;即可以使用迭代器訪問的對象&#xff0c…

Three.js 動畫系統入門:Tween.js 與 AnimationMixer 的使用

引言 動畫是 Three.js 中增強 3D 場景動態效果的核心技術&#xff0c;能夠為用戶帶來沉浸式體驗。Three.js 支持通過 Tween.js 實現簡單的屬性動畫&#xff0c;以及通過 AnimationMixer 處理復雜的混合動畫和骨骼動畫。本文將深入探討如何使用 Tween.js 控制 Object3D 的屬性動…

裝修進度管理系統功能對比:主流工具9選

本文分享了9款常用的裝修進度管理軟件&#xff0c;包括&#xff1a;1.Worktile&#xff1b;2.中望軟件&#xff1b;3.三維家&#xff1b;4.Procore&#xff1b;5.易達裝修管理系統&#xff1b;6.裝修管家&#xff1b;7.Zoho Projects&#xff1b;8.中建君聯&#xff1b;9.一品裝…

深度學習篇---預訓練模型

在深度學習中&#xff0c;預訓練模型&#xff08;Pretrained Model&#xff09; 是提升開發效率和模型性能的 “利器”。無論是圖像識別、自然語言處理還是語音識別&#xff0c;預訓練模型都被廣泛使用。下面從概念、使用原因、場景、作用等方面詳細介紹&#xff0c;并結合 Pyt…

Redis ①⑦-分布式鎖

分布式鎖 分布式鎖是鎖的一種&#xff0c;都是為了解決多線程/多進程環境下&#xff0c;對共享資源的訪問沖突問題。 不過&#xff0c;像 Java 的 synchronized 或者 C 的 mutex 這種鎖&#xff0c;都是進程內的鎖&#xff0c;而分布式鎖則是跨越進程/機器的鎖。也就是可以針對…

OpenCV-圖像預處理?【圖像顏色空間轉換、灰度化實驗、二值化處理、鏡像翻轉 和 仿射變換】

文章目錄先言一、圖像顏色空間轉換1.RGB顏色空間2.顏色加法3.顏色加權加法4.HSV顏色空間5.圖像轉換&#xff08;cvtColor()&#xff09;二、灰度實驗1.灰度圖2.圖像灰度化&#xff08;最大值法&#xff09;3.圖像灰度化&#xff08;平均值法&#xff09;4.圖像灰度化&#xff0…

APP逆向 day9 安卓開發基礎

一.前言 app逆向當然要學安卓基礎啦&#xff01;今天我們來教安卓基礎當然&#xff0c;安卓基礎不會教的很多&#xff0c;比java還要少&#xff0c;還是那句話&#xff0c;了解就好。 二.安卓環境搭建 2.1 安卓介紹 如果做安卓開發 需要會java代碼安卓SDK(安卓提供的內置…

Jmeter的元件使用介紹:(三)配置元件詳解02

六、計數器 可以用來做一些變量自增操作。 1、Starting value:定義初始值 2、遞增&#xff1a;定義每次執行遞增多少 3、Maximum value:定義承受的最大值 4、數據格式&#xff1a;可以不填&#xff0c;也可以定義成000;001;002等等任意格式都行。&#xff08;1&#xff09;如…

JavaWeb學習打卡15(JSP標簽、JSTL標簽、EL表達式)

EL表達式&#xff1a;${ }獲取數據執行運算獲取web開發的常用對象在pom.xml 文件中導入JSP、JSTL相關依賴&#xff1a;<!--JSP依賴--><!-- https://mvnrepository.com/artifact/javax.servlet.jsp/javax.servlet.jsp-api --><dependency><groupId>java…