YOLOv8目標(biāo)檢測算法

YOLOv8目標(biāo)檢測算法相較于前幾代YOLO系列算法具有如下的幾點優(yōu)勢:
更友好的安裝/運行方式
速度更快、準(zhǔn)確率更高
新的backbone,將YOLOv5中的C3更換為C2F
YOLO系列第一次嘗試使用anchor-free
新的損失函數(shù)
YOLOv8簡介
YOLOv8 是 Ultralytics 公司繼?YOLOv5?算法之后開發(fā)的下一代算法模型,目前支持圖像分類、物體檢測和實例分割任務(wù)。YOLOv8 是一個 SOTA 模型,它建立在之前YOLO?系列模型的成功基礎(chǔ)上,并引入了新的功能和改進(jìn),以進(jìn)一步提升性能和靈活性。具體創(chuàng)新包括:一個新的骨干網(wǎng)絡(luò)、一個新的 Ancher-Free 檢測頭和一個新的損失函數(shù),可以在從 CPU 到 GPU 的各種硬件平臺上運行。注意到ultralytics 并沒有直接將開源庫命名為 YOLOv8,而是直接使用 Ultralytics這個單詞,原因是Ultralytics這個庫的定位是算法框架,而非特指某一個特定算法,其希望這個庫不僅僅能夠用于 YOLO 系列模型,同時也能支持其他的視覺任務(wù)如圖像分類、實例分割等。下圖畫圖YOLOv8目標(biāo)檢測算法同其他YOLO系列算法(YOLOv5、6、7)的實驗對比圖,左邊是模型參數(shù)量對比,右邊是速度對比。

下面兩個表分別是YOLOv8和YOLOv5(v7.0版本)官方在 COCO Val 2017 數(shù)據(jù)集上測試結(jié)果,從中看出 YOLOv8 相比 YOLOv5 精度提升大,但是 N/S/M 模型相應(yīng)的參數(shù)量、FLOPS等提高了不少。


YOLOv8概述
l?提供了一個全新的SOTA模型,和YOLOv5一樣,基于縮放系數(shù)也提供了 N/S/M/L/X 尺度的不同大小模型,用于滿足不同場景需求,同時支持圖像分類、目標(biāo)檢測、實例分割和姿態(tài)檢測任務(wù)
在骨干網(wǎng)絡(luò)和Neck部分將YOLOv5的C3結(jié)構(gòu)換成了梯度流更豐富的 C2f 結(jié)構(gòu),并對不同尺度模型調(diào)整了不同的通道數(shù),大幅提升了模型性能;需要注意的是C2f 模塊中存在Split等操作對特定硬件部署沒有之前那么友好
Head部分換成了目前主流的解耦頭結(jié)構(gòu),將分類和檢測頭分離,同時也從 Anchor-Based換成了Anchor-Free
Loss 計算方面采用了 TaskAlignedAssigner 正樣本分配策略,并引入了 Distribution Focal Loss
?下圖畫出YOLOv8目標(biāo)檢測算法的整體結(jié)構(gòu)圖,原圖從mmyolo倉庫(https://github.com/open-mmlab/mmyolo/blob/dev/configs/yolov8/README.md)獲取

YOLOv8模型
YOLOv8目標(biāo)檢測算法的模型配置文件如下:

從配置文件可以看出,YOLOv8與YOLOv5模型最明顯的差異是使用C2F模塊替換了原來的C3模塊,兩個模塊的結(jié)構(gòu)圖(原圖:https://mmyolo.readthedocs.io/zh_CN/latest/recommended_topics/algorithm_descriptions/yolov8_description.html)下圖所示。

另外Head 部分變化最大,從原先的耦合頭變成了解耦頭,并且從 YOLOv5 的 Anchor-Based 變成了 Anchor-Free。其結(jié)構(gòu)對比圖(原圖:https://mmyolo.readthedocs.io/zh_CN/latest/recommended_topics/algorithm_descriptions/yolov8_description.html)如下所示:

當(dāng)然YOLOv8相較于之前YOLO系列算法還有其他的改變,具體參考官方源碼庫(https://github.com/ultralytics/ultralytics)和mmyolo庫(https://mmyolo.readthedocs.io/zh_CN/latest/recommended_topics/algorithm_descriptions/yolov8_description.html)
YOLOv8安裝
(1)直接安裝: pip install ultralytics
(2)下載倉庫安裝:git clone https://github.com/ultralytics/ultralytics
cd ultralytics
pip install -e .
YOLOv8訓(xùn)練
yolov8的訓(xùn)練采用命令行的模型(當(dāng)然也可以使用api調(diào)用的方式),下面是yolov8官方給定的訓(xùn)練方式:

一個簡單的單卡模型訓(xùn)練命令如下:

一個簡單的多卡模型訓(xùn)練命令如下:

當(dāng)然更多的參數(shù)在訓(xùn)練時可以被指定,這些參數(shù)包括如下:

YOLOv8驗證
yolov8的驗證采用命令行的模型(當(dāng)然也可以使用api調(diào)用的方式),下面是yolov8官方給定的驗證方式:


?
YOLOv8推理測試
yolov8的推理測試采用api調(diào)用的方式,下面是yolov8官方給定的測試方式:

?YOLOv8推理可為各種任務(wù)生成預(yù)測結(jié)果,可返回一個結(jié)果對象列表或一個節(jié)省內(nèi)存的結(jié)果對象生成器(在使用流模式時,即在model中設(shè)置stream=True)
YOLOv8可以處理不同類型的輸入源(如下表所示)進(jìn)行推理,輸入源包括靜態(tài)圖像、視頻流和各種數(shù)據(jù)格式。表中還顯示了參數(shù) stream=True表示可以在流模式下使用這個源。流模式有利于處理視頻或?qū)崟r流,因為它會創(chuàng)建一個結(jié)果生成器,而不是將所有幀加載到內(nèi)存中。(在處理長視頻或大型數(shù)據(jù)集時,使用 stream=True 可以有效管理內(nèi)存。當(dāng) stream=False 時,所有幀或數(shù)據(jù)點的結(jié)果都會存儲在內(nèi)存中,這可能會迅速增加數(shù)據(jù)量,最終導(dǎo)致內(nèi)存不足錯誤。相比之下,stream=True利用生成器,只將當(dāng)前幀或數(shù)據(jù)點的結(jié)果保存在內(nèi)存中,從而大大減少了內(nèi)存消耗,防止出現(xiàn)內(nèi)存不足問題)

model.predict()接受多個參數(shù),可在推理時通過下面的這些參數(shù)覆蓋默認(rèn)值:

更多的信息如圖像格式、視頻格式、檢測結(jié)果格式等信息請參考官網(wǎng):https://docs.ultralytics.com/modes/predict/#working-with-results
YOLOv8導(dǎo)出
yolov8模型的導(dǎo)出采用命令行的模型(當(dāng)然也可以使用api調(diào)用的方式),下面是yolov8官方給定的模型導(dǎo)出方式:


可用的YOLOv8模型的導(dǎo)出格式如下表所示,您可以使用format參數(shù)導(dǎo)出任何格式,例如format='onnx' 或 format='engine'

?
?
?
?