論文閱讀 - FastInst

文章目錄

  • 1 概述
  • 2 模型說明
    • 2.1 總體架構
    • 2.2 輕量pixel decoder
    • 2.3 實例激活引導的Query
    • 2.4 雙路徑更新策略
    • 2.5 GT掩碼引導學習
    • 2.6 損失函數
  • 3 效果

1 概述

FastInst是一種基于query的實時實例分割方法,它能以32.5FPS的實時速度在COCO測試集上達到40.5的AP。在實例分割領域,基于query的方法源自Mask2former,FastInst也不例外,它也沿用了MaskFormer的大架構。其核心設計包括:
(1)實例激活引導的Query
(2)雙路徑更新策略
(3)GT掩碼引導學習
這些設計使FastInst能夠使用更輕量的像素解碼器和更少的 Transformer 解碼器層,同時獲得更優的性能。

2 模型說明

2.1 總體架構

如圖2-1-1所示的左半部分所示,FastInst和MaskFormer一樣,網絡結構上主要分為三大部分,分別是Backbone、Pixel decoder和Transformer decoder。
模型總體架構示意圖

圖2-1-1 模型總體架構示意圖

假設網絡的輸入為I∈RH×W×3I \in R^{H \times W \times 3}IRH×W×3,經過Backbone之后,可以得到下采樣8倍、16倍和32倍的特征圖C3C_3C3?C4C_4C4?C5C_5C5?,此時這三個特征的shape可以表示為[BatchSize,2048,H8,W8][BatchSize, 2048, \frac{H}{8}, \frac{W}{8}][BatchSize,2048,8H?,8W?][BatchSize,1024,H16,W16][BatchSize, 1024, \frac{H}{16}, \frac{W}{16}][BatchSize,1024,16H?,16W?][BatchSize,512,H32,W32][BatchSize, 512, \frac{H}{32}, \frac{W}{32}][BatchSize,512,32H?,32W?]
這三個特征就是pixel decoder的輸入,輸出對應的三個特征圖E3E_3E3?E4E_4E4?E5E_5E5?C3C_3C3?C4C_4C4?C5C_5C5?經過1×11 \times 11×1的卷積,統一將通道數變為256,此時的shape仍舊是[BatchSize,256,H8,W8][BatchSize, 256, \frac{H}{8}, \frac{W}{8}][BatchSize,256,8H?,8W?][BatchSize,256,H16,W16][BatchSize, 256, \frac{H}{16}, \frac{W}{16}][BatchSize,256,16H?,16W?][BatchSize,256,H32,W32][BatchSize, 256, \frac{H}{32}, \frac{W}{32}][BatchSize,256,32H?,32W?]。然后,從E4E_4E4?特征圖中選取NaN_aNa?個實例激活引導查詢,并于NbN_bNb?個輔助可學習查詢連接,作為最終的總查詢Q∈RN×256Q \in R^{N \times 256}QRN×256,其中N=Na+NbN=N_a+N_bN=Na?+Nb?
Transformer decoder將QQQ和高分辨率像素特征圖E3E_3E3?作為輸入,以雙路徑的方式更新像素特征QQQE3E_3E3?,并在每個解碼器層預測對象類別和分割掩碼。

2.2 輕量pixel decoder

多尺度上下文特征圖對于圖像分割至關重要。然而,使用復雜的多尺度特征金字塔(FPN)會增加計算負擔。與直接采用pixel decoder輸出的底層特征圖的先前方法不同,FastInst使用 Transformer decoder中經過精煉的像素特征來生成分割掩碼。這種設置降低了pixel decoder對大量上下文聚合的需求,因此使用輕量級的pixel decoder模塊就夠了。換句話說,也就是主力在Transformer decoder了,pixel decoder搞得簡單點就行了。
為了在精度和速度之間取得更好的平衡,FastInst使用一種名為 PPM-FPN 的變體來替代普通的 FPN。
pixel decoder的示意圖如下圖2-2-1所示(假設整個網絡的的輸入為I∈R1024×1024×3I \in R^{1024 \times 1024 \times 3}IR1024×1024×3),PPM只作用于C5C_5C5?的特征,這里的CBR指的就是[Conv, BN, Relu]。
輕量解碼器示意圖

圖2-2-1 輕量解碼器示意圖

2.3 實例激活引導的Query

