当前位置: 首页 > news >正文

【人工智能】用Python进行对象检测:从OpenCV到YOLO的全面指南

对象检测是计算机视觉领域的核心任务之一,广泛应用于视频监控、自动驾驶、智能安防等多个场景。随着深度学习技术的发展,基于传统方法的对象检测逐渐被基于神经网络的先进模型所取代。本文将系统地介绍如何使用Python进行对象检测,重点探讨了OpenCVYOLO(You Only Look Once)两种方法。首先,介绍了对象检测的基本概念、应用及技术挑战。随后,详细讲解了如何利用OpenCV进行基于传统方法的对象检测,包括Haar Cascades和HOG+SVM方法,并配以详细的代码示例和中文注释。接着,深入解析了YOLO模型的工作原理及其不同版本的演进,展示了如何使用预训练的YOLO模型进行高效的对象检测,并通过代码示例说明了YOLO在实际应用中的优势。最后,探讨了图像识别与目标跟踪的结合应用,并提供了提升对象检测效果的实用技巧。通过本文的学习,读者将全面掌握使用Python进行对象检测的理论基础与实战技能,能够在实际项目中灵活应用不同的对象检测技术。

引言

对象检测(Object Detection)是计算机视觉中的一项基础任务,其目标是识别图像或视频中所有感兴趣的对象,并确定其在图像中的位置。与图像分类(仅识别图像中是否存在某类对象)不同,对象检测不仅要确定对象的类别,还需要准确定位其在图像中的位置,通常以边界框(Bounding Box)的形式表示。

对象检测技术在实际应用中具有广泛的前景,例如:

  • 视频监控:自动识别和跟踪监控视频中的人物或车辆,提高安全性。
  • 自动驾驶:实时检测道路上的行人、车辆、交通标志等,辅助驾驶决策。
  • 智能安防:识别特定区域内的可疑活动或物品,提升安防水平。
  • 医疗影像分析:检测医学影像中的异常区域,辅助医生诊断。

随着深度学习的快速发展,基于卷积神经网络(CNN)的对象检测算法在准确性和速度上取得了显著提升。其中,OpenCV作为一个开源的计算机视觉库,提供了丰富的传统对象检测方法,而YOLO系列模型则代表了当前对象检测领域的先进水平。

本文将系统地介绍如何使用Python进行对象检测,涵盖从传统方法到先进的YOLO模型,配以大量代码示例和详细的中文注释,帮助读者全面掌握对象检测的理论与实战技巧。

对象检测基础

对象检测的定义与任务

对象检测的主要任务包括:

  1. 对象定位:确定图像中目标对象的位置,通常以矩形框的形式表示。
  2. 对象分类:识别目标对象的类别,例如人、车、狗等。

对象检测不仅需要识别图像中的多个对象,还要准确地定位它们的位置,这对算法的精度和效率提出了更高的要求。

技术挑战

对象检测面临诸多技术挑战,包括但不限于:

  • 多尺度检测:对象在图像中可能具有不同的大小,如何在不同尺度下准确检测对象是一个关键问题。
  • 遮挡与重叠:对象之间可能存在遮挡或部分重叠,增加了检测的难度。
  • 实时性要求:在某些应用场景中,如自动驾驶,检测算法需要具备实时处理能力。
  • 多类别与高精度:需要同时检测多种类别的对象,并在定位上达到高精度。

评估指标

