21xrx.com
2024-12-26 04:36:39 Thursday
登录
文章检索 我的文章 写文章
OpenCV调用Yolov5:实现目标检测
2023-09-23 06:44:31 深夜i     --     --
OpenCV Yolov5 目标检测 调用 实现

OpenCV是一个广泛应用于计算机视觉领域的开源库,它提供了许多功能强大的图像处理和计算机视觉算法。Yolov5是一个基于深度学习的目标检测算法,它能够快速准确地识别图像中的多个目标。在这篇文章中,我们将介绍如何使用OpenCV调用Yolov5来实现目标检测。

首先,我们需要安装OpenCV和Yolov5的相关库和模型。可以通过pip命令来安装它们:


pip install opencv-python

pip install opencv-contrib-python

pip install yolov5

在安装完成后,我们可以开始编写代码。首先,我们需要导入所需的库:

python

import cv2

import torch

from torchvision.models import load_state_dict_from_url

from yolov5.models.experimental import attempt_load

from yolov5.utils.torch_utils import select_device, time_synchronized

from yolov5.utils.general import non_max_suppression, scale_coords

然后,我们需要定义一些辅助函数,例如加载模型和类别文件,以及进行目标检测的函数:

python

def load_model():

  model = attempt_load("yolov5s.pt", map_location=torch.device('cpu'))

  return model

def load_classes():

  with open("coco.names", "r") as f:

    classes = [line.strip() for line in f.readlines()]

  return classes

def detect_objects(image, model, classes):

  device = select_device('')

  model.to(device).eval()

  img = torch.from_numpy(image).to(device)

  img = img.float() / 255.0

  img = img.unsqueeze(0)

  pred = model(img)[0]

  pred = non_max_suppression(pred, 0.4, 0.5)

  for det in pred:

    if len(det):

      det[:, :4] = scale_coords(img.shape[2:], det[:, :4], image.shape).round()

      for *xyxy, conf, cls in reversed(det):

        label = f'{classes[int(cls)]} {conf:.2f}'

        plot_one_box(xyxy, image, label=label)

  return image

def plot_one_box(xyxy, img, color=(0, 255, 0), label=None, line_thickness=3):

  tl = line_thickness or round(0.002 * (img.shape[0] + img.shape[1]) / 2) + 1

  c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))

  cv2.rectangle(img, c1, c2, color, thickness=tl, lineType=cv2.LINE_AA)

  if label:

    tf = max(tl - 1, 1)

    t_size = cv2.getTextSize(label, 0, fontScale=tl / 3, thickness=tf)[0]

    c2 = c1[0] + t_size[0], c1[1] - t_size[1] - 3

    cv2.rectangle(img, c1, c2, color, -1, cv2.LINE_AA)

    cv2.putText(

      img, label, (c1[0], c1[1] - 2), 0, tl / 3, [225, 255, 255], thickness=tf, lineType=cv2.LINE_AA

    )

接下来,我们可以使用OpenCV读取图像并调用目标检测函数:

python

if __name__ == '__main__':

  # 加载模型和类别文件

  model = load_model()

  classes = load_classes()

  # 读取图像

  image = cv2.imread("image.jpg")

  # 目标检测

  result = detect_objects(image, model, classes)

  # 显示结果

  cv2.imshow("Object Detection", result)

  cv2.waitKey(0)

  cv2.destroyAllWindows()

通过以上步骤,我们就可以使用OpenCV调用Yolov5来实现目标检测了。只需几行代码,就能够快速准确地检测出图像中的多个目标。这对于许多计算机视觉应用,如视频监控、自动驾驶等都非常有用。OpenCV和Yolov5的结合为我们提供了一个强大的工具,帮助我们更好地理解和分析图像中的信息。希望本文能够对读者们在目标检测方面的学习和应用有所帮助。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复