導航:首頁 > 源碼編譯 > v2演算法

v2演算法

發布時間:2023-06-26 16:31:20

android V1及V2簽名原理簡析

Android為了保證系統及應用的安全性,在安裝APK的時候需要校驗包的完整性,同時,對於覆蓋安裝的場景還要校驗新舊是否匹配,這兩者都是通過Android簽名機制來進行保證的,本文就簡單看下Android的簽名與校驗原理,分一下幾個部分分析下:

簽名是摘要與非對稱密鑰加密相相結合的產物,摘要就像內容的一個指紋信息,一旦內容被篡改,摘要就會改變,簽名是摘要的加密結果,摘要改變,簽名也會失效。Android APK簽名也是這個道理,如果APK簽名跟內容對應不起來,Android系統就認為APK內容被篡改了,從而拒絕安裝,以保證系統的安全性。目前Android有三種簽名V1、V2(N)、V3(P),本文只看前兩種V1跟V2,對於V3的輪密先不考慮。先看下只有V1簽名後APK的樣式:

再看下只有V2簽名的APK包樣式:

同時具有V1 V2簽名:

可以看到,如果只有V2簽名,那麼APK包內容幾乎是沒有改動的,META_INF中不會有新增文件,按Google官方文檔:在使用v2簽名方案進行簽名時,會在APK文件中插入一個APK簽名分塊,該分塊位於zip中央目錄部分之前並緊鄰該部分。在APK簽名分塊內, 簽名和簽名者身份信息會存儲在APK簽名方案v2分塊中,保證整個APK文件不可修改 ,如下圖:

而V1簽名是通過META-INF中的三個文件保證簽名及信息的完整性:

V1簽名是如何保證信息的完整性呢?V1簽名主要包含三部分內容,如果狹義上說簽名跟公鑰的話,僅僅在.rsa文件中,V1簽名的三個文件其實是一套機制,不能單單拿一個來說事,

如果對APK中的資源文件進行了替換,那麼該資源的摘要必定發生改變,如果沒有修改MANIFEST.MF中的信息,那麼在安裝時候V1校驗就會失敗,無法安裝,不過如果篡改文件的同時,也修改其MANIFEST.MF中的摘要值,那麼MANIFEST.MF校驗就可以繞過。

CERT.SF個人覺得有點像冗餘,更像對文件完整性的二次保證,同繞過MANIFEST.MF一樣,.SF校驗也很容易被繞過。

CERT.RSA與CERT.SF是相互對應的,兩者名字前綴必須一致,不知道算不算一個無聊的標准。看下CERT.RSA文件內容:

CERT.RSA文件裡面存儲了證書公鑰、過期日期、發行人、加密演算法等信息,根據公鑰及加密演算法,Android系統就能計算出CERT.SF的摘要信息,其嚴格的格式如下:

從CERT.RSA中,我們能獲的證書的指紋信息,在微信分享、第三方SDK申請的時候經常用到,其實就是公鑰+開發者信息的一個簽名:

除了CERT.RSA文件,其餘兩個簽名文件其實跟keystore沒什麼關系,主要是文件自身的摘要及二次摘要,用不同的keystore進行簽名,生成的MANIFEST.MF與CERT.SF都是一樣的,不同的只有CERT.RSA簽名文件。也就是說前兩者主要保證各個文件的完整性,CERT.RSA從整體上保證APK的來源及完整性,不過META_INF中的文件不在校驗范圍中,這也是V1的一個缺點。V2簽名又是如何保證信息的完整性呢?

前面說過V1簽名中文件的完整性很容易被繞過,可以理解 單個文件完整性校驗的意義並不是很大 ,安裝的時候反而耗時,不如採用更加簡單的便捷的校驗方式。V2簽名就不針對單個文件校驗了,而是 針對APK進行校驗 ,將APK分成1M的塊,對每個塊計算值摘要,之後針對所有摘要進行摘要,再利用摘要進行簽名。

也就是說,V2摘要簽名分兩級,第一級是對APK文件的1、3 、4 部分進行摘要,第二級是對第一級的摘要集合進行摘要,然後利用秘鑰進行簽名。安裝的時候,塊摘要可以並行處理,這樣可以提高校驗速度。

APK是先摘要,再簽名,先看下摘要的定義:Message Digest:摘要是對消息數據執行一個單向Hash,從而生成一個固定長度的Hash值,這個值就是消息摘要,至於常聽到的MD5、SHA1都是摘要演算法的一種。理論上說,摘要一定會有碰撞,但只要保證有限長度內碰撞率很低就可以,這樣就能利用摘要來保證消息的完整性,只要消息被篡改,摘要一定會發生改變。但是,如果消息跟摘要同時被修改,那就無從得知了。

而數字簽名是什麼呢(公鑰數字簽名),利用非對稱加密技術,通過私鑰對摘要進行加密,產生一個字元串,這個字元串+公鑰證書就可以看做消息的數字簽名,如RSA就是常用的非對稱加密演算法。在沒有私鑰的前提下,非對稱加密演算法能確保別人無法偽造簽名,因此數字簽名也是對發送者信息真實性的一個有效證明。不過由於Android的keystore證書是自簽名的,沒有第三方權威機構認證,用戶可以自行生成keystore,Android簽名方案無法保證APK不被二次簽名。

知道了摘要跟簽名的概念後,再來看看Android的簽名文件怎麼來的?如何影響原來APK包?通過sdk中的apksign來對一個APK進行簽名的命令如下:

其主要實現在 android/platform/tools/apksig 文件夾中,主體是ApkSigner.java的sign函數,函數比較長,分幾步分析

先來看這一步,ApkUtils.findZipSections,這個函數主要是解析APK文件,獲得ZIP格式的一些簡單信息,並返回一個ZipSections,

ZipSections包含了ZIP文件格式的一些信息,比如中央目錄信息、中央目錄結尾信息等,對比到zip文件格式如下:

獲取到 ZipSections之後,就可以進一步解析APK這個ZIP包,繼續走後面的簽名流程,

可以看到先進行了一個V2簽名的檢驗,這里是用來簽名,為什麼先檢驗了一次?第一次簽名的時候會直接走這個異常邏輯分支,重復簽名的時候才能獲到取之前的V2簽名,懷疑這里獲取V2簽名的目的應該是為了排除V2簽名,並獲取V2簽名以外的數據塊,因為簽名本身不能被算入到簽名中,之後會解析中央目錄區,構建一個DefaultApkSignerEngine用於簽名