对象检测算法的性能通常通过以下几个指标来评估:

  • 平均精度均值(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=1NAPi

    其中, 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提供了多种基于传统方法的对象检测技术,主要包括:

  1. Haar Cascades:基于Haar特征的级联分类器,用于检测面部、眼睛等。
  2. 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()
代码解释
  1. 加载模型:使用CascadeClassifier加载预训练的Haar Cascades模型。
  2. 读取图像:读取输入图像并转换为灰度图,因为Haar Cascades在灰度图上效果更好。
  3. 人脸检测:调用detectMultiScale方法进行人脸检测,参数scaleFactor控制图像尺寸缩放,minNeighbors控制检测框的最小邻居数,minSize设置检测对象的最小尺寸。
  4. 绘制矩形:在检测到的人脸位置绘制绿色矩形框。
  5. 显示结果:显示检测结果图像。
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()
代码解释
  1. 初始化HOG描述符:创建一个HOG描述符对象,并设置默认的行人检测SVM分类器。
  2. 读取图像:读取输入图像并转换为灰度图。
  3. 行人检测:调用detectMultiScale方法进行行人检测,参数winStride控制滑动窗口的步幅,padding设置图像边界的填充,scale控制图像尺寸缩放。
  4. 绘制矩形:在检测到的行人位置绘制蓝色矩形框。
  5. 显示结果:显示检测结果图像。

YOLO简介

YOLO(You Only Look Once)是一种实时对象检测系统,由Joseph Redmon等人在2016年提出。YOLO的核心思想是将对象检测任务转化为一个回归问题,直接从图像像素到边界框坐标和类别概率的映射,实现了高速和高精度的对象检测。

YOLO的工作原理

YOLO通过一个单一的神经网络对整个图像进行处理,输出多个边界框及其对应的类别概率。其主要步骤包括:

  1. 图像划分:将输入图像划分为S×S的网格。
  2. 边界框预测:每个网格预测B个边界框,每个边界框包含5个参数(x, y, w, h, confidence)。
  3. 类别概率预测:每个网格预测C个类别的条件概率。
  4. 最终输出:结合边界框置信度和类别概率,计算每个边界框的最终得分,并进行非极大值抑制(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()
代码解释
  1. 加载模型:使用CascadeClassifier加载预训练的Haar Cascades人脸检测模型。
  2. 读取图像:读取输入图像并转换为灰度图,因为Haar Cascades在灰度图上效果更佳。
  3. 人脸检测:调用detectMultiScale方法进行人脸检测,参数scaleFactor控制图像尺寸缩放比例,minNeighbors控制每个检测到的目标至少需要被多少个邻居检测到,minSize设置目标的最小尺寸。
  4. 绘制矩形:在检测到的人脸位置绘制绿色矩形框。
  5. 显示结果:使用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()
代码解释
  1. 初始化HOG描述符:创建一个HOG描述符对象,并设置默认的行人检测SVM分类器。
  2. 读取图像:读取输入图像并转换为灰度图。
  3. 行人检测:调用detectMultiScale方法进行行人检测,参数winStride控制滑动窗口的步幅,padding设置图像边界的填充,scale控制图像尺寸缩放比例。
  4. 绘制矩形:在检测到的行人位置绘制蓝色矩形框。
  5. 显示结果:使用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()
代码解释
  1. 读取图像并转换颜色空间:读取输入图像并转换为HSV颜色空间,便于颜色分割。
  2. 定义红色范围:红色在HSV空间中有两个范围,通过lower_red1upper_red1lower_red2upper_red2定义。
  3. 创建掩码:使用inRange函数创建红色掩码,并通过bitwise_or合并两个掩码。
  4. 应用掩码:将掩码应用于原始图像,提取红色区域。
  5. 阈值处理:将结果转换为灰度图,并进行二值化处理,以便查找轮廓。
  6. 查找与绘制轮廓:使用findContours查找轮廓,并绘制最小外接圆,过滤掉小于一定半径的噪声。
  7. 显示结果:显示检测到的红色圆形物体。

使用YOLO进行对象检测

YOLO系列模型以其高速度和较高的准确性,成为当前对象检测领域的主流方法之一。本文将以YOLOv5为例,详细介绍如何使用预训练的YOLO模型进行对象检测,并通过代码示例展示其实际应用。

YOLOv5简介

YOLOv5是由Ultralytics开发的YOLO系列最新版本,采用PyTorch框架实现,具有更高的灵活性和易用性。YOLOv5提供了多个模型尺寸(如YOLOv5s、YOLOv5m、YOLOv5l、YOLOv5x),用户可以根据实际需求选择合适的模型,以在速度和精度之间取得平衡。

安装与配置

在开始使用YOLOv5进行对象检测之前,需要安装相关依赖。以下是安装步骤:

  1. 克隆YOLOv5仓库
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
  1. 安装依赖
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 = detectionlabel = 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()
代码解释
  1. 加载模型:使用torch.hub.load加载预训练的YOLOv5s模型。
  2. 读取图像:使用cv2.imread读取输入图像,并将其从BGR颜色空间转换为RGB。
  3. 对象检测:将RGB图像输入模型,获取检测结果。
  4. 解析检测结果results.xyxy[0].numpy()返回一个数组,每一行包含一个检测框的信息:[x1, y1, x2, y2, confidence, class]。
  5. 绘制边界框与标签:遍历检测结果,绘制绿色矩形框,并在框上方添加标签和置信度。
  6. 显示结果:使用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图像转换为RGBimg_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 = detectionlabel = 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()
代码解释
  1. 加载模型:与之前相同,加载YOLOv5s模型。
  2. 打开摄像头:使用cv2.VideoCapture(0)打开默认摄像头。
  3. 实时检测循环
    • 读取摄像头帧。
    • 将BGR图像转换为RGB。
    • 进行对象检测并解析结果。
    • 绘制检测框和标签。
    • 显示检测结果。
    • 按下’q’键退出检测循环。
  4. 释放资源:关闭摄像头并销毁所有窗口。

YOLOv5的优化与自定义

为了满足特定应用场景的需求,YOLOv5支持模型的优化与自定义,包括模型微调、转换为不同格式等。

模型微调

通过在特定数据集上微调YOLOv5模型,可以提升模型在特定任务或领域的检测性能。以下是使用YOLOv5进行模型微调的基本步骤:

  1. 准备数据集:按照YOLO格式组织数据,包括图像和对应的标签文件(.txt),标签文件中包含每个对象的类别和边界框坐标。
  2. 配置训练参数:修改data.yaml文件,指定训练、验证集的路径以及类别名称。
  3. 开始训练
python train.py --img 640 --batch 16 --epochs 50 --data data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --name custom_yolov5s
  1. 评估模型:训练完成后,使用val.py进行模型评估,查看mAP等指标。
  2. 导出模型:将训练好的模型导出为不同格式,如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
代码解释
  1. 准备数据集:确保数据集按照YOLO格式组织,包含图像和对应的标签文件。
  2. 配置训练参数:修改data.yaml文件,指定训练集和验证集的路径,以及类别名称。
  3. 开始训练:运行train.py脚本,设置图像尺寸、批量大小、训练轮数、模型配置和预训练权重等参数。
  4. 评估模型:使用val.py脚本评估训练好的模型,查看mAP等指标。
  5. 导出模型:使用export.py脚本将PyTorch模型转换为ONNX格式,便于在不同平台上部署。

图像识别与目标跟踪

对象检测不仅需要在静态图像中识别目标,还需要在视频序列中对目标进行跟踪。结合对象检测与目标跟踪,可以实现视频中目标的连续跟踪,提高检测的实用性。

目标跟踪简介

目标跟踪(Object Tracking)是指在视频序列中持续跟踪特定目标的位置。目标跟踪通常与对象检测结合使用,检测每一帧中的目标,并通过算法将连续帧中的目标关联起来。

常用的目标跟踪算法

  1. SORT (Simple Online and Realtime Tracking):基于卡尔曼滤波和匈牙利算法的简单高效跟踪算法。
  2. Deep SORT:在SORT的基础上引入深度特征,提升在复杂场景下的跟踪性能。
  3. 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图像转换为RGBimg_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 = detdets.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 = outputlabel = 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()
代码解释
  1. 加载模型:加载预训练的YOLOv5模型和Deep SORT跟踪器。
  2. 打开视频源:使用cv2.VideoCapture打开视频文件或摄像头。
  3. 实时检测与跟踪
    • 读取视频帧并转换颜色空间。
    • 使用YOLOv5进行对象检测,获取检测框及类别。
    • 准备检测结果作为Deep SORT的输入,进行目标跟踪。
    • 绘制跟踪结果,包括边界框和跟踪ID。
  4. 显示结果:实时显示带有检测与跟踪结果的视频帧,按下’q’键退出循环。
  5. 释放资源:关闭视频源并销毁所有窗口。

提升对象检测效果的技巧

为了在实际应用中获得更好的对象检测效果,可以采取以下几种优化策略:

数据预处理

数据预处理是提升对象检测模型性能的重要步骤,包括图像增强、归一化等操作。

  • 图像增强:通过旋转、缩放、裁剪、翻转等方式增加数据多样性,提升模型的泛化能力。

    import cv2
    import numpy as npdef 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.0return image
    

数据增强

数据增强不仅限于图像增强,还包括对标注数据的处理,如边界框的调整、遮挡处理等。

def adjust_bounding_boxes(boxes, scale_x, scale_y, dx, dy):"""调整边界框坐标"""adjusted_boxes = []for box in boxes:x1, y1, x2, y2 = boxx1 = 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图像转换为RGBimg_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 = detectionlabel = 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()
代码解释
  1. 加载模型:加载预训练的YOLOv5s模型。
  2. 打开摄像头:使用cv2.VideoCapture(0)打开默认摄像头。
  3. 实时检测循环
    • 读取摄像头帧并转换颜色空间。
    • 使用YOLOv5进行对象检测,获取检测结果。
    • 过滤出行人类别的检测框,并绘制绿色矩形框和标签。
    • 显示检测结果。
    • 按下’q’键退出检测循环。
  4. 释放资源:关闭摄像头并销毁所有窗口。

视频对象检测与跟踪

在视频对象检测中,对每一帧进行对象检测,并结合目标跟踪算法,实现视频中对象的持续跟踪。结合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图像转换为RGBimg_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 = detdets.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 = outputlabel = 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()
代码解释
  1. 加载模型:加载预训练的YOLOv5s模型。
  2. 初始化Deep SORT:设置Deep SORT的参数,加载预训练的Deep SORT模型权重。
  3. 打开视频文件:使用cv2.VideoCapture打开视频文件。
  4. 检测与跟踪循环
    • 读取视频帧并转换颜色空间。
    • 使用YOLOv5进行对象检测,获取检测结果。
    • 准备检测结果作为Deep SORT的输入,进行目标跟踪。
    • 绘制跟踪结果,包括边界框和跟踪ID。
    • 显示检测与跟踪结果。
    • 按下’q’键退出检测循环。
  5. 释放资源:关闭视频源并销毁所有窗口。

数学基础与理论分析

对象检测算法的核心在于如何准确地定位和分类图像中的目标对象。无论是基于传统方法的Haar Cascades和HOG+SVM,还是基于深度学习的YOLO系列模型,其数学基础都涉及到图像特征提取、分类器训练和优化等方面。

Haar Cascades的数学原理

Haar Cascades基于Haar特征和AdaBoost算法,实现了快速且高效的对象检测。其主要步骤包括:

  1. 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)whiteI(x,y)(x,y)blackI(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)的灰度值。

  2. 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是该分类器的错误率。

  3. 级联分类器:将多个弱分类器级联起来,实现高效的对象检测。级联结构能够快速过滤掉背景区域,保留潜在的目标区域,提高检测速度。

HOG特征的数学表示

方向梯度直方图(Histogram of Oriented Gradients, HOG)是一种用于对象检测的特征描述方法,其主要步骤包括:

  1. 梯度计算:计算图像的梯度方向和幅值,通常使用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=xI,Gy=yI

    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)

  2. 细胞划分:将图像划分为小的单元格(cell),如8x8像素。

  3. 梯度方向直方图:在每个单元格中,根据梯度方向对幅值进行加权,构建梯度方向直方图。

    Histogram = ∑ i = 1 N G i ⋅ δ ( θ i − θ k ) \text{Histogram} = \sum_{i=1}^{N} G_i \cdot \delta(\theta_i - \theta_k) Histogram=i=1NGiδ(θiθk)

    其中, G i G_i Gi是第 i i i个像素的梯度幅值, θ i \theta_i θi是其梯度方向, θ k \theta_k θk是直方图的第 k k k个方向。

  4. 块归一化:将多个单元格组成一个块(block),对块内的梯度方向直方图进行归一化处理,增强特征的鲁棒性。

    Normalized Histogram = Histogram Histogram 2 + ϵ 2 \text{Normalized Histogram} = \frac{\text{Histogram}}{\sqrt{\text{Histogram}^2 + \epsilon^2}} Normalized Histogram=Histogram2+ϵ2 Histogram

