YOLOv8模型剪枝筆記(DepGraph和Network Slimming網絡瘦身)

文章目錄

    • 一、DepGraph剪枝
      • (1)項目準備
        • 1)剪枝基礎知識
        • 2)DepGraph剪枝論文解讀1
        • 2)DepGraph剪枝論文解讀2
        • 3)YOLO目標檢測系列發展史
        • 4)YOLO網絡架構
      • (2)項目實戰(YOLOv8應用DepGraph剪枝+finetune)
        • 1)安裝軟件環境(基礎環境、Pytorch、YOLOv8)Windows
        • 1)安裝軟件環境(基礎環境、Pytorch、YOLOv8)Linux(略)
        • 2)準備數據集和修改配置(YOLO版本8.1033)
        • 3)訓練數據集、測試訓練的網絡測試和性能評估
        • 4)DepGraph剪枝訓練YOLOv8
        • 5)剪枝訓練后網絡測試和性能評估
      • (3)代碼解析
        • 1)Torch Pruning工具包介紹(安裝、普通剪枝示例、掃描分組、根據通道剪枝的高級剪枝器、全局剪枝、依賴圖中不必要的權重更新的稀疏訓練、交互式剪枝、)
        • 2)yolov8_pruning腳本代碼解析(代碼針對yolov8 8.1.33)
        • 3)額外代碼注釋補充:
    • 二、Network Slimming剪枝
      • (1)項目準備
        • 1)Network Slimming剪枝原理
        • 2)YOLO目標檢測系列發展史
        • 3)YOLOv8網絡架構
      • (2)項目實戰
        • 1)安裝基礎環境、安裝Pytorch、安裝YOLOv8
        • 2)準備數據集、修改配置文件、訓練數據集
        • 3)測試訓練處的網絡和性能統計
        • 4)稀疏化訓練
        • 5)網絡剪枝
        • 6)剪枝后微調
      • (3)代碼解析
        • 1)修改代碼文件解析
        • 2)新增代碼文件解析

一、DepGraph剪枝

(1)項目準備

  • 基礎知識背景
    ①稀疏:在模型剪枝(Model Pruning)中,稀疏表示(Sparsity)是指通過某種方式使模型的參數或結構中出現大量的零值(或接近零的值),從而讓模型的表示變得 “稀疏”
    ②為什么要剪枝而不是去訓練小網絡:因為彩票事件效應,去小網絡是很難學習成功的
    彩票效應:大模型有很多小網絡,如果有一個子網絡訓練成功則可以看做大模型訓練成功
    在這里插入圖片描述
    在這里插入圖片描述
    把模型隨機初始化后訓練,剪枝后如果再次隨機初始化權重是很難訓練成功的,但是如果用原先第一次隨機初始化的權重訓練的話就成功,這就說明中獎了
1)剪枝基礎知識

之前我有寫過博客
CUDA與TensorRT學習四:模型部署基礎知識、模型部署的幾大誤區、模型量化、模型剪枝、層融合

①剪枝分類
在這里插入圖片描述
②粗粒度剪枝和細粒度剪枝對比
粗粒度
在這里插入圖片描述

在這里插入圖片描述
細粒度剪枝在這里插入圖片描述

在這里插入圖片描述
③基礎知識
1)神經網絡通常都是過度參數化,權重數很多都是多余的
2)剪枝顆粒度
(1)權重剪枝
權重剪枝,剪枝之后就變成非規則,缺點是難以實現,難以加速
在這里插入圖片描述
(2)神經元剪枝
在這里插入圖片描述

  • 補充
    還有不同顆粒度剪枝
    在這里插入圖片描述
    )element wise包括了權重和神經元剪枝,可能會導致非結構化剪枝,得不到GPU加速
    )其他四個是結構化剪枝,能得到GPU加速是研究重點

在這里插入圖片描述
channel:通道剪枝
filter:濾波器剪枝
shape:若干個高度和寬度的神經元剪枝
depth:某個深度方向的神經元都剪枝掉

2)DepGraph剪枝論文解讀1

①論文截圖
在這里插入圖片描述