先解析中央目錄區,獲取AndroidManifest文件,獲取minSdkVersion(影響簽名演算法),並構建DefaultApkSignerEngine,默認情況下V1 V2簽名都是打開的。

第五步與第六步的主要工作是:apk的預處理,包括目錄的一些排序之類的工作,應該是為了更高效處理簽名,預處理結束後,就開始簽名流程,首先做的是V1簽名(默認存在,除非主動關閉):

步驟7、8、9都可以看做是V1簽名的處理邏輯,主要在V1SchemeSigner中處理,其中包括創建META-INFO文件夾下的一些簽名文件,更新中央目錄、更新中央目錄結尾等,流程不復雜,不在贅述,簡單流程就是:

這里特殊提一下重復簽名的問題: 對一個已經V1簽名的APK再次V1簽名不會有任何問題 ,原理就是:再次簽名的時候,會排除之前的簽名文件。

可以看到目錄、META-INF文件夾下的文件、sf、rsa等結尾的文件都不會被V1簽名進行處理,所以這里不用擔心多次簽名的問題。接下來就是處理V2簽名。

V2SchemeSigner處理V2簽名,邏輯比較清晰,直接對V1簽名過的APK進行分塊摘要,再集合簽名,V2簽名不會改變之前V1簽名後的任何信息,簽名後,在中央目錄前添加V2簽名塊,並更新中央目錄結尾信息,因為V2簽名後,中央目錄的偏移會再次改變:

簽名校驗的過程可以看做簽名的逆向,只不過覆蓋安裝可能還要校驗公鑰及證書信息一致,否則覆蓋安裝會失敗。簽名校驗的入口在PackageManagerService的install里,安裝官方文檔,7.0以上的手機優先檢測V2簽名,如果V2簽名不存在,再校驗V1簽名,對於7.0以下的手機,不存在V2簽名校驗機制,只會校驗V1,所以,如果你的App的miniSdkVersion<24(N),那麼你的簽名方式必須內含V1簽名:

校驗流程就是簽名的逆向,了解簽名流程即可,本文不求甚解,有興趣自己去分析,只是額外提下覆蓋安裝,覆蓋安裝除了檢驗APK自己的完整性以外,還要校驗證書是否一致只有證書一致(同一個keystore簽名),才有可能覆蓋升級。覆蓋安裝同全新安裝相比較多了幾個校驗

這里只關心證書部分:

Android V1及V2簽名簽名原理簡析

僅供參考,歡迎指正

Ⅱ 【目標檢測演算法解讀】yolo系列演算法二

https://blog.csdn.net/Gentleman_Qin/article/details/84349144

|聲明:遵循CC 4.0 BY-SA版權協議

    建立在YOLOv1的基礎上,經過Joseph Redmon等的改進,YOLOv2和YOLO9000演算法在2017年CVPR上被提出,並獲得最佳論文提名,重點解決YOLOv1召回率和定位精度方面的誤差。在提出時,YOLOv2在多種監測數據集中都要快過其他檢測系統,並可以在速度與精確度上進行權衡。

    YOLOv2採用Darknet-19作為特徵提取網路,增加了批量標准化(Batch Normalization)的預處理,並使用224×224和448×448兩階段訓練ImageNet,得到預訓練模型後fine-tuning。

    相比於YOLOv1是利用FC層直接預測Bounding Box的坐標,YOLOv2借鑒了FSR-CNN的思想,引入Anchor機制,利用K-Means聚類的方式在訓練集中聚類計算出更好的Anchor模板,在卷積層使用Anchor Boxes操作,增加Region Proposal的預測,同時採用較強約束的定位方法,大大提高演算法召回率。同時結合圖像細粒度特徵,將淺層特徵與深層特徵相連,有助於對小尺寸目標的檢測。 

    下圖所示是YOLOv2採取的各項改進帶了的檢測性能上的提升:

    YOLO9000 的主要檢測網路也是YOLO v2,同時使用WordTree來混合來自不同的資源的訓練數據,並使用聯合優化技術同時在ImageNet和COCO數據集上進行訓練,目的是利用數量較大的分類數據集來幫助訓練檢測模型,因此,YOLO 9000的網路結構允許實時地檢測超過9000種物體分類,進一步縮小了檢測數據集與分類數據集之間的大小代溝。

    下面將具體分析YOLOv2的各個創新點:

BN概述:

    對數據進行預處理(統一格式、均衡化、去噪等)能夠大大提高訓練速度,提升訓練效果。BN正是基於這個假設的實踐,對每一層輸入的數據進行加工。

    BN是2015年Google研究員在論文《Batch Normalization: Accelerating Deep Network Training by Recing Internal Covariate Shift》一文中提出的,同時也將BN應用到了2014年的GoogLeNet上,也就是Inception-v2。

    BN層簡單講就是對網路的每一層的輸入都做了歸一化,這樣網路就不需要每層都去學數據的分布,收斂會更快。YOLOv1演算法(採用的是GoogleNet網路提取特徵)是沒有BN層的,而在YOLOv2中作者為每個卷積層都添加了BN層。

    使用BN對網路進行優化,讓網路提高了收斂性,同時還消除了對其他形式的正則化(regularization)的依賴,因此使用BN後可以從模型中去掉Dropout,而不會產生過擬合。

BN優點:

神經網路每層輸入的分布總是發生變化,加入BN,通過標准化上層輸出,均衡輸入數據分布,加快訓練速度,因此可以設置較大的學習率(Learning Rate)和衰減(Decay);

通過標准化輸入,降低激活函數(Activation Function)在特定輸入區間達到飽和狀態的概率,避免梯度彌散(Gradient Vanishing)問題;

輸入標准化對應樣本正則化,BN在一定程度上可以替代 Dropout解決過擬合問題。

