使用 YOLO 和計(jì)算機(jī)視覺(jué)進(jìn)行目標(biāo)跟蹤
YOLO 是一種能夠?qū)崟r(shí)進(jìn)行目標(biāo)檢測(cè)的深度學(xué)習(xí)算法。您可以使用預(yù)訓(xùn)練的 YOLO 模型,如 YOLOv8 或 YOLOv9,或者在需要時(shí)在自定義數(shù)據(jù)集上訓(xùn)練自己的模型。在本文中,我將帶您了解如何使用預(yù)訓(xùn)練的 YOLO 模型進(jìn)行目標(biāo)跟蹤。這是最簡(jiǎn)單的教程,我們只處理簡(jiǎn)單的目標(biāo)檢測(cè)。

讓我們看看目標(biāo)檢測(cè)所涉及的步驟。
- 我們將加載模型
- 我們將加載視頻
- 我們將逐幀提取視頻
- 對(duì)每一幀進(jìn)行預(yù)測(cè)并使用 OpenCV 顯示結(jié)果
下面的圖像總結(jié)了這些步驟:

目標(biāo)檢測(cè)步驟 讓我們開(kāi)始編碼。
第 0 步:環(huán)境設(shè)置
我們需要兩個(gè)庫(kù) ultralytics 和 opencv,您可以使用以下代碼安裝這些庫(kù)。
pip install ultralytics opencv-python導(dǎo)入所有必要的庫(kù)。
import cv2 as cv
from ultralytics import YOLO第 1 步:加載模型
#load the model
model = YOLO('yolov8n.pt')在 YOLO 中加載模型非常容易。我們可以直接使用 ultralytics 提供的 YOLO() 函數(shù),并指定模型名稱(chēng)。一旦運(yùn)行,它會(huì)自動(dòng)在代碼所在的文件夾中下載指定的 YOLO 模型。
第 2 步:加載視頻
我們使用 OpenCV 的 VideoCapture() 函數(shù)來(lái)加載視頻。這個(gè)函數(shù)的輸入是視頻的路徑。
path = "../videos/football_test.mp4"
#read video
vs = cv.VideoCapture(path)第 3 步:提取幀
一旦我們加載了視頻,在下一步我們將逐個(gè)提取視頻中的幀。視頻是由連續(xù)拼接在一起的幀組成的。
- vs = cv.VideoCapture(path):包含指向視頻的指針。
- vs.read():允許我們逐幀讀取視頻。一旦我們調(diào)用vs上的read函數(shù),它將以迭代的方式返回當(dāng)前的視頻幀。
- cv.imshow('image', frame):顯示每個(gè)提取出的幀。
path = "../videos/football_test.mp4"
#read video
vs = cv.VideoCapture(path)
#load the model
model = YOLO('yolov8n.pt')
while True:
(grabbed,frame) = vs.read()
if not grabbed:
break
cv.imshow('image', frame)
cv.waitKey(500)第 4 步:應(yīng)用預(yù)測(cè)
模型的predict()方法是用于對(duì)每一幀進(jìn)行預(yù)測(cè)的方法。預(yù)測(cè)結(jié)果存儲(chǔ)在results變量中。在while循環(huán)中,我們從視頻中提取每一幀,并在每一幀上進(jìn)行預(yù)測(cè)。簡(jiǎn)單來(lái)說(shuō),我正在嘗試在視頻中的每一幀中檢測(cè)對(duì)象。
results = model.predict(frame,stream=False)
path = "../videos/football_test.mp4"
#read video
vs = cv.VideoCapture(path)
#load the model
model = YOLO('yolov8n.pt')
while True:
(grabbed,frame) = vs.read()
if not grabbed:
break
results = model.predict(frame,stream=False)
cv.imshow('image', frame)
cv.waitKey(500)第 5 步:繪制邊界框
為了繪制邊界框,我創(chuàng)建了一個(gè)函數(shù),該函數(shù)將輸入圖像、數(shù)據(jù)(包含預(yù)測(cè)結(jié)果)、檢測(cè)到的類(lèi)別名稱(chēng),并返回帶有檢測(cè)到的對(duì)象邊界框的圖像。drawBox(data, image, name):data是預(yù)測(cè)詳情,image是幀,name是檢測(cè)到的類(lèi)別名稱(chēng),例如:人、汽車(chē)等。
def drawBox(data,image,name):
x1, y1, x2, y2, conf, id = data
p1 = (int(x1), int(y1))
p2 = (int(x2), int(y2))
cv.rectangle(image, p1, p2, (0, 0, 255), 3)
cv.putText(image, name, p1, cv.FONT_HERSHEY_SIMPLEX, 3, (0, 0, 255), 3)
return image
results = model.predict(frame,stream=False)
for result in results:
for data in result.boxes.data.tolist():
#print(data)
id = data[5]
drawBox(data, frame,detection_classes[id])由于結(jié)果包含了幀中所有檢測(cè)到的對(duì)象的詳細(xì)信息,我們?cè)谏鲜龃a中對(duì)每個(gè)檢測(cè)到的對(duì)象進(jìn)行解碼。對(duì)于每個(gè)檢測(cè),我們調(diào)用`drawBox(data, frame, detection_classes[id])`來(lái)在檢測(cè)周?chē)L制邊界框。
第 6 步:完整代碼
您也可以在此處訪問(wèn)完整代碼:https://github.com/sunnykumar1516/YOLO/blob/main/ReadVideoApplyYoloV8.py。
import cv2 as cv
from ultralytics import YOLO
def drawBox(data,image,name):
x1, y1, x2, y2, conf, id = data
p1 = (int(x1), int(y1))
p2 = (int(x2), int(y2))
cv.rectangle(image, p1, p2, (0, 0, 255), 3)
cv.putText(image, name, p1, cv.FONT_HERSHEY_SIMPLEX, 3, (0, 0, 255), 3)
return image
detection_classes= []
path = "../videos/football_test.mp4"
#read video
vs = cv.VideoCapture(path)
#load the model
model = YOLO('yolov8n.pt')
while True:
(grabbed,frame) = vs.read()
if not grabbed:
break
results = model.predict(frame,stream=False)
detection_classes = results[0].names
for result in results:
for data in result.boxes.data.tolist():
#print(data)
id = data[5]
drawBox(data, frame,detection_classes[id])完整代碼參考:https://github.com/sunnykumar1516/YOLO/blob/main































