三、计算机视觉_08YOLO目标检测
0、前言
YOLO作为目前CV领域的扛把子,分类、检测等任务样样精通,本文将基于两个小案例,用YOLO做检测任务,看看效果如何
1、对图片内容做检测
假设我有一张名为picture.jpeg的图片,其内容如下
我将图片和代码放到了同级目录
代码如下:
from ultralytics import YOLO
import cv2
import os
# 解决OMP问题
os.environ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
# 加载模型
model = YOLO("yolo11n.pt")
# 读取图片(这里要写图片的路径和名称)
image = cv2.imread("picture.jpeg")
# 预测
results = model(image)
# 绘制预测结果
img = results[0].plot()
from matplotlib import pyplot as plt
import matplotlib
matplotlib.use('TkAgg')
# 显示图像(BGR转RGB)
# OpenCV默认使用BGR颜色顺序,matplotlib默认使用RGB颜色顺序,所以需要先进行转换,然后才能正常显示
plt.imshow(X=img[:, :, ::-1])
plt.show()
运行结果:(检测出了图片中的目标物,并对边框线、标签以及置信度做了标注)
2、对视频内容做检测
2.1 本地视频
假设我有一段视频文件(bwgqmy.mp4),我需要对视频中的内容进行检测
我将视频文件和代码放到了同级目录
代码如下:
PS:其实视频检测和上面的图片检测一样,是将视频拆分成一帧一帧的图片来做检测,连起来就是视频效果
from ultralytics import YOLO
import cv2
# 加载YOLO模型
model = YOLO("yolo11n.pt")
# 打开视频(填写自己电脑上想要检测的视频路径和名称即可)
cap = cv2.VideoCapture("bwgqmy.mp4")
while cap.isOpened():
# read方法用于尝试读取一帧图像,并返回两个值:
# (1)status(布尔值,表示是否成功读取帧)
# (2)frame(读取到的帧图像)
status, frame = cap.read()
# 如果读取失败,则跳出循环
if not status:
print("error")
break
# 如果视频太大了,则缩小尺寸
# height, width = frame.shape[:2]
# new_width = width // 2
# new_height = height // 2
# frame = cv2.resize(frame, (new_width, new_height))
# 使用YOLO模型检测物体
results = model(frame)
# 绘制预测结果
img = results[0].plot()
# 显示图像(循环显示预测结果的图像,就相当于视频效果)
cv2.imshow("demo", img)
# 如果按下的是ESC键(ASCII码为27),则跳出循环
if cv2.waitKey(delay=1000 // 24) == 27:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
运行结果:(检测出了视频中的目标物,并对边框线、标签以及置信度做了标注)
2.2 摄像头
假设我需要对我电脑摄像头拍摄到的内容进行检测
代码如下:
PS:其实和视频检测一样,是将摄像头拍到的内容拆分成一帧一帧的图片来做检测
from ultralytics import YOLO
import cv2
# 加载YOLO模型
model = YOLO("yolo11n.pt")
# 调起电脑的第0个摄像头
cap = cv2.VideoCapture(0)
while cap.isOpened():
# read方法用于尝试读取一帧图像,并返回两个值:
# (1)status(布尔值,表示是否成功读取帧)
# (2)frame(读取到的帧图像)
status, frame = cap.read()
# 如果读取失败,则跳出循环
if not status:
print("error")
break
# 如果显示区域太大了,则缩小尺寸
# height, width = frame.shape[:2]
# new_width = width // 2
# new_height = height // 2
# frame = cv2.resize(frame, (new_width, new_height))
# 使用YOLO模型检测物体
results = model(frame)
# 绘制预测结果
img = results[0].plot()
# 显示图像(循环显示预测结果的图像,就相当于视频效果)
cv2.imshow("demo", img)
# 如果按下的是ESC键(ASCII码为27),则跳出循环
if cv2.waitKey(delay=1000 // 24) == 27:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
运行结果:(检测出了摄像头中的目标物,并对边框线、标签以及置信度做了标注)