基于Query的這種方式最初來自于DETR,但是DETR的Query是全零初始化的,所以其收斂速度很慢。收到Deformable DETR的啟發,作者提出了一種實例激活引導的Query,直接從多尺度的特征圖上選取包含高級語義的Queries。具體來說,給定pixel decoder的輸出特征圖,在特征圖E4E_{4}E4?上添加一個輔助分類頭,隨后進行softmax激活,以生成每個像素的類別概率預測pi∈ΔK+1p_{i} \in \Delta^{K+1}pi?ΔK+1,其中ΔK+1\Delta^{K+1}ΔK+1(K+1)(K+1)(K+1)維概率單純形,KKK是類別數,為“無目標”(?)增加了一個類別,i是像素索引,輔助分類頭分別由兩個內核大小為3×33×33×31×11×11×1的卷積層組成。通過pip_{i}pi?,獲得每個像素的前景概率pi,kip_{i, k_{i}}pi,ki??ki=argmaxk{pi,k∣pi,k∈pi,k∈1,?,K}k_{i}=argmax_{k}\{{p_{i, k} | p_{i, k} \in p_{i}, k \in}{1, \cdots, K}\}ki?=argmaxk?{pi,k?pi,k?pi?,k1,?,K}。這里有點對特征圖進行語義分割的味道。
然后,從特征圖E4E_{4}E4?中選擇具有高前景概率的NaN_{a}Na?個像素嵌入作為目標查詢。在這里,首先選擇在相應類別平面中具有八鄰域內局部最大值的那些點,然后在pi,kii{p_{i, k_{i}}}_{i}pi,ki??i?中選擇具有最高前景概率的那些點。這里默認了特征圖上相鄰像素點為同一個類別時,他們表示的是同一個實例,這在大部分情況下是成立的,但是對于緊密貼合的同類別小面積實例是有風險的。這樣做還有一點好處就是防止最終NaN_aNa?個Queries都集中在某一塊置信度較高的前景區域。
在訓練過程中,應用基于匹配的匈牙利損失來監督輔助分類頭,記作LIA?qL_{IA-q}LIA?q?。與DETR不同,FastInst僅使用類別預測和位置成本LlocL_{loc}Lloc?來計算分配成本。位置成本LlocL_{loc}Lloc?被定義為一個指示函數,當像素位于該物體的區域內時為0;否則為1。這種成本背后的直覺是,只有落在物體內部的像素才有理由推斷該物體的類別和掩碼嵌入。此外,位置成本減少了二分匹配空間并加速了訓練收斂。
使用這種匹配方式,就是為了讓每個GT掩碼只對應于一個特征點。另一種比較直覺的方式是直接對掩碼所對應的區域進行交叉熵損失計算,這樣每個GT掩碼就對應于一片特征點了,不利于后續topk的篩選,可能會被一個概率高的區域主導。所以還是需要二分匹配。
將通過上述策略生成的Queries稱為實例激活引導(IA引導)的查詢。與零初始化Queries相比,IA引導的查詢在初始階段就包含了關于潛在對象的豐富信息,并提高了Transformer decoder中查詢迭代的效率。
其實,這個策略也可以在E3E_{3}E3?或者E5E_{5}E5?上進行,更大的特征圖包含更豐富的實例線索,但計算負擔更重。為了權衡,作者使用中等大小的特征圖E4E_{4}E4?
實例激活引導的Query示意圖

圖2-3-1 實例激活引導的Query示意圖

2.4 雙路徑更新策略

在從特征圖中選擇NaN_{a}Na?個由實例激活引導的Queries后,將它們與NbN_{b}Nb?個輔助可學習Queries連接起來,以獲得總查詢Q,其中輔助可學習Queries用于在后續的雙重更新過程中促進背景像素特征的分組,并提供通用的與圖像無關的信息。然后,將總查詢Q與展平的1/8高分辨率像素特征E3E_3E3?輸入到Transformer decoder中。在Transformer decoder中,為查詢Q和像素特征E3E_3E3?添加位置嵌入,隨后經過連續的Transformer decoder層對它們進行更新。一個Transformer decoder層包含一次像素特征更新和一次查詢更新。整個過程類似于EM(期望最大化)聚類算法。E步:根據像素特征所屬的中心(Query)更新像素特征;M步:更新聚類中心(Query)。與單路徑更新策略相比,雙路徑更新策略共同優化像素特征和Query,減少了對重型pixel decoder的依賴,并獲得了更細粒度的特征嵌入。最后,使用細化后的像素特征和查詢來預測每一層的目標類別和分割掩碼。
(1)位置編碼
位置編碼是非常重要的信息,特別是對于不同位置但類別相同的物體而言。本文使用一個固定尺寸的可學習位置嵌入向量P∈RS×S×256P \in R^{S \times S \times 256}PRS×S×256,其中SSS作者根據經驗設定為Na\sqrt{N_a}Na??,比如Na=100N_a=100Na?=100,則P∈R10×10×256P \in R^{10 \times 10 \times 256}PR10×10×256。如果某個特征圖需要使用位置編碼,則將PPP上采樣到對應的尺寸即可。
官方對應的代碼為