BN演算法:

    在卷積或池化之後,激活函數之前,對每個數據輸出進行標准化,方式如下圖所示:

    公式很簡單,前三行是 Batch內數據歸一化(假設一個Batch中有每個數據),同一Batch內數據近似代表了整體訓練數據。第四行引入了附加參數 γ 和 β,此二者的取值演算法可以參考BN論文,在此不再贅述。

    fine-tuning:用已經訓練好的模型,加上自己的數據集,來訓練新的模型。即使用別人的模型的前幾層,來提取淺層特徵,而非完全重新訓練模型,從而提高效率。一般新訓練模型准確率都會從很低的值開始慢慢上升,但是fine-tuning能夠讓我們在比較少的迭代次數之後得到一個比較好的效果。

    YOLO模型分為兩部分,分類模型和檢測模型,前者使用在ImageNet上預訓練好的模型,後者在檢測數據集上fine-tuning。

    YOLOv1在預訓練時採用的是224*224的輸入(在ImageNet數據集上進行),然後在檢測的時候採用448*448的輸入,這會導致從分類模型切換到檢測模型的時候,模型還要適應圖像解析度的改變。

    YOLOv2則將預訓練分成兩步:先用224*224的輸入在ImageNet數據集訓練分類網路,大概160個epoch(將所有訓練數據循環跑160次)後將輸入調整到448*448,再訓練10個epoch(這兩步都是在ImageNet數據集上操作)。然後利用預訓練得到的模型在檢測數據集上fine-tuning。這樣訓練得到的模型,在檢測時用448*448的圖像作為輸入可以順利檢測。

    YOLOv1將輸入圖像分成7*7的網格,每個網格預測2個Bounding Box,因此一共有98個Box,同時YOLOv1包含有全連接層,從而能直接預測Bounding Boxes的坐標值,但也導致丟失較多的空間信息,定位不準。

    YOLOv2首先將YOLOv1網路的FC層和最後一個Pooling層去掉,使得最後的卷積層可以有更高解析度的特徵,然後縮減網路,用416*416大小的輸入代替原來的448*448,使得網路輸出的特徵圖有奇數大小的寬和高,進而使得每個特徵圖在劃分單元格(Cell)的時候只有一個中心單元格(Center Cell)。

    為什麼希望只有一個中心單元格呢?由於圖片中的物體都傾向於出現在圖片的中心位置,特別是比較大的物體,所以有一個單元格單獨位於物體中心的位置用於預測這些物體。

    YOLOv2通過引入Anchor Boxes,通過預測Anchor Box的偏移值與置信度,而不是直接預測坐標值。YOLOv2的卷積層採用32這個值來下采樣圖片,所以通過選擇416*416用作輸入尺寸最終能輸出一個13*13的特徵圖。若採用FSRCNN中的方式,每個Cell可預測出9個Anchor Box,共13*13*9=1521個(YOLOv2確定Anchor Boxes的方法見是維度聚類,每個Cell選擇5個Anchor Box)。

    在FSRCNN中,以一個51*39大小的特徵圖為例,其可以看做一個尺度為51*39的圖像,對於該圖像的每一個位置,考慮9個可能的候選窗口:3種面積3種比例。這些候選窗口稱為Anchor Boxes。下圖示出的是51*39個Anchor Box中心,以及9種Anchor Box示例。

YOLOv1和YOLOv2特徵圖數據結構:

YOLOv1:S*S* (B*5 + C) => 7*7(2*5+20)

    其中B對應Box數量,5對應邊界框的定位信息(w,y,w,h)和邊界框置信度(Confidience)。解析度是7*7,每個Cell預測2個Box,這2個Box共用1套條件類別概率(1*20)。

YOLOv2:S*S*K* (5 + C) => 13*13*9(5+20)

    解析度提升至13*13,對小目標適應性更好,借鑒了FSRCNN的思想,每個Cell對應K個Anchor box(YOLOv2中K=5),每個Anchor box對應1組條件類別概率(1*20)。

    聚類:聚類是指事先沒有「標簽」而通過某種成團分析找出事物之間存在聚集性原因的過程。即在沒有劃分類別的情況下,根據數據相似度進行樣本分組。

    在FSR-CNN中Anchor Box的大小和比例是按經驗設定的,然後網路會在訓練過程中調整Anchor Box的尺寸,最終得到准確的Anchor Boxes。若一開始就選擇了更好的、更有代表性的先驗Anchor Boxes,那麼網路就更容易學到准確的預測位置。

    YOLOv2使用K-means聚類方法類訓練Bounding Boxes,可以自動找到更好的寬高維度的值用於一開始的初始化。傳統的K-means聚類方法使用的是歐氏距離函數,意味著較大的Anchor Boxes會比較小的Anchor Boxes產生更多的錯誤,聚類結果可能會偏離。由於聚類目的是確定更精準的初始Anchor Box參數,即提高IOU值,這應與Box大小無關,因此YOLOv2採用IOU值為評判標准,即K-means 採用的距離函數(度量標准) 為:

d(box,centroid) = 1 - IOU(box,centroid)

    如下圖,左邊是聚類的簇個數和IOU的關系,兩條曲線分別代表兩個不同的數據集。分析聚類結果並權衡模型復雜度與IOU值後,YOLOv2選擇K=5,即選擇了5種大小的Box 維度來進行定位預測。

    其中紫色和灰色也是分別表示兩個不同的數據集,可以看出其基本形狀是類似的。更重要的是,可以看出聚類的結果和手動設置的Anchor Box位置和大小差別顯著——結果中扁長的框較少,而瘦高的框更多(更符合行人的特徵)。

    YOLOv2採用的5種Anchor的Avg IOU是61,而採用9種Anchor Boxes的Faster RCNN的Avg IOU是60.9,也就是說本文僅選取5種box就能達到Faster RCNN的9中box的效果。選擇值為9的時候,AVG IOU更有顯著提高。說明K-means方法的生成的boxes更具有代表性。

    直接對Bounding Boxes求回歸會導致模型不穩定,其中心點可能會出現在圖像任何位置,有可能導致回歸過程震盪,甚至無法收斂,尤其是在最開始的幾次迭代的時候。大多數不穩定因素產生自預測Bounding Box的中心坐標(x,y)位置的時候。

    YOLOv2的網路在特徵圖(13*13)的每一個單元格中預測出5個Bounding Boxes(對應5個Anchor Boxes),每個Bounding Box預測出5個值(tx,ty,tw,th,t0),其中前4個是坐標偏移值,t0是置信度結果(類似YOLOv1中的邊界框置信度Confidence)。YOLOv2借鑒了如下的預測方式,即當Anchor Box的中心坐標和寬高分別是(xa,ya)和(wa,wh)時,Bounding Box坐標的預測偏移值(tx,ty,tw,th)與其坐標寬高(x,y,w,h)的關系如下:                         

tx = (x-xa)/wa

ty= (y-ya)/ha

tw = log(w/wa)