②網絡架構中可按照不同層數分配在各個組中,按組來剪枝(同一組有依賴關系
在這里插入圖片描述
如圖所示 CNNS、Transformer、RNNs、 GNNs都可以剪枝。在圖中如果剪枝了CNNs的Con v2,那就必須刪除同組中的{ Conv1、BN1、 BN2} ,從而引入了依賴圖,明確依賴圖來自動化剪枝

算法核心:利用相鄰層的局部依賴關系,遞歸地推導出需要的分組矩陣G
在這里插入圖片描述
如下圖,a是非結構化剪枝僅僅關注了權重的重要性,b學習結構稀疏層,但是w比w‘耦合權重更多是不稀疏的,也不考慮剪枝掉,唯有c組是學習組的一致結構稀疏,表示的是要剪枝掉的組里面w和w’都是稀疏的

在這里插入圖片描述

④相關工具:基于DepGraph算法,作者開發Pytorch結構化剪枝框架Torch-Pruning,與torch.nn.utils.prune最大的差別在于:它會物理地移除參數,同時自動裁剪其他依賴層,而后者只能把參數置為0
④DepGraph剪枝+fine效果展示:
在這里插入圖片描述
可以看到橫軸往右隨著剪枝越多,計算量MACs越低,pruned mAP掉點越跳躍,而fine-tune后的模型精度基本變化不大

1)MACs
MACs(Multiply - Accumulate Operations,乘累加操作次數 )代表計算量。它用于衡量模型在推理過程中執行乘法和累加操作的總數,是評估模型計算復雜度的重要指標
2)pruned mAP
表示剪枝后的模型精度
3)recovered mAP
剪枝后的模型微調后的精度
2)DepGraph剪枝論文解讀2

(1)問題點-現有的剪枝存在問題:算法實現和網絡結構強綁定,需要為不同模型分別開發專用且復雜的剪枝程序
在這里插入圖片描述

(2)解決方法-依賴圖:自動方式去分組
在這里插入圖片描述

(3)原理解析:利用相鄰層的局部關系遞歸式分組

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

3)YOLO目標檢測系列發展史

①重大分水嶺在2012年,2012年之前是傳統檢測方法,2012年后是基于深度學習檢測方法
②2012年后有兩種發展方式:單階段檢測、雙階段檢測,兩者區別是雙階段檢測器提出了候選框階段然后得出物體的預測框
③單階段檢測框:yolo、SSD、Retina-Net,雙階段檢測框:RCNN、SPPNet、Fast RCNN、Faster RCNN、Pyramid Networks
在這里插入圖片描述
④yolo發展
在這里插入圖片描述

4)YOLO網絡架構
  • 網絡架構簡圖
    在這里插入圖片描述
    ①input:輸入圖片
    ②Backbone:骨干網絡,深度學習的神經網絡
    ③由于沒有候選框,所以單階段檢測有密集的預測,而多階段檢測有候選框所以是稀疏的預測

在這里插入圖片描述
④proposal-free表示沒有候選框
⑤yolo主要思想:分框對落入其中的目標進行檢測,一次性預測所有格子所含目標的邊界框、定位置信度、以及所有類別概率向量
在這里插入圖片描述
Non-max suppression:NMS,非極大抑制,比較多個預測框的IOU
在這里插入圖片描述

⑥yolo基礎思想:
1、劃分網格
2、通過網格得到物體的邊界框 bounding boxes+置信度得分 confidence + class probility map類別概率圖
3、最終的檢測結果
4、以下圖的B表示有多少尺度邊界框的預測,現在再看是有三個尺度的邊界框,然后用FPN多尺度的融合劃分預測(13x13\26x26\52x52)

在這里插入圖片描述

在這里插入圖片描述
5、Anchor錨框機制:預先設置邊界框的大小,每個尺度上都可以有若干個Anchor(下圖每種顏色有三個錨框)

在這里插入圖片描述
6、不同anchor對比
在這里插入圖片描述
在這里插入圖片描述

(2)項目實戰(YOLOv8應用DepGraph剪枝+finetune)

1)安裝軟件環境(基礎環境、Pytorch、YOLOv8)Windows

①準備基礎環境

基礎環境
1)windows 10
2)cuda 11.8
3)cudnn 8.9
4)vs 2022
5)下載安裝顯卡驅動