pixel_pos_embeds = F.interpolate(self.meta_pos_embed, size=pixel_feature_size,mode="bilinear", align_corners=False)
proposal_pos_embeds = F.interpolate(self.meta_pos_embed, size=proposal_size,mode="bilinear", align_corners=False)

其中,self.meta_pos_embed就是PPP,也就是所有的特征圖都共用一個可學習的位置編碼。作者認為,這種方式可以在不影響模型效果的前提下,提高模型的推理速度。實際情況下,PPP作用于兩種特征,一種是從E3E_3E3?得到的像素特征,也即是圖2-1-1中的pixel features;另一種是從E4E_4E4?得到的NaN_aNa?個實例激活引導的Queries,也即是圖2-1-1中的NaN_aNa? IA-guided features。
對于NbN_{b}Nb?個輔助可學習Queries而言,使用了額外的可學習位置編碼,shape為Nb×256N_b \times 256Nb?×256。這是因為NbN_{b}Nb?個輔助可學習Queries學習到的Queries對應的位置,我們并不知道。
(2)像素特征更新
首先更新像素特征。給定展平的像素特征XXX(最開始就是E3E_3E3?)和查詢QQQ,像素特征更新的流程包括一個交叉注意力層和一個前饋層,如圖2-1-1右側所示。在每個交叉注意力層,都會將位置嵌入添加到query和key中。在更新像素特征時,不使用自注意力,因為像素特征的序列較長,自注意力會帶來巨大的計算和內存成本。全局特征可以通過對query的交叉注意力進行聚合。
假設輸入的XXX的shape為[N,256][N, 256][N,256]QQQ的shape為[100+Nb,256][100+N_b, 256][100+Nb?,256]NNN要比100+Nb100+N_b100+Nb?大得多。像素特征更新是,將XXX作為query,QQQ作為key和value。經過cross attention之后,XXX會被替換更新,輸出的shape仍為[N,256][N, 256][N,256]。也就是對于每一個query,都可以通過key對value進行加權求和,換句話說,XXX會被QQQ中與其相似的特征加權求和更新。
看到這里,我們其實可以進一步理解為什么作者要增加NbN_{b}Nb?個輔助可學習Queries,因為NaN_aNa?里的都是前景特征,而XXX中既有前景,又有背景,在更新XXX時,不能只使用前景特征的加權求和得到,需要一些反應背景的特征的加權求和,這個反應背景的特征就是NbN_{b}Nb?個輔助可學習Queries。
(3)Query更新
作者像Mask2Former中那樣,使用掩碼注意力,隨后再使用自注意力和前饋網絡來進行Query更新。掩碼注意力將每個Query的注意力限制在僅關注前一層預測掩碼的前景區域內,而上下文信息則被假設通過后續的自注意力來收集。這種設計顯著提升了基于Query的模型在圖像分割任務中的性能。在此,位置嵌入同樣會被添加到每個掩碼注意力層和自注意力層的query與key中。
這里的masked attention中使用的mask會在2.5中進一步說明。
(4)預測
作者在每個decoder layer中,使用兩個獨立的三層MLPs作用于細化后的實例激活引導queries來預測物體的類別和mask embeddings。每個實例激活引導查詢(IA-guided query)都需要預測所有目標類別的概率,包括 “無目標”(?)類別。作者對經過精煉的mask features進行線性投影以獲得掩碼特征。然后,將mask embeddings與mask features相乘,得到每個query對應的分割掩碼。此處,每個 Transformer decoder層中多層感知機(MLPs)和線性投影的參數是不共享的,因為query和pixel features會交替更新,且在不同的解碼器層中,它們的特征可能處于不同的表征空間。此外,實例分割需要為每個預測結果提供一個置信度分數用于評估。作者沿用先前的工作的方法,將類別概率分數與掩碼分數(即前景區域內掩碼概率的平均值)相乘,作為最終的置信度分數。

