初见YoloV3:部署与应用

目录

  • 部署方式
      • OpenCV方式部署
      • 使用Yolo v3官方仓库进行部署
      • 总结

部署方式

从部署方式上,Yolo支持两种方式的应用:

  • 使用OpenCV读取Yolo官方提供的权重和配置文件
  • 克隆完整Yolo官方Github仓库,并调用脚本进行检测

OpenCV方式部署

这里我们需要首先下载Yolo v3的weights权重文件cfg配置文件,这里我分别提供官方的权重文件和cfg文件的下载地址,这里我使用的是Yolo v3 416模型,这里的416指的是模型所接受的输入图片大小为416*416

下载好后,我们可以开始进行脚本的编写了

# 导入OpenCV和numpy
import cv2 as cv
import numpy as np

# 初始化窗口
cv.namedWindow("YoloV3Rendered", cv.WINDOW_AUTOSIZE)

# 记载yolo权重和配置文件
net = cv.dnn.readNet("../configs/yolov3.weights", "../configs/yolov3.cfg")

# 初始化classes类列表
classes = []

# 读取coco.names文件
with open("../configs/coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]

# 获取输出层
layer_names = net.getLayerNames()
# 获取输出层的索引
output_layers = [layer_names[i - 1] for i in net.getUnconnectedOutLayers()]

# 定义颜色组矩阵,为了保证色系的一致性,所以用uniform保证一致性
colors = np.random.uniform(0, 255, size=(len(classes), 3))

# 读取图片
img = cv.imread("../img/demo.jpg")
# 重塑图像
img = cv.resize(img, None, fx=0.4, fy=0.4)
height, width, channel = img.shape
# 初始化blob检测对象
# 由于我们的yolo权重是基于416*416的,所以我们需要将图片resize到416*416
blob = cv.dnn.blobFromImage(
    img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
# 为网络设置目标检测器参数
net.setInput(blob)
# 进行前向传播
outs = net.forward(output_layers)


# 创建三个列表,用于表示检测的索引,置信度,边框
class_ids = []
confidences = []
boxes = []
for out in outs:
    for detection in out:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.5:
            # 进行目标检测,获取检测目标的x和y
            center_x = int(detection[0] * width)
            center_y = int(detection[1] * height)
            w = int(detection[2] * width)
            h = int(detection[3] * height)
            # 计算边框的左上角坐标
            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)

# 初始化cv2字体设置
font = cv.FONT_HERSHEY_PLAIN
# 绘制边框
for i in range(len(boxes)):
    if i in class_ids:
        # 从boxes中获取边框
        x, y, w, h = boxes[i]
        # 读取id
        label = str(classes[class_ids[i]])
        # 读取颜色
        color = colors[i]
        cv.rectangle(img, (x, y), (x + w, y + h), color, 2)
        cv.putText(img, label, (x, y + 30), font, 3, color, 3)

# 显示图片
cv.imshow("YoloV3Rendered", img)
cv.waitKey(0)
cv.destroyAllWindows()

执行结果很明显如下图,似乎少点Yolo内味儿是吧,没关系,别着急,接下来我们就使用Yolo官方的项目包来进行检测。
初见YoloV3:部署与应用_第1张图片

使用Yolo v3官方仓库进行部署

在使用Yolo之前,我们需要确认Python环境中包含:

  • Pytorch全家桶:包含torch,torchvision,torchaudio,这里笔者的版本为1.12.1+cu116
  • CUDA Toolkit,笔者当前版本为11.6

我们使用git clone指令将Yolo v3官方仓库克隆下来。
我们会得到如下的文件结构:

├───.github
│   ├───ISSUE_TEMPLATE
│   └───workflows
├───data
│   ├───hyps
│   ├───images
│   └───scripts
├───models
│   └───__pycache__
├───runs
│   └───detect
│       ├───exp
│       ├───exp2
│       ├───exp3
│       ├───exp4
│       ├───exp5
│       └───exp6
└───utils
    ├───loggers
    │   └───wandb
    └───__pycache__

对于我们使用预训练模型的情况,我们只需要知道如何使用detect.py这个文件即可。
那么我们只需要调用如下指令即可使用官方的目标检测器啦:

python ./yolov3/detect.py --source ./img/demo.jpg

这里的--source指的是输入的源文件,Yolo官方支持多种格式:HTML链接,本地端的AVI,MP4视频格式;JPG,PNG等多种图像格式。
执行完上述指令后,我们在./yolov3/runs/exp这个得到了我们想要的图片:
初见YoloV3:部署与应用_第2张图片
嗯,这才有Yolo内味儿嘛。
至于这个detect,py还有另外一个重要的参数:--weights,即为权重值,这个需要我们单独对Yolo模型进行训练后才能得到。我将会用另外一个文章来表达它。

总结

好了,写完了,赶紧去上课,我是Deahost,下期见。

你可能感兴趣的:(opencv,计算机视觉,深度学习)