th = log(h/ha)

    基於這種思想,YOLOv2在預測Bounding Box的位置參數時採用了如下強約束方法:

    上圖中,黑色虛線框是Anchor Box,藍色矩形框就是預測的Bounding Box結果,預測出的Bounding Box的坐標和寬高為(bx,by)和(bw,bh),計算方式如圖中所示,其中:對每個Bounding Box預測出5個值(tx,ty,tw,th,t0),Cell與圖像左上角的橫縱坐標距離為(cx,cy),σ定義為sigmoid激活函數(將函數值約束到[0,1]),該Cell對應的Anchor Box對應的寬高為(pw,ph)。

    簡而言之,(bx,by)就是(cx,cy)這個Cell附近的Anchor Box針對預測值(tx,ty)得到的Bounding Box的坐標預測結果,同時可以發現這種方式對於較遠距離的Bounding Box預測值(tx,ty)能夠得到很大的限制。

    YOLOv2通過添加一個轉移層,把高解析度的淺層特徵連接到低解析度的深層特徵(把特徵堆積在不同Channel中)而後進行融合和檢測。具體操作是先獲取前層的26*26的特徵圖,將其同最後輸出的13*13的特徵圖進行連接,而後輸入檢測器進行檢測(檢測器的FC層起到了全局特徵融合的作用),以此來提高對小目標的檢測能力。    

    為了適應不同尺度下的檢測任務,YOLOv2在訓練網路時,其在檢測數據集上fine-tuning時候採用的輸入圖像的size是動態變化的。具體來講,每訓練10個Batch,網路就會隨機選擇另一種size的輸入圖像。因為YOLOv2用到了參數是32的下采樣,因此也採用32的倍數作為輸入的size,即採用{320,352,…,608}的輸入尺寸(網路會自動改變尺寸,並繼續訓練的過程)。

這一策略讓網路在不同的輸入尺寸上都能達到較好的預測效果,使同一網路能在不同解析度上進行檢測。輸入圖片較大時,檢測速度較慢,輸入圖片較小時,檢測速度較快,總體上提高了准確率,因此多尺度訓練算是在准確率和速度上達到一個平衡。

    上表反映的是在檢測時,不同大小的輸入圖片情況下的YOLOv2和其他目標檢測演算法的對比。可以看出通過多尺度訓練的檢測模型,在測試的時候,輸入圖像在尺寸變化范圍較大的情況下也能取得mAP和FPS的平衡。

    YOLOv1採用的訓練網路是GoogleNet,YOLOv2採用了新的分類網路Darknet-19作為基礎網路,它使用了較多的3*3卷積核,並把1*1的卷積核置於3*3的卷積核之間,用來壓縮特徵,同時在每一次池化操作後把通道(Channels)數翻倍(借鑒VGG網路)。

    YOLOv1採用的GooleNet包含24個卷積層和2個全連接層,而Darknet-19包含19個卷積層和5個最大池化層(Max Pooling Layers),後面添加Average Pooling層(代替v1中FC層),而Softmax分類器作為激活被用在網路最後一層,用來進行分類和歸一化。

    在ImageNet數據集上進行預訓練,主要分兩步(採用隨機梯度下降法):

輸入圖像大小是224*224,初始學習率(Learning Rate)為0.1,訓練160個epoch,權值衰減(Weight Decay)為0.0005,動量(Momentum)為0.9,同時在訓練時採用標準的數據增強(Data Augmentation)方式如隨機裁剪、旋轉以及色度、亮度的調整。

fine-tuning:第1步結束後,改用448*448輸入(高解析度模型),學習率改為0.001,訓練10個epoch,其他參數不變。結果表明:fine-tuning後的top-1准確率為76.5%,top-5准確率為93.3%,若按照原來的訓練方式,Darknet-19的top-1准確率是72.9%,top-5准確率為91.2%。可以看出,兩步分別從網路結構和訓練方式方面入手提高了網路分類准確率。

    預訓練之後,開始基於檢測的數據集再進行fine-tuning。    

    首先,先把最後一個卷積層去掉,然後添加3個3*3的卷積層,每個卷積層有1024個卷積核,並且後面都連接一個1*1的卷積層,卷積核個數(特徵維度)根據需要檢測的類數量決定。(比如對VOC數據,每個Cell需要預測5個Boungding Box,每個Bounding Box有4個坐標值、1個置信度值和20個條件類別概率值,所以每個單元格對應125個數據,此時卷積核個數應該取125。)

    然後,將最後一個3*3*512的卷積層和倒數第2個卷積層相連(提取細粒度特徵),最後在檢測數據集上fine-tuning預訓練模型160個epoch,學習率採用0.001,並且在第60和90個epoch的時候將學習率除以10,權值衰減、動量和數據增強方法與預訓練相同。

    YOLO9000通過結合分類和檢測數據集,使得訓練得到的模型可以檢測約9000類物體,利用帶標注的分類數據集量比較大的特點,解決了帶標注的檢測數據集量比較少的問題。具體方法是:一方面採用WordTree融合數據集,另一方面聯合訓練分類數據集和檢測數據集。

    分類數據集和檢測數據集存在較大差別:檢測數據集只有粗粒度的標記信息,如「貓」、「狗」,而分類數據集的標簽信息則更細粒度,更豐富。比如「狗」就包括「哈士奇」、「金毛狗」等等。所以如果想同時在檢測數據集與分類數據集上進行訓練,那麼就要用一種一致性的方法融合這些標簽信息。

    用於分類的方法,常用Softmax(比如v2),Softmax意味著分類的類別之間要互相獨立的,而ImageNet和COCO這兩種數據集之間的分類信息不相互獨立(ImageNet對應分類有9000種,而COCO僅提供80種目標檢測),所以使用一種多標簽模型來混合數據集,即假定一張圖片可以有多個標簽,並且不要求標簽之間獨立,而後進行Softmax分類。

    由於ImageNet的類別是從WordNet選取的,作者採用以下策略重建了一個樹形結構(稱為WordTree):

遍歷ImageNet的標簽,然後在WordNet中尋找該標簽到根節點(所有的根節點為實體對象)的路徑;

如果路徑只有一條,將該路徑直接加入到WordTree結構中;

否則,從可選路徑中選擇一條最短路徑,加入到WordTree結構中。

WordTree的作用就在於將兩種數據集按照層級進行結合。

    如此,在WordTree的某個節點上就可以計算該節點的一些條件概率值,比如在terrier這個節點,可以得到如下條件概率值:

    進而,如果要預測此節點的概率(即圖片中目標是Norfolk terrier的概率),可以根據WordTree將該節點到根節點的條件概率依次相乘得到,如下式:

其中:        

    YOLO9000在WordTree1k(用有1000類別的ImageNet1k創建)上訓練了Darknet-19模型。為了創建WordTree1k作者添加了很多中間節點(中間詞彙),把標簽由1000擴展到1369。

    訓練過程中GroundTruth標簽要順著向根節點的路徑傳播:為了計算條件概率,模型預測了一個包含1369個元素的向量,而且基於所有「同義詞集」計算Softmax,其中「同義詞集」是同一概念下的所屬詞。

    現在一張圖片是多標記的,標記之間不需要相互獨立。在訓練過程中,如果有一個圖片的標簽是「Norfolk terrier」,那麼這個圖片還會獲得「狗」以及「哺乳動物」等標簽。

    如上圖所示,之前的ImageNet分類是使用一個大Softmax進行分類,而現在WordTree只需要對同一概念下的同義詞進行Softmax分類。然後作者分別兩個數據集上用相同訓練方法訓練Darknet-19模型,最後在ImageNet數據集上的top-1准確率為72.9%,top-5准確率為91.2%;在WordTree數據集上的top-1准確率為71.9%,top-5准確率為90.4%。

    這種方法的好處是有「退而求其次」的餘地:在對未知或者新的物體進行分類時,性能損失更低,比如看到一個狗的照片,但不知道是哪種種類的狗,那麼就預測其為「狗」。

    以上是構造WordTree的原理,下圖是融合COCO數據集和ImageNet數據集以及生成它們的WordTree的示意圖(用顏色區分了COCO數據集和ImageNet數據集的標簽節點), 混合後的數據集對應的WordTree有9418個類。另一方面,由於ImageNet數據集太大,YOLO9000為了平衡兩個數據集之間的數據量,通過過采樣(Oversampling)COCO數據集中的數據,使COCO數據集與ImageNet數據集之間的數據量比例達到1:4。

    對YOLO9000進行評估,發現其mAP比DPM高,而且YOLO有更多先進的特徵,YOLO9000是用部分監督的方式在不同訓練集上進行訓練,同時還能檢測9000個物體類別,並保證實時運行。雖然YOLO9000對動物的識別性能很好,但是對衣服或者裝備的識別性能不是很好(這跟數據集的數據組成有關)。

    YOLO9000的網路結構和YOLOv2類似,區別是每個單元格只採用3個Anchor Boxes。

    YOLO9000提出了一種在分類數據集和檢測數據集上聯合訓練的機制,即使用檢測數據集(COCO)的圖片去學習檢測相關的信息即查找對象(例如預測邊界框坐標、邊界框是否包含目標及目標屬於各個類別的概率),使用僅有類別標簽的分類數據集(ImageNet)中的圖片去擴展檢測到的對象的可識別種類。

    具體方法是:當網路遇到一個來自檢測數據集的圖片與標記信息,就把這些數據用完整的損失函數(v2和9000均沿用了v1網路的損失函數)反向傳播,而當網路遇到一個來自分類數據集的圖片和分類標記信息,只用代表分類誤差部分的損失函數反向傳播這個圖片。

    YOLO v2 在大尺寸圖片上能夠實現高精度,在小尺寸圖片上運行更快,可以說在速度和精度上達到了平衡,具體性能表現如下所示。

coco數據集

voc2012數據集

Ⅲ 目標檢測演算法(R-CNN,fast R-CNN,faster R-CNN,yolo,SSD,yoloV2,yoloV3)

深度學習目前已經應用到了各個領域,應用場景大體分為三類:物體識別,目標檢測,自然語言處理。  目標檢測可以理解為是物體識別和物體定位的綜合 ,不僅僅要識別出物體屬於哪個分類,更重要的是得到物體在圖片中的具體位置。

2014年R-CNN演算法被提出,基本奠定了two-stage方式在目標檢測領域的應用。它的演算法結構如下圖

演算法步驟如下:

R-CNN較傳統的目標檢測演算法獲得了50%的性能提升,在使用VGG-16模型作為物體識別模型情況下,在voc2007數據集上可以取得66%的准確率,已經算還不錯的一個成績了。其最大的問題是速度很慢,內存佔用量很大,主要原因有兩個

針對R-CNN的部分問題,2015年微軟提出了Fast R-CNN演算法,它主要優化了兩個問題。

R-CNN和fast R-CNN均存在一個問題,那就是 由選擇性搜索來生成候選框,這個演算法很慢 。而且R-CNN中生成的2000個左右的候選框全部需要經過一次卷積神經網路,也就是需要經過2000次左右的CNN網路,這個是十分耗時的(fast R-CNN已經做了改進,只需要對整圖經過一次CNN網路)。這也是導致這兩個演算法檢測速度較慢的最主要原因。

faster R-CNN 針對這個問題, 提出了RPN網路來進行候選框的獲取,從而擺脫了選擇性搜索演算法,也只需要一次卷積層操作,從而大大提高了識別速度 。這個演算法十分復雜,我們會詳細分析。它的基本結構如下圖

主要分為四個步驟:

使用VGG-16卷積模型的網路結構:

卷積層採用的VGG-16模型,先將PxQ的原始圖片,縮放裁剪為MxN的圖片,然後經過13個conv-relu層,其中會穿插4個max-pooling層。所有的卷積的kernel都是3x3的,padding為1,stride為1。pooling層kernel為2x2, padding為0,stride為2。

MxN的圖片,經過卷積層後,變為了(M/16) x (N/16)的feature map了。

faster R-CNN拋棄了R-CNN中的選擇性搜索(selective search)方法,使用RPN層來生成候選框,能極大的提升候選框的生成速度。RPN層先經過3x3的卷積運算,然後分為兩路。一路用來判斷候選框是前景還是背景,它先reshape成一維向量,然後softmax來判斷是前景還是背景,然後reshape恢復為二維feature map。另一路用來確定候選框的位置,通過bounding box regression實現,後面再詳細講。兩路計算結束後,挑選出前景候選框(因為物體在前景中),並利用計算得到的候選框位置,得到我們感興趣的特徵子圖proposal。

卷積層提取原始圖像信息,得到了256個feature map,經過RPN層的3x3卷積後,仍然為256個feature map。但是每個點融合了周圍3x3的空間信息。對每個feature map上的一個點,生成k個anchor(k默認為9)。anchor分為前景和背景兩類(我們先不去管它具體是飛機還是汽車,只用區分它是前景還是背景即可)。anchor有[x,y,w,h]四個坐標偏移量,x,y表示中心點坐標,w和h表示寬度和高度。這樣,對於feature map上的每個點,就得到了k個大小形狀各不相同的選區region。