2.5 GT掩碼引導學習

mask attention的方法是以模型之前預測的mask作為先驗來對attention進行掩碼的,如果這個mask學習的不好,會影響之后的學習效果。為緩解這一問題,作者引入了GT掩碼引導學習。首先,使用最后一層的二分匹配GT真值掩碼替換第lll層掩碼注意力中使用的預測掩碼。對于在最后一層中未匹配到任何實例的Query(包括輔助可學習查詢),采用標準的交叉注意力,即

Mil={Mjgtif(i,j)∈σ?otherwise(2-5-1)M^l_i = \begin{cases} M^{gt}_j & if (i, j) \in \sigma \\ \empty & otherwise \end{cases} \tag{2-5-1} Mil?={Mjgt???if(i,j)σotherwise?(2-5-1)

其中,MilM^l_iMil?是第iii個query在第lll層的注意力掩碼,σ={(i,j)∣i∈{1,...,Na},j∈{1,...,Nobj}}\sigma = \{ (i, j) | i \in \{ 1, ..., N_a \}, j \in \{ 1, ..., N_{obj} \} \}σ={(i,j)i{1,...,Na?},j{1,...,Nobj?}}是decoder最后一層的匹配關系,并且MjgtM^{gt}_jMjgt?是第iii個query在最后一層匹配到的GT掩碼。NobjN_{obj}Nobj?表示GT目標的數量。
然后,使用該注意力掩碼MlM^lMl來進行masked attention。圖2-1-1右側所示的結構會重復多次,每一次都輸入是上一次的輸出。新的一輪根據固定匹配σσσ對新輸出進行監督,也就是σσσ的匹配過程只在第一次進行。這種固定匹配確保了每個Transformer decoder層的預測的一致性,并在訓練過程中節省了匹配的計算成本。通過這樣的指導學習,允許每個query在訓練期間看到其目標的整個區域預測對象,這有助于掩碼注意力在更合適的前景區域內進行。

2.6 損失函數

FastInst的整個損失函數可以寫作

L=LIA?q+Lpred+Lpred′(2-6-1)L = L_{IA-q} + L_{pred} + L'_{pred} \tag{2-6-1} L=LIA?q?+Lpred?+Lpred?(2-6-1)

其中,LIA?qL_{IA-q}LIA?q?就是2.3中提到的輔助分類頭損失,也就是先使用匈牙利匹配,后進行交叉熵損失。
LpredL_{pred}Lpred?定義為

Lpred=∑i=0D(λceLcei+λdiceLdicei)+λclsLclsi(2-6-2)L_{pred} = \sum^D_{i=0} (\lambda_{ce} L^i_{ce} + \lambda_{dice} L^i_{dice}) + \lambda_{cls} L^i_{cls} \tag{2-6-2} Lpred?=i=0D?(λce?Lcei?+λdice?Ldicei?)+λcls?Lclsi?(2-6-2)

其中,DDD表示Transformer decoder的層數,并且i=0i=0i=0表示在進入Transformer decoder之前的prediction損失。LceiL^i_{ce}Lcei?LdiceiL^i_{dice}Ldicei?分別表示分割任務的二元交叉熵損失和dice損失。LclsL_{cls}Lcls?表示類別交叉熵損失。同樣,利用匈牙利算法來尋找目標分配的最佳匹配。對于匹配成本,為每個query添加了額外的位置成本λlocLlocλ_{loc}L_{loc}λloc?Lloc?
Lpred′L'_{pred}Lpred?表示GT掩碼引導的損失,與LpredL_{pred}Lpred?相似。區別是它不計算第0層的損失,并使用固定的二分匹配結果。LpredL_{pred}Lpred?是使用模型預測的掩碼引導的,Lpred′L'_{pred}Lpred?是GT掩碼引導的。

3 效果

FastInst和其他模型的效果對比可見表3-1。其中,FastInst-D1表示一層transformer decoder層,FastInst-D3表示三層transformer decoder層,層數速度越慢,但是精度越高。
FastInst和其他模型效果對比

表3-1 FastInst和其他模型效果對比

圖3-1是實例激活引導的query的可視化結果。第一行和第二行顯示了實例激活引導的query的分布,對輔助分類頭部的監督損失不同。
第一列:密集的像素語義分類損失
第二列:基于二分匹配的匈牙利損失,沒有位置成本
第三列:基于二分的匹配匈牙利損失,有位置成本
第四列:GT
本文設計的損失(第三列)下的查詢點更集中于每個前景對象的區域。最后一行顯示四個預測的掩碼(藍色),具有相應的實例激活引導query位置(紅色)。
實例激活引導的query的可視化結果

圖3-1 實例激活引導的query的可視化結果

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

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

相關文章

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點)

Elasticsearch 9.x 高可用集群部署教程(3 主節點 + 3 數據節點) 1. 集群架構規劃 生產環境中的 Elasticsearch 集群需要高可用性和容錯能力。以下是基于 3 主節點 + 3 數據節點的架構規劃: 節點分布: 主節點(Master Nodes):3 臺(master-node-1, master-node-2, maste…

Unity_通過鼠標點擊屏幕移動屏幕里的一個對象

文章目錄一、獲取到點擊物體的Tansform(摁下鼠標左鍵的瞬間)二、移動點擊的物體(摁著鼠標左鍵不放)三、松開左鍵清理被移動對象屬性總結注:本文章只是學習總結的筆記,視頻鏈接 一、獲取到點擊物體的Tansfor…

UDP中的單播,多播,廣播(代碼實現)

文章目錄1. UDP 單播(Unicast)示例2. UDP 廣播(Broadcast)示例3. UDP 多播(Multicast)示例3.1 多播發送方示例3.2 多播接收方示例總結1. UDP 單播(Unicast)示例 發送方向指定單個目…

神經網絡:卷積層

神經網絡 卷積操作 例子: 輸入:二維圖像 [1,2,0,3,1] [0,1,2,3,1] [1,2,1,0,0] [5,2,3,1,1] [2,1,0,1,1] 卷積核: [1,2,1] [0,1,0] [2,1,0] 然后需要將輸入圖像和卷積核轉化為4維張量 為什么轉為4維張量?因為卷積操作需要輸入圖像…

2.4 組件間通信Props(父傳子)

父組件 在父組件模板上的子組件上加上屬性值&#xff0c;屬性值就是想要傳遞給子組件的信息。 例如&#xff1a; <template> <div class"Big-box"><testBox :personList"p"></testBox> </div> </template>子組件 子組…

從零開始學習 Redux:React Native 項目中的狀態管理

Redux 是一個用于 JavaScript 應用程序的狀態管理庫&#xff0c;通常與 React 或 React Native 配合使用&#xff0c;幫助管理應用的狀態和數據流。其核心原理是通過集中式的“單一數據源”來管理應用狀態&#xff0c;避免組件之間的“層層傳遞”狀態和副作用。 Redux 的原理單…

[特殊字符] CentOS 7 離線安裝 MySQL 5.7 實驗

&#x1f427; CentOS 7 離線安裝 MySQL 5.7 實驗 針對企業無互聯網環境的系統&#xff0c;設計了如何在 CentOS 7 系統中&#xff0c;使用一臺可以聯網的主機&#xff08;NodeA&#xff09;為另一臺無法聯網的主機&#xff08;NodeB&#xff09;安裝 MySQL 5.7 數據庫及其依賴…

Redis 概率型數據結構實戰指南

1. 為什么要用「近似」&#xff1f; 隨著業務量爆發式增長&#xff0c;精確統計 的內存或 CPU 成本可能難以接受。例如&#xff1a; 統計一天內 唯一 IP 數 —— 用 SET 精確去重&#xff0c;百萬 IP→占用數百 MB。統計海量商品銷量、實時計算 P99 延遲、獲取 TOP-N 熱門頁面……

Android開發工程師:Linux一條find grep命令通關搜索內容與文件

find . -type f \( -name "*.java" -o -name "*.xml" \) -not -path "./out/*" -exec grep -irnE activity|class {} 多關鍵詞搜索&#xff1a;使用正則表達式 pattern1|pattern2 同時搜索多個關鍵詞&#xff08;如 activity|class&#xff09;單…

深入理解瀏覽器解析機制和XSS向量編碼

URL 編碼 "javascript:alert(1)"---->%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29<a href"%6a%61%76%61%73%63%72%69%70%74:%61%6c%65%72%74%28%31%29">aaa</a>-------瀏覽器解析不了。 頁面識別在url解碼之前&#xff0c;在…

ThinkPHP8極簡上手指南:開啟高效開發之旅

目錄一、環境搭建1.1 安裝 PHP1.2 安裝 Composer二、安裝 ThinkPHP8三、目錄結構解析四、第一個簡單示例&#xff1a;Hello, ThinkPHP84.1 創建控制器4.2 編寫控制器方法4.3 配置路由4.4 訪問測試五、進階示例&#xff1a;數據庫查詢5.1 配置數據庫連接5.2 創建模型5.3 編寫查詢…

智能制造之物料詳解

在制造業業務系統中&#xff0c;物料流轉貫穿“需求→采購→入庫→生產→成品→交付”全流程&#xff0c;各系統通過數據協同實現物料狀態、位置、數量的精準追蹤。以下按流轉階段拆解&#xff1a;一、需求發起與計劃階段&#xff08;CRM/ERP/PLM主導&#xff09;1. 需求源頭…

Qt的安裝和環境配置

QT開發環境的搭建&#xff0c;需要安裝3個部分&#xff0c;C編譯器、Qt SDK(SDK是軟件開發工具包)、QT的集成開發環境(IDE)Qt的3種集成開發環境&#xff1a;Qt Creator&#xff1a;是由Qt官方提供的&#xff0c;容易上手&#xff0c;不需要額外的配置&#xff0c;但是有一些bug…

解析MCUboot的實現原理和Image結構

目錄 概述 1 MCUboot的功能 1.1 代碼包結構 1.2 限制 2 MCUboot Image 2.1 Image格式 2.2 Flash Map 2.3 Image 槽 2.4 使用scratch交換 2.5 Image 尾部數據結構 3 交換區 3.1 單交換區 3.2 Multiple Image boot 3.3 Image交換 4 交換狀態&#xff08;swap statu…

YOLOv8目標檢測項目代碼詳解與習題

YOLOv8目標檢測項目代碼詳解與習題一、項目代碼詳解該代碼是基于 YOLOv8 和 OpenCV 實現的圖像目標檢測項目&#xff0c;核心功能是加載預訓練的 YOLOv8 模型&#xff0c;對指定圖像進行目標檢測&#xff0c;然后可視化檢測結果并保存或顯示。以下是逐行解析&#xff1a;# -*- …

gradle關于dependency-management的使用

1、相關文檔Spring官方文檔&#xff1a;https://docs.spring.io/dependency-management-plugin/docs/current-SNAPSHOT/reference/html/#introduction倉庫版本查看&#xff1a;https://mvnrepository.com/artifact/io.spring.gradle/dependency-management-plugin/1.0.15.RELEA…

Java SpringBoot 對接FreeSwitch

1.增加Maven依賴<dependency><groupId>org.freeswitch.esl.client</groupId><artifactId>org.freeswitch.esl.client</artifactId><version>0.9.2</version></dependency><!-- XML-RPC --><dependency><groupI…

限流算法與實現

費曼學習法學習限流算法為什么要限流mysql插入600次/秒超過這個閾值&#xff0c;要么使用mysql集群、要么限流&#xff0c;防止宕機有哪些算法固定窗口就是個計數器&#xff0c;一秒內超過閾值&#xff0c;不允許訪問缺點&#xff1a;不均勻&#xff0c;跨越臨界點的一秒內&…

Android本地瀏覽PDF(Android PDF.js 簡要學習手冊)

環境 Min SDK: 21 依賴&#xff1a; implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.1" implementation "androidx.webkit:webkit:1.12.0"權限&#xff1a; <uses-permission android:name"android.permission.INTERNE…

CVE-2022-41128

概述CVE-2022-41128 是 Microsoft Internet Explorer&#xff08;IE&#xff09;瀏覽器中 JavaScript 引擎&#xff08;JScript/Chakra&#xff09;的一個 0day 漏洞&#xff08;披露時無官方補丁&#xff09;&#xff0c;屬于內存破壞類漏洞&#xff0c;可被用于遠程代碼執行&…