OpenCV调用YOLOv3目标检测示例

1.OpenCV支持的深度学习框架

        对于我们新手来说自己去实现一些深度学习目标检测算法难度很大,不过OpenCV的DNN(深度学习模块)里封装了各种 深度学习框架供我们使用。

        比如我们常见的下面四种框架:

        -TensorFlow       -Caffe         -Darknet      -Pytorch

2.用到的API

2.1cv2.dnn.readNet(model,config)

        我们可以通过cv2.dnn.readNet(model,config)函数来读取 网络,导入相应的模型。其中model为我们训练的模型文件比如yolo就是.weights文件,而conifg为神经网络的配置文件。

2.2cv2.dnn.blobFromImage(img, scalefactor, size, mean, swapRB, crop)

        其中img为输入图像,scalefactor为缩放因子,size为输入图片大小,mean为图像RGB三个通道减去的均值 用来减少图片受光照影响,swapRB是否交换RB通道,crop代表是否裁剪。

2.3net.setInput(blob)  net.forward()

        net.setInput(blob)是把图像张量blob(由2.2得到)送入网络输入,net.forward()对blob进行网络的相应执行操作,比如卷积 、池化,最后得到输出结果。

3.Yolov3示例

        具体过程不过多阐述,有机会后面文章出。

import cv2
import numpy as np
from matplotlib import pyplot as plt

# Load Yolo
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
classes = []
with open("coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]

layer_names = net.getLayerNames()
print(len(layer_names))
output_layers = [layer_names[i-1] for i in net.getUnconnectedOutLayers()]
print(output_layers)
colors = np.random.uniform(0, 255, size=(len(classes), 3)) / 255

# Loading image
img = cv2.imread("traffic.jpg")
#img = cv2.resize(img, None, fx=0.4, fy=0.4)
height, width, channels = img.shape

# Detecting objects
blob = cv2.dnn.blobFromImage(img, 1.0 / 255.0, (320 , 320), (0, 0, 0), True, crop=False)

net.setInput(blob)
outs = net.forward(output_layers)

# Showing informations on the screen
class_ids = []
confidences = []
boxes = []

fig = plt.gcf()
fig.set_size_inches(20, 10)
plt_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(plt_img)

for out in outs:
    for detection in out:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.5:
            # Object detected
            center_x = int(detection[0] * width)
            center_y = int(detection[1] * height)
            w = int(detection[2] * width)
            h = int(detection[3] * height)

            # Rectangle coordinates
            x = int(center_x - w / 2)
            y = int(center_y - h / 2)

            boxes.append([x, y, w, h])
            confidences.append(float(confidence))
            class_ids.append(class_id)

indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)

for i in range(len(boxes)):
    if i in indexes:
        x, y, w, h = boxes[i]
        label = str(classes[class_ids[i]])
        color = colors[i]
        plt.gca().add_patch(
            plt.Rectangle((x, y), w,
                          h, fill=False,
                          edgecolor=color, linewidth=2)
            )
        plt.text(x, y - 10, label, color = color, fontsize=20)
 
plt.show()
 

现象如下:

  • 24
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要在 OpenCV 中使用 YOLOv7 模型进行目标检测,你需要首先下载和安装 YOLOv7 模型和权重文件。可以从以下链接获取这些文件: 模型:https://github.com/WongKinYiu/yolov7/tree/master/models 权重:https://github.com/WongKinYiu/yolov7/releases/download/v1.0/yolov7-tiny.pt 然后,你可以使用 OpenCV 中的 `dnn` 模块来加载模型和权重,并将其应用于图像。下面是一个简单的代码示例: ```python import cv2 # 加载模型和权重 model = cv2.dnn.readNetFromDarknet('path/to/yolov7.cfg', 'path/to/yolov7-tiny.weights') # 加载类别标签 with open('path/to/labels.txt', 'r') as f: labels = [line.strip() for line in f.readlines()] # 加载图像 img = cv2.imread('path/to/image.jpg') # 将图像送入模型进行目标检测 blob = cv2.dnn.blobFromImage(img, 1 / 255.0, (416, 416), swapRB=True, crop=False) model.setInput(blob) outputs = model.forward(model.getUnconnectedOutLayersNames()) # 处理模型输出 for output in outputs: for detection in output: scores = detection[5:] class_id = np.argmax(scores) confidence = scores[class_id] if confidence > 0.5: x, y, w, h = detection[:4] * np.array([img.shape[1], img.shape[0], img.shape[1], img.shape[0]]) x, y, w, h = int(x - w / 2), int(y - h / 2), int(w), int(h) cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2) cv2.putText(img, labels[class_id], (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) # 显示结果图像 cv2.imshow('Image', img) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这个代码示例YOLOv7 模型应用于输入图像,并显示检测结果。你需要将 `path/to` 替换为相应的文件路径。 ### 回答2: OpenCV是一个功能强大的计算机视觉库,它提供了许多机器学习算法和计算机视觉技术的实现。使用OpenCV调用Yolov7意味着我们可以利用OpenCV的图像处理功能来执行实时目标检测Yolov7是一种使用卷积神经网络(CNN)实现的目标检测算法。它能够识别图像中的多个目标,并准确地标记它们的位置。通过结合OpenCVYolov7,我们可以实现在图像或视频中实时检测目标。 首先,我们需要安装并配置OpenCVYolov7的环境。这包括安装OpenCV库文件和相应的依赖项,以及下载和配置Yolov7的模型文件和权重。 然后,我们可以使用OpenCV提供的函数和方法来读取图像或视频文件,并将其传递给Yolov7的模型。Yolov7将对图像或视频进行处理,并返回检测到的目标及其位置信息。 最后,我们可以使用OpenCV提供的绘制函数将检测结果标记在图像或视频中。这样,我们就可以实时地看到Yolov7检测到的目标以及它们的位置信息。 需要注意的是,调用Yolov7需要一定的计算资源和时间。较大的图像或高分辨率的视频可能需要更长的处理时间。另外,Yolov7的性能还受到硬件设备的限制。 总之,使用OpenCV调用Yolov7可以实现实时目标检测的功能。通过结合这两个强大的工具,我们可以在计算机视觉领域实现更精确和高效的目标识别应用。 ### 回答3: OpenCV是一个开源的计算机视觉库,它可以用来处理图像和视频。Yolov7是一个基于深度学习的目标检测算法,它可以用于检测图像中的不同目标物体。 要在OpenCV调用Yolov7,需要先安装OpenCVYolov7的运行环境。可以通过pip或者conda安装OpenCV,并且根据官方文档安装Yolov7的环境。 安装完成后,可以使用OpenCV的接口来读取图像或者视频,并将其传递给Yolov7进行目标检测。首先,需要加载Yolov7的网络模型,可以使用OpenCV提供的函数来加载预训练的权重文件和配置文件。 然后,将图像或者视频帧传递给Yolov7的网络模型进行推理。可以使用OpenCV提供的函数来调用Yolov7进行目标检测,并得到检测结果。检测结果包括目标的类别、位置和置信度等信息。 最后,可以使用OpenCV的函数将检测结果绘制在原始图像上,并显示出来。可以使用不同的颜色来标记不同类别的目标,并在目标周围绘制矩形框。 通过这样的步骤,就可以实现在OpenCV调用Yolov7进行目标检测。这样可以方便地将目标检测算法与OpenCV的其他功能结合起来,实现更复杂的图像处理任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值