Python> 正文

使用 YOLOv4 模型检测所有物体或单独检测一类物体

2024-05-30T12:21:33+08:00

YOLO(You Only Look Once)是一种实时目标检测算法。本文将介绍如何使用 YOLOv4 模型检测所有物体或单独检测一类物体,以及在使用过程中需要注意的事项。

1. 准备工作

在使用 YOLOv4 模型进行目标检测之前,需要先完成以下几个步骤:

  1. 安装 OpenCV 库。OpenCV 是一个开源的计算机视觉库,在目标检测中常用于处理图像和绘制边界框。
  2. 下载 YOLOv4 模型。YOLOv4 模型包括配置文件(.cfg)和权重文件(.weights)两个部分,可以从 YOLOv4 的 GitHub 仓库中下载。 GitHub 仓库:https://github.com/AlexeyAB/darknet 在 GitHub 仓库中,可以在 darknet/cfg 目录下找到 YOLOv4 的配置文件,在 darknet/backup 目录下可以找到 YOLOv4 的权重文件。需要确保配置文件和权重文件的版本和类型是匹配的。例如,如果使用的是 YOLOv4-tiny 模型,那么需要使用 YOLOv4-tiny 的配置文件和权重文件。
  3. 准备待检测的图像或视频。在进行目标检测之前,需要先准备好待检测的图像或视频。

2. 使用 YOLOv4 模型检测所有物体

在使用 YOLOv4 模型进行目标检测时,需要先加载模型和设置类标签,然后在图像或视频中检测目标并绘制边界框。以下是使用 YOLOv4 模型检测所有物体的具体步骤:

  1. 加载 YOLOv4 模型。在使用 YOLOv4 模型进行目标检测之前,需要先将其加载到内存中。可以使用 OpenCV 的 dnn.readNetFromDarknet 函数来加载 YOLOv4 模型,其中需要提供模型的配置文件和权重文件。

  2. 在图像中检测目标并绘制边界框。在进行目标检测时,需要先将图像调整为网络输入大小,然后将其输入到 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 模型进行目标检测时,需要注意以下几个事项:

  1. 模型的选择。在使用 YOLOv4 模型进行目标检测时,可以选择不同的模型,如 YOLOv4、YOLOv4-tiny 等。不同的模型在速度和准确性上有所不同,可以根据实际需求进行选择。
  2. 类别标签的设置。在设置类别标签时,需要确保类别标签与模型中的类别标签一致。否则,可能会导致检测结果的错误。
  3. 置信度阈值的设置。在过滤检测结果时,需要设置一个合适的置信度阈值。如果置信度阈值过高,可能会导致漏检;如果置信度阈值过低,可能会导致误检。
  4. NMS 算法的使用。在过滤检测结果时,可以使用 NMS 算法来去除相似的边界框。在使用 NMS 算法时,需要设置一个合适的 NMS 阈值。
分享到:

Ranvane的日常记录

关于我们 客服中心 广告服务 法律声明