点击上方
“
小白学视觉
”,选择加"
星标
"或“
置顶
”
重磅干货,第一时间送达
![](http://mmbiz.qpic.cn/mmbiz_jpg/ow6przZuPIENb0m5iawutIf90N2Ub3dcPuP2KXHJvaR1Fv2FnicTuOy3KcHuIEJbd9lUyOibeXqW8tEhoJGL98qOw/640?wx_fmt=jpeg)
YOLO是一种深度学习算法,用于实时进行目标检测。您可以使用预训练的YOLO模型,如YOLOv8或YOLOv9,或者根据需要在自定义数据集上训练自己的模型。在本文中,我将带您了解如何使用预训练的YOLO模型进行目标跟踪。这是最简单教程,我们只处理简单的目标检测。
完整代码:
https://github.com/sunnykumar1516/YOLO/blob/main
-
-
-
-
在每个提取出的帧上,我们将应用预测并使用opencv显示结果。
步骤0:环境设置
我们将需要两个库ultralytics和opencv,您可以使用以下代码安装这些库。
pip install opencv-python
pip install ultralytics
import cv2 as cv
from ultralytics import YOLO
在yolo中加载模型非常容易。我们可以直接使用ultralytics中的YOLO(),并提供模型名称。一旦您运行它,指定的yolo模型将自动下载到您的代码所在文件夹。
model = YOLO('yolov8n.pt')
我们使用opencv中的VideoCapture()来加载视频。这个函数的输入是视频的路径。
path = "../videos/football_test.mp4"
vs = cv.VideoCapture(path)
path = "../videos/football_test.mp4"
vs = cv.VideoCapture(path)
model = YOLO('yolov8n.pt')
while True:
(grabbed,frame) = vs.read()
if not grabbed:
break
cv.imshow('image', frame)
cv.waitKey(500)
一旦我们加载了视频,在下一步我们将逐个提取视频中的帧。视频是一系列帧的组合。
-
vs = cv.VideoCapture(path):包含视频的指针。
-
vs.read():使我们能够逐帧读取视频。一旦我们调用vs上的read函数,它将以迭代方式返回当前的视频帧。
每个提取出的帧都使用cv.imshow('image', frame)显示。
results = model.predict(frame,stream=False)
path = "../videos/football_test.mp4"
vs = cv.VideoCapture(path)
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)
model.predict()是用于对每个帧进行预测的方法。预测结果存储在results变量中。
在while循环中,我们逐个提取视频中的每个帧,并对每个帧进行预测。简单来说,我正在尝试检测视频中每一帧中的对象。
为了绘制边界框,我创建了一个函数,它将输入图像、数据(包含预测结果)、检测到的类别名称,并返回带有检测对象边界框的图像。drawBox(data, image, name):data是预测详情,image是帧,name是检测到的类别名称,如:人、汽车等。
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])
由于结果包含一帧中所有检测到的对象的详细信息,我们在上述代码中对每个检测到的对象进行了解析。对于每个检测,我们调用“drawBox(data, frame, detection_classes[id])”,以在检测周围绘制边界框。
这就是完整代码现在的样子。您也可以在这里访问完整代码,
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"
vs = cv.VideoCapture(path)
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():
id = data[5]
drawBox(data, frame,detection_classes[id])