对象检测是计算机视觉领域的核心任务之一,广泛应用于视频监控、自动驾驶、智能安防等多个场景。随着深度学习技术的发展,基于传统方法的对象检测逐渐被基于神经网络的先进模型所取代。本文将系统地介绍如何使用Python进行对象检测,重点探讨了OpenCV
与YOLO
(You Only Look Once)两种方法。首先,介绍了对象检测的基本概念、应用及技术挑战。随后,详细讲解了如何利用OpenCV
进行基于传统方法的对象检测,包括Haar Cascades和HOG+SVM方法,并配以详细的代码示例和中文注释。接着,深入解析了YOLO模型的工作原理及其不同版本的演进,展示了如何使用预训练的YOLO模型进行高效的对象检测,并通过代码示例说明了YOLO在实际应用中的优势。最后,探讨了图像识别与目标跟踪的结合应用,并提供了提升对象检测效果的实用技巧。通过本文的学习,读者将全面掌握使用Python进行对象检测的理论基础与实战技能,能够在实际项目中灵活应用不同的对象检测技术。
引言
对象检测(Object Detection)是计算机视觉中的一项基础任务,其目标是识别图像或视频中所有感兴趣的对象,并确定其在图像中的位置。与图像分类(仅识别图像中是否存在某类对象)不同,对象检测不仅要确定对象的类别,还需要准确定位其在图像中的位置,通常以边界框(Bounding Box)的形式表示。
对象检测技术在实际应用中具有广泛的前景,例如:
- 视频监控:自动识别和跟踪监控视频中的人物或车辆,提高安全性。
- 自动驾驶:实时检测道路上的行人、车辆、交通标志等,辅助驾驶决策。
- 智能安防:识别特定区域内的可疑活动或物品,提升安防水平。
- 医疗影像分析:检测医学影像中的异常区域,辅助医生诊断。
随着深度学习的快速发展,基于卷积神经网络(CNN)的对象检测算法在准确性和速度上取得了显著提升。其中,OpenCV
作为一个开源的计算机视觉库,提供了丰富的传统对象检测方法,而YOLO系列模型则代表了当前对象检测领域的先进水平。
本文将系统地介绍如何使用Python进行对象检测,涵盖从传统方法到先进的YOLO模型,配以大量代码示例和详细的中文注释,帮助读者全面掌握对象检测的理论与实战技巧。
对象检测基础
对象检测的定义与任务
对象检测的主要任务包括:
- 对象定位:确定图像中目标对象的位置,通常以矩形框的形式表示。
- 对象分类:识别目标对象的类别,例如人、车、狗等。
对象检测不仅需要识别图像中的多个对象,还要准确地定位它们的位置,这对算法的精度和效率提出了更高的要求。
技术挑战
对象检测面临诸多技术挑战,包括但不限于:
- 多尺度检测:对象在图像中可能具有不同的大小,如何在不同尺度下准确检测对象是一个关键问题。
- 遮挡与重叠:对象之间可能存在遮挡或部分重叠,增加了检测的难度。
- 实时性要求:在某些应用场景中,如自动驾驶,检测算法需要具备实时处理能力。
- 多类别与高精度:需要同时检测多种类别的对象,并在定位上达到高精度。
评估指标
对象检测算法的性能通常通过以下几个指标来评估:
-
平均精度均值(Mean Average Precision, mAP):综合考虑检测的准确性和召回率,是评估对象检测模型性能的主要指标。
mAP = 1 N ∑ i = 1 N AP i \text{mAP} = \frac{1}{N} \sum_{i=1}^{N} \text{AP}_i mAP=N1i=1∑NAPi
其中, AP i \text{AP}_i APi表示第 i i i个类别的平均精度, N N N是类别总数。
-
检测速度:通常以每秒处理的帧数(Frames Per Second, FPS)来衡量,尤其在实时应用中尤为重要。
-
定位精度:通过交并比(Intersection over Union, IoU)来衡量预测边界框与真实边界框的重叠程度。
IoU = Area of Overlap Area of Union \text{IoU} = \frac{\text{Area of Overlap}}{\text{Area of Union}} IoU=Area of UnionArea of Overlap
IoU值越高,表示定位越准确。
OpenCV简介
OpenCV
(Open Source Computer Vision Library)是一个开源的计算机视觉库,提供了丰富的工具和函数,用于图像处理、视频分析、对象检测等任务。它支持多种编程语言,包括C++、Python和Java,且具有跨平台特性。
安装与基本使用
在开始使用OpenCV
进行对象检测之前,需要确保已安装OpenCV
库。以下是安装OpenCV
的步骤:
pip install opencv-python
安装完成后,可以通过以下代码验证安装是否成功:
import cv2
print(cv2.__version__)
基于传统方法的对象检测
在深度学习兴起之前,对象检测主要依赖于传统的计算机视觉方法。OpenCV
提供了多种基于传统方法的对象检测技术,主要包括:
- Haar Cascades:基于Haar特征的级联分类器,用于检测面部、眼睛等。
- HOG + SVM:基于方向梯度直方图(Histogram of Oriented Gradients, HOG)特征和支持向量机(Support Vector Machine, SVM)的检测方法,常用于行人检测。
Haar Cascades
Haar Cascades是由Viola和Jones在2001年提出的一种基于机器学习的对象检测方法。它通过提取Haar特征,并使用AdaBoost算法训练级联分类器,实现对特定对象的快速检测。
使用Haar Cascades进行人脸检测
以下是使用OpenCV
的Haar Cascades进行人脸检测的示例代码:
import cv2
# 加载预训练的Haar Cascades人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取输入图像
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 绘制检测到的人脸
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释
- 加载模型:使用
CascadeClassifier
加载预训练的Haar Cascades模型。 - 读取图像:读取输入图像并转换为灰度图,因为Haar Cascades在灰度图上效果更好。
- 人脸检测:调用
detectMultiScale
方法进行人脸检测,参数scaleFactor
控制图像尺寸缩放,minNeighbors
控制检测框的最小邻居数,minSize
设置检测对象的最小尺寸。 - 绘制矩形:在检测到的人脸位置绘制绿色矩形框。
- 显示结果:显示检测结果图像。
HOG + SVM
HOG特征结合SVM分类器是一种经典的行人检测方法。HOG特征通过统计图像中各个局部区域的梯度方向分布,描述了对象的形状和边缘信息,而SVM用于分类是否存在目标对象。
使用HOG + SVM进行行人检测
以下是使用OpenCV
的HOG + SVM方法进行行人检测的示例代码:
import cv2
# 初始化HOG描述符
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# 读取输入图像
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测行人
boxes, weights = hog.detectMultiScale(gray, winStride=(8, 8), padding=(16, 16), scale=1.05)
# 绘制检测到的行人
for (x, y, w, h) in boxes:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Detected People', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释
- 初始化HOG描述符:创建一个HOG描述符对象,并设置默认的行人检测SVM分类器。
- 读取图像:读取输入图像并转换为灰度图。
- 行人检测:调用
detectMultiScale
方法进行行人检测,参数winStride
控制滑动窗口的步幅,padding
设置图像边界的填充,scale
控制图像尺寸缩放。 - 绘制矩形:在检测到的行人位置绘制蓝色矩形框。
- 显示结果:显示检测结果图像。
YOLO简介
YOLO(You Only Look Once)是一种实时对象检测系统,由Joseph Redmon等人在2016年提出。YOLO的核心思想是将对象检测任务转化为一个回归问题,直接从图像像素到边界框坐标和类别概率的映射,实现了高速和高精度的对象检测。
YOLO的工作原理
YOLO通过一个单一的神经网络对整个图像进行处理,输出多个边界框及其对应的类别概率。其主要步骤包括:
- 图像划分:将输入图像划分为S×S的网格。
- 边界框预测:每个网格预测B个边界框,每个边界框包含5个参数(x, y, w, h, confidence)。
- 类别概率预测:每个网格预测C个类别的条件概率。
- 最终输出:结合边界框置信度和类别概率,计算每个边界框的最终得分,并进行非极大值抑制(NMS)以去除冗余框。
YOLO的主要优势在于其速度快、实时性强,适合需要实时处理的应用场景。然而,早期版本的YOLO在小对象检测和精度上有所不足,随着版本的迭代,YOLO在精度和速度上均有显著提升。
YOLO的发展历程
YOLO系列模型经过多次迭代,主要版本包括:
- YOLOv1:初版YOLO,提出了将对象检测任务转化为单一回归问题的思路,实现了实时检测。
- YOLOv2 (YOLO9000):引入了Batch Normalization、锚框(Anchor Boxes)、高分辨率分类器等技术,提升了检测精度和速度。
- YOLOv3:采用多尺度预测和更深的网络结构,引入残差连接和多标签分类,进一步提升了性能。
- YOLOv4:结合了许多最新的技术,如CSPDarknet53、PANet、SAM等,显著提升了检测精度和速度。
- YOLOv5:由Ultralytics开发,采用PyTorch实现,具有更好的灵活性和易用性,支持自动混合精度训练和模型压缩等功能。
- YOLOv7:进一步优化了网络结构和训练策略,提升了对小对象和复杂场景的检测能力。
- YOLOv8:最新版本,集成了更多的优化技术,支持更加高效和精确的对象检测。
YOLO的优势与局限
优势:
- 实时性强:YOLO能够以高帧率进行对象检测,适用于实时应用。
- 全局推理:通过全图预测,YOLO能够更好地利用上下文信息,减少误检。
- 简单统一的框架:将对象检测任务转化为单一回归问题,简化了检测流程。
局限:
- 对小对象检测不佳:早期版本的YOLO在检测小对象时表现较差,虽然后续版本有所改进。
- 定位精度有限:相较于基于区域提议的方法,YOLO在边界框定位精度上稍显不足。
- 对密集场景的处理:在对象密集的场景中,YOLO可能会出现漏检或重叠框的问题。
使用OpenCV进行对象检测
基于Haar Cascades的对象检测
Haar Cascades是基于Haar特征和AdaBoost算法的传统对象检测方法,适用于人脸、眼睛、车辆等简单对象的检测。以下是使用Haar Cascades进行人脸检测的详细步骤和代码示例。
代码示例
import cv2
# 加载预训练的Haar Cascades人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取输入图像
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1, # 图像尺寸缩放比例
minNeighbors=5, # 每个目标至少被检测到的邻居数
minSize=(30, 30), # 目标的最小尺寸
flags=cv2.CASCADE_SCALE_IMAGE
)
# 绘制检测到的人脸
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释
- 加载模型:使用
CascadeClassifier
加载预训练的Haar Cascades人脸检测模型。 - 读取图像:读取输入图像并转换为灰度图,因为Haar Cascades在灰度图上效果更佳。
- 人脸检测:调用
detectMultiScale
方法进行人脸检测,参数scaleFactor
控制图像尺寸缩放比例,minNeighbors
控制每个检测到的目标至少需要被多少个邻居检测到,minSize
设置目标的最小尺寸。 - 绘制矩形:在检测到的人脸位置绘制绿色矩形框。
- 显示结果:使用
imshow
显示检测结果图像,按任意键退出。
基于HOG + SVM的行人检测
HOG特征结合SVM分类器是另一种经典的对象检测方法,特别适用于行人检测。HOG特征通过统计局部区域的梯度方向分布,描述了对象的形状和边缘信息,而SVM用于分类是否存在目标对象。
代码示例
import cv2
# 初始化HOG描述符并设置SVM分类器为默认行人检测器
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# 读取输入图像
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测行人
boxes, weights = hog.detectMultiScale(
gray,
winStride=(8, 8), # 滑动窗口的步幅
padding=(16, 16), # 图像边界的填充
scale=1.05 # 图像尺寸缩放比例
)
# 绘制检测到的行人
for (x, y, w, h) in boxes:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Detected People', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释
- 初始化HOG描述符:创建一个HOG描述符对象,并设置默认的行人检测SVM分类器。
- 读取图像:读取输入图像并转换为灰度图。
- 行人检测:调用
detectMultiScale
方法进行行人检测,参数winStride
控制滑动窗口的步幅,padding
设置图像边界的填充,scale
控制图像尺寸缩放比例。 - 绘制矩形:在检测到的行人位置绘制蓝色矩形框。
- 显示结果:使用
imshow
显示检测结果图像,按任意键退出。
基于颜色与形状的简单对象检测
除了Haar Cascades和HOG + SVM,OpenCV
还提供了基于颜色和形状的简单对象检测方法。例如,使用颜色空间转换和轮廓检测来识别特定颜色的对象。
代码示例
以下示例展示了如何检测红色圆形物体:
import cv2
import numpy as np
# 读取输入图像
image = cv2.imread('input.jpg')
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 定义红色的HSV范围
lower_red1 = np.array([0, 100, 100])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([160, 100, 100])
upper_red2 = np.array([180, 255, 255])
# 创建掩码
mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
mask = cv2.bitwise_or(mask1, mask2)
# 应用掩码
result = cv2.bitwise_and(image, image, mask=mask)
# 转换为灰度图并进行阈值处理
gray = cv2.cvtColor(result, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray, 50, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 绘制圆形边界
for cnt in contours:
((x, y), radius) = cv2.minEnclosingCircle(cnt)
if radius > 10:
cv2.circle(image, (int(x), int(y)), int(radius), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Detected Red Circles', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释
- 读取图像并转换颜色空间:读取输入图像并转换为HSV颜色空间,便于颜色分割。
- 定义红色范围:红色在HSV空间中有两个范围,通过
lower_red1
、upper_red1
和lower_red2
、upper_red2
定义。 - 创建掩码:使用
inRange
函数创建红色掩码,并通过bitwise_or
合并两个掩码。 - 应用掩码:将掩码应用于原始图像,提取红色区域。
- 阈值处理:将结果转换为灰度图,并进行二值化处理,以便查找轮廓。
- 查找与绘制轮廓:使用
findContours
查找轮廓,并绘制最小外接圆,过滤掉小于一定半径的噪声。 - 显示结果:显示检测到的红色圆形物体。
使用YOLO进行对象检测
YOLO系列模型以其高速度和较高的准确性,成为当前对象检测领域的主流方法之一。本文将以YOLOv5为例,详细介绍如何使用预训练的YOLO模型进行对象检测,并通过代码示例展示其实际应用。
YOLOv5简介
YOLOv5是由Ultralytics开发的YOLO系列最新版本,采用PyTorch框架实现,具有更高的灵活性和易用性。YOLOv5提供了多个模型尺寸(如YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x),用户可以根据实际需求选择合适的模型,以在速度和精度之间取得平衡。
安装与配置
在开始使用YOLOv5进行对象检测之前,需要安装相关依赖。以下是安装步骤:
- 克隆YOLOv5仓库:
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
- 安装依赖:
pip install -r requirements.txt
加载预训练的YOLOv5模型
YOLOv5提供了多种预训练模型,可以直接用于对象检测任务。以下是加载YOLOv5预训练模型的代码示例:
import torch
# 加载预训练的YOLOv5模型(YOLOv5s)
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# 设置模型为评估模式
model.eval()
使用YOLOv5进行对象检测
以下是使用YOLOv5对图像进行对象检测的完整代码示例,包括加载图像、进行检测、绘制边界框和显示结果。
代码示例
import torch
import cv2
import numpy as np
# 加载预训练的YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# 读取输入图像
image = cv2.imread('input.jpg')
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy() # [x1, y1, x2, y2, confidence, class]
# 绘制边界框和标签
for detection in detections:
x1, y1, x2, y2, confidence, cls = detection
label = model.names[int(cls)]
confidence = round(confidence, 2)
# 绘制矩形框
cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
# 绘制标签和置信度
cv2.putText(image, f'{label} {confidence}', (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2)
# 显示结果
cv2.imshow('YOLOv5 Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解释
- 加载模型:使用
torch.hub.load
加载预训练的YOLOv5s模型。 - 读取图像:使用
cv2.imread
读取输入图像,并将其从BGR颜色空间转换为RGB。 - 对象检测:将RGB图像输入模型,获取检测结果。
- 解析检测结果:
results.xyxy[0].numpy()
返回一个数组,每一行包含一个检测框的信息:[x1, y1, x2, y2, confidence, class]。 - 绘制边界框与标签:遍历检测结果,绘制绿色矩形框,并在框上方添加标签和置信度。
- 显示结果:使用
cv2.imshow
显示带有检测结果的图像,按任意键退出。
高级对象检测功能
YOLOv5不仅支持基本的对象检测,还提供了许多高级功能,如:
- 实时视频对象检测
- 批量图像处理
- 自定义模型训练
- 多尺度训练与推理
- 模型量化与优化
实时视频对象检测
以下示例展示了如何使用YOLOv5对实时视频流进行对象检测:
import torch
import cv2
# 加载预训练的YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
model.eval()
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy()
# 绘制边界框和标签
for detection in detections:
x1, y1, x2, y2, confidence, cls = detection
label = model.names[int(cls)]
confidence = round(confidence, 2)
# 绘制矩形框
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
# 绘制标签和置信度
cv2.putText(frame, f'{label} {confidence}', (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2)
# 显示结果
cv2.imshow('YOLOv5 Real-Time Detection', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
代码解释
- 加载模型:与之前相同,加载YOLOv5s模型。
- 打开摄像头:使用
cv2.VideoCapture(0)
打开默认摄像头。 - 实时检测循环:
- 读取摄像头帧。
- 将BGR图像转换为RGB。
- 进行对象检测并解析结果。
- 绘制检测框和标签。
- 显示检测结果。
- 按下’q’键退出检测循环。
- 释放资源:关闭摄像头并销毁所有窗口。
YOLOv5的优化与自定义
为了满足特定应用场景的需求,YOLOv5支持模型的优化与自定义,包括模型微调、转换为不同格式等。
模型微调
通过在特定数据集上微调YOLOv5模型,可以提升模型在特定任务或领域的检测性能。以下是使用YOLOv5进行模型微调的基本步骤:
- 准备数据集:按照YOLO格式组织数据,包括图像和对应的标签文件(.txt),标签文件中包含每个对象的类别和边界框坐标。
- 配置训练参数:修改
data.yaml
文件,指定训练、验证集的路径以及类别名称。 - 开始训练:
python train.py --img 640 --batch 16 --epochs 50 --data data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name custom_yolov5s
- 评估模型:训练完成后,使用
val.py
进行模型评估,查看mAP等指标。 - 导出模型:将训练好的模型导出为不同格式,如ONNX、TensorRT等,便于部署。
模型转换与部署
YOLOv5支持将PyTorch模型转换为ONNX格式,方便在不同平台上部署。以下是转换模型为ONNX格式的代码示例:
python export.py --weights runs/train/custom_yolov5s/weights/best.pt --img 640 --batch 1 --device 0 --include onnx
代码解释
- 准备数据集:确保数据集按照YOLO格式组织,包含图像和对应的标签文件。
- 配置训练参数:修改
data.yaml
文件,指定训练集和验证集的路径,以及类别名称。 - 开始训练:运行
train.py
脚本,设置图像尺寸、批量大小、训练轮数、模型配置和预训练权重等参数。 - 评估模型:使用
val.py
脚本评估训练好的模型,查看mAP等指标。 - 导出模型:使用
export.py
脚本将PyTorch模型转换为ONNX格式,便于在不同平台上部署。
图像识别与目标跟踪
对象检测不仅需要在静态图像中识别目标,还需要在视频序列中对目标进行跟踪。结合对象检测与目标跟踪,可以实现视频中目标的连续跟踪,提高检测的实用性。
目标跟踪简介
目标跟踪(Object Tracking)是指在视频序列中持续跟踪特定目标的位置。目标跟踪通常与对象检测结合使用,检测每一帧中的目标,并通过算法将连续帧中的目标关联起来。
常用的目标跟踪算法
- SORT (Simple Online and Realtime Tracking):基于卡尔曼滤波和匈牙利算法的简单高效跟踪算法。
- Deep SORT:在SORT的基础上引入深度特征,提升在复杂场景下的跟踪性能。
- CSRT (Discriminative Correlation Filter with Channel and Spatial Reliability):基于相关滤波器的跟踪算法,适用于复杂背景和快速移动目标。
使用YOLOv5与Deep SORT进行目标跟踪
以下示例展示了如何结合YOLOv5与Deep SORT实现视频中的对象检测与跟踪。
安装Deep SORT
首先,克隆Deep SORT仓库并安装依赖:
git clone https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch.git
cd Yolov5_DeepSort_Pytorch
pip install -r requirements.txt
代码示例
以下是结合YOLOv5与Deep SORT进行目标检测与跟踪的完整代码示例:
import torch
import cv2
from deep_sort_pytorch.deep_sort import DeepSort
# 初始化YOLOv5模型
yolo_model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
yolo_model.eval()
# 初始化Deep SORT
deepsort = DeepSort(
'deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7',
max_dist=0.2,
min_confidence=0.3,
nms_max_overlap=1.0,
max_iou_distance=0.7,
max_age=70,
n_init=3,
nn_budget=100
)
# 打开视频文件或摄像头
cap = cv2.VideoCapture('input_video.mp4') # 或者使用0打开摄像头
while True:
ret, frame = cap.read()
if not ret:
break
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = yolo_model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy() # [x1, y1, x2, y2, confidence, class]
# 准备Deep SORT的输入
dets = []
for det in detections:
x1, y1, x2, y2, conf, cls = det
dets.append([x1, y1, x2, y2, conf])
dets = np.array(dets)
# 进行目标跟踪
outputs = deepsort.update(dets, frame)
# 绘制跟踪结果
if len(outputs) > 0:
for output in outputs:
x1, y1, x2, y2, track_id, cls = output
label = f'{yolo_model.names[int(cls)]} ID:{int(track_id)}'
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
cv2.putText(frame, label, (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
# 显示结果
cv2.imshow('YOLOv5 + Deep SORT Tracking', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
代码解释
- 加载模型:加载预训练的YOLOv5模型和Deep SORT跟踪器。
- 打开视频源:使用
cv2.VideoCapture
打开视频文件或摄像头。 - 实时检测与跟踪:
- 读取视频帧并转换颜色空间。
- 使用YOLOv5进行对象检测,获取检测框及类别。
- 准备检测结果作为Deep SORT的输入,进行目标跟踪。
- 绘制跟踪结果,包括边界框和跟踪ID。
- 显示结果:实时显示带有检测与跟踪结果的视频帧,按下’q’键退出循环。
- 释放资源:关闭视频源并销毁所有窗口。
提升对象检测效果的技巧
为了在实际应用中获得更好的对象检测效果,可以采取以下几种优化策略:
数据预处理
数据预处理是提升对象检测模型性能的重要步骤,包括图像增强、归一化等操作。
-
图像增强:通过旋转、缩放、裁剪、翻转等方式增加数据多样性,提升模型的泛化能力。
import cv2 import numpy as np def augment_image(image): # 随机水平翻转 if np.random.rand() > 0.5: image = cv2.flip(image, 1) # 随机旋转 angle = np.random.uniform(-15, 15) h, w = image.shape[:2] M = cv2.getRotationMatrix2D((w/2, h/2), angle, 1) image = cv2.warpAffine(image, M, (w, h)) return image
-
归一化:将像素值缩放到[0, 1]或[-1, 1]范围,提升模型的训练稳定性。
def normalize_image(image): image = image / 255.0 return image
数据增强
数据增强不仅限于图像增强,还包括对标注数据的处理,如边界框的调整、遮挡处理等。
def adjust_bounding_boxes(boxes, scale_x, scale_y, dx, dy):
"""
调整边界框坐标
"""
adjusted_boxes = []
for box in boxes:
x1, y1, x2, y2 = box
x1 = int(x1 * scale_x + dx)
y1 = int(y1 * scale_y + dy)
x2 = int(x2 * scale_x + dx)
y2 = int(y2 * scale_y + dy)
adjusted_boxes.append([x1, y1, x2, y2])
return adjusted_boxes
模型优化
通过调整模型结构和参数,可以提升对象检测模型的性能。
- 调整网络深度和宽度:根据计算资源和应用需求,选择合适的模型大小(如YOLOv5s、YOLOv5m等)。
- 使用锚框:合理设置锚框大小和比例,匹配目标对象的尺度和形状。
- 多尺度训练:在不同的图像尺寸上进行训练,提升模型对不同尺度对象的检测能力。
后处理优化
对象检测的后处理步骤对最终结果有重要影响,合理设置NMS参数和置信度阈值,可以提升检测的准确性和可靠性。
def non_max_suppression(boxes, scores, iou_threshold=0.5):
"""
非极大值抑制
"""
indices = cv2.dnn.NMSBoxes(boxes, scores, score_threshold=0.5, nms_threshold=iou_threshold)
return indices
使用更先进的模型
除了YOLO系列模型,当前对象检测领域还涌现出许多先进的模型,如Faster R-CNN、SSD、EfficientDet等。根据具体应用需求,选择合适的模型可以进一步提升检测效果。
高级应用
实时对象检测
在实时应用场景中,对象检测算法需要具备高速度和低延迟。YOLO系列模型因其高效的结构,成为实时对象检测的首选。
示例:实时行人检测
以下示例展示了如何使用YOLOv5对摄像头实时视频流中的行人进行检测:
import torch
import cv2
# 加载预训练的YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
model.eval()
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy()
# 绘制边界框和标签
for detection in detections:
x1, y1, x2, y2, confidence, cls = detection
label = model.names[int(cls)]
confidence = round(confidence, 2)
# 只检测行人类别
if label == 'person':
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.putText(frame, f'{label} {confidence}', (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2)
# 显示结果
cv2.imshow('Real-Time Person Detection', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
代码解释
- 加载模型:加载预训练的YOLOv5s模型。
- 打开摄像头:使用
cv2.VideoCapture(0)
打开默认摄像头。 - 实时检测循环:
- 读取摄像头帧并转换颜色空间。
- 使用YOLOv5进行对象检测,获取检测结果。
- 过滤出行人类别的检测框,并绘制绿色矩形框和标签。
- 显示检测结果。
- 按下’q’键退出检测循环。
- 释放资源:关闭摄像头并销毁所有窗口。
视频对象检测与跟踪
在视频对象检测中,对每一帧进行对象检测,并结合目标跟踪算法,实现视频中对象的持续跟踪。结合YOLOv5与Deep SORT,可以实现高效的对象检测与跟踪。
示例:视频中对象的检测与跟踪
import torch
import cv2
from deep_sort_pytorch.deep_sort import DeepSort
import numpy as np
# 加载预训练的YOLOv5模型
yolo_model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
yolo_model.eval()
# 初始化Deep SORT
deepsort = DeepSort(
'deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7',
max_dist=0.2,
min_confidence=0.3,
nms_max_overlap=1.0,
max_iou_distance=0.7,
max_age=70,
n_init=3,
nn_budget=100
)
# 打开视频文件
cap = cv2.VideoCapture('input_video.mp4')
while True:
ret, frame = cap.read()
if not ret:
break
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = yolo_model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy()
# 准备Deep SORT的输入
dets = []
for det in detections:
x1, y1, x2, y2, conf, cls = det
dets.append([x1, y1, x2, y2, conf])
dets = np.array(dets)
# 进行目标跟踪
outputs = deepsort.update(dets, frame)
# 绘制跟踪结果
if len(outputs) > 0:
for output in outputs:
x1, y1, x2, y2, track_id, cls = output
label = f'{yolo_model.names[int(cls)]} ID:{int(track_id)}'
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
cv2.putText(frame, label, (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
# 显示结果
cv2.imshow('Video Object Detection and Tracking', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
代码解释
- 加载模型:加载预训练的YOLOv5s模型。
- 初始化Deep SORT:设置Deep SORT的参数,加载预训练的Deep SORT模型权重。
- 打开视频文件:使用
cv2.VideoCapture
打开视频文件。 - 检测与跟踪循环:
- 读取视频帧并转换颜色空间。
- 使用YOLOv5进行对象检测,获取检测结果。
- 准备检测结果作为Deep SORT的输入,进行目标跟踪。
- 绘制跟踪结果,包括边界框和跟踪ID。
- 显示检测与跟踪结果。
- 按下’q’键退出检测循环。
- 释放资源:关闭视频源并销毁所有窗口。
数学基础与理论分析
对象检测算法的核心在于如何准确地定位和分类图像中的目标对象。无论是基于传统方法的Haar Cascades和HOG+SVM,还是基于深度学习的YOLO系列模型,其数学基础都涉及到图像特征提取、分类器训练和优化等方面。
Haar Cascades的数学原理
Haar Cascades基于Haar特征和AdaBoost算法,实现了快速且高效的对象检测。其主要步骤包括:
-
Haar特征提取:通过滑动窗口方式,提取图像中的Haar特征。Haar特征通过简单的矩形区域的像素灰度值差异来描述图像中的边缘、线条等特征。
Haar Feature = ∑ ( x , y ) ∈ white I ( x , y ) − ∑ ( x , y ) ∈ black I ( x , y ) \text{Haar Feature} = \sum_{(x, y) \in \text{white}} I(x, y) - \sum_{(x, y) \in \text{black}} I(x, y) Haar Feature=(x,y)∈white∑I(x,y)−(x,y)∈black∑I(x,y)
其中, white \text{white} white和 black \text{black} black表示Haar特征的白色和黑色矩形区域, I ( x , y ) I(x, y) I(x,y)表示像素 ( x , y ) (x, y) (x,y)的灰度值。
-
AdaBoost训练:使用AdaBoost算法选择最优的Haar特征,并训练级联分类器。AdaBoost通过加权投票的方式,提升弱分类器的性能。
α t = 1 2 ln ( 1 − ϵ t ϵ t ) \alpha_t = \frac{1}{2} \ln \left( \frac{1 - \epsilon_t}{\epsilon_t} \right) αt=21ln(ϵt1−ϵt)
其中, α t \alpha_t αt是第 t t t个弱分类器的权重, ϵ t \epsilon_t ϵt是该分类器的错误率。
-
级联分类器:将多个弱分类器级联起来,实现高效的对象检测。级联结构能够快速过滤掉背景区域,保留潜在的目标区域,提高检测速度。
HOG特征的数学表示
方向梯度直方图(Histogram of Oriented Gradients, HOG)是一种用于对象检测的特征描述方法,其主要步骤包括:
-
梯度计算:计算图像的梯度方向和幅值,通常使用Sobel算子。
G x = ∂ I ∂ x , G y = ∂ I ∂ y G_x = \frac{\partial I}{\partial x}, \quad G_y = \frac{\partial I}{\partial y} Gx=∂x∂I,Gy=∂y∂I
G = G x 2 + G y 2 , θ = arctan ( G y G x ) G = \sqrt{G_x^2 + G_y^2}, \quad \theta = \arctan\left(\frac{G_y}{G_x}\right) G=Gx2+Gy2,θ=arctan(GxGy)
-
细胞划分:将图像划分为小的单元格(cell),如8x8像素。
-
梯度方向直方图:在每个单元格中,根据梯度方向对幅值进行加权,构建梯度方向直方图。
Histogram = ∑ i = 1 N G i ⋅ δ ( θ i − θ k ) \text{Histogram} = \sum_{i=1}^{N} G_i \cdot \delta(\theta_i - \theta_k) Histogram=i=1∑NGi⋅δ(θi−θk)
其中, G i G_i Gi是第 i i i个像素的梯度幅值, θ i \theta_i θi是其梯度方向, θ k \theta_k θk是直方图的第 k k k个方向。
-
块归一化:将多个单元格组成一个块(block),对块内的梯度方向直方图进行归一化处理,增强特征的鲁棒性。
Normalized Histogram = Histogram Histogram 2 + ϵ 2 \text{Normalized Histogram} = \frac{\text{Histogram}}{\sqrt{\text{Histogram}^2 + \epsilon^2}} Normalized Histogram=Histogram2+ϵ2Histogram
YOLO的数学模型
YOLO将对象检测任务转化为一个回归问题,通过单一的神经网络直接预测边界框坐标和类别概率。其数学模型如下:
-
输入图像:将输入图像调整为固定尺寸(如640x640),并进行归一化处理。
-
网络结构:使用卷积神经网络提取特征,并通过多个检测头(Head)输出边界框坐标和类别概率。
-
边界框预测:每个检测头预测固定数量的锚框(Anchor Boxes),每个锚框包含五个参数(x, y, w, h, confidence)。
Bounding Box = ( x , y , w , h , confidence ) \text{Bounding Box} = (x, y, w, h, \text{confidence}) Bounding Box=(x,y,w,h,confidence)
其中, ( x , y ) (x, y) (x,y)表示边界框的中心坐标, ( w , h ) (w, h) (w,h)表示宽度和高度, confidence \text{confidence} confidence表示边界框包含对象的置信度。
-
类别概率预测:每个边界框预测各类别的条件概率。
P ( class i ∣ object ) = softmax ( c i ) P(\text{class}_i | \text{object}) = \text{softmax}(c_i) P(classi∣object)=softmax(ci)
其中, c i c_i ci是类别 i i i的置信度得分。
-
损失函数:YOLO的损失函数综合考虑边界框坐标、置信度和类别概率的误差。
L = λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 + ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj ( 1 − c ^ i ) 2 + λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj ( c i ) 2 + ∑ i = 0 S 2 1 i obj ∑ c ∈ classes ( p i ( c ) − p ^ i ( c ) ) 2 \mathcal{L} = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 + (w_i - \hat{w}_i)^2 + (h_i - \hat{h}_i)^2 \right] + \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} (1 - \hat{c}_i)^2 + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} (c_i)^2 + \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 L=λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2+(wi−w^i)2+(hi−h^i)2]+i=0∑S2j=0∑B1ijobj(1−c^i)2+λnoobji=0∑S2j=0∑B1ijnoobj(ci)2+i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
其中, λ coord \lambda_{\text{coord}} λcoord和 λ noobj \lambda_{\text{noobj}} λnoobj是权重系数,用于平衡不同损失项的影响, 1 i j obj \mathbb{1}_{ij}^{\text{obj}} 1ijobj和 1 i j noobj \mathbb{1}_{ij}^{\text{noobj}} 1ijnoobj分别表示是否存在对象。
损失函数的数学表示
YOLO的损失函数综合考虑了位置误差、置信度误差和类别误差,具体公式如下:
L = λ coord ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj [ ( x i − x ^ i ) 2 + ( y i − y ^ i ) 2 + ( w i − w ^ i ) 2 + ( h i − h ^ i ) 2 ] + ∑ i = 0 S 2 ∑ j = 0 B 1 i j obj ( 1 − c ^ i ) 2 + λ noobj ∑ i = 0 S 2 ∑ j = 0 B 1 i j noobj ( c i ) 2 + ∑ i = 0 S 2 1 i obj ∑ c ∈ classes ( p i ( c ) − p ^ i ( c ) ) 2 \mathcal{L} = \lambda_{\text{coord}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} \left[ (x_i - \hat{x}_i)^2 + (y_i - \hat{y}_i)^2 + (w_i - \hat{w}_i)^2 + (h_i - \hat{h}_i)^2 \right] + \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{obj}} (1 - \hat{c}_i)^2 + \lambda_{\text{noobj}} \sum_{i=0}^{S^2} \sum_{j=0}^{B} \mathbb{1}_{ij}^{\text{noobj}} (c_i)^2 + \sum_{i=0}^{S^2} \mathbb{1}_{i}^{\text{obj}} \sum_{c \in \text{classes}} (p_i(c) - \hat{p}_i(c))^2 L=λcoordi=0∑S2j=0∑B1ijobj[(xi−x^i)2+(yi−y^i)2+(wi−w^i)2+(hi−h^i)2]+i=0∑S2j=0∑B1ijobj(1−c^i)2+λnoobji=0∑S2j=0∑B1ijnoobj(ci)2+i=0∑S21iobjc∈classes∑(pi(c)−p^i(c))2
- 第一项:位置误差,衡量预测边界框与真实边界框的坐标差异。
- 第二项:存在对象的置信度误差,衡量预测的置信度与真实值的差异。
- 第三项:不存在对象的置信度误差,通过惩罚预测错误为存在对象的情况。
- 第四项:类别误差,衡量预测类别概率与真实类别的差异。
结论与展望
本文系统地介绍了如何使用Python进行对象检测,涵盖了基于传统方法的OpenCV
对象检测和基于深度学习的YOLO模型。通过详细的理论讲解和丰富的代码示例,读者不仅了解了对象检测的基本原理和技术挑战,还掌握了实战中如何应用不同的方法进行对象检测与跟踪。
随着深度学习技术的不断进步,对象检测模型在准确性和实时性上不断提升,未来的研究方向可能包括:
- 更高效的模型架构:如YOLOv8等新版本的出现,进一步提升检测速度和精度。
- 小目标检测:针对小目标检测的优化,提升模型在复杂场景下的表现。
- 跨领域应用:将对象检测技术应用于更多领域,如医疗影像分析、农业监测等。
- 增强现实与虚拟现实:结合对象检测技术,提升AR和VR的互动体验。
通过不断的研究和创新,对象检测技术将在计算机视觉领域发挥更大的作用,推动智能应用的发展。
参考文献
- Viola, P., & Jones, M. (2001). Rapid object detection using a boosted cascade of simple features. Proceedings of the 2001 IEEE Computer Society Conference on Computer Vision and Pattern Recognition.
- Dalal, N., & Triggs, B. (2005). Histograms of oriented gradients for human detection. Proceedings of the IEEE Computer Society Conference on Computer Vision and Pattern Recognition.
- Redmon, J., Divvala, S., Girshick, R., & Farhadi, A. (2016). You Only Look Once: Unified, Real-Time Object Detection. Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition.
- Bochkovskiy, A., Wang, C.-Y., & Liao, H.-Y. M. (2020). YOLOv4: Optimal Speed and Accuracy of Object Detection. arXiv preprint arXiv:2004.10934.
- Jocher, G., et al. (2021). YOLOv5. GitHub Repository.
- Bochkovskiy, A. (2022). YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors. arXiv preprint arXiv:2207.02696.
- Ultralytics YOLOv5 Repository: https://github.com/ultralytics/yolov5
- Deep SORT Repository: https://github.com/mikel-brostrom/Yolov5_DeepSort_Pytorch
附录:完整代码示例
使用OpenCV进行Haar Cascades人脸检测
import cv2
# 加载预训练的Haar Cascades人脸检测模型
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 读取输入图像
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(
gray,
scaleFactor=1.1, # 图像尺寸缩放比例
minNeighbors=5, # 每个目标至少被检测到的邻居数
minSize=(30, 30), # 目标的最小尺寸
flags=cv2.CASCADE_SCALE_IMAGE
)
# 绘制检测到的人脸
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Detected Faces', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用OpenCV进行HOG + SVM行人检测
import cv2
# 初始化HOG描述符并设置SVM分类器为默认行人检测器
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())
# 读取输入图像
image = cv2.imread('input.jpg')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测行人
boxes, weights = hog.detectMultiScale(
gray,
winStride=(8, 8), # 滑动窗口的步幅
padding=(16, 16), # 图像边界的填充
scale=1.05 # 图像尺寸缩放比例
)
# 绘制检测到的行人
for (x, y, w, h) in boxes:
cv2.rectangle(image, (x, y), (x + w, y + h), (255, 0, 0), 2)
# 显示结果
cv2.imshow('Detected People', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用YOLOv5进行对象检测
import torch
import cv2
import numpy as np
# 加载预训练的YOLOv5模型
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
# 读取输入图像
image = cv2.imread('input.jpg')
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy() # [x1, y1, x2, y2, confidence, class]
# 绘制边界框和标签
for detection in detections:
x1, y1, x2, y2, confidence, cls = detection
label = model.names[int(cls)]
confidence = round(confidence, 2)
# 绘制矩形框
cv2.rectangle(image, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
# 绘制标签和置信度
cv2.putText(image, f'{label} {confidence}', (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (36,255,12), 2)
# 显示结果
cv2.imshow('YOLOv5 Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
使用YOLOv5与Deep SORT进行对象检测与跟踪
import torch
import cv2
from deep_sort_pytorch.deep_sort import DeepSort
import numpy as np
# 加载预训练的YOLOv5模型
yolo_model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
yolo_model.eval()
# 初始化Deep SORT
deepsort = DeepSort(
'deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7',
max_dist=0.2,
min_confidence=0.3,
nms_max_overlap=1.0,
max_iou_distance=0.7,
max_age=70,
n_init=3,
nn_budget=100
)
# 打开视频文件
cap = cv2.VideoCapture('input_video.mp4')
while True:
ret, frame = cap.read()
if not ret:
break
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = yolo_model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy()
# 准备Deep SORT的输入
dets = []
for det in detections:
x1, y1, x2, y2, conf, cls = det
dets.append([x1, y1, x2, y2, conf])
dets = np.array(dets)
# 进行目标跟踪
outputs = deepsort.update(dets, frame)
# 绘制跟踪结果
if len(outputs) > 0:
for output in outputs:
x1, y1, x2, y2, track_id, cls = output
label = f'{yolo_model.names[int(cls)]} ID:{int(track_id)}'
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
cv2.putText(frame, label, (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
# 显示结果
cv2.imshow('Video Object Detection and Tracking', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
实时行人检测与跟踪
import torch
import cv2
from deep_sort_pytorch.deep_sort import DeepSort
import numpy as np
# 加载预训练的YOLOv5模型
yolo_model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
yolo_model.eval()
# 初始化Deep SORT
deepsort = DeepSort(
'deep_sort_pytorch/deep_sort/deep/checkpoint/ckpt.t7',
max_dist=0.2,
min_confidence=0.3,
nms_max_overlap=1.0,
max_iou_distance=0.7,
max_age=70,
n_init=3,
nn_budget=100
)
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
ret, frame = cap.read()
if not ret:
break
# 将BGR图像转换为RGB
img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 使用YOLOv5进行对象检测
results = yolo_model(img_rgb)
# 获取检测结果
detections = results.xyxy[0].numpy()
# 准备Deep SORT的输入
dets = []
for det in detections:
x1, y1, x2, y2, conf, cls = det
# 只检测行人类别
if yolo_model.names[int(cls)] == 'person':
dets.append([x1, y1, x2, y2, conf])
dets = np.array(dets)
# 进行目标跟踪
outputs = deepsort.update(dets, frame)
# 绘制跟踪结果
if len(outputs) > 0:
for output in outputs:
x1, y1, x2, y2, track_id, cls = output
label = f'Person ID:{int(track_id)}'
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (255, 0, 0), 2)
cv2.putText(frame, label, (int(x1), int(y1) - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 0, 0), 2)
# 显示结果
cv2.imshow('Real-Time Person Detection and Tracking', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
总结
本文详细介绍了如何使用Python进行对象检测,从传统的OpenCV
方法到先进的YOLO模型,涵盖了理论基础、算法原理及实战应用。通过丰富的代码示例和详细的中文注释,读者不仅掌握了对象检测的基本方法,还了解了如何结合目标跟踪算法实现视频中对象的持续跟踪。此外,本文还探讨了提升对象检测效果的多种优化策略,帮助读者在实际项目中灵活应用不同的方法。
随着计算机视觉技术的不断发展,对象检测在各个领域的应用将更加广泛和深入。通过不断学习和实践,开发者和研究人员可以利用先进的对象检测技术,推动智能应用的创新与发展。