對於生成的anchors,我們首先要判斷它是前景還是背景。由於感興趣的物體位於前景中,故經過這一步之後,我們就可以舍棄背景anchors了。大部分的anchors都是屬於背景,故這一步可以篩選掉很多無用的anchor,從而減少全連接層的計算量。

對於經過了3x3的卷積後得到的256個feature map,先經過1x1的卷積,變換為18個feature map。然後reshape為一維向量,經過softmax判斷是前景還是背景。此處reshape的唯一作用就是讓數據可以進行softmax計算。然後輸出識別得到的前景anchors。

另一路用來確定候選框的位置,也就是anchors的[x,y,w,h]坐標值。如下圖所示,紅色代表我們當前的選區,綠色代表真實的選區。雖然我們當前的選取能夠大概框選出飛機,但離綠色的真實位置和形狀還是有很大差別,故需要對生成的anchors進行調整。這個過程我們稱為bounding box regression。

假設紅色框的坐標為[x,y,w,h], 綠色框,也就是目標框的坐標為[Gx, Gy,Gw,Gh], 我們要建立一個變換,使得[x,y,w,h]能夠變為[Gx, Gy,Gw,Gh]。最簡單的思路是,先做平移,使得中心點接近,然後進行縮放,使得w和h接近。如下:

我們要學習的就是dx dy dw dh這四個變換。由於是線性變換,我們可以用線性回歸來建模。設定loss和優化方法後,就可以利用深度學習進行訓練,並得到模型了。對於空間位置loss,我們一般採用均方差演算法,而不是交叉熵(交叉熵使用在分類預測中)。優化方法可以採用自適應梯度下降演算法Adam。

得到了前景anchors,並確定了他們的位置和形狀後,我們就可以輸出前景的特徵子圖proposal了。步驟如下:

1,得到前景anchors和他們的[x y w h]坐標。

2,按照anchors為前景的不同概率,從大到小排序,選取前pre_nms_topN個anchors,比如前6000個

3,剔除非常小的anchors。

4,通過NMS非極大值抑制,從anchors中找出置信度較高的。這個主要是為了解決選取交疊問題。首先計算每一個選區面積,然後根據他們在softmax中的score(也就是是否為前景的概率)進行排序,將score最大的選區放入隊列中。接下來,計算其餘選區與當前最大score選區的IOU(IOU為兩box交集面積除以兩box並集面積,它衡量了兩個box之間重疊程度)。去除IOU大於設定閾值的選區。這樣就解決了選區重疊問題。

5,選取前post_nms_topN個結果作為最終選區proposal進行輸出,比如300個。

經過這一步之後,物體定位應該就基本結束了,剩下的就是物體識別了。

和fast R-CNN中類似,這一層主要解決之前得到的proposal大小形狀各不相同,導致沒法做全連接。全連接計算只能對確定的shape進行運算,故必須使proposal大小形狀變為相同。通過裁剪和縮放的手段,可以解決這個問題,但會帶來信息丟失和圖片形變問題。我們使用ROI pooling可以有效的解決這個問題。

ROI pooling中,如果目標輸出為MxN,則在水平和豎直方向上,將輸入proposal劃分為MxN份,每一份取最大值,從而得到MxN的輸出特徵圖。

ROI Pooling層後的特徵圖,通過全連接層與softmax,就可以計算屬於哪個具體類別,比如人,狗,飛機,並可以得到cls_prob概率向量。同時再次利用bounding box regression精細調整proposal位置,得到bbox_pred,用於回歸更加精確的目標檢測框。

這樣就完成了faster R-CNN的整個過程了。演算法還是相當復雜的,對於每個細節需要反復理解。faster R-CNN使用resNet101模型作為卷積層,在voc2012數據集上可以達到83.8%的准確率,超過yolo ssd和yoloV2。其最大的問題是速度偏慢,每秒只能處理5幀,達不到實時性要求。

針對於two-stage目標檢測演算法普遍存在的運算速度慢的缺點, yolo創造性的提出了one-stage。也就是將物體分類和物體定位在一個步驟中完成。 yolo直接在輸出層回歸bounding box的位置和bounding box所屬類別,從而實現one-stage。通過這種方式, yolo可實現45幀每秒的運算速度,完全能滿足實時性要求 (達到24幀每秒,人眼就認為是連續的)。它的網路結構如下圖:

主要分為三個部分:卷積層,目標檢測層,NMS篩選層。

採用Google inceptionV1網路,對應到上圖中的第一個階段,共20層。這一層主要是進行特徵提取,從而提高模型泛化能力。但作者對inceptionV1進行了改造,他沒有使用inception mole結構,而是用一個1x1的卷積,並聯一個3x3的卷積來替代。(可以認為只使用了inception mole中的一個分支,應該是為了簡化網路結構)

先經過4個卷積層和2個全連接層,最後生成7x7x30的輸出。先經過4個卷積層的目的是為了提高模型泛化能力。yolo將一副448x448的原圖分割成了7x7個網格,每個網格要預測兩個bounding box的坐標(x,y,w,h)和box內包含物體的置信度confidence,以及物體屬於20類別中每一類的概率(yolo的訓練數據為voc2012,它是一個20分類的數據集)。所以一個網格對應的參數為(4x2+2+20) = 30。如下圖

其中前一項表示有無人工標記的物體落入了網格內,如果有則為1,否則為0。第二項代表bounding box和真實標記的box之間的重合度。它等於兩個box面積交集,除以面積並集。值越大則box越接近真實位置。

分類信息: yolo的目標訓練集為voc2012,它是一個20分類的目標檢測數據集 。常用目標檢測數據集如下表:

| Name | # Images (trainval) | # Classes | Last updated |

| --------------- | ------------------- | --------- | ------------ |

| ImageNet | 450k | 200 | 2015 |

| COCO | 120K | 90 | 2014 |

| Pascal VOC | 12k | 20 | 2012 |

| Oxford-IIIT Pet | 7K | 37 | 2012 |

| KITTI Vision | 7K | 3 | |

每個網格還需要預測它屬於20分類中每一個類別的概率。分類信息是針對每個網格的,而不是bounding box。故只需要20個,而不是40個。而confidence則是針對bounding box的,它只表示box內是否有物體,而不需要預測物體是20分類中的哪一個,故只需要2個參數。雖然分類信息和confidence都是概率,但表達含義完全不同。