2)下載cuda 11.8
在這里插入圖片描述
在這里插入圖片描述
安裝cuda
在這里插入圖片描述
在這里插入圖片描述
3)cudnn 8.9 下載
在這里插入圖片描述
在這里插入圖片描述
安裝cudnn
在這里插入圖片描述
cuda安裝測試
在這里插入圖片描述
在這里插入圖片描述

4)vs 2022安裝
在這里插入圖片描述
5)下載安裝顯卡驅動

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

②安裝PyTorch
這里是用的Anaconda進行安裝

1)安裝Anaconda
2)安裝pytorch

1)安裝Anaconda

在這里插入圖片描述
2)安裝pytorch
在這里插入圖片描述
在環境下面安裝pytorch
在這里插入圖片描述
再安裝cudnn
在這里插入圖片描述

③克隆和安裝YOLOv8

1)克隆yolov8并安裝
2)下載yolov8預訓練權重文件
3)安全測速

1)克隆yolov8并安裝
先安裝git
在這里插入圖片描述
安裝git后克隆yolov8項目
在這里插入圖片描述
2)下載yolov8預訓練權重文件

在這里插入圖片描述
這里選用的yolov8s,這里使用的訓練集是coco,下圖是coco數據集上性能的表現
在這里插入圖片描述

3)安全測速
在這里插入圖片描述
單次預測圖片
在這里插入圖片描述
打開文件夾
在這里插入圖片描述
可以看到檢測圖片

在這里插入圖片描述

攝像頭實時動態預測:
在這里插入圖片描述
在這里插入圖片描述

預測文本的結果:命令如下
在這里插入圖片描述
最左邊:類別的編號–5是bug,0是person
后面四位小數:預測物體在圖片上的位置(進行了歸一化所以是小數)
在這里插入圖片描述

1)安裝軟件環境(基礎環境、Pytorch、YOLOv8)Linux(略)

①準備基礎環境
②安裝PyTorch
③克隆和安裝YOLOv8

2)準備數據集和修改配置(YOLO版本8.1033)

在這里插入圖片描述
①進入ultraiyics解壓目錄輸入 ,安裝好后進入上面安裝測試的步驟

pip install -e .

在這里插入圖片描述

①testfile下面的圖片是測試圖片
②VOC2007下面是圖片和圖片對應的標注信息和圖片信息

在這里插入圖片描述
執行這個腳本是劃分數據集和驗證集
TRAIN_RATIO表示80%劃分到訓練集,20%驗證集

在這里插入圖片描述

4)修改配置文件
在這里插入圖片描述
①這里的目錄images是相對路徑,相當于vocdevkit目錄下
②name下面是類別的名稱

3)訓練數據集、測試訓練的網絡測試和性能評估

1)訓練數據集命令(利用預訓練的權重來在自己的數據集上進行訓練,也可稱為微調)
在這里插入圖片描述
斷點續訓練:因斷電或其他原因導致的中斷訓練,可以接著訓練
在這里插入圖片描述

在這里插入圖片描述
訓練結果(train是訓練中的變化,val是驗證中的變化,metric是訓練中的指標)
在這里插入圖片描述
2)訓練結果查看

在這里插入圖片描述

  • 測試訓練出的網絡模型
    在這里插入圖片描述
    性能統計
    在這里插入圖片描述

conf:置信度閾值
iou:非極大抑制閾值

4)DepGraph剪枝訓練YOLOv8

在這里插入圖片描述
+參數說明
在這里插入圖片描述
觸發掉點20%才會終止迭代

  • 訓練后 ultralytics/runs/detect文件夾下
    在這里插入圖片描述
  • 結果
    在這里插入圖片描述
5)剪枝訓練后網絡測試和性能評估

在這里插入圖片描述

  • 驗證安裝onnx-runtime
    在這里插入圖片描述

  • 注意
    非pytorch模型,batch在檢測性能的時候會變成1
    在這里插入圖片描述

  • 性能評估
    ①可以看到剪枝后mAP50為0.966,mAP(50~95)為0.775
    ②微調后的數據mAP50為0.985,mAP(50~95)為0.821,明顯是比只剪枝精度高的
    在這里插入圖片描述
    ③可以從圖中看到,在剪枝比例50%附近掉點事最嚴重的,但是經過微調也能恢復到與剛開始mAP差不多的精度
    在這里插入圖片描述
    ④linux下在做對比
    在這里插入圖片描述

