21 目标检测与识别之YOLO与SSD算法详解
系列进度
计算机视觉网络教程 · 第 21 / 31 篇
整理说明
这篇内容怎么整理
郭震 · 2026-06-04
阅读路线
先按这条路线读
先抓住主线,再回到代码、配置和图文细节,读起来会更稳。
YOLO 和 SSD 都强调一次前向完成检测,适合实时场景。差别要从预测尺度、框设计和速度精度折中来看。
我会用同一张测试图比较推理时间、漏检和误检。只看一张漂亮结果图,不能说明模型稳定。
在上一篇中,我们对目标检测与识别的基础知识进行了概述,阐述了它们的应用及重要性。本文将深入探讨两种重要的目标检测算法——YOLO(You Only Look Once)和SSD(Single Shot MultiBox Detector)。这两者都是当前计算机视觉领域中非常流行的算法,广泛应用于实时和高效的目标检测。
YOLO算法详解
YOLO算法由Joseph Redmon等人于2016年首次提出,它的主要特点在于将目标检测视为一个回归问题,直接在图像上进行边界框和类别预测。
比较 YOLO 与 SSD 时,先看候选框设计、特征层、类别预测、框回归、非极大值抑制和推理速度。
YOLO的工作原理
YOLO将输入图像划分为一个固定大小的网格(例如,)。每个网格单元负责检测那些中心点落在该单元内的物体。对于每个网格单元,YOLO预测以下几个值:
- 个边界框的坐标(以相对于网格的位置表示)
- 每个边界框的置信度分数,表示检测到物体的概率
- 每个边界框的类别概率分布
YOLO的损失函数由多个部分组成,包括边界框的准确性、置信度分数和类别的正确性:
速度与准确性
YOLO的主要优势在于速度,它将整个图像作为输入,通过单次前向传播就能得到所有的检测结果。这使得YOLO在实时应用中非常有效,比如视频监控和自动驾驶。
实例代码
下面是一个使用YOLO进行目标检测的简单示例:
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()]
# 读取图片
img = cv2.imread("image.jpg")
height, width, channels = img.shape
# 预处理图片
blob = cv2.dnn.blobFromImage(img, 0.00392, (416, 416), (0, 0, 0), True, crop=False)
net.setInput(blob)
outputs = net.forward(output_layers)
# 处理检测结果
boxes, confidences, class_ids = [], [], []
for output in outputs:
for detection in output:
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]])
cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.putText(img, label, (x, y + 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
在这个示例中,我们通过OpenCV加载YOLO模型并对输入图像进行检测,绘制出边界框和类别名称。
SSD算法详解
SSD算法由Wei Liu等人在2016年提出。与YOLO不同的是,SSD在多个尺度上进行目标检测,允许检测不同大小的目标。
练习《目标检测与识别之YOLO与SSD算法详解》时,建议把输入条件、处理动作和可见结果写在一起,方便下次复查。
复习《目标检测与识别之YOLO与SSD算法详解》时,建议把关键概念、操作步骤和可见结果放在同一页里回看。
读《目标检测与识别之YOLO与SSD算法详解》时,可以把配图当成路线卡:先看整体顺序,再看每一步为什么这样做,最后再检查边界条件。
SSD的工作原理
SSD结合了卷积神经网络(CNN)和边界框回归,采用多层次的特征图来处理图像,以便在不同的空间和尺度上进行目标检测。具体来说,SSD通过以下步骤进行工作:
- 使用一个基础网络(如VGG16)提取特征。
- 在特征图上生成多个默认边界框(称为prior boxes),并为每个框预测类别和调整框的位置。
- 利用Softmax函数计算每个边界框的类别概率。
速度与准确性
SSD在速度和准确性方面都表现良好。通过结合多个特征层,SSD能够更好地处理不同大小的目标,使其在复杂场景中更加有效。
实例代码
下面是一个使用SSD进行目标检测的示例:
import cv2
# 加载SSD模型
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "weight.caffemodel")
# 读取图片
img = cv2.imread("image.jpg")
(h, w) = img.shape[:2]
# 预处理
blob = cv2.dnn.blobFromImage(cv2.resize(img, (300, 300)), 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:
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
label = f"Object {i}: {confidence:.2f}"
cv2.rectangle(img, (startX, startY), (endX, endY), (0, 255, 0), 2)
cv2.putText(img, label, (startX, startY - 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
此示例使用OpenCV加载SSD模型,并对图像进行实时检测,最后绘制出边
继续阅读
从这篇继续找到相关教程
常见问题
读前先确认这三点
目标检测与识别之YOLO与SSD算法详解适合谁读?
这是 计算机视觉网络教程 系列第 21 / 31 篇,适合正在学习计算机视觉网络教程,并且需要把概念落到操作步骤或判断标准里的读者。
读这篇计算机视觉网络教程要多久?
按中文技术文章阅读速度估算,通读大约 3 分钟;如果要跟着复现,建议把命令、配置和结果检查分开做。
这篇文章里的图文节点怎么用?
正文里有 6 个图文节点,可以先用它们抓住流程、配置和判断点,再回到对应段落细读。
分享文章
转发到常用平台
微信/朋友圈可先复制链接
相关教程
从相近问题继续读
继续阅读