YOLO(You Only Look Once)是一种实时目标检测算法。本文将介绍如何使用 YOLOv4 模型检测所有物体或单独检测一类物体,以及在使用过程中需要注意的事项。
1. 准备工作
在使用 YOLOv4 模型进行目标检测之前,需要先完成以下几个步骤:
- 安装 OpenCV 库。OpenCV 是一个开源的计算机视觉库,在目标检测中常用于处理图像和绘制边界框。
- 下载 YOLOv4 模型。YOLOv4 模型包括配置文件(
.cfg
)和权重文件(.weights
)两个部分,可以从 YOLOv4 的 GitHub 仓库中下载。 GitHub 仓库:https://github.com/AlexeyAB/darknet 在 GitHub 仓库中,可以在 darknet/cfg 目录下找到 YOLOv4 的配置文件,在 darknet/backup 目录下可以找到 YOLOv4 的权重文件。需要确保配置文件和权重文件的版本和类型是匹配的。例如,如果使用的是 YOLOv4-tiny 模型,那么需要使用 YOLOv4-tiny 的配置文件和权重文件。 - 准备待检测的图像或视频。在进行目标检测之前,需要先准备好待检测的图像或视频。
2. 使用 YOLOv4 模型检测所有物体
在使用 YOLOv4 模型进行目标检测时,需要先加载模型和设置类标签,然后在图像或视频中检测目标并绘制边界框。以下是使用 YOLOv4 模型检测所有物体的具体步骤:
-
加载 YOLOv4 模型。在使用 YOLOv4 模型进行目标检测之前,需要先将其加载到内存中。可以使用 OpenCV 的
dnn.readNetFromDarknet
函数来加载 YOLOv4 模型,其中需要提供模型的配置文件和权重文件。 -
在图像中检测目标并绘制边界框。在进行目标检测时,需要先将图像调整为网络输入大小,然后将其输入到 YOLOv4 模型中,并获取检测结果。在检测到物体时,需要根据类别标签和置信度阈值来过滤检测结果,并在图像中绘制边界框。
import cv2
# 定义检测函数
def detect_and_draw_boxes(
image_path, YOLO_net, classes, confThreshold=0.2, nmsThreshold=0.4
):
"""
加载YOLO模型并在图像中检测目标,并绘制边界框。
参数:
image_path (str): 待检测的图像路径。
cfg_file (str): YOLO模型的配置文件路径。
weights_file (str): YOLO模型的权重文件路径。
classes (list): 目标类别标签列表。
confThreshold (float): 置信度阈值。
nmsThreshold (float): NMS阈值。
"""
# 读取图像
print(image_path)
image = cv2.imread(image_path)
# 将图像调整为网络输入大小
blob = cv2.dnn.blobFromImage(
image, 1 / 255.0, (416, 416), (0, 0, 0), swapRB=True, crop=False
)
# 将blob输入网络
YOLO_net.setInput(blob)
# 运行前向传播并获取检测结果
detections = YOLO_net.forward()
_detections = [] # 检测到的所有检测结果,未过滤相似的边框
_scores = []
for detection in detections:
# 检查检测置信度
confidence = detection[5]
if confidence > confThreshold:
# 获取检测边界框
x, y, w, h = (
detection[0:4]
* [image.shape[1], image.shape[0], image.shape[1], image.shape[0]]
).astype(int)
# 计算边界框的左上角和右下角坐标
x1 = x - w // 2
y1 = y - h // 2
x2 = x + w // 2
y2 = y + h // 2
# 限制坐标在图像范围内
x1 = max(0, x1)
y1 = max(0, y1)
x2 = min(image.shape[1], x2)
y2 = min(image.shape[0], y2)
_detections.append((x1, y1, x2, y2))
_scores.append(detection[5])
# 应用NMS,结果为_detections的索引
filtered_indexs = cv2.dnn.NMSBoxes(
_detections,
_scores,
confThreshold,
nmsThreshold,
)
print(
f"共获得{len(_detections)}个检测结果,其中经过NMS处理后保留了{len(filtered_indexs)}个检测结果"
)
for index in filtered_indexs:
x1, y1, x2, y2 = _detections[index]
cv2.rectangle(image, (x1, y1), (x2, y2), (0, 255, 0), 2)
# 返回带有边界框的图像
return image
# 加载 YOLOv4 模型
net = cv2.dnn.readNetFromDarknet("yolov4.cfg", "yolov4.weights")
# 设置类标签
classes = ["person", "car", "truck"]
# 在图像中检测目标并绘制边界框
image = cv2.imread("test.jpg")
detected_image = detect_and_draw_boxes(image, net, classes)
cv2.imshow("image", detected_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
3. 注意事项
在使用 YOLOv4 模型进行目标检测时,需要注意以下几个事项:
- 模型的选择。在使用 YOLOv4 模型进行目标检测时,可以选择不同的模型,如 YOLOv4、YOLOv4-tiny 等。不同的模型在速度和准确性上有所不同,可以根据实际需求进行选择。
- 类别标签的设置。在设置类别标签时,需要确保类别标签与模型中的类别标签一致。否则,可能会导致检测结果的错误。
- 置信度阈值的设置。在过滤检测结果时,需要设置一个合适的置信度阈值。如果置信度阈值过高,可能会导致漏检;如果置信度阈值过低,可能会导致误检。
- NMS 算法的使用。在过滤检测结果时,可以使用 NMS 算法来去除相似的边界框。在使用 NMS 算法时,需要设置一个合适的 NMS 阈值。