YOLO的数学模型

YOLO将对象检测任务转化为一个回归问题,通过单一的神经网络直接预测边界框坐标和类别概率。其数学模型如下:

  1. 输入图像:将输入图像调整为固定尺寸(如640x640),并进行归一化处理。

  2. 网络结构:使用卷积神经网络提取特征,并通过多个检测头(Head)输出边界框坐标和类别概率。

  3. 边界框预测:每个检测头预测固定数量的锚框(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表示边界框包含对象的置信度。

  4. 类别概率预测:每个边界框预测各类别的条件概率。

    P ( class i ∣ object ) = softmax ( c i ) P(\text{class}_i | \text{object}) = \text{softmax}(c_i) P(classiobject)=softmax(ci)

    其中, c i c_i ci是类别 i i i的置信度得分。

  5. 损失函数: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=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2+(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj(1c^i)2+λnoobji=0S2j=0B1ijnoobj(ci)2+i=0S21iobjcclasses(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=0S2j=0B1ijobj[(xix^i)2+(yiy^i)2+(wiw^i)2+(hih^i)2]+i=0S2j=0B1ijobj(1c^i)2+λnoobji=0S2j=0B1ijnoobj(ci)2+i=0S21iobjcclasses(pi(c)p^i(c))2

  • 第一项:位置误差,衡量预测边界框与真实边界框的坐标差异。
  • 第二项:存在对象的置信度误差,衡量预测的置信度与真实值的差异。
  • 第三项:不存在对象的置信度误差,通过惩罚预测错误为存在对象的情况。
  • 第四项:类别误差,衡量预测类别概率与真实类别的差异。

结论与展望

本文系统地介绍了如何使用Python进行对象检测,涵盖了基于传统方法的OpenCV对象检测和基于深度学习的YOLO模型。通过详细的理论讲解和丰富的代码示例,读者不仅了解了对象检测的基本原理和技术挑战,还掌握了实战中如何应用不同的方法进行对象检测与跟踪。

随着深度学习技术的不断进步,对象检测模型在准确性和实时性上不断提升,未来的研究方向可能包括:

  • 更高效的模型架构:如YOLOv8等新版本的出现,进一步提升检测速度和精度。
  • 小目标检测:针对小目标检测的优化,提升模型在复杂场景下的表现。
  • 跨领域应用:将对象检测技术应用于更多领域,如医疗影像分析、农业监测等。
  • 增强现实与虚拟现实:结合对象检测技术,提升AR和VR的互动体验。

通过不断的研究和创新,对象检测技术将在计算机视觉领域发挥更大的作用,推动智能应用的发展。

参考文献

  1. 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.
  2. 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.
  3. 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.
  4. Bochkovskiy, A., Wang, C.-Y., & Liao, H.-Y. M. (2020). YOLOv4: Optimal Speed and Accuracy of Object Detection. arXiv preprint arXiv:2004.10934.
  5. Jocher, G., et al. (2021). YOLOv5. GitHub Repository.
  6. Bochkovskiy, A. (2022). YOLOv7: Trainable bag-of-freebies sets new state-of-the-art for real-time object detectors. arXiv preprint arXiv:2207.02696.
  7. Ultralytics YOLOv5 Repository: https://github.com/ultralytics/yolov5
  8. 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 = detectionlabel = 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图像转换为RGBimg_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 = detdets.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 = outputlabel = 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图像转换为RGBimg_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 = outputlabel = 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模型,涵盖了理论基础、算法原理及实战应用。通过丰富的代码示例和详细的中文注释,读者不仅掌握了对象检测的基本方法,还了解了如何结合目标跟踪算法实现视频中对象的持续跟踪。此外,本文还探讨了提升对象检测效果的多种优化策略,帮助读者在实际项目中灵活应用不同的方法。

随着计算机视觉技术的不断发展,对象检测在各个领域的应用将更加广泛和深入。通过不断学习和实践,开发者和研究人员可以利用先进的对象检测技术,推动智能应用的创新与发展。

相关文章:

【人工智能】用Python进行对象检测:从OpenCV到YOLO的全面指南

对象检测是计算机视觉领域的核心任务之一,广泛应用于视频监控、自动驾驶、智能安防等多个场景。随着深度学习技术的发展,基于传统方法的对象检测逐渐被基于神经网络的先进模型所取代。本文将系统地介绍如何使用Python进行对象检测,重点探讨了…...

深度学习从入门到实战——卷积神经网络原理解析及其应用

卷积神经网络CNN 卷积神经网络前言卷积神经网络卷积的填充方式卷积原理展示卷积计算量公式卷积核输出的大小计算感受野池化自适应均值化空洞卷积经典卷积神经网络参考 卷积神经网络 前言 为什么要使用卷积神经网络呢? 首先传统的MLP的有什么问题呢? - …...

Flink概念知识讲解之:Restart重启策略配置

Flink概念知识讲解之:Restart重启策略配置 当 Task 发生故障时,Flink 需要重启出错的 Task 以及其他受到影响的 Task ,以使得作业恢复到正常执行状态。 Flink 通过重启策略和故障恢复策略来控制 Task 重启:重启策略决定是否可以…...

Golang中使用 Mqtt

MQTT 是一种基于发布/订阅模式的 轻量级物联网消息传输协议 ,可以用极少的代码和带宽为联网设备提供实时可靠的消息服务,它广泛应用于物联网、移动互联网、智能硬件、车联网、电力能源等行业。 本文主要介绍如何在 Golang 项目中使用 github.com/eclips…...

腾讯云下架印度云服务器节点,印度云服务器租用何去何从

近日,腾讯云下架印度云服务器节点的消息引起了业界的广泛关注。这一变动让许多依赖印度云服务器的用户开始担忧,印度云服务器租用的未来究竟在何方? 从印度市场本身来看,其云服务市场的潜力不容小觑。据 IDC 报告,到 2…...

STM32内置Flash

一、原理 利用flash存储用户数据需要注意查看,用户数据是否会覆盖芯片运行程序。 IAP(在程序中编程)利用程序修改程序本身,和OTA是一个原理。IAP在程序中编程支持任意一种通信下载。 ICP(在电路中编程,通…...

面试:C++类成员初始化顺序

1、非静态数据成员:按它们在类定义的声明顺序初始化,不会按它们在初始化列表的顺序。 2、静态数据成员:在main函数启动之前,并且只初始化一次 3、基类构造函数:如果类从一个或多个基类继承而来,基类的构造…...

约束的笔记

约束的分类 为什么需要约束 为了保证数据的完整性 ①实体完整性(Entity Integrity)(同一个表中,不能存在两条完全相同无法区分的记录) ②域完整性(Domain Integrity) ③引用完整性(Referential Integ…...

【Docker】安装registry本地镜像库,开启Https功能

下载镜像 docker pull registry:2 需要启动https功能,就要生成服务端的自签名的证书和私钥,以及在docker客户端安装这个经过签名的证书。 第一步:生成公私钥信息,第二步,制作证书签名申请文件, 第三步&…...

el-tree拖拽光标错位问题

背景:el-tree实现的分类树增加拖拽功能后,当分类树由于数量较多产生滚动条,如果分类树已滚动,进行拖拽时会造成光标错位的问题: 原因:el-tree拖拽光标定位的高度并未加上滚动的高度解决:将滚动的样式属性放…...

Linux权限

目录 一.Linux权限的概念 二.Linux权限管理 1.文件访问者的分类 2.文件类型和访问权限 1.文件类型 2.基本权限 3.文件权限的表示方法 1.字符表示法 2.八进制表示法 4.文件权限的相关访问方法 1.chmod 2.chown 3.chgrp 4.粘滞位 三.权限总结 一.Linux权限的概念 …...

mysql binlog 日志分析查找

文章目录 前言一、分析 binlog 内容二、编写脚本结果总结 前言 高效快捷分析 mysql binlog 日志文件。 mysql binlog 文件很大 怎么快速通过关键字查找内容 一、分析 binlog 内容 通过 mysqlbinlog 命令可以看到 binlog 解析之后的大概样子 二、编写脚本 编写脚本 search_…...

win32汇编环境,窗口程序中对按钮控件常用操作的示例

;运行效果 ;win32汇编环境,窗口程序中对按钮控件常用操作的示例 ;常用的操作,例如创建按钮控件,使其无效,改变文本,得到文本等。 ;将代码复制进radasm软件里,直接就可以编译运行。重点部分加备注。 ;>&g…...

风水算命系统架构与功能分析

系统架构 服务端:Java(最低JDK1.8,支持JDK11以及JDK17)数据库:MySQL数据库(标配5.7版本,支持MySQL8)ORM框架:Mybatis(集成通用tk-mapper,支持myb…...

如何在 Ubuntu 22.04 上安装和配置邮件服务器教程

简介: 在本指南中,我们将演示如何在 Ubuntu 22.04 上安装和配置邮件服务器,因为大中型公司可以从拥有私人邮件服务器中获益匪浅。通过使用邮件服务器,可以密切监视所有电子邮件流量。此外,自定义设置的灵活性使得建立…...

后门原理与实践

实验目录 windows主机与kali虚拟机实现互联互通使用netcat获取主机操作Shell,cron启动使用socat获取主机操作Shell, 任务计划启动使用MSF meterpreter生成可执行文件,利用ncat或socat传送到主机并运行获取主机Shell使用MSF meterpreter生成获取目标主机…...

代理模式详解与应用

代理模式(Proxy Pattern),也称为委托模式或 surrogate 模式,是一种结构型设计模式。它为其他对象提供一个代理以控制对这个对象的访问。通过引入代理对象,可以在不改变原始对象接口的前提下,添加额外的功能…...

C#,动态规划问题中基于单词搜索树(Trie Tree)的单词断句分词( Word Breaker)算法与源代码

1 分词 分词是自然语言处理的基础,分词准确度直接决定了后面的词性标注、句法分析、词向量以及文本分析的质量。英文语句使用空格将单词进行分隔,除了某些特定词,如how many,New York等外,大部分情况下不需要考虑分词…...

基于单片机的智能家居排气扇系统设计

1系统方案设计 本设计基于单片机的智能家居排气扇系统采用STM32单片机作为主控制器,通过DHT11温湿传感器和MQ-2烟雾传感器实现温度、湿度、烟雾检测,在自动模式下,可以根据烟雾浓度通过PWM调速的方式自动调节排气扇的速度,而在手…...

基于JAVA+SpringBoot+Vue的二手车交易系统

基于JAVASpringBootVue的二手车交易系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈喽…...

【JVM-2.2】使用JConsole监控和管理Java应用程序:从入门到精通

在Java应用程序的开发和运维过程中,监控和管理应用程序的性能和资源使用情况是非常重要的。JConsole是Java Development Kit(JDK)自带的一款图形化监控工具,它可以帮助开发者实时监控Java应用程序的内存、线程、类加载以及垃圾回收…...

windows及linux 安装 Yarn 4.x 版本

1. 确保系统环境准备 a. 安装 Node.js Yarn 依赖于 Node.js,所以需要先安装 Node.js。前往 Node.js 官网 下载并安装适合你的 Windows 版本的 Node.js(推荐 LTS 版本)。安装完成后,打开命令提示符(CMD)或 PowerShell,验证安装:node -v npm -v如果显示版本号,则表示安…...

VS2015 + OpenCV + OnnxRuntime-Cpp + YOLOv8 部署

近期有个工作需求是进行 YOLOv8 模型的 C 部署,部署环境如下 系统:WindowsIDE:VS2015语言:COpenCV 4.5.0OnnxRuntime 1.15.1 0. 预训练模型保存为 .onnx 格式 假设已经有使用 ultralytics 库训练并保存为 .pt 格式的 YOLOv8 模型…...

1.两数之和--力扣

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。 示例 1…...

MySQL库表的操作

目录 一、库的操作 1.1库的创建 1.2字符集和校验规则 1.2.1 查看系统默认字符集以及校验规则 1.2.2 查看数据库支持的字符集 1.2.3 查看数据库支持的字符集校验规则 1.2.4 校验规则对数据库的影响 1.3操纵数据库 1.3.1显示库 1.3.2显示创建语句 1.3.3修改数据库 1.3…...

【强化学习】深度确定性策略梯度算法(DDPG)详解(附代码)

📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅…...

单片机实物成品-011 火灾监测

火灾监测(20个版本) 版本20: oled显示温湿度烟雾浓度火焰传感器天然气浓度窗户风扇水泵排气系统声光报警语音播报按键WIFI模块 ----------------------------------------------------------------------------- https://www.bilibili.com…...

牛客网刷题 ——C语言初阶(6指针)——BC106 上三角矩阵判定

1. 题目描述——BC106 上三角矩阵判定 牛客网OJ题链接 描述 KiKi想知道一个n阶方矩是否为上三角矩阵,请帮他编程判定。上三角矩阵即主对角线以下的元素都为0的矩阵,主对角线为从矩阵的左上角至右下角的连线。 示例 输入: 3 1 2 3 0 4 5 0 0…...

Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)

索引是数据库中用于加速查询操作的重要机制。通过索引,MySQL可以快速定位到满足查询条件的数据行,而不需要扫描整个表。合理的索引设计可以显著提高查询性能,但不合理的索引可能会导致性能下降和磁盘空间浪费。因此,理解索引的工作…...

Vue3框架核心功能点响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia等的实战示例代码

记录几个Vue3框架核心功能点,例如响应式数据reactive、组合式API setup、computed、组件通信、路由导航,状态管理vuex、pinia……等实战示例代码: 一、响应式数据(Reactive Data) 创建响应式对象 使用reactive函数创建…...

Gitlab-Runner配置

原理 Gitlab-Runner是一个非常强大的CI/CD工具。它可以帮助我们自动化执行各种任务,如构建、测试和部署等。Gitlab-Runner和Gitlab通过API通信,接收作业并提交到执行队列,Gitlab-Runner从队列中获取作业,并允许在不同环境下进行作…...

多台PC共用同一套鼠标键盘

当环境中有多个桌面 pc 需要操作的时候,在 多台 pc 之间切换会造成很多的不方便 可以通过远程进行连接,但是有一个更好的方案是让多台机器之间共用同一套键盘鼠标 常用的解决方案 synergy 和 sharemouse,通过移动光标在不同的 pc 间切换 s…...

学会使用computed计算属性与watch监听(小白学习笔记)

1. 使用不同方法实现 姓名案例 需求: 根据data中 firstName 和 lastName 的值 来动态地展示全名 1.1. 插值语法 如果只使用学过的插值语法 那可以在模板中直接使用两个变量 . 但是如果需要对数据进行计算等处理 就需要在插值语法里写复杂的js表达式. 这样就违背了vue风格指…...

atoi函数的概念和使用案例

atoi 函数是 C 语言标准库中的一个函数&#xff0c;它用于将字符串转换为整数。atoi 的名称是 “ASCII to integer” 的缩写。该函数定义在 <stdlib.h> 头文件中。 概念 atoi 函数会从字符串的开始位置开始转换&#xff0c;直到遇到第一个非数字字符或遇到字符串结束符…...

unittest VS pytest

以下是 unittest 和 pytest 框架的对比表格&#xff1a; 特性unittestpytest设计理念基于类的设计&#xff0c;类似于 Java 的 JUnit更简洁&#xff0c;基于函数式编程设计&#xff0c;支持类和函数两种方式测试编写需要继承 unittest.TestCase 类&#xff0c;方法以 test_ 开…...

B2C API安全警示:爬虫之外,潜藏更大风险挑战

在数字化时代&#xff0c;B2C&#xff08;Business-to-Consumer&#xff09;电子商务模式已成为企业连接消费者、推动业务增长的重要桥梁。而B2C API&#xff08;应用程序编程接口&#xff09;作为企业与消费者之间数据交互的桥梁&#xff0c;其安全性更是至关重要。然而&#…...

大型语言模型(LLM)中的tokens是什么

大型语言模型(LLM)中的tokens是什么 在大型语言模型(LLM)中,tokens是文本处理的基本单位,它可以是一个单词、一个字符、一个标点符号,或者是一个特殊的标记。以下是关于tokens的详细介绍及举例: 一、tokens的定义和作用 定义:tokens是将文本分割成的一个个有意义的…...

自动驾驶---E2E架构演进

1 背景 模型最早应用的自动驾驶模块就是感知层面&#xff0c;随着技术的发展&#xff0c;逐渐开始应用到决策规划等其它模块。端到端自动驾驶架构是一种基于深层神经网络模型和方法的自动驾驶技术模式。目前一段式端到端系统只有在英伟达早期所做的demo中实现&#xff0c;再者就…...

w~自动驾驶~合集16

我自己的原文哦~ https://blog.51cto.com/whaosoft/12765612 #SIMPL 用于自动驾驶的简单高效的多智能体运动预测基准 原标题&#xff1a;SIMPL: A Simple and Efficient Multi-agent Motion Prediction Baseline for Autonomous Driving 论文链接&#xff1a;https://ar…...

python学opencv|读取图像(三十)使用cv2.getAffineTransform()函数倾斜拉伸图像

【1】引言 前序已经学习了如何平移和旋转缩放图像&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;二十七&#xff09;使用cv2.warpAffine&#xff08;&#xff09;函数平移图像-CSDN博客 python学opencv|读取图像&#xff08;二十八&#xff0…...

Java异常处理

1.异常是程序运行过程中出现的非正常现象&#xff0c;例如输入错误、需要处理的文件不存在&#xff0c;在网络上传输数据但是网络没有连接等2.在java中我们把异常分为&#xff1a;错误&#xff08;Error&#xff09;和异常&#xff08;Exception&#xff09;Exception类有自己的…...

STM32-DMA数据转运

注&#xff1a;DMA对应的库函数文件讲解 DMA_GetITStatus(uint32_t DMAy_IT) 是一个用于检查DMA&#xff08;直接存储器访问&#xff09;中断状态的库函数。它通常在使用STM32系列微控制器及其标准外设库时被调用。此函数的主要作用是返回指定DMA通道的特定中断标志的状态&…...

ASP.NET Core 实现微服务 - Elastic APM

这次要给大家介绍的是Elastic APM &#xff0c;一款应用程序性能监控组件。APM 监控围绕对应用、服务、容器的健康监控&#xff0c;对接口的调用链、性能进行监控。在我们实施微服务后&#xff0c;由于复杂的业务逻辑&#xff0c;服务之间的调用会像蜘蛛网一样复杂。有了调用链…...

Stable Diffusion本地部署教程(附安装包)

想使用Stable Diffusion需要的环境有哪些呢? python3.10.11(至少也得3.10.6以上):依赖python环境NVIDIA:GPUgit:从github上下载包(可选,由于我已提供安装包,你可以不用git)Stable Diffusion安装包工具包: NVIDIA:https://developer.nvidia.com/cuda-toolkit-archiv…...

图片和短信验证码(头条项目-06)

1 图形验证码接口设计 将后端⽣成的图⽚验证码存储在redis数据库2号库。 结构&#xff1a; {img_uuid:0594} 1.1 创建验证码⼦应⽤ $ cd apps $ python ../../manage.py startapp verifications # 注册新应⽤ INSTALLED_APPS [django.contrib.admin,django.contrib.auth,…...

天气app的收获

天气app的收获 无论如何&#xff0c;是基于MVC模式&#xff0c;但都是从UI页面开始设计&#xff0c;然后根据输入的城市名称&#xff0c;将其传入到model层&#xff0c;进行相对应的处理。 对于controler层&#xff0c;需要通过一些协议完成一些输入的反馈&#xff0c;例如输…...

软件自动定时启动器

点击添加软件&#xff0c;可以添加可执行文件软件&#xff0c;设置启动的时间&#xff0c;也可以设置关闭的时间 注意&#xff0c;时间为00&#xff1a;00&#xff1a;00 等于没设置&#xff0c;这个时间不在设置范围&#xff0c;其他任何时间都可以 1.1更新 1&#xff1a;修复…...

k8s部署rocketmq踩坑笔记

给团队部署一个rocketmq4.8.0. k8s上部署的broker&#xff0c;注册到nameserver上是自己的pod ip&#xff0c;导致本机连接到的broker的pod ip&#xff0c;这个ip k8s集群外的机器是无法联通的。 nameserver上注册的是这个pod ipv4 尝试将broker的配置brokerIP1修改为注册到na…...

从项目代码看 React:State 和 Props 的区别及应用场景实例讲解

在 React 中&#xff0c;state 和 props 是组件的两个重要概念&#xff0c;它们有不同的作用和应用场景。理解它们之间的区别对于开发 React 应用至关重要。 1. state 和 props 的区别 props (属性)&#xff1a; props 是由父组件传递给子组件的数据或函数。props 是只读的&am…...

深度学习中的优化算法

深度学习中的优化算法&#xff0c;是模型训练期间微调神经网络参数的关键元素。其主要作用是最小化模型的误差或损失&#xff0c;从而提高性能。各种优化算法(称为优化器)采用不同的策略来收敛到最佳参数值&#xff0c;从而有效地提高预测效果。 在深度学习的背景下&#xff0c…...