篩選層是為了在多個結果中(多個bounding box)篩選出最合適的幾個,這個方法和faster R-CNN 中基本相同。都是先過濾掉score低於閾值的box,對剩下的box進行NMS非極大值抑制,去除掉重疊度比較高的box(NMS具體演算法可以回顧上面faster R-CNN小節)。這樣就得到了最終的最合適的幾個box和他們的類別。

yolo的損失函數包含三部分,位置誤差,confidence誤差,分類誤差。具體公式如下:

誤差均採用了均方差演算法,其實我認為,位置誤差應該採用均方差演算法,而分類誤差應該採用交叉熵。由於物體位置只有4個參數,而類別有20個參數,他們的累加和不同。如果賦予相同的權重,顯然不合理。故yolo中位置誤差權重為5,類別誤差權重為1。由於我們不是特別關心不包含物體的bounding box,故賦予不包含物體的box的置信度confidence誤差的權重為0.5,包含物體的權重則為1。

Faster R-CNN准確率mAP較高,漏檢率recall較低,但速度較慢。而yolo則相反,速度快,但准確率和漏檢率不盡人意。SSD綜合了他們的優缺點,對輸入300x300的圖像,在voc2007數據集上test,能夠達到58 幀每秒( Titan X 的 GPU ),72.1%的mAP。

SSD網路結構如下圖:

和yolo一樣,也分為三部分:卷積層,目標檢測層和NMS篩選層

SSD論文採用了VGG16的基礎網路,其實這也是幾乎所有目標檢測神經網路的慣用方法。先用一個CNN網路來提取特徵,然後再進行後續的目標定位和目標分類識別。

這一層由5個卷積層和一個平均池化層組成。去掉了最後的全連接層。SSD認為目標檢測中的物體,只與周圍信息相關,它的感受野不是全局的,故沒必要也不應該做全連接。SSD的特點如下。

每一個卷積層,都會輸出不同大小感受野的feature map。在這些不同尺度的feature map上,進行目標位置和類別的訓練和預測,從而達到 多尺度檢測 的目的,可以克服yolo對於寬高比不常見的物體,識別准確率較低的問題。而yolo中,只在最後一個卷積層上做目標位置和類別的訓練和預測。這是SSD相對於yolo能提高准確率的一個關鍵所在。

如上所示,在每個卷積層上都會進行目標檢測和分類,最後由NMS進行篩選,輸出最終的結果。多尺度feature map上做目標檢測,就相當於多了很多寬高比例的bounding box,可以大大提高泛化能力。

和faster R-CNN相似,SSD也提出了anchor的概念。卷積輸出的feature map,每個點對應為原圖的一個區域的中心點。以這個點為中心,構造出6個寬高比例不同,大小不同的anchor(SSD中稱為default box)。每個anchor對應4個位置參數(x,y,w,h)和21個類別概率(voc訓練集為20分類問題,在加上anchor是否為背景,共21分類)。如下圖所示:

另外,在訓練階段,SSD將正負樣本比例定位1:3。訓練集給定了輸入圖像以及每個物體的真實區域(ground true box),將default box和真實box最接近的選為正樣本。然後在剩下的default box中選擇任意一個與真實box IOU大於0.5的,作為正樣本。而其他的則作為負樣本。由於絕大部分的box為負樣本,會導致正負失衡,故根據每個box類別概率排序,使正負比例保持在1:3。SSD認為這個策略提高了4%的准確率

另外,SSD採用了數據增強。生成與目標物體真實box間IOU為0.1 0.3 0.5 0.7 0.9的patch,隨機選取這些patch參與訓練,並對他們進行隨機水平翻轉等操作。SSD認為這個策略提高了8.8%的准確率。

和yolo的篩選層基本一致,同樣先過濾掉類別概率低於閾值的default box,再採用NMS非極大值抑制,篩掉重疊度較高的。只不過SSD綜合了各個不同feature map上的目標檢測輸出的default box。

SSD基本已經可以滿足我們手機端上實時物體檢測需求了,TensorFlow在Android上的目標檢測官方模型ssd_mobilenet_v1_android_export.pb,就是通過SSD演算法實現的。它的基礎卷積網路採用的是mobileNet,適合在終端上部署和運行。

針對yolo准確率不高,容易漏檢,對長寬比不常見物體效果差等問題,結合SSD的特點,提出了yoloV2。它主要還是採用了yolo的網路結構,在其基礎上做了一些優化和改進,如下

網路採用DarkNet-19:19層,裡麵包含了大量3x3卷積,同時借鑒inceptionV1,加入1x1卷積核全局平均池化層。結構如下

yolo和yoloV2隻能識別20類物體,為了優化這個問題,提出了yolo9000,可以識別9000類物體。它在yoloV2基礎上,進行了imageNet和coco的聯合訓練。這種方式充分利用imageNet可以識別1000類物體和coco可以進行目標位置檢測的優點。當使用imageNet訓練時,只更新物體分類相關的參數。而使用coco時,則更新全部所有參數。

YOLOv3可以說出來直接吊打一切圖像檢測演算法。比同期的DSSD(反卷積SSD), FPN(feature pyramid networks)准確率更高或相仿,速度是其1/3.。

YOLOv3的改動主要有如下幾點:

不過如果要求更精準的預測邊框,採用COCO AP做評估標準的話,YOLO3在精確率上的表現就弱了一些。如下圖所示。

當前目標檢測模型演算法也是層出不窮。在two-stage領域, 2017年Facebook提出了mask R-CNN 。CMU也提出了A-Fast-RCNN 演算法,將對抗學習引入到目標檢測領域。Face++也提出了Light-Head R-CNN,主要探討了 R-CNN 如何在物體檢測中平衡精確度和速度。

one-stage領域也是百花齊放,2017年首爾大學提出 R-SSD 演算法,主要解決小尺寸物體檢測效果差的問題。清華大學提出了 RON 演算法,結合 two stage 名的方法和 one stage 方法的優勢,更加關注多尺度對象定位和負空間樣本挖掘問題。

目標檢測領域的深度學習演算法,需要進行目標定位和物體識別,演算法相對來說還是很復雜的。當前各種新演算法也是層不出窮,但模型之間有很強的延續性,大部分模型演算法都是借鑒了前人的思想,站在巨人的肩膀上。我們需要知道經典模型的特點,這些tricks是為了解決什麼問題,以及為什麼解決了這些問題。這樣才能舉一反三,萬變不離其宗。綜合下來,目標檢測領域主要的難點如下:

一文讀懂目標檢測AI演算法:R-CNN,faster R-CNN,yolo,SSD,yoloV2