1)從圖片可以看到只剪枝后對比只微調精度在mAP指標上有下降,從0.983下降到0.879大概掉點11%
2)接下來的步驟是先剪枝,結果保存在step_0_pre_val
3)再繼續進行30個epoch的微調(可以30以上的epoch效果會更好),再查看精度(在最好的權重文件best.pt里面),結果保存在step_post_val
在這里插入圖片描述

4)再做一次pruning剪枝,然后在做30個epoch的微調

在這里插入圖片描述

可以看到再次微調后mAP只跌到0.78,而mAP(50~95)還是0.96附近
在這里插入圖片描述
5)打開結果可以看到第二次剪枝后微調,mAP50在30個epoch后還在持續上升
在這里插入圖片描述

(3)代碼解析

1)Torch Pruning工具包介紹(安裝、普通剪枝示例、掃描分組、根據通道剪枝的高級剪枝器、全局剪枝、依賴圖中不必要的權重更新的稀疏訓練、交互式剪枝、)

①可以給很多網絡剪枝
在這里插入圖片描述
②安裝步驟
在這里插入圖片描述
③演示DepGraph進行基本修剪流程,目標層是resnet.conv1,找出與conv1分為同一組的其他層,統一剪枝
在這里插入圖片描述
④掃描模型所有的分組
在這里插入圖片描述
⑤高級剪枝器:通過指定所需的通道修剪比例,修剪器將掃描所有可修剪的組并預估重要性從而修剪整個模型,并使用自己的訓練代碼進行微調
代碼備注:分類層別剪枝,分類層是跟類別數相關的
在這里插入圖片描述
在這里插入圖片描述
⑥全局剪枝:根據各層的全局重要性分配自適應稀疏性,但會存在過度剪枝風險
在這里插入圖片描述
⑦稀疏訓練:減少依賴圖中不必要的權重更新
在這里插入圖片描述
⑧交互類剪枝:要求了解那些層可以拿來剪枝,要求非常了解網絡架構

在這里插入圖片描述
⑨軟剪枝:將參數歸零而不是移除
在這里插入圖片描述

⑩組級剪枝
在這里插入圖片描述
十一、低級剪枝功能:指定那些層來剪枝

在這里插入圖片描述

2)yolov8_pruning腳本代碼解析(代碼針對yolov8 8.1.33)
  • 主體思想
    函數中使用了 torch-pruning(tp)庫進行剪枝操作,通過 GroupNormPruner 對象基于 L2 范數的重要性對模型的卷積層進行剪枝。剪枝后,通過微調訓練來恢復模型的性能。在每次迭代中,函數記錄了剪枝前后的 MACs、參數數量和 mAP,并繪制性能圖表,以便觀察剪枝對模型性能的影響。如果 mAP 下降超過指定閾值,函數會提前停止剪枝過程。最后,函數將剪枝后的模型導出為 ONNX 格式,并將最終的剪枝和微調后的模型保存為 .pt 文件,以便后續使用。

  • 注意點
    需要注意的是,該函數依賴于其他函數和類,如 train_v2 、 replace_c2f_with_c2f_v2 、initialize_weights 等,以及 torch-pruning 庫的相關功能。

  • 代碼步驟
    ①main函數設置讀取配置規則:
    ②進行多次迭代的剪枝和微調:
    ③將剪枝后的模型導出為 ONNX 格式
    ④將最終的剪枝和微調后的模型保存為 .pt 文件

  • 具體
    ①main函數設置讀取配置規則:
    創建一個 argparse.ArgumentParser 對象 parser ,用于定義和解析命令行參數

