📜  YOLO : You Only Look Once – 实时目标检测(1)

📅  最后修改于: 2023-12-03 15:06:06.508000             🧑  作者: Mango

YOLO : You Only Look Once – 实时目标检测

简介

YOLO: You Only Look Once 是一种实时目标检测算法,可以在一张图片中同时预测多个目标,并且速度非常快。其前身是实时目标检测算法R-CNN和Fast R-CNN,但是这两种算法的速度和实时性并不够强。YOLO算法的特点在于将目标检测问题转化为一个回归问题,通过一个神经网络直接从一张完整的图像中直接预测出目标的类别和位置信息。

原理

YOLO框架的核心是一个完全卷积网络,它把图像分成 SxS 个网格,每个格子可以预测 B 个bounding box以及这些bounding box的置信度,同时也预测该bounding box所含类别的概率。

YOLO的输出由2部分组成,一部分是bounding box的位置信息 (x,y,w,h),另一部分则是这个bounding box所包含的不同目标的类别概率值。

在训练过程中,目标变换为了一个回归问题,即通过一个CNN网络直接从原始图像中提取目标位置等信息,然后由softmax计算出每个目标的置信度。

优缺点

优点:

  • YOLO是实时目标检测算法,速度极快。
  • YOLO将目标检测问题转化为一个回归问题,通过一个神经网络直接从一张完整的图像中直接预测出目标的类别和位置信息,一次卷积即可完成。

缺点:

  • 对于小的物体检测效果较差,其原因是在整张图片中,小物体占的位置很少,因此网络会很难发现其存在。
  • 对于类别不够多的情况下,准确率比较低。
应用
  • 自动驾驶方面的应用
  • 视频监控领域的应用
  • 图像检索等应用
代码示例
import cv2
import numpy as np

# 加载图片
image = cv2.imread('test.jpg')

# 初始化权重及超参数
net = cv2.dnn.readNetFromDarknet('yolo.cfg', 'yolo.weights')
ln = net.getLayerNames()
ln = [ln[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# 设置标签
labels = ['person', 'car', 'truck', 'bus']

# 构建blob
blob = cv2.dnn.blobFromImage(image, 1 / 255.0, (416, 416), swapRB=True, crop=False)
net.setInput(blob)

# 前向传播计算
outputs = net.forward(ln)

# 循环输出层
for output in outputs:
    # 循环预测
    for detection in output:
        # 提取类别 ID 和 置信度
        scores = detection[5:]
        classID = np.argmax(scores)
        confidence = scores[classID]

        # 过滤掉置信度太低的
        if confidence > 0.5:
            # 几何中心 + 宽高
            box = detection[0:4] * np.array([w, h, w, h])
            (centerX, centerY, width, height) = box.astype('int')

            # 边框
            x = int(centerX - (width / 2))
            y = int(centerY - (height / 2))

            # 计算颜色和类别名称
            color = [int(c) for c in COLORS[classID]]
            text = '{}: {:.4f}'.format(classes[classID], confidence)

            # 绘制边框和文本
            cv2.rectangle(image, (x, y), (x + int(width), y + int(height)), color, 2)
            cv2.putText(image, text, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

# 显示
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
参考资料