從YOLOv1到v3的進化之路

SSD-Tensorflow超詳細解析【一】:載入模型對圖片進行測試  https://blog.csdn.net/k87974/article/details/80606407

YOLO    https://pjreddie.com/darknet/yolo/      https://github.com/pjreddie/darknet   

C#項目參考:https://github.com/AlturosDestinations/Alturos.Yolo

項目實踐貼個圖。

Ⅳ Android | 他山之石,可以攻玉!一篇文章看懂 v1/v2/v3 簽名機制

這篇文章的內容會涉及以下前置 / 相關知識,貼心的我都幫你准備好了,請享用~

數字簽名(Digital Signature)也叫作數字指紋(Digital Fingerprint),它是消息摘要演算法和非對稱加密演算法的結合體,能夠驗證數據的完整性,並且認證數據的來源

數據簽名演算法的模型分為兩個主要階段:

需要注意的是,Android 目前不對應用證書進行 CA 認證,應用可以由第三方(OEM、運營商、其他應用市場)簽名,也可以自行簽名。

應用 APK 其實是一種特殊的 Zip 壓縮包,無法避免惡意破解者解壓 / 反編譯修改內容,針對這個問題有何解決方案呢?他山之石,可以攻玉 ——數字簽名演算法。應用簽名正是數字簽名演算法的應用場景之一,與其他應用場景類似,目的無非是:

Android 平台上運行的每個應用都必須有開發者的簽名。在慧喚安裝應用時,軟體包管理器會驗證 APK 是否已經過適當簽名,安裝程序會拒絕沒有獲得簽名就嘗試安裝的應用。

軟體包管理器在安裝應用前會驗證應用摘要,如果破解者修改了 apk 里的內容,那麼摘要就不再匹配,驗證失敗(驗證流程見下文方案)。

截止至 Android 11,Android 支持以下三種應用簽名方案:

為了提高兼容性,必須按照 v1、v2、v3 的先後順序採用簽名方案,低版本平台會忽略高版本的簽名方案在 APK 中添加的額外數據。

v1 簽名方案是基於 Jar 的簽名。

首先,我們先來分析其簽名產物。 v1 簽名後會增加 META-INF 文件夾 ,其中會有如下三個文件。考慮到使用不同的證書和簽名方式,得到的文件名可能不同,因此你只要留意文件的後綴即可:

v1 簽名流程如下:

MANIFEST.MF(Message Digest File,摘要文件)

*.SF(Signature File,簽名文件)

驗證流程可以分為驗證簽名和驗證完整性兩個步驟:

驗證簽名步驟:

如果上述簽名驗證結果正確,才會驗證完整性:

以上任何步驟驗證失敗,則整個 APK 驗證失敗。

為了解決這些問題,Android 7.0 中引入了 APK 簽名方案 v2。

v2 簽名方案是一種 全文件簽名方案 ,該方案能夠發現對 APK 的受保護部分進行的所有更改,相對於 v1 簽名方案驗證速度更快,完整性覆蓋范圍更廣。

在分析 v2 簽名方案之前,我們先簡單了解一下 Zip 文件格式:

首先,我們先來分析其簽名產物。v2 簽名後會在 「條目內容區」和「中央目錄區」之間插入「APK 簽名分塊(APK Signing Block)」

從左到右邊,我們定義為區塊 1~4。

相對與 v1 簽名方案,v2 簽名方案不再以文件為單位計算摘要了,而敬坦是以 1 MB 為單位將文件拆分為多個連續的塊(chunk),每個分區的最後一個塊可能會小於 1 MB。

v2 簽亮碧桐名流程如下:

驗證流程可以分為驗證簽名和驗證完整性兩個步驟:

簽名方案 v3 支持密鑰輪換,應用能夠在 APK 更新過程中更改其簽名密鑰。

【累了,後面先不寫了...】

這一節,我們介紹基於 Android 應用簽名機制的衍生應用場景。

在 v1 方案中, MANIFEST.MF *.SF 這兩個文件會記錄大量的文件名和文件摘要。如果 apk 中文件數很多,而且文件名很長,那麼這兩個文件會變得很大。使用 AndResGuard 工具,可以將文件名轉換為短路徑文件名,從而減少這兩個文件的大小。

在實際生產中,往往需要生成多個渠道的 APK 包,傳統的方法是使用 APKTool 逆向工具、Flavor + BuildType 等方案,這一類多渠道打包方案的缺點是耗時嚴重。隨著 Android 應用簽名方案的演進,演變出了不同的多渠道打包方案:

在 v1 方案中,我們提到了完整性校驗不覆蓋到 META-INF 文件夾的問題。有些多渠道打包方案就是利用了這個問題,在 META-INF 文件夾下添加空文件, 用空文件的名稱來作為渠道的唯一標識 ,就可以節省打包的時間,提高打渠道包的速度。

除了添加空文件的方法,還可以向 APK 添加 Zip Comment 來生成多渠道包(APK 本身就是特殊的 Zip 包)。

在 v2 簽名方案中,幾乎整個 APK 都納入保護范圍,如果向 APK 添加空文件或 Zip Comment 的話,在安裝時會報以下錯誤:

新背景下的多渠道打包方案,則是利用了 APK 簽名分塊(區塊 2)不受保護 & 欄位可擴展的特點 ,向區塊中添加多渠道信息(ID-Value),例如 美團多渠道打包方案 Walle 。

閱讀全文

與v2演算法相關的資料

熱點內容
dvd光碟存儲漢子演算法 瀏覽:757
蘋果郵件無法連接伺服器地址 瀏覽:963
phpffmpeg轉碼 瀏覽:671
長沙好玩的解壓項目 瀏覽:145
專屬學情分析報告是什麼app 瀏覽:564
php工程部署 瀏覽:833
android全屏透明 瀏覽:737
阿里雲伺服器已開通怎麼辦 瀏覽:803
光遇為什麼登錄時伺服器已滿 瀏覽:302
PDF分析 瀏覽:485
h3c光纖全工半全工設置命令 瀏覽:143
公司法pdf下載 瀏覽:382
linuxmarkdown 瀏覽:350
華為手機怎麼多選文件夾 瀏覽:683
如何取消命令方塊指令 瀏覽:350
風翼app為什麼進不去了 瀏覽:778
im4java壓縮圖片 瀏覽:362
數據查詢網站源碼 瀏覽:150
伊克塞爾文檔怎麼進行加密 瀏覽:892
app轉賬是什麼 瀏覽:163