郭震 AI公众号:郭震AI

15 目标检测之YOLO与SSD

发布日期:

最近更新:

分类: Opencv教程

预计阅读: 5 分钟

阅读次数: 0

预计阅读5 分钟
结构重点6 个
图文要点6 张
正文规模2.1k 字

整理说明

这篇内容怎么整理

郭震 · 2026-06-04

独立整理围绕 6 个结构重点拆成环境、步骤、验证点和常见误区,尽量让读者能照着复现。
图文对照保留 6 张和配置、流程、判断结果有关的图片,方便快速定位正文重点。
持续校对工具、模型和命令变化较快,后续优先修正入口、参数和风险提醒。

阅读路线

先按这条路线读

先抓住主线,再回到代码、配置和图文细节,读起来会更稳。

图文要点

先看本文图文节点

按图先建立主线,再跳回正文核对步骤、配置和判断标准。

目标检测之YOLO与SSD结构图查看大图
目标检测之YOLO与SSD结构图

OpenCV 学习要把图像输入、处理步骤、检测结果和工程性能放在一起验证。阅读时可以按「YOLO -> YOLO 的工作原理 -> 在 OpenCV 中实现 YOLO -> SSD」建立结构,再回到正文里的代码、案例或指标做验证。

目标检测之YOLO与SSD核对图查看大图
目标检测之YOLO与SSD核对图

读完后,用一个真实小任务复查:输入是什么,处理环节在哪里,输出是否可验收;失败时先查「YOLO」,再查「YOLO 的工作原理」。

目标检测是计算机视觉中的一个重要任务,涉及到在图片或视频中识别和定位多个对象。近年来,随着深度学习技术的快速发展,基于深度学习的目标检测方法得到了广泛的应用。其中,YOLO(You Only Look Once)和 SSD(Single Shot MultiBox Detector)是两个非常流行且高效的方法。在本篇教程中,我们将详细探讨这两种检测算法,包括它们的原理、实现以及如何在 OpenCV 中使用它们。

YOLO(You Only Look Once)

YOLO 是一种基于卷积神经网络(CNN)的实时目标检测系统。这种方法的主要思想是将整个图像作为网络的输入,并在单个前向传播中同时进行目标的定位和分类。与传统的目标检测方法不同,YOLO 将检测问题转化为回归问题。

YOLO与SSD判断卡查看大图
YOLO与SSD判断卡

比较 YOLO 与 SSD 时,先看检测速度、特征尺度、默认框或网格、类别预测、小目标效果和部署场景。

YOLO 的工作原理

YOLO 将输入图像划分为 S x S 的网格,每个网格负责预测一个边界框和对应的类概率。每个网格单元输出的信息包括:

  • 边界框的中心坐标 (x,y)(x, y)
  • 边界框的宽度和高度 (w,h)(w, h)
  • 某个类的置信度 P(Class)P(Class)

最终,YOLO 会通过 Non-Maximum Suppression(NMS)来整理重叠的边界框,保留最高置信度的边框,得到最终的检测结果。

在 OpenCV 中实现 YOLO

下面是如何在 OpenCV 中使用 YOLO 进行目标检测的简单示例。

1. 下载 YOLO 模型

首先,你需要下载 YOLO 的权重和配置文件。你可以从 YOLO 官方 GitHub 页面下载:

  • yolov3.weights
  • yolov3.cfg
  • coco.names(类名文件)

2. 代码示例

import cv2
import numpy as np

# 加载 YOLO 模型
net = cv2.dnn.readNet("yolov3.weights", "yolov3.cfg")
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]

# 加载类名
with open("coco.names", "r") as f:
    classes = [line.strip() for line in f.readlines()]

# 加载图片
img = cv2.imread("image.jpg")
height, width, _ = img.shape

# 创建输入Blob
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)

# 进行前向传播
outs = net.forward(output_layers)

# 解析输出
boxes = []
confidences = []
class_ids = []

for out in outs:
    for detection in out:
        scores = detection[5:]
        class_id = np.argmax(scores)
        confidence = scores[class_id]
        if confidence > 0.5:  # 设置阈值
            # 获取边界框坐标
            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)

# 应用非极大抑制
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]])
        confidence = confidences[i]
        cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
        cv2.putText(img, f"{label} {round(confidence, 2)}", (x, y + 30), cv2.FONT_HERSHEY_PLAIN, 2, (0, 255, 0), 3)

# 显示结果
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,我们使用 OpenCV 的 dnn 模块来加载 YOLO 模型,进行目标检测并绘制出检测到的边界框和标签。

SSD(Single Shot MultiBox Detector)

SSD 是另一种流行的目标检测方法,能够以较高的速度和准确性进行检测。与 YOLO 相似,SSD 也将目标检测问题视为一个回归问题。

目标检测之YOLO与SSD应用检查卡查看大图
目标检测之YOLO与SSD应用检查卡

回看《目标检测之YOLO与SSD》时,不必一次做大项目,先用一条简单样例确认主线是否清楚。

目标检测之YOLO与SSD应用复盘卡查看大图
目标检测之YOLO与SSD应用复盘卡

如果《目标检测之YOLO与SSD》还没完全消化,可以从这张卡片的四个动作重新走一遍。

OpenCV阅读地图卡查看大图
OpenCV阅读地图卡

学习《目标检测之YOLO与SSD》不必一口气吃完所有细节。先挑一个能动手验证的小问题,再顺着图和正文补齐概念。

SSD 的工作原理

SSD 在不同的特征图上进行检测,并使用默认边界框进行预测。它通过在多层特征图上进行卷积操作,提取多尺度信息以提高检测效果。SSD 可以在添加较少的计算负担的情况下,达到较高的召回率和精度。

在 OpenCV 中实现 SSD

与 YOLO 类似,你同样可以在 OpenCV 中使用 SSD 模型进行目标检测。在运行 SSD 的代码之前,请确保你已经下载了对应的模型文件,比如 SSD MobileNet 或其他类型的 SSD 模型。

代码示例

import cv2

# 加载 SSD 模型
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "mobilenet.caffemodel")

# 加载图片
img = cv2.imread("image.jpg")
height, width, _ = img.shape

# 创建输入Blob
blob = cv2.dnn.blobFromImage(img, 0.007843, (300, 300), 127.5)
net.setInput(blob)

# 进行前向传播
detections = net.forward()

# 解析输出
for i in range(detections.shape[2]):
    confidence = detections[0, 0, i, 2]
    if confidence > 0.5:  # 设置阈值
        class_id = int(detections[0, 0, i, 1])
        box = detections[0, 0, i, 3:7] * np.array([width, height, width, height])
        (startX, startY, endX, endY) = box.astype("int")

        # 绘制检测结果
        label

继续阅读

从这篇继续找到相关教程

AI 教程总索引

常见问题

读前先确认这三点

目标检测之YOLO与SSD适合谁读?

这是 OpenCV 教程 系列第 15 / 24 篇,适合正在学习OpenCV 教程,并且需要把概念落到操作步骤或判断标准里的读者。

读这篇OpenCV教程要多久?

按中文技术文章阅读速度估算,通读大约 5 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。

这篇文章里的图文节点怎么用?

正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。

分享文章

转发到常用平台

微信/朋友圈可先复制链接

相关教程

AI 教程总索引

继续阅读

继续找到相关 AI 教程

返回栏目

Reader Messages

读者留言

有问题、补充资料或实测结果,可以直接留下。这里不需要登录。

最多 800 字

为了防刷,每条留言会做长度、链接数量和提交频率限制。

0/800

留言列表

0
正在加载留言...