YOLOv10:SOTA 實(shí)時(shí)物體檢測
5 月 23 日,清華大學(xué)發(fā)布了YOLOv10(You Only Look Once v10),與 YOLOv9 相比,YOLOv10 有了顯著改進(jìn),在性能保持不變的情況下,延遲減少了 46%,參數(shù)減少了 25%。
2. YOLOv10 視覺物體檢測:概述
2.1 什么是 YOLO?
YOLO(You Only Look Once)是一種基于深度神經(jīng)網(wǎng)絡(luò)的物體檢測算法,旨在實(shí)時(shí)識(shí)別和定位圖像或視頻中的多個(gè)物體。YOLO 以其快速的處理速度和高精度而聞名,非常適合需要快速檢測物體的應(yīng)用,例如實(shí)時(shí)視頻分析、自動(dòng)駕駛和智能醫(yī)療。
在 YOLO 之前,主流算法是 R-CNN,這是一種“兩階段”方法:首先,生成錨框,然后預(yù)測這些框中的物體。YOLO 通過允許“一階段”直接、端到端輸出物體及其位置,徹底改變了這一現(xiàn)狀。
· 單階段算法:這些模型執(zhí)行直接回歸任務(wù)以輸出對(duì)象概率及其坐標(biāo)。示例包括 SSD、YOLO 和 MTCNN。
· 兩階段算法: 首先生成多個(gè)錨框,然后使用卷積神經(jīng)網(wǎng)絡(luò)輸出這些框內(nèi)物體的概率和坐標(biāo)。例如 R-CNN 系列。
2.2 YOLO的網(wǎng)絡(luò)結(jié)構(gòu)
YOLOv10是YOLOv8的增強(qiáng),我們先簡單看一下YOLOv8的網(wǎng)絡(luò)結(jié)構(gòu):
3.YOLOv10 視覺物體檢測:訓(xùn)練和推理
3.1 安裝YOLOv10
3.1.1 克隆存儲(chǔ)庫
首先從 GitHub 克隆 YOLOv10 存儲(chǔ)庫:
git clone https://github.com/THU-MIG/yolov10.git
3.1.2 創(chuàng)建 Conda 環(huán)境
接下來,專門為 YOLOv10 創(chuàng)建一個(gè)新的 Conda 環(huán)境并激活它:
conda create -n yolov10 python=3.10
conda activate yolov10
3.1.3 下載并編譯依賴包
為了安裝所需的依賴項(xiàng),建議使用騰訊pip鏡像以更快地下載:
pip install -r requirements.txt -i https://mirrors.cloud.tencent.com/pypi/simple
pip install -e . -i https://mirrors.cloud.tencent.com/pypi/simple
3.2 使用 YOLOv10 進(jìn)行模型推理
3.2.1 模型下載
要開始使用 YOLOv10,我們可以使用以下鏈接下載預(yù)先訓(xùn)練的模型:
· YOLOv10-N
· YOLOv10-S
· YOLOv10-M
· YOLOv10-B
· YOLOv10-L
· YOLOv10-X
3.2.2 WebUI 推斷
要使用 WebUI 執(zhí)行推理,請(qǐng)按照以下步驟操作:
導(dǎo)航到 YOLOv10 項(xiàng)目的根目錄。運(yùn)行以下命令啟動(dòng)該應(yīng)用程序:
python app.py
一旦服務(wù)器成功啟動(dòng),我們將看到一條消息,表明應(yīng)用程序正在運(yùn)行并可供使用。
3.2.3 命令行推斷
對(duì)于命令行推理,我們可以在 Conda 環(huán)境中使用 Yolo 命令。設(shè)置和執(zhí)行方法如下:
激活 YOLOv10 Conda 環(huán)境:確保我們已激活之前為 YOLOv10 創(chuàng)建的環(huán)境。
殼
1
conda activate yolov10
使用命令行運(yùn)行推理:使用yolo predict命令進(jìn)行預(yù)測。我們需要指定模型、設(shè)備和源圖像路徑,如下所示:
殼
1
yolo predict model=yolov10n.pt device=2 source=/aigc_dev/yolov10/ultralytics/assets
· model:指定下載的模型文件的路徑(例如,yolov10n.pt)。
· device:指定使用哪個(gè) GPU(例如,device=2 表示 GPU #2)。
· source:指定要檢測對(duì)象的圖像的路徑。
默認(rèn)路徑和結(jié)果:
· 默認(rèn)情況下,需要檢測的圖像應(yīng)該放在yolov10/ultralytics/assets目錄中。
· 檢測后,結(jié)果將保存在名為yolov10/runs/detect/predictxx的目錄中,其中xx代表每次運(yùn)行的唯一標(biāo)識(shí)符。
CoCo 數(shù)據(jù)集上的基準(zhǔn)測試。
3.3 訓(xùn)練YOLOv10模型
除了推理之外,YOLOv10 還支持在自定義數(shù)據(jù)集上進(jìn)行訓(xùn)練。以下是使用命令行訓(xùn)練模型的方法:
要使用 YOLOv10 開始訓(xùn)練,請(qǐng)使用以下命令:
yolo detect train data=coco.yaml model=yolov10s.yaml epochs=100 batch=128 imgsz=640 device=2
以下是命令選項(xiàng)的細(xì)分:
· detect train:這指定我們想要執(zhí)行對(duì)象檢測的訓(xùn)練。
· data=coco.yaml:指定數(shù)據(jù)集配置文件,默認(rèn)數(shù)據(jù)集(COCO)下載并存放在此../datasets/coco目錄下。
· model=yolov10s.yaml:指定要訓(xùn)練的模型的配置文件。
· epochs=100:設(shè)置訓(xùn)練迭代次數(shù)(epoch)。
· batch=128:指定訓(xùn)練的批次大小,即每個(gè)訓(xùn)練步驟處理的圖像數(shù)量。
· imgsz=640:表示訓(xùn)練期間所有輸入圖像將調(diào)整到的圖像大小。
· device=2:指定使用哪個(gè) GPU 進(jìn)行訓(xùn)練(例如,device=2GPU #2)。
示例解釋
假設(shè)你已經(jīng)正確設(shè)置了 YOLOv10 環(huán)境和數(shù)據(jù)集,運(yùn)行上述命令將在指定的GPU上啟動(dòng)訓(xùn)練過程。該模型將以 128 的批大小進(jìn)行 100 個(gè) epoch 的訓(xùn)練,輸入圖像的大小將調(diào)整為 640x640 像素。
訓(xùn)練 YOLOv10 的步驟
準(zhǔn)備數(shù)據(jù)集
· 確保我們的數(shù)據(jù)集在 coco.yaml 文件(或我們自己的自定義數(shù)據(jù)集配置文件)中格式正確且描述正確。
· 數(shù)據(jù)集配置文件包括訓(xùn)練和驗(yàn)證數(shù)據(jù)的路徑以及類別的數(shù)量。
配置模型
· 模型配置文件(例如,yolov10s.yaml)包含我們正在訓(xùn)練的 YOLOv10 變體特定設(shè)置,包括架構(gòu)和初始權(quán)重。
運(yùn)行訓(xùn)練命令
· 使用上面提供的命令開始訓(xùn)練過程。根據(jù)我們的硬件能力和訓(xùn)練要求調(diào)整 epochs、batch、imgsz 和 device 等參數(shù)。
監(jiān)測和評(píng)估
· 在訓(xùn)練期間,如果可用,請(qǐng)通過日志或可視化工具監(jiān)控進(jìn)度。
· 訓(xùn)練后,在驗(yàn)證集上評(píng)估模型性能以確保其符合我們的期望。
使用Yolo10進(jìn)行實(shí)時(shí)在線物體檢測的Demo案例:
Python
1
import cv2
from ultralytics import YOLOv10
model = YOLOv10("yolov10s.pt")
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
results = model.predict(frame)
for result in results:
boxes = result.boxes
for box in boxes:
x1,y1,x2,y2 = map(int, box.xyxy[0])
cls = int(box.cls[0])
conf = float(box.conf[0])
cv2.rectangle(frame, (x1, y1), (x2, y2), (255, 0, 0), 2)
cv2.putText(frame, f'{model.names[cls]} {conf:.2f}', (x1, y1 - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
cv2.imshow('YOLOv10', frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
我們可以構(gòu)建工作站來運(yùn)行/訓(xùn)練 AI 系統(tǒng)。為了省錢,我們還可以在網(wǎng)上找到 GPU 等廉價(jià)組件。