【完整源碼+數據集+部署教程】公交車部件實例分割系統源碼和數據集:改進yolo11-fasternet

背景意義

隨著城市化進程的加快,公共交通系統的需求日益增加,公交車作為城市交通的重要組成部分,其運行效率和安全性直接影響到城市的交通狀況和居民的出行體驗。因此,公交車的維護和管理顯得尤為重要。在這一背景下,公交車部件的實例分割技術應運而生,成為提升公交車管理智能化水平的重要手段。通過對公交車各個部件進行精準的實例分割,可以實現對公交車狀態的實時監控,及時發現潛在的故障和安全隱患,從而提高公交車的運行安全性和可靠性。

本研究旨在基于改進的YOLOv11模型,構建一個高效的公交車部件實例分割系統。YOLO(You Only Look Once)系列模型因其快速和準確的特性,廣泛應用于目標檢測和實例分割任務。YOLOv11作為該系列的最新版本,具備更強的特征提取能力和更高的檢測精度,適合處理復雜的公交車部件圖像數據。我們將利用一個包含1000張公交車部件圖像的數據集,數據集中涵蓋了門、車牌、車輪等8個類別的部件,提供了豐富的實例分割訓練樣本。

通過對該數據集的深入分析和處理,我們期望能夠提高模型在公交車部件實例分割任務中的表現,進而為公交車的智能監控和管理提供技術支持。此外,研究成果不僅有助于公交車行業的智能化發展,也為其他交通工具的部件監測提供了借鑒,推動整個交通領域的技術進步。因此,本項目的研究具有重要的理論意義和廣泛的應用前景。

圖片效果

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

數據集信息

本項目數據集信息介紹

本項目所使用的數據集名為“BusPartsSegmentation”,旨在為改進YOLOv11的公交車部件實例分割系統提供支持。該數據集專注于公交車的關鍵部件,涵蓋了四個主要類別,分別是“Door”(門)、“ID”(標識牌)、“Plate”(車牌)和“Wheel”(輪胎)。這些類別的選擇不僅反映了公交車的基本構造特征,也為實例分割任務提供了豐富的標注信息。

在數據集的構建過程中,我們收集了大量公交車的圖像,確保涵蓋不同品牌、型號及顏色的公交車,以增強模型的泛化能力。每個圖像均經過精細標注,確保每個部件的邊界清晰可辨。通過對公交車各個部件的精確標注,數據集能夠有效支持模型在復雜場景下的學習,提升其對公交車部件的識別和分割能力。

此外,數據集的多樣性也為模型訓練提供了堅實的基礎。我們確保數據集中包含了不同光照條件、天氣狀況和拍攝角度下的公交車圖像,這將有助于模型在實際應用中應對各種環境變化。通過對這些數據的充分利用,模型能夠更好地理解公交車部件的形狀、顏色和位置,從而實現更高精度的實例分割。

總之,“BusPartsSegmentation”數據集不僅為YOLOv11的改進提供了必要的訓練素材,也為未來公交車相關研究提供了寶貴的數據支持。通過對該數據集的深入分析和應用,我們期望能夠推動公交車部件實例分割技術的發展,為智能交通系統的實現奠定基礎。
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

核心代碼

以下是經過簡化和注釋的核心代碼部分:

import torch
import torch.nn.functional as F

def build_selective_scan_fn(selective_scan_cuda: object = None, mode=“mamba_ssm”):
“”"
構建選擇性掃描函數的工廠函數。