if __name__ == "__main__":parser = argparse.ArgumentParser()parser.add_argument('--model', default='D:/ultralytics/runs/detect/train/weights/best.pt', help='Pretrained pruning target model file')parser.add_argument('--cfg', default='default.yaml',help='Pruning config file.'' This file should have same format with ultralytics/ultralytics/cfg/default.yaml')parser.add_argument('--iterative-steps', default=16, type=int, help='Total pruning iteration step')parser.add_argument('--target-prune-rate', default=0.5, type=float, help='Target pruning rate')parser.add_argument('--max-map-drop', default=0.2, type=float, help='Allowed maximum map drop after fine-tuning')parser.add_argument('--data', type=str, default='VOC-ball.yaml',help='Path to the dataset configuration file')parser.add_argument('--epochs', type=int, default=30, help='Number of epochs for fine-tuning each pruning iteration step')args = parser.parse_args()prune(args)

這段代碼是一個 Python 腳本的主程序部分,它使用 argparse 模塊來解析命令行參數,并調用 prune 函數來
執行模型剪枝。
參數解釋如下:
在這里插入圖片描述
-》調用 parser.parse_args() 方法解析命令行參數,并將解析結果存儲在 args 變量中
-》調用 prune 函數,并將 args 作為參數傳遞給該函數,開始執行模型剪枝過程
-》當用戶在命令行中運行該腳本時,可以使用以下格式指定參數:

python yolov8_pruning.py --model last.pt --cfg default.yaml --iterative-steps 16 --
target-prune-rate 0.5 --max-map-drop 0.2 --data VOC-ball.yaml --epochs 30

②進行多次迭代的剪枝和微調:

