计算机视觉系列(3):目标检测的基础与实现
前言
欢迎来到“计算机视觉系列”的第三篇!在前两篇中,我们分别探讨了图像处理的基础和图像分类的原理。本篇将聚焦于目标检测(Object Detection),这是计算机视觉中的一个核心任务。目标检测不仅要识别图像中的物体类别,还要定位它们的位置,通常以边界框(Bounding Box)的形式输出结果。本文将带你从基础概念入手,逐步走向代码实现。
“计算机视觉系列”共分为7个专题:
- 图像处理基础
- 图像分类入门
- 目标检测的基础与实现(本文)
- 图像分割技术
- 视频分析与跟踪
- 深度学习在计算机视觉中的应用
- 计算机视觉的未来趋势
什么是目标检测?
目标检测的任务是在图像或视频中找到感兴趣的对象,并标注其位置和类别。例如,在自动驾驶场景中,目标检测可以识别行人、车辆和交通标志。相比图像分类(仅输出类别),目标检测多了一个“定位”的要求,因此难度更高。
常见的目标检测算法分为两类:
- 两阶段检测:如 Faster R-CNN,先生成候选区域(Region Proposal),再分类和定位。
- 单阶段检测:如 YOLO 和 SSD,直接预测边界框和类别,速度更快。
目标检测的核心概念
-
边界框(Bounding Box)
边界框通常由四个参数定义:左上角坐标(x_min, y_min)和右下角坐标(x_max, y_max),或者中心点坐标(x_center, y_center)加宽高(w, h)。 -
IOU(交并比)
IOU 是衡量预测边界框与真实边界框重合程度的重要指标,计算公式为:IOU = (交集面积) / (并集面积)IOU 值越高,说明预测越准确。
-
非极大值抑制(NMS)
NMS 用于去除重叠的边界框,保留置信度最高的框。
一个简单的代码示例:使用 OpenCV 进行目标检测
以下是一个基于 OpenCV 的简单目标检测示例,使用预训练的 SSD 模型检测图像中的常见物体。
环境准备
确保你已安装以下库:
pip install opencv-python numpy
代码实现
import cv2
import numpy as np
# 加载预训练 SSD 模型
net = cv2.dnn.readNetFromCaffe("deploy.prototxt", "mobilenet_ssd.caffemodel")
# 加载图像
image = cv2.imread("example.jpg")
(h, w) = image.shape[:2]
# 图像预处理
blob = cv2.dnn.blobFromImage(cv2.resize(image, (300, 300)), 0.007843, (300, 300), 127.5)
# 输入模型并检测
net.setInput(blob)
detections = net.forward()
# 类别标签(COCO 数据集部分)
CLASSES = ["background", "aeroplane", "bicycle", "bird", "boat", "bottle", "bus", "car", "cat", "chair"]
# 处理检测结果
for i in range(detections.shape[2]):
confidence = detections[0, 0, i, 2]
if confidence > 0.5: # 置信度阈值
idx = int(detections[0, 0, i, 1])
box = detections[0, 0, i, 3:7] * np.array([w, h, w, h])
(startX, startY, endX, endY) = box.astype("int")
# 绘制边界框和标签
label = f"{CLASSES[idx]}: {confidence:.2f}"
cv2.rectangle(image, (startX, startY), (endX, endY), (0, 255, 0), 2)
cv2.putText(image, label, (startX, startY - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2)
# 显示结果
cv2.imshow("Output", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码说明
- 模型加载:使用 MobileNet SSD 预训练模型,您需要下载
deploy.prototxt和mobilenet_ssd.caffemodel文件(可在 OpenCV 官方 GitHub 获取)。 - 图像预处理:将图像调整为 300x300 并转换为 Blob 格式。
- 结果处理:遍历检测结果,绘制置信度高于 0.5 的边界框和标签。
运行结果
运行代码后,程序会在输入图像上绘制绿色边界框,并标注物体类别和置信度。如果您想测试,可以用一张包含常见物体的照片(如汽车、猫等)替换 example.jpg。
进阶方向:YOLO 与 Faster R-CNN
-
YOLO(You Only Look Once)
YOLO 将图像分成网格,直接预测每个网格中的边界框和类别,速度快,适合实时应用。推荐使用 YOLOv5 或 YOLOv8(PyTorch 实现)。 -
Faster R-CNN
通过区域建议网络(RPN)生成候选区域,再进行分类和边界框回归,精度更高但速度较慢。
如果您想尝试 YOLO,可以参考以下伪代码:
from yolov5 import YOLOv5
model = YOLOv5("yolov5s.pt") # 加载预训练模型
results = model.predict("example.jpg")
results.show() # 显示检测结果
总结
目标检测是计算机视觉中的关键技术,广泛应用于自动驾驶、安防监控等领域。本文介绍了目标检测的基础概念,并通过 OpenCV 提供了一个入门示例。下一期(系列4),我们将探讨图像分割技术,敬请期待!
如果您有任何问题或建议,欢迎在评论区留言!
17万+

被折叠的 条评论
为什么被折叠?



