原文鏈接:
1、?詳解YOLOv8網絡結構/環境搭建/數據集獲取/訓練/推理/驗證/導出
2、Yolov8的詳解與實戰
3、YOLOV8模型訓練+部署(實戰)()有具體部署和訓練實現代碼YOLOV8模型訓練+部署(實戰)()
4、官方平臺介紹Ultralytics Inc.
5、YOLOv8改進有效系列目錄 | 包含卷積、主干、檢測頭、注意力機制、Neck上百種創新機制(有非常好的參考和啟示價值)
6、源碼github地址:?GitHub - ultralytics/ultralytics: NEW - YOLOv8 🚀 in PyTorch > ONNX > OpenVINO > CoreML > TFLite
1、導讀
YOLOv8 是 ultralytics 公司在 2023 年 1月 10 號開源的基于YOLOV5進行更新的?下一個重大更新版本,目前支持圖像分類、物體檢測和實例分割任務,鑒于Yolov5的良好表現,Yolov8在還沒有開源時就收到了用戶的廣泛關注。其主要結構如下圖所示:
2、YOLOv8相對于Yolov5的核心改動
從YOLOv8的網絡結構可以看出,其延用了YOLOv5的網絡結構思想,網絡還是分為三個部分: 基于CSP(緊湊和分離)的主干網絡(backbone),特征增強網絡(neck),檢測頭(head) 三個部分。
改進總結:
- Backbone的改進:YOLOV5中的C3模塊被替換成了C2f模塊,實現了進一步的輕量化。同時保持了CSP的思想,保留了YOLOv5等架構中使用的SPPF(空間金字塔池化)模塊。
- 特征增強網絡(neck): YOLOv8使用PA-FPN(路徑聚合網絡-特征金字塔網絡)的思想,具體實施過程中將YOLOV5中的PA-FPN上采樣階段的卷積去除了,并且將其中的C3模塊替換為了C2f模塊。
- 檢測頭(head) :區別于YOLOV5的耦合頭,YOLOV8使用了Decoupled-Head,使得網絡的訓練和推理更加高效。
- 其它更新部分:
- Anchor-Free的思想:拋棄了Anchor-Base,采用了Anchor-Free的思想。
- 損失函數的改進:分類使用BCEloss,回歸使用DFL Loss+CIOU Loss。
- 樣本匹配方式的改進:采用了Task-Aligned Assigner匹配方式。
這些改進使得YOLOv8在保持了YOLOv5網絡結構的優點的同時,進行了更加精細的調整和優化,提高了模型在不同場景下的性能。
yolov8是個模型簇,從小到大包括:yolov8n、yolov8s、yolov8m、yolov8l、yolov8x等。模型參數、運行速度、參數量等詳見下表:
對比yolov5,如下表:
mAP和參數量都上升了不少。
3、YOLOv8的網絡結構詳解
- Backbone:它采用了一系列卷積和反卷積層來提取特征,同時也使用了殘差連接和瓶頸結構來減小網絡的大小和提高性能。該部分采用了C2f模塊作為基本構成單元,與YOLOv5的C3模塊相比,C2f模塊具有更少的參數量和更優秀的特征提取能力。
- Neck:它采用了多尺度特征融合技術,將來自Backbone的不同階段的特征圖進行融合,以增強特征表示能力。具體來說,YOLOv8的Neck部分包括一個SPPF模塊、一個PAA模塊和兩個PAN模塊。
- Head:它負責最終的目標檢測和分類任務,包括一個檢測頭和一個分類頭。檢測頭包含一系列卷積層和反卷積層,用于生成檢測結果;分類頭則采用全局平均池化來對每個特征圖進行分類。
3.1 Backbone
由最上面的YOLOv8網絡結構圖我們可以看出在其中的Backbone部分,由5個卷積模塊和4個C2f模塊和一個SPPF模塊組成。
(其中淺藍色為卷積模塊,黃色為C2f模塊深藍色為SPPF模塊 )
如果上圖看的不夠直觀,我們來看一下YOLOv8的文件中的yaml文件,看一下它backbone部分的結構組成部分,會更加直觀。?
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] ?# 0-P1/2- [-1, 1, Conv, [128, 3, 2]] ?# 1-P2/4- [-1, 3, C2f, [128, True]]- [-1, 1, Conv, [256, 3, 2]] ?# 3-P3/8- [-1, 6, C2f, [256, True]]- [-1, 1, Conv, [512, 3, 2]] ?# 5-P4/16- [-1, 6, C2f, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] ?# 7-P5/32- [-1, 3, C2f, [1024, True]]- [-1, 1, SPPF, [1024, 5]] ?# 9
上面的部分就是YOLOv8的yaml文件的Backbone部分,可以看到其由5個Conv模塊,四個C2f模塊以及一個SPPF模塊組成,下面我們來根據每個模塊的組成來進行講解。
3.1.1 卷積模塊(Conv)
在其中卷積模塊的結構主要為下圖
在其中主要結構為一個2D的卷積一個BatchNorm2d和一個SiLU激活函數,整個卷積模塊的作用為:
- 下采樣:每個卷積模塊中的卷積層都采用步長為2的卷積核進行下采樣操作,以減小特征圖的尺寸并增加通道數。
- 非線性表示:每個卷積層之后都添加了Batch Normalization(批標準化)層和ReLU激活函數,以增強模型的非線性表示能力。
在其中Batch Normalization(批標準化)是深度學習中常用的一種技術,用于加速神經網絡的訓練。Batch Normalization通過對每個小批量數據進行標準化,使得神經網絡在訓練過程中更加穩定,可以使用更高的學習率,并且減少了對初始化權重的依賴。Batch Normalization的基本思想是:對每個小批量數據進行標準化,使得每個特征的均值為0,方差為1,然后再通過一個可學習的縮放因子和平移因子來調整數據的分布,從而使得神經網絡更容易訓練。
3.1.2 C2f 模塊
在YOLOv8的網絡結構中C2f模塊算是YOLOv8的一個較大的改變,與YOLOv5的C3模塊相比,C2f模塊具有更少的參數量和更優秀的特征提取能力。下圖為C2f的內部網絡結構圖。
在C2f模塊中我們可以看到輸入首先經過一個k=1,s=1,p=0,c=c_out的卷積模塊進行了處理,然后經過一個split處理(在這里split和后面的concat的組成其實就是所謂的殘差模塊處理)經過數量為n的DarknetBottleneck模塊處理以后將殘差模塊和主干模塊的結果進行Concat拼接在經過一個卷積模塊處理進行輸出。?
在其中提到的殘差連接(residual connections)是一種用于構建深層神經網絡的技術。它的核心思想是通過跳過層級連接來傳遞殘差或誤差。
在傳統的神經網絡中,信息流通過一層層的網絡層,每一層都通過非線性激活函數進行轉換和提取特征。然而,隨著神經網絡的加深,可能會出現"梯度消失"或"梯度爆炸"的問題,導致網絡收斂困難或性能下降。
殘差連接通過引入跨層級的連接,將輸入的原始信息直接傳遞到后續層級,以解決梯度消失和爆炸問題。具體而言,它將網絡的輸入與中間層的輸出相加,形成了一個"捷徑"或"跳躍連接",從而允許梯度更容易地傳播。
數學上,假設我們有一個輸入x,通過多個網絡層進行處理后得到預測值H(x)。那么殘差連接的表達式為: F(x) = H(x) + x 。其中,F(x)為殘差塊的輸出,H(x)為經過一系列網絡層處理后得到的特征表示,x為輸入直接連接到殘差塊中的跳躍連接。
通過殘差連接,網絡可以更容易地學習殘差或誤差,從而使網絡更深層次的特征表達更準確。這對于訓練深層神經網絡非常有用,可以提高網絡的性能和收斂速度。
?在C2f模塊中用到的DarknetBottleneck模塊其中使用多個3x3卷積核進行卷積操作,提取特征信息。同時其具有add是否進行殘差鏈接的選項。
?其實整個C2f模塊就是一個改良版本的Darknet
- 首先,使用1x1卷積核將輸入通道數減少到原來的1/2,以減少計算量和內存消耗。
- 然后,使用多個3x3卷積核進行卷積操作,提取特征信息。
- 接著,使用殘差鏈接,將輸入直接加到輸出中,從而形成了一條跨層連接。
- 接著,再次使用1x1卷積核恢復特征圖的通道數。
3.1.3 SPPF模塊?
YOLOv8的SPPF模塊相對于YOLOv5的SPPF模塊并沒有任何的改變。
在傳統的卷積神經網絡中,通常使用全連接層來將卷積和池化層提取的特征映射到固定長度的向量上,以便進行分類或檢測。然而,全連接層需要固定大小的輸入(例如640*640(YOLOV5)、32*32(LenNet)、224*224(ImageNet)),這使得網絡無法處理尺寸不同的輸入圖像。因此,SPP-Net引入了空間金字塔池化(SPP,Spatial Pyramid Pooling)模塊,用于解決輸入圖像尺寸不同的問題,并且可以在不同尺寸的輸入圖像上實現準確的分類和檢測。
在SPP-Net中,輸入圖像首先通過一個卷積神經網絡進行特征提取。然后,在SPP層中進行池化操作,將卷積層的輸出特征圖(Feature Map)分成不同尺度的網格,對于每個網格,都對其內部進行池化操作,池化輸出的結果拼接成一個固定長度的特征向量。這個特征向量可以用于后續的分類任務,下面的圖是介紹從一張輸入圖上提取提特征圖然后產生固定長度的特征向量然后輸入到全連接層中進行分類的流程圖。
下面將通過一個簡單的例子來說明SPP-Net是如何解決選擇性搜索問題的是如何將不同大小的特征圖轉換為固定長度的特征向量的。假設我們有一個輸入圖像大小為300?300像素,由于我們希望網絡能夠處理不同大小的輸入圖像,因此我們先對輸入圖像進行卷積操作,得到一個特征圖大小為15? 15? 1024其中分別表示一個特征圖的寬度、高度和每個位置上的特征向量的維數。具體來說,在這個例子中,15? 15表示特征圖的寬度和高度,1024表示每個位置上的特征向量的維數。然后,我們使用SPP層對特征圖進行池化操作,將其分成1?1、2?2和4?4三個尺度的網格,并對每個網格內部進行池化操作。最后,對于每個尺度,將池化輸出的結果拼接成一個固定長度的特征向量。假設我們選擇的池化操作是最大池化,每個網格內部的池化操作輸出的結果是一個特征向量,我們將這些特征向量拼接起來,得到一個長度為1024?(1+4+9)=15360的特征向量。這個特征向量可以作為分類器的輸入,用于分類任務。
下面這個圖詮釋了上面的例子,方框內的部分即SPP部分,其分成1?1、2?2和4?4三個尺度的網格進行特征向量的提取然后進行拼接固定長度的特征向量并將其輸入到全連接層中用于分類任務,需要注意的是SPP通常在一個網絡結構的最后一層,輸出結果直接輸入給檢測頭進行檢測,或者輸入給Neck部分進行特征向量的拼接操作以將不同尺度下的特征向量進行拼接提高檢測和分類效率。
SPP-Net的優點包括:
- 對任意大小的輸入圖像進行處理,具有較好的泛化能力和適用性;
- 可以用于多種計算機視覺任務,包括圖像分類、物體檢測、場景分類等;
- 可以減少網絡訓練和測試時間,提高網絡的效率;
- 在多個數據集和比賽中取得了不錯的表現,證明了其有效性和通用性。
3.2 Neck?
YOLOv8的Neck部分是該模型中的一個關鍵組件,它在特征提取和融合方面起著重要作用。?YOLOv8的Neck部分依然采用PAN-FPN的思想,下圖的a,b,c為一個Neck部分的流程示意圖。
整個Neck部分的步驟如下:將特征提取網絡(Backbone)的輸出P3,P4,P5輸入進PAN-FPN網絡結構,使得多個尺度的特征圖進行融合;將P5經過上采樣與P4進行融合得到F1,將F1經過C2f層和一次上采樣與P3進行融合得到T1,將T1經過一次卷積層與F1經過融合得到F2,將F2經過一次C2f層得到T2,將T2經過一次卷積層與P5融合得到F3,將F3經過一次C2f層得到T3,最終得到T1、T2、T3就是整個Neck的產物;
上述過程可以描述為下圖,在圖片上做了一些標準方便理解。
上述的過程可以在代碼部分看到,我們同樣看YOLOv8的yaml文件,能夠更直觀的看到這個步驟,大家可以看代碼同時對應圖片來進行分析:
head:
? - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
? - [[-1, 6], 1, Concat, [1]] ?# cat backbone P4
? - [-1, 3, C2f, [512]] ?# 12? - [-1, 1, nn.Upsample, [None, 2, 'nearest']]
? - [[-1, 4], 1, Concat, [1]] ?# cat backbone P3
? - [-1, 3, C2f, [256]] ?# 15 (P3/8-small)? - [-1, 1, Conv, [256, 3, 2]]
? - [[-1, 12], 1, Concat, [1]] ?# cat head P4
? - [-1, 3, C2f, [512]] ?# 18 (P4/16-medium)? - [-1, 1, Conv, [512, 3, 2]]
? - [[-1, 9], 1, Concat, [1]] ?# cat head P5
? - [-1, 3, C2f, [1024]] ?# 21 (P5/32-large)
Neck部分的整體功能的詳細分析如下:
- 1. Neck的作用:
- Neck部分在YOLOv8模型中負責對來自Backbone的特征進行進一步處理和融合,以提高目標檢測的準確性和魯棒性。它通過引入不同的結構和技術,將多尺度的特征圖進行融合,以便更好地捕捉不同尺度目標的信息。
- 2. 特征金字塔網絡(Feature Pyramid Network, FPN):
- YOLOv8的Neck部分通常采用特征金字塔網絡結構,用于處理來自Backbone的多尺度特征圖。FPN通過在不同層級上建立特征金字塔,使得模型能夠在不同尺度上進行目標檢測。它通過上采樣和下采樣操作,將低層級的細節特征與高層級的語義特征進行融合,以獲取更全面和豐富的特征表示。
- 3. 特征融合(Feature Fusion):
- Neck部分還包括特征融合的操作,用于將來自不同層級的特征進行融合。這種特征融合有助于提高模型對目標的檢測準確性,尤其是對于不同尺度的目標。
- 4. 上采樣和下采樣:
- Neck部分通常會使用上采樣和下采樣操作,以調整特征圖的尺度和分辨率。上采樣操作可以將低分辨率的特征圖放大到與高分辨率特征圖相同的尺寸,以保留更多的細節信息。而下采樣操作則可以將高分辨率的特征圖降低尺寸,以減少計算量和內存消耗。
YOLOv8的Neck部分通過特征金字塔網絡和特征融合等操作,有效地提取和融合多尺度的特征,從而提高了目標檢測的性能和魯棒性。這使得模型能夠更好地適應不同尺度和大小的目標,并在復雜場景下取得更準確的檢測結果。
PAN-FPN(具有特征金字塔網絡的路徑聚合網絡)是一種用于計算機視覺中對象檢測的神經網絡架構。它將特征金字塔網絡(FPN)與路徑聚合網絡(PAN)相結合,以提高目標檢測的準確性和效率。
FPN 用于從不同比例的圖像中提取特征,而 PAN 用于跨網絡的不同層聚合這些特征。這允許網絡檢測不同大小和分辨率的對象,并處理具有多個對象的復雜場景。
3.3 Head
如果Backbone和Neck部分可以理解為準備工作,那么Head部分就是收獲的部分,經過前面的準備工作我們得到了Neck部分的輸出T1、T2、T3分別代表不同層級的特征圖,Head部分就是對這三個特征圖進行處理以產生模型的的輸出結果的一個過程。
YOLOv8的Head部分我們先來看一下它的網絡結構。
可以看到在YOLOv8的Head部分,體現了最核心的改動—>解耦頭(Decoupled-Head),顧名思義就是將原先的一個檢測頭分解成兩個部分。
在Head部分的三個解耦頭分別對應著Neck部分的特征圖輸出T1、T2、T3。、
解耦頭的工作流程是:
將網絡得到的特征圖T1,T2,T3分別輸入解耦頭頭進行預測,檢測頭的結構如下圖所示其中包含4個3×3卷積與2個1×1卷積,同時在檢測頭的回歸分支中添加WIOU損失函數如圖4所示,回歸頭部需要計算預測框與真實框之間的位置偏移量,然后將偏移量送入回歸頭部進行損失計算,然后輸出一個四維向量,分別表示目標框的左上角坐標x、y和右下角坐標x、y。分類頭部針對于每個Anchor Free提取的候選框對其進行RoI Pooling和卷積操作得到一個分類器輸出張量每個位置上的值表示該候選框屬于每個類別的概率,在最后通過極大值抑制方式篩選出最終的檢測結果?
我們再從YOLOv8的yaml文件來看Head部分的作用
可以看到檢測頭部分的輸出為15,18,21分別對應著Neck部分的三個輸出特征圖。?
到此YOLOv8的網絡結構部分講解就已經完成,下面我們來看如何利用YOLOv8進行訓練操作。
四、環境搭建
在配置好環境之后,在之后模型獲取完成之后,我們可以進行配置的安裝我們可以在命令行下輸入如下命令進行環境的配置。
pip install -r requirements.txt
輸入如上命令之后我們就可以看到命令行在安裝模型所需的庫了。?
五、數據集獲取
?在我們開始訓練之前,我們需要一份數據集,如何獲取一個YOLOv8的數據集大家可以看原作者的的另一篇博客: 從YOLO官方指定的數據集網站Roboflow下載數據模型訓練
超詳細教程YoloV8官方推薦免費數據集網站Roboflow一鍵導出Voc、COCO、Yolo、Csv等格式
在上面隨便下載了一個 數據集用它導出yolov8的數據集,以及自動給轉換成txt的格式yaml文件也已經配置好了,我們直接用就可以。?
六、模型獲取
到這里假設你已經搭建好了環境和有了數據集,那么我們就可以進行模型的下載,因為yolov8目前還存在BUG并不穩定隨時都有可能進行更新,所以不推薦大家通過其它的途徑下載,最好通過下面的方式進行下載。
我們可以直接在終端命令下
(PS:這里需要注意的是我們需要在你總項目文件目錄下輸入這個命令,因為他會下載到當前目錄下)
?pip install ultralytics
?如果大家去github上直接下載zip文件到本地可能會遇到報錯如下,識別不了yolo命令,所以推薦大家用這種方式下載,
七、模型訓練
我們來看一下主要的ultralytics目錄結構,
?我門打開cfg目錄下的default.yaml文件可以配置模型的參數,
在其中和模型訓練有關的參數及其解釋如下:
參數名 | 輸入類型 | ||
---|---|---|---|
0 | task | str | YOLO模型的任務選擇,選擇你是要進行檢測、分類等操作 |
1 | mode | str | YOLO模式的選擇,選擇要進行訓練、推理、輸出、驗證等操作 |
2 | model | str/optional | 模型的文件,可以是官方的預訓練模型,也可以是訓練自己模型的yaml文件 |
3 | data | str/optional | 模型的地址,可以是文件的地址,也可以是配置好地址的yaml文件 |
4 | epochs | int | 訓練的輪次,將你的數據輸入到模型里進行訓練的次數 |
5 | patience | int | 早停機制,當你的模型精度沒有改進了就提前停止訓練 |
6 | batch | int | 我們輸入的數據集會分解為多個子集,一次向模型里輸入多少個子集 |
7 | imgsz | int/list | 輸入的圖片的大小,可以是整數就代表圖片尺寸為int*int,或者list分別代表寬和高[w,h] |
8 | save | bool | 是否保存模型以及預測結果 |
9 | save_period | int | 在訓練過程中多少次保存一次模型文件,就是生成的pt文件 |
10 | cache | bool | 參數cache 用于控制是否啟用緩存機制。 |
11 | device | int/str/list/optional | GPU設備的選擇:cuda device=0 or device=0,1,2,3 or device=cpu |
12 | workers | int | 工作的線程,Windows系統一定要設置為0否則很可能會引起線程報錯 |
13 | name | str/optional | 模型保存的名字,結果會保存到'project/name' 目錄下 |
14 | exist_ok | bool | 如果模型存在的時候是否進行覆蓋操作 |
15 | prepetrained | bool | 參數pretrained用于控制是否使用預訓練模型。 |
16 | optimizer | str | 優化器的選擇choices=[SGD, Adam, Adamax, AdamW, NAdam, RAdam, RMSProp, auto] |
17 | verbose | bool | 用于控制在執行過程中是否輸出詳細的信息和日志。 |
18 | seed | int | 隨機數種子,模型中涉及到隨機的時候,根據隨機數種子進行生成 |
19 | deterministic | bool | 用于控制是否啟用確定性模式,在確定性模式下,算法的執行將變得可重復,即相同的輸入將產生相同的輸出 |
20 | single_cls | bool | 是否是單標簽訓練 |
21 | rect | bool | 當?rect ?設置為?True ?時,表示啟用矩形訓練或驗證。矩形訓練或驗證是一種數據處理技術,其中在訓練或驗證過程中,輸入數據會被調整為具有相同寬高比的矩形形狀。 |
22 | cos_lr | bool | 控制是否使用余弦學習率調度器 |
23 | close_mosaic | int | 控制在最后幾個 epochs 中是否禁用馬賽克數據增強 |
24 | resume | bool | 用于從先前的訓練檢查點(checkpoint)中恢復模型的訓練。 |
25 | amp | bool | 用于控制是否進行自動混合精度 |
26 | fraction | float | 用于指定訓練數據集的一部分進行訓練的比例。默認值為 1.0 |
27 | profile | bool | 用于控制是否在訓練過程中啟用 ONNX 和 TensorRT 的性能分析 |
28 | freeze | int/list/optinal | 用于指定在訓練過程中凍結前?n ?層或指定層索引的列表,以防止它們的權重更新。這對于遷移學習或特定層的微調很有用。 |
7.1 訓練的三種方式
7.1.1 方式一
我們可以通過命令直接進行訓練在其中指定參數,但是這樣的方式,我們每個參數都要在其中打出來。命令如下:
yolo task=detect mode=train model=yolov8n.pt data=data.yaml batch=16 epochs=100 imgsz=640 workers=0 device=0
需要注意的是如果你是Windows系統的電腦其中的Workers最好設置成0否則容易報線程的錯誤。
7.1.2 方式二(推薦)
通過指定cfg直接進行訓練,我們配置好ultralytics/cfg/default.yaml這個文件之后,可以直接執行這個文件進行訓練,這樣就不用在命令行輸入其它的參數了。
yolo cfg=ultralytics/cfg/default.yaml
7.1.3 方式三??
我們可以通過創建py文件來進行訓練,這樣的好處就是不用在終端上打命令,這也能省去一些工作量,我們在根目錄下創建一個名字為run.py的文件,在其中輸入代碼
from ultralytics import YOLO
model = YOLO("權重的地址")
data = "文件的地址"
model.train(data=data, epochs=100, batch=16)
無論通過上述的哪一種方式在控制臺輸出如下圖片的內容就代表著開始訓練成功了!
八、模型驗證/測試
參數名 | 類型 | 參數講解 | |
---|---|---|---|
1 | val | bool | 用于控制是否在訓練過程中進行驗證/測試。 |
2 | split | str | 用于指定用于驗證/測試的數據集劃分。可以選擇 'val'、'test' 或 'train' 中的一個作為驗證/測試數據集 |
3 | save_json | bool | 用于控制是否將結果保存為 JSON 文件 |
4 | save_hybird | bool | 用于控制是否保存標簽和附加預測結果的混合版本 |
5 | conf | float/optional | 用于設置檢測時的目標置信度閾值 |
6 | iou | float | 用于設置非極大值抑制(NMS)的交并比(IoU)閾值。 |
7 | max_det | int | 用于設置每張圖像的最大檢測數。 |
8 | half | bool | 用于控制是否使用半精度(FP16)進行推斷。 |
9 | dnn | bool | ,用于控制是否使用 OpenCV DNN 進行 ONNX 推斷。 |
10 | plots | bool | 用于控制在訓練/驗證過程中是否保存繪圖結果。 |
驗證我們劃分的驗證集/測試集的情況,也就是評估我們訓練出來的best.pt模型好與壞
yolo task=detect mode=val model=best.pt data=data.yaml device=0
?九、模型推理
我們訓練好自己的模型之后,都會生成一個模型文件,保存在你設置的目錄下,當我們再次想要實驗該模型的效果之后就可以調用該模型進行推理了,我們也可以用官方的預訓練權重來進行推理。
推理的方式和訓練一樣我們這里就選一種來進行舉例其它的兩種方式都是一樣的操作只是需要改一下其中的一些參數即可:
參數講解
參數名?? ? | 類型?? ? | 參數講解 | |
---|---|---|---|
0 | source | str/optinal | 用于指定圖像或視頻的目錄 |
1 | show | bool | 用于控制是否在可能的情況下顯示結果 |
2 | save_txt | bool | 用于控制是否將結果保存為?.txt ?文件 |
3 | save_conf | bool | 用于控制是否在保存結果時包含置信度分數 |
4 | save_crop | bool | 用于控制是否將帶有結果的裁剪圖像保存下來 |
5 | show_labels | bool | 用于控制在繪圖結果中是否顯示目標標簽 |
6 | show_conf | bool | 用于控制在繪圖結果中是否顯示目標置信度分數 |
7 | vid_stride | int/optional | 用于設置視頻的幀率步長 |
8 | stream_buffer | bool | 用于控制是否緩沖所有流式幀(True)或返回最新的幀(False) |
9 | line_width | int/list[int]/optional | 用于設置邊界框的線寬度,如果缺失則自動設置 |
10 | visualize | bool | 用于控制是否可視化模型的特征 |
11 | augment | bool | 用于控制是否對預測源應用圖像增強 |
12 | agnostic_nms | bool | 用于控制是否使用無關類別的非極大值抑制(NMS) |
13 | classes | int/list[int]/optional | 用于按類別篩選結果 |
14 | retina_masks | bool | 用于控制是否使用高分辨率分割掩碼 |
15 | boxes | bool | 用于控制是否在分割預測中顯示邊界框。 |
?這里需要需要注意的是我們用模型進行推理的時候可以選擇照片也可以選擇一個視頻的格式都可以。支持的視頻格式有?
MP4(.mp4):這是一種常見的視頻文件格式,通常具有較高的壓縮率和良好的視頻質量
AVI(.avi):這是一種較舊但仍廣泛使用的視頻文件格式。它通常具有較大的文件大小
MOV(.mov):這是一種常見的視頻文件格式,通常與蘋果設備和QuickTime播放器相關
MKV(.mkv):這是一種開放的多媒體容器格式,可以容納多個視頻、音頻和字幕軌道
FLV(.flv):這是一種用于在線視頻傳輸的流式視頻文件格式
十、模型輸出
當我們進行部署的時候可以進行文件導出,然后在進行部署。
YOLOv8支持的輸出格式有如下:
1. ONNX(Open Neural Network Exchange):ONNX 是一個開放的深度學習模型表示和轉換的標準。它允許在不同的深度學習框架之間共享模型,并支持跨平臺部署。導出為 ONNX 格式的模型可以在支持 ONNX 的推理引擎中進行部署和推理。
2. TensorFlow SavedModel:TensorFlow SavedModel 是 TensorFlow 框架的標準模型保存格式。它包含了模型的網絡結構和參數,可以方便地在 TensorFlow 的推理環境中加載和使用。
3. PyTorch JIT(Just-In-Time):PyTorch JIT 是 PyTorch 的即時編譯器,可以將 PyTorch 模型導出為優化的 Torch 腳本或 Torch 腳本模型。這種格式可以在沒有 PyTorch 環境的情況下進行推理,并且具有更高的性能。
4. Caffe Model:Caffe 是一個流行的深度學習框架,它使用自己的模型表示格式。導出為 Caffe 模型的文件可以在 Caffe 框架中進行部署和推理。
5. TFLite(TensorFlow Lite):TFLite 是 TensorFlow 的移動和嵌入式設備推理框架,支持在資源受限的設備上進行高效推理。模型可以導出為 TFLite 格式,以便在移動設備或嵌入式系統中進行部署。
6. Core ML(Core Machine Learning):Core ML 是蘋果的機器學習框架,用于在 iOS 和 macOS 上進行推理。模型可以導出為 Core ML 格式,以便在蘋果設備上進行部署。
這些格式都提供了不同的優勢和適用場景。選擇合適的導出格式應該考慮到目標平臺和部署環境的要求,以及所使用的深度學習框架的支持情況。
模型輸出的參數有如下
參數名 | 類型 | 參數解釋 | |
---|---|---|---|
0 | format | str | 導出模型的格式 |
1 | keras | bool | 表示是否使用Keras |
2 | optimize | bool | 用于在導出TorchScript模型時進行優化,以便在移動設備上獲得更好的性能 |
3 | int8 | bool | 用于在導出CoreML或TensorFlow模型時進行INT8量化 |
4 | dynamic | bool | 用于在導出CoreML或TensorFlow模型時進行INT8量化 |
5 | simplify | bool | 用于在導出ONNX模型時進行模型簡化 |
6 | opset | int/optional | 用于指定導出ONNX模型時的opset版本 |
7 | workspace | int | 用于指定TensorRT模型的工作空間大小,以GB為單位 |
8 | nms | bool | 用于在導出CoreML模型時添加非極大值抑制(NMS) |
命令行命令如下:?
yolo task=detect mode=export model=best.pt format=onnx ?
到此為止本文的講解就結束了,希望對大家對于YOLOv8模型理解有幫助,