YOLOv11來了 | 自定義目標檢測
概述
YOLO11 在 2024 年 9 月 27 日的 YOLO Vision 2024 活動中宣布:https://www.youtube.com/watch?v=rfI5vOo3-_A。
YOLO11 是 Ultralytics YOLO 系列的最新版本,結合了尖端的準確性、速度和效率,用于目標檢測、分割、分類、定向邊界框和姿態估計。與 YOLOv8 相比,它具有更少的參數和更好的結果,不難預見,YOLO11 在邊緣設備上更高效、更快,將頻繁出現在計算機視覺領域的最先進技術(SOTA)中。
主要特點:
- 增強的特征提取:YOLO11 使用改進的主干和頸部架構來增強特征提取,以實現更精確的目標檢測和復雜任務的性能。
- 針對效率和速度優化:精細的架構設計和優化的訓練流程在保持準確性和性能之間最佳平衡的同時,提供更快的處理速度。
- 更少的參數,更高的準確度:YOLO11m 在 COCO 數據集上實現了比 YOLOv8m 更高的 mAP,參數減少了 22%,提高了計算效率,同時不犧牲準確度。
- 跨環境的適應性:YOLO11 可以無縫部署在邊緣設備、云平臺和配備 NVIDIA GPU 的系統上,確保最大的靈活性。
- 支持廣泛的任務范圍:YOLO11 支持各種計算機視覺任務,如目標檢測、實例分割、圖像分類、姿態估計和定向目標檢測(OBB)。
圖片==
本教程涵蓋的步驟:
- 環境設置
- 準備數據集
- 訓練模型
- 驗證模型
- 在測試圖像上運行推理
- 結論
環境設置
你需要一個谷歌賬戶才能使用 Google Colab。我們使用 Colab 進行需要密集計算的任務,比如深度學習。由于我電腦的 GPU 不足,我需要激活 Colab 的 GPU 支持。
這樣做之后,我們檢查 gpu 活動。
它支持高達 16GB 的內存和 2560 CUDA 核心,以加速廣泛的現代應用程序。然后執行此代碼以動態確定工作目錄并靈活管理文件路徑。
import os
HOME = os.getcwd()
接下來,你需要下載 Ultralytics 包來加載和處理模型,以及用于數據集的 Roboflow 包。
!pip install ultralytics supervision roboflow
from ultralytics import YOLO
from roboflow import Roboflow
準備數據集
在這個項目中,我使用了 RF100 中包含的寄生蟲數據集。我將在這個數據集中訓練一個有 8 種不同寄生蟲類別的目標檢測模型。我將通過 Roboflow 處理標記、分類的圖像。我經常在我的個人項目中使用這個開源平臺。在處理現成的數據集時,你可以在數據集的健康分析部分快速獲取大量關于數據的信息。例如,下面顯示的類別平衡部分,我們可以看到 Hymenolepis 類別是代表不足的。
數據集相關鏈接:
- https://universe.roboflow.com/roboflow-100/parasites-1s07h
- https://universe.roboflow.com/roboflow-100
- https://universe.roboflow.com/roboflow-100/parasites-1s07h/health
為了提高這個類別的準確性,你需要應用增強、過采樣或調整類別權重。我們不會在本文中討論這些主題,不用擔心,但如果你對這些任務感興趣,請隨時聯系我。如果有足夠需求,我也可以分享我關于這些主題的詳細工作。你可以下載并使用 Roboflow 環境中的任何開源項目,按照格式使用。在準備或選擇數據集后,我們將在 Colab 環境中工作我們切換到 Colab 的原因是它提供免費的 16GB NVIDIA T4 GPU 使用。我在下面提到了這個問題。我們需要使用 Roboflow API 以 YOLOv8 格式導入我們的數據。讓我們獲取現成的代碼片段和數據格式。
rf = Roboflow(api_key="your-api-key")
project = rf.workspace("roboflow-100").project("parasites-1s07h")
version = project.version(2)
dataset = version.download("yolov8")
!sed -i '$d' {dataset.location}/data.yaml # Delete the last line
!sed -i '$d' {dataset.location}/data.yaml # Delete the second-to-last line
!sed -i '$d' {dataset.location}/data.yaml # Delete the third-to-last line
!echo 'test: ../test/images' >> {dataset.location}/data.yaml
!echo 'train: ../train/images' >> {dataset.location}/data.yaml
!echo 'val: ../valid/images' >> {dataset.location}/data.yaml
我們需要更新 data.yaml 格式,如下所示,以便以 YOLO11 格式進行訓練。
!sed -i '$d' {dataset.location}/data.yaml # Delete the last line
!sed -i '$d' {dataset.location}/data.yaml # Delete the second-to-last line
!sed -i '$d' {dataset.location}/data.yaml # Delete the third-to-last line
!echo 'test: ../test/images' >> {dataset.location}/data.yaml
!echo 'train: ../train/images' >> {dataset.location}/data.yaml
!echo 'val: ../valid/images' >> {dataset.location}/data.yaml
訓練模型
讓我們在我們的數據集上訓練模型 40 個周期。作為這個項目的一部分,我通過 CLI 命令展示了訓練。在如下所示的簡單命令下定義后,訓練開始。
!yolo task=detect mode=train model=yolo11s.pt data={dataset.location}/data.yaml epochs=40 imgsz=640 plots=True
你也可以使用 Python 創建它,以實現更靈活的場景。下面展示了示例 Python 訓練代碼:
from ultralytics import YOLO
# Load a COCO-pretrained YOLO11n model
model = YOLO("yolo11n.pt")
# Train the model on the COCO8 example dataset for 40 epochs
results = model.train(data="coco8.yaml", epochs=40, imgsz=640)
訓練好的模型保存在 /runs/detect/train/weights 文件下的 best.pt。
一旦你的模型完成訓練,你可以使用 YOLO11 生成的圖表評估訓練結果。
性能指標
混淆矩陣
注意:在訓練模型時,回顧 Ultralytics 文檔中“訓練設置”部分的參數是有益的。這部分對您的訓練過程至關重要。
驗證模型
以下是使用 YOLO11 的 Val 模式的優勢:
- 精度:獲取準確的指標,如 mAP50、mAP75 和 mAP50–95,全面評估你的模型。
- 便利性:利用內置功能記住訓練設置,簡化驗證過程。
- 靈活性:使用相同或不同的數據集和圖像大小驗證你的模型。
- 超參數調整:使用驗證指標微調你的模型以獲得更好的性能。
!yolo task=detect mode=val model={HOME}/runs/detect/train/weights/best.pt data={dataset.location}/data.yaml
Val 結果
一般評估:
- 精確度、召回率和 mAP 指標相當高。
- 盡管不同類別之間存在性能差異,但整體模型性能令人滿意。
- 在速度方面,這是一個有效的模型,推理時間很低。
在測試數據集上運行推理
讓我們評估模型的泛化能力,看看它在之前未見過的測試數據集上的預測。
# predict mode for test data
!yolo task=detect mode=predict model={HOME}/runs/detect/train/weights/best.pt conf=0.25 source={dataset.location}/test/images save=True
# for visualization
latest_folder = max(glob.glob('/content/runs/detect/predict*/'), key=os.path.getmtime)
for img in glob.glob(f'{latest_folder}/*.jpg')[:1]:
display(IPyImage(filename=img, width=600))
print("\n")
結果