for i in range(args

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

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

相關文章

MySQL:11_事務

事務 一.CURD不加控制,會有什么問題? 二.什么是事務? 事務就是一組DML語句組成,這些語句在邏輯上存在相關性,這一組DML語句要么全部成功,要么全部失敗,是一個整體。MySQL提供一種機制&#xf…

【notepad++如何設置成中文界面呢?】

“Notepad”是一款非常強大的文本編輯軟件,將其界面設置成中文的方法如下: 一、工具/原料: 華為 Matebook 15、Windows 10、Notepad 8.4.6。 二 、具體步驟: 1、找到任意一個文本文件,比如 txt 格式的文…

職坐標嵌入式MCU/DSP與RTOS開發精講

嵌入式系統開發作為現代智能設備與工業控制的核心技術領域,其架構設計與實現邏輯直接影響系統性能與可靠性。本課程以嵌入式系統架構為切入點,系統化梳理從硬件選型到軟件調度的全鏈路知識體系,重點聚焦微控制器(MCU)與…

雙深度Q網絡(Double DQN)基礎解析與python實例:訓練穩定倒立擺

目錄 1. 前言 2. Double DQN的核心思想 3. Double DQN 實例:倒立擺 4. Double DQN的關鍵改進點 5. 雙重網絡更新策略 6. 總結 1. 前言 在強化學習領域,深度Q網絡(DQN)開啟了利用深度學習解決復雜決策問題的新篇章。然而&am…

使用KubeKey快速部署k8s v1.31.8集群

實戰環境涉及軟件版本信息: 使用kubekey部署k8s 1. 操作系統基礎配置 設置主機名、DNS解析、時鐘同步、防火墻關閉、ssh免密登錄等等系統基本設置 dnf install -y curl socat conntrack ebtables ipset ipvsadm 2. 安裝部署 K8s 2.1 下載 KubeKey ###地址 https…

SQL:窗口函數(Window Functions)

目錄 什么是窗口函數? 基本語法結構 為什么要用窗口函數? 常見的窗口函數分類 1?? 排名類函數 2?? 聚合類函數(不影響原始行) 3?? 值訪問函數 窗口范圍說明(ROWS / RANGE) 什么是窗口函數&a…

相機內參 opencv

視場角定相機內參 import numpy as np import cv2 import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3Ddef calculate_camera_intrinsics(image_width640, image_height480, fov55, is_horizontalTrue):"""計算相機內參矩陣參數:image_w…

MATLAB 各個工具箱 功能說明

? 想必大家在安裝MATLAB時,或多或少會疑惑應該安裝哪些工具箱。筆者遇到了兩種情況——只安裝了MATLAB主程序,老師讓用MATLAB的時候卻發現沒有安裝對應安裝包;第二次安裝學聰明了,全選安裝,嗯……占用了20多個G。 ?…

學習日記-day14-5.23

完成目標: 學習java下半段課程 知識點: 1.多態轉型 知識點 核心內容 重點 多態轉型 向上轉型(父類引用指向子類對象) 與向下轉型(強制類型轉換)的機制與區別 向上轉型自動完成,向下轉型需…

【編程語言】【Java】一篇文章學習java,復習完善知識體系

第一章 Java基礎 1.1 變量與數據類型 1.1.1 基本數據類型 1.1.1.1 整數類型(byte、short、int、long) 在 Java 中,整數類型用于表示沒有小數部分的數字,不同的整數類型有不同的取值范圍和占用的存儲空間: byte&am…

匯量科技前端面試題及參考答案

數組去重的方法有哪些? 在 JavaScript 中,數組去重是一個常見的操作,有多種方法可以實現這一目標。每種方法都有其適用場景和性能特點,下面將詳細介紹幾種主要的去重方法。 使用 Set 數據結構 Set 是 ES6 引入的一種新數據結構&a…

Git實戰演練,模擬日常使用,快速掌握命令

01 引言 上一期借助Idea,完成了Git倉庫的建立、配置、代碼提交等操作,初步入門了Git的使用。然而日常開發中經常面臨各種各樣的問題,入門級的命令遠遠不夠使用。 這一期,我們將展開介紹Git的日常處理命令,解決日常問…

wordpress主題開發中常用的12個模板文件

在WordPress主題開發中,有多種常用的模板文件,它們負責控制網站不同部分的顯示內容和布局,以下是一些常見的模板文件: 1.index.php 這是WordPress主題的核心模板文件。當沒有其他更具體的模板文件匹配當前頁面時,Wor…

數據庫blog5_數據庫軟件架構介紹(以Mysql為例)

🌿軟件的架構 🍂分類 軟件架構總結為兩種主要類型:一體式架構和分布式架構 ● 一體化架構 一體式架構是一種將所有功能集成到一個單一的、不可分割的應用程序中的架構模式。這種架構通常是一個大型的、復雜的單一應用程序,包含所…

離線服務器算法部署環境配置

本文將詳細記錄我如何為一臺全新的離線服務器配置必要的運行環境,包括基礎編譯工具、NVIDIA顯卡驅動以及NVIDIA-Docker,以便順利部署深度學習算法。 前提條件: 目標離線服務器已安裝操作系統(本文以Ubuntu 18.04為例&#xff09…

chromedp -—— 基于 go 的自動化操作瀏覽器庫

chromedp chromedp 是一個用于 Chrome 瀏覽器的自動化測試工具,基于 Go 語言開發,專門用于控制和操作 Chrome 瀏覽器實例。 chromedp 安裝 go get -u github.com/chromedp/chromedp基于chromedp 實現的的簡易學習通刷課系統 目前實現的功能&#xff…

高級特性實戰:死信隊列、延遲隊列與優先級隊列(三)

四、優先級隊列:優先處理重要任務 4.1 優先級隊列概念解析 優先級隊列(Priority Queue)是一種特殊的隊列數據結構,它與普通隊列的主要區別在于,普通隊列遵循先進先出(FIFO)的原則,…

python打卡day34

GPU訓練及類的call方法 知識點回歸: CPU性能的查看:看架構代際、核心數、線程數GPU性能的查看:看顯存、看級別、看架構代際GPU訓練的方法:數據和模型移動到GPU device上類的call方法:為什么定義前向傳播時可以直接寫作…

Newtonsoft Json序列化數據不序列化默認數據

問題描述 數據在序列號為json時,一些默認值也序列化了,像旋轉rot都是0、縮放scal都是1,這樣的默認值完全可以去掉,減少和服務器通信數據量 核心代碼 數據結構字段增加[DefaultValue(1.0)]屬性,縮放的默認值為1 public class Vec3DataOne{[DefaultValue(1.0)] public flo…

可增添功能的鼠標右鍵優化工具

軟件介紹 本文介紹一款能優化Windows電腦的軟件,它可以讓鼠標右鍵菜單添加多種功能。 軟件基本信息 這款名為Easy Context Menu的鼠標右鍵菜單工具非常小巧,軟件大小僅1.14MB,打開即可直接使用,無需進行安裝。 添加功能列舉 它…