从部署方式上,Yolo支持两种方式的应用:
这里我们需要首先下载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官方的项目包来进行检测。
在使用Yolo之前,我们需要确认Python环境中包含:
1.12.1+cu116
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
这个得到了我们想要的图片:
嗯,这才有Yolo内味儿嘛。
至于这个detect,py还有另外一个重要的参数:--weights
,即为权重值,这个需要我们单独对Yolo模型进行训练后才能得到。我将会用另外一个文章来表达它。
好了,写完了,赶紧去上课,我是Deahost,下期见。