參數:
selective_scan_cuda: CUDA實現的選擇性掃描函數
mode: 模式選擇
"""class SelectiveScanFn(torch.autograd.Function):@staticmethoddef forward(ctx, u, delta, A, B, C, D=None, z=None, delta_bias=None, delta_softplus=False, return_last_state=False):"""前向傳播函數,計算選擇性掃描的輸出。參數:ctx: 上下文對象,用于保存狀態u: 輸入張量delta: 變化率張量A, B, C: 權重張量D: 可選的額外張量z: 可選的門控張量delta_bias: 可選的偏置delta_softplus: 是否使用softplus激活return_last_state: 是否返回最后狀態返回:輸出張量或輸出和最后狀態的元組"""# 確保輸入張量是連續的if u.stride(-1) != 1:u = u.contiguous()if delta.stride(-1) != 1:delta = delta.contiguous()if D is not None:D = D.contiguous()if B.stride(-1) != 1:B = B.contiguous()if C.stride(-1) != 1:C = C.contiguous()if z is not None and z.stride(-1) != 1:z = z.contiguous()# 調用CUDA實現的前向函數out, x, *rest = selective_scan_cuda.fwd(u, delta, A, B, C, D, z, delta_bias, delta_softplus)# 保存必要的張量以用于反向傳播ctx.save_for_backward(u, delta, A, B, C, D, z, delta_bias, x)# 返回輸出或輸出和最后狀態last_state = x[:, :, -1, 1::2]  # 獲取最后狀態return out if not return_last_state else (out, last_state)@staticmethoddef backward(ctx, dout):"""反向傳播函數,計算梯度。參數:ctx: 上下文對象,包含前向傳播中保存的狀態dout: 輸出的梯度返回:輸入張量的梯度"""# 從上下文中恢復保存的張量u, delta, A, B, C, D, z, delta_bias, x = ctx.saved_tensors# 調用CUDA實現的反向函數du, ddelta, dA, dB, dC, dD, ddelta_bias, *rest = selective_scan_cuda.bwd(u, delta, A, B, C, D, z, delta_bias, dout, x)return du, ddelta, dA, dB, dC, dD, None, ddelta_bias, Nonedef selective_scan_fn(u, delta, A, B, C, D=None, z=None, delta_bias=None, delta_softplus=False, return_last_state=False):"""封裝選擇性掃描函數的調用。參數:u, delta, A, B, C, D, z, delta_bias, delta_softplus, return_last_state: 同上"""return SelectiveScanFn.apply(u, delta, A, B, C, D, z, delta_bias, delta_softplus, return_last_state)return selective_scan_fn

示例使用

selective_scan_fn = build_selective_scan_fn()
代碼說明:
build_selective_scan_fn: 這是一個工廠函數,用于創建選擇性掃描的前向和反向傳播函數。
SelectiveScanFn: 這是一個自定義的PyTorch自動求導函數,包含前向和反向傳播的實現。
forward: 計算選擇性掃描的輸出,并保存需要在反向傳播中使用的張量。
backward: 計算輸入張量的梯度,使用保存的張量和輸出的梯度進行計算。
selective_scan_fn: 封裝了對SelectiveScanFn的調用,提供一個簡單的接口。
這個簡化版本保留了選擇性掃描的核心邏輯,并提供了詳細的中文注釋以幫助理解每個部分的功能。

這個程序文件 test_selective_scan.py 主要用于實現和測試一個選擇性掃描(Selective Scan)功能,通常在深度學習和序列建模中使用。文件中包含了多個函數和類,以下是對其主要內容的逐步講解。

首先,文件導入了一些必要的庫,包括 torch、torch.nn.functional、pytest 等。torch 是 PyTorch 的核心庫,提供了張量操作和深度學習的基本功能。

接下來,定義了一個函數 build_selective_scan_fn,它接受一個 CUDA 選擇性掃描的實現和一些參數,返回一個選擇性掃描的函數。這個函數內部定義了一個 SelectiveScanFn 類,繼承自 torch.autograd.Function,用于實現前向和反向傳播的計算。

在 SelectiveScanFn 類中,forward 方法實現了選擇性掃描的前向計算。它接收多個輸入參數,包括 u、delta、A、B、C 等,分別代表不同的輸入張量。該方法首先確保輸入張量是連續的,并根據輸入的維度進行適當的重排。然后,它調用 CUDA 實現的前向函數,計算輸出,并保存必要的中間狀態以供反向傳播使用。

backward 方法實現了反向傳播的計算。它根據前向計算中保存的狀態,計算各個輸入的梯度,并返回這些梯度。這里的實現考慮了多種模式(如 mamba_ssm、ssoflex 等),每種模式對應不同的 CUDA 實現。

此外,文件中還定義了兩個參考實現函數 selective_scan_ref 和 selective_scan_ref_v2,它們使用純 PyTorch 實現選擇性掃描的邏輯。這些參考實現用于在測試中與 CUDA 實現的結果進行比較,以確保功能的正確性。

接下來,文件中定義了一個 selective_scan_fn 函數,它調用之前構建的選擇性掃描函數,并處理返回值的類型轉換。

在文件的最后部分,設置了一些參數和測試用例,并使用 pytest 框架定義了一個測試函數 test_selective_scan。這個測試函數使用不同的輸入配置,驗證選擇性掃描函數的輸出與參考實現的一致性,并檢查梯度的正確性。

整體來看,這個程序文件實現了選擇性掃描的功能,并通過測試確保了其正確性和性能,適用于深度學習中的序列數據處理。

10.4 repvit.py
以下是經過簡化和注釋的核心代碼部分:

import torch
import torch.nn as nn
from timm.models.layers import SqueezeExcite

def _make_divisible(v, divisor, min_value=None):
“”"
確保所有層的通道數是8的倍數。
:param v: 輸入值
:param divisor: 除數
:param min_value: 最小值
:return: 可被divisor整除的值
“”"
if min_value is None:
min_value = divisor
new_v = max(min_value, int(v + divisor / 2) // divisor * divisor)
if new_v < 0.9 * v: # 確保不減少超過10%
new_v += divisor
return new_v

class Conv2d_BN(nn.Sequential):
“”"
包含卷積層和批歸一化層的組合模塊。
“”"
def init(self, in_channels, out_channels, kernel_size=1, stride=1, padding=0, dilation=1, groups=1):
super().init()
# 添加卷積層
self.add_module(‘conv’, nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding, dilation, groups, bias=False))
# 添加批歸一化層
self.add_module(‘bn’, nn.BatchNorm2d(out_channels))

@torch.no_grad()
def fuse_self(self):"""融合卷積層和批歸一化層為一個卷積層。"""conv, bn = self._modules.values()# 計算融合后的權重和偏置w = bn.weight / (bn.running_var + bn.eps)**0.5w = conv.weight * w[:, None, None, None]b = bn.bias - bn.running_mean * bn.weight / (bn.running_var + bn.eps)**0.5# 創建新的卷積層fused_conv = nn.Conv2d(w.size(1) * conv.groups, w.size(0), w.shape[2:], stride=conv.stride, padding=conv.padding, dilation=conv.dilation, groups=conv.groups)fused_conv.weight.data.copy_(w)fused_conv.bias.data.copy_(b)return fused_conv

class RepViTBlock(nn.Module):
“”"
RepViT模塊,包含token混合和通道混合。
“”"
def init(self, inp, hidden_dim, oup, kernel_size, stride, use_se, use_hs):
super(RepViTBlock, self).init()
self.identity = stride == 1 and inp == oup # 判斷是否為恒等映射
if stride == 2:
# 下采樣路徑
self.token_mixer = nn.Sequential(
Conv2d_BN(inp, inp, kernel_size, stride, (kernel_size - 1) // 2, groups=inp),
SqueezeExcite(inp, 0.25) if use_se else nn.Identity(),
Conv2d_BN(inp, oup, ks=1, stride=1, pad=0)
)
self.channel_mixer = nn.Sequential(
Conv2d_BN(oup, 2 * oup, 1, 1, 0),
nn.GELU() if use_hs else nn.GELU(),
Conv2d_BN(2 * oup, oup, 1, 1, 0)
)
else:
# 保持分辨率路徑
assert(self.identity)
self.token_mixer = nn.Sequential(
Conv2d_BN(inp, inp, 3, 1, 1, groups=inp),
SqueezeExcite(inp, 0.25) if use_se else nn.Identity(),
)
self.channel_mixer = nn.Sequential(
Conv2d_BN(inp, hidden_dim, 1, 1, 0),
nn.GELU() if use_hs else nn.GELU(),
Conv2d_BN(hidden_dim, oup, 1, 1, 0)
)

def forward(self, x):return self.channel_mixer(self.token_mixer(x))

class RepViT(nn.Module):
“”"
RepViT模型,包含多個RepViTBlock。
“”"
def init(self, cfgs):
super(RepViT, self).init()
self.cfgs = cfgs # 配置參數
layers = []
input_channel = cfgs[0][2] # 第一個塊的輸入通道數
# 構建網絡層
for k, t, c, use_se, use_hs, s in self.cfgs:
output_channel = _make_divisible(c, 8)
exp_size = _make_divisible(input_channel * t, 8)
layers.append(RepViTBlock(input_channel, exp_size, output_channel, k, s, use_se, use_hs))
input_channel = output_channel
self.features = nn.ModuleList(layers)

def forward(self, x):for f in self.features:x = f(x)return x

def repvit_m2_3(weights=‘’):
“”"
構建RepViT模型的特定配置。
“”"
cfgs = [
# k, t, c, SE, HS, s
[3, 2, 80, 1, 0, 1],
# … 省略其他配置
]
model = RepViT(cfgs)
if weights:
model.load_state_dict(torch.load(weights)[‘model’])
return model

if name == ‘main’:
model = repvit_m2_3(‘repvit_m2_3_distill_450e.pth’) # 加載模型
inputs = torch.randn((1, 3, 640, 640)) # 隨機輸入
res = model(inputs) # 前向傳播
for i in res:
print(i.size()) # 輸出每層的尺寸
代碼注釋說明:
_make_divisible: 確保通道數是8的倍數,以便于后續處理。
Conv2d_BN: 定義了一個包含卷積和批歸一化的模塊,提供了融合功能以優化模型。
RepViTBlock: 該模塊實現了RepViT的基本構建塊,包含token混合和通道混合的邏輯。
RepViT: 該類構建了整個RepViT模型,包含多個RepViTBlock。
repvit_m2_3: 用于構建特定配置的RepViT模型,并可選擇加載預訓練權重。
通過這些注釋,代碼的結構和功能更加清晰易懂。

這個程序文件 repvit.py 實現了一個基于 RepVGG 結構的視覺模型,結合了深度學習中的卷積神經網絡(CNN)和注意力機制。文件中包含多個類和函數,用于構建和操作這個模型。

首先,文件導入了必要的庫,包括 PyTorch 和 NumPy,以及 timm 庫中的 SqueezeExcite 層。接著,定義了一個名為 replace_batchnorm 的函數,用于替換模型中的 BatchNorm 層為 Identity 層,以便在推理時加速計算。

接下來,定義了一個 _make_divisible 函數,確保每一層的通道數是可被 8 整除的,這對于某些模型的優化是必要的。

Conv2d_BN 類是一個自定義的模塊,結合了卷積層和 BatchNorm 層,并在初始化時對 BatchNorm 的權重進行常數初始化。該類還實現了一個 fuse_self 方法,用于將卷積層和 BatchNorm 層融合為一個卷積層,以提高推理速度。

Residual 類實現了殘差連接的功能,允許輸入和輸出相加,同時支持在訓練時進行隨機丟棄。它也實現了 fuse_self 方法,用于融合其內部的卷積層。

RepVGGDW 類實現了一個特定的卷積模塊,結合了深度可分離卷積和殘差連接。它的 forward 方法定義了前向傳播的計算過程,并實現了 fuse_self 方法以優化推理。

RepViTBlock 類則是模型的核心構建塊,結合了通道混合和令牌混合的操作。根據步幅的不同,構建不同的結構。

RepViT 類是整個模型的主類,負責構建模型的各個層。它接受一個配置列表,逐層構建網絡,并在 forward 方法中定義了輸入的前向傳播過程。switch_to_deploy 方法用于在推理階段替換 BatchNorm 層。

文件中還定義了多個函數(如 repvit_m0_9, repvit_m1_0 等),這些函數用于創建不同配置的 RepViT 模型,并可以加載預訓練的權重。

最后,在 main 塊中,程序創建了一個特定配置的模型實例,并對一個隨機輸入進行前向傳播,輸出每一層的特征圖大小。

整體而言,這個文件實現了一個靈活且高效的視覺模型,適用于圖像分類等任務,并通過模塊化設計使得模型的構建和修改變得更加方便。

源碼文件

在這里插入圖片描述

源碼獲取

歡迎大家點贊、收藏、關注、評論啦 、查看👇🏻獲取聯系方式👇🏻

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

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

相關文章

【C++題解】關聯容器

關于set&#xff0c;map以及變種 |關聯容器| set&multiset | map&multimap |無序關聯容器| Unordered set&multiset | Unordered map&multimap | 建議先了解之后再配合練習 這次練習CCF真題比較多&#xff0c;也比較基礎&#xff0c;預計耗時不用這么久。 今天…

【智譜清言-GLM-4.5】StackCube-v1 任務訓練結果不穩定性的分析

1. Prompt 我是機器人RL方向的博士生正在學習ManiSkill&#xff0c;在學習時我嘗試使用相同命令訓練同一個任務&#xff0c;但是我發現最終的 success_once 指標并不是相同的&#xff0c;我感到十分焦慮&#xff0c; 我使用的命令如下&#xff1a; python sac.py --env_id&qu…

MySQL 8.0 主從復制原理分析與實戰

MySQL 8.0 主從復制原理分析與實戰半同步復制設計理念&#xff1a;復制狀態機——幾乎所有的分布式存儲都是這么復制數據的基于全局事務標識符&#xff08;GTID&#xff09;復制GTID工作原理多主模式多主模式部署示例課程目標&#xff1a; MySQL 復制&#xff08;Replication&a…

[UT]記錄case中seq.start(sequencer)的位置變化帶來的執行行為的變化

現象&#xff1a; 代碼選擇打開57行&#xff0c;注釋掉60行執行&#xff0c;結果58行不會打印。 代碼選擇打開60行&#xff0c;注釋57行執行&#xff0c;結果58行正常打印。 sequence的執行需要時間&#xff01;&#xff01;&#xff01; SV中代碼57行切換到60行的區別&#xf…

利用keytool實現https協議(生成自簽名證書)

利用keytool實現https協議&#xff08;生成自簽名證書&#xff09;什么是https協議&#xff1f;https&#xff08;安全超文本傳輸協議&#xff09;是 HTTP 的安全版本&#xff0c;通過 SSL/TLS 加密技術&#xff0c;在客戶端&#xff08;如瀏覽器&#xff09;和服務器之間建立加…

拆解 AI 大模型 “思考” 邏輯:從參數訓練到語義理解的核心鏈路

一、引言&#xff1a;揭開 AI 大模型 “思考” 的神秘面紗?日常生活中的 AI 大模型 “思考” 場景呈現&#xff08;如 ChatGPT 對話、AI 寫作輔助、智能客服應答&#xff09;?提出核心問題&#xff1a;看似具備 “思考” 能力的 AI 大模型&#xff0c;其背后的運作邏輯究竟是…

element plus 使用細節 (二)

接上一篇文章&#xff1a; element plus 使用細節 最近菜鳥忙于系統開發&#xff0c;都沒時間總結項目中使用的問題&#xff0c;幸好還是在空閑之余總結了一點&#xff08;后續也會來補充&#xff09;&#xff0c;希望能給大家帶來幫助&#xff01; 文章目錄table fixed 的 v…

【機器學習學習筆記】numpy基礎2

零基礎小白的 NumPy 入門指南如果你想用電競&#xff08;打游戲&#xff09;的思路理解編程&#xff1a;Python 是基礎操作鍵位&#xff0c;而 NumPy 就是 “英雄專屬技能包”—— 專門幫你搞定 “數值計算” 這類復雜任務&#xff0c;比如算游戲里的傷害公式、地圖坐標&#x…

從自動化到智能化:家具廠智能化產線需求與解決方案解析

伴隨著工業4.0浪潮和智能制造技術的成熟&#xff0c;家具行業正逐步從傳統的自動化生產邁向智能化生產。智能化產線的構建不僅可以提升生產效率&#xff0c;還能滿足個性化定制和柔性制造的需求。本文以某家具廠為例&#xff0c;詳細解析智能化產線的核心需求&#xff0c;并提出…

macOS下基于Qt/C++的OpenGL開發環境的搭建

系統配置 MacBook Pro 2015 Intel macOS 12Xcode 14 Qt開發環境搭建 Qt Creator的下載與安裝 在Qt官網的下載頁面上下載&#xff0c;即Download Qt Online Installer for macOS。下載完成就得到一個文件名類似于qt-online-installer-macOS-x64-x.y.z.dmg的安裝包。 下一步 …

當液態玻璃計劃遭遇反叛者:一場 iOS 26 界面的暗戰

引子 在硅谷的地下代碼俱樂部里&#xff0c;流傳著一個關于 “液態玻璃” 的傳說 —— 那是 Apple 秘密研發的界面改造計劃&#xff0c;如同電影《變臉》中那張能改變命運的面具&#xff0c;一旦啟用&#xff0c;所有 App 都將被迫換上流光溢彩的新面孔。 而今天&#xff0c;我…

探究Linux系統的SSL/TLS證書機制

一、SSL/TLS證書的基本概念 1.1 SSL/TLS協議簡介 SSL/TLS是一種加密協議&#xff0c;旨在為網絡通信提供機密性、完整性和身份驗證。它廣泛應用于HTTPS網站、電子郵件服務、VPN以及其他需要安全通信的場景。SSL&#xff08;安全套接字層&#xff09;是TLS&#xff08;傳輸層安全…

python和java爬蟲優劣對比

Python和Java作為爬蟲開發的兩大主流語言&#xff0c;核心差異源于語法特性、生態工具鏈、性能表現的不同&#xff0c;其優勢與劣勢需結合具體場景&#xff08;如開發效率、爬取規模、反爬復雜度&#xff09;判斷。以下從 優勢、劣勢、適用場景 三個維度展開對比&#xff0c;幫…

Unity 槍械紅點瞄準器計算

今天突然別人問我紅點瞄準器在鏡子上如何計算&#xff0c;之前的吃雞項目做過不記得&#xff0c;今天寫個小用例整理下。 主體思想記得是目標位置到眼睛穿過紅點瞄準器獲取當前點的位置就可以。應該是這樣吧&#xff0c;&#xff1a;&#xff09; 武器測試結構 首先整個結構&am…

題解 洛谷P13778 「o.OI R2」=+#-

文章目錄題解代碼居然沒有題解&#xff1f;我來寫一下我的抽象做法。 題解 手玩一下&#xff0c;隨便畫個他信心的折線圖&#xff0c;如下&#xff1a; 可以發現&#xff0c;如果我們知道終止節點&#xff0c;那么我們就可以知道中間有多少個上升長度。&#xff08;因為它只能…

RTSP流端口占用詳解:TCP模式與UDP模式的對比

在音視頻傳輸協議中&#xff0c;RTSP&#xff08;Real-Time Streaming Protocol&#xff0c;實時流傳輸協議&#xff09;被廣泛用于點播、直播、監控等場景。開發者在實際部署或調試時&#xff0c;常常會遇到一個問題&#xff1a;一路 RTSP 流到底占用多少個端口&#xff1f; 這…

websocket的key和accept分別是多少個字節

WebSocket的Sec-WebSocket-Key是24字節&#xff08;192位&#xff09;的Base64編碼字符串&#xff0c;解碼后為16字節&#xff08;128位&#xff09;的原始隨機數據&#xff1b;Sec-WebSocket-Accept是28字節&#xff08;224位&#xff09;的Base64編碼字符串&#xff0c;解碼后…

單片機開發----一個簡單的Boot

文章目錄一、設計思路**整體框架設計****各文件/模塊功能解析**1. main.c&#xff08;主程序入口&#xff0c;核心控制&#xff09;2. 隱含的核心模塊&#xff08;框架中未展示但必備&#xff09;**設計亮點**二、代碼bootloader.hbootloader.cflash.cmain.c一、設計思路 整體…

Day2p2 夏暮客的Python之路

day2p2 The Hard Way to learn Python 文章目錄day2p2 The Hard Way to learn Python前言一、提問和提示1.1 關于raw_input()1.2 關于input()二、參數、解包、變量2.1 解讀參數2.2 解讀解包2.3 解讀變量2.4 實例2.5 模塊和功能2.6 練習前言 author&#xff1a;SummerEnd date…

【C++設計模式】第二篇:策略模式(Strategy)--從基本介紹,內部原理、應用場景、使用方法,常見問題和解決方案進行深度解析

C設計模式系列文章目錄 【第一篇】C單例模式–懶漢與餓漢以及線程安全 【C設計模式】第二篇&#xff1a;策略模式&#xff08;Strategy&#xff09;--從基本介紹&#xff0c;內部原理、應用場景、使用方法&#xff0c;常見問題和解決方案進行深度解析一、策略模式的基本介紹1.…