Python 语言 用 OpenCV+DNN 实现目标检测 YOLOv5 识别道路车辆

Python阿木 发布于 18 小时前 1 次阅读


使用OpenCV+DNN实现YOLOv5道路车辆检测

随着计算机视觉技术的不断发展,目标检测在智能交通、自动驾驶等领域发挥着越来越重要的作用。本文将介绍如何使用OpenCV和DNN模块,结合YOLOv5模型实现道路车辆检测。

准备工作

在开始之前,请确保您已经安装了以下软件和库:

- Python 3.x
- OpenCV 4.x
- PyTorch
- YOLOv5

以下是安装步骤:

1. 安装Python 3.x:从官方网站下载并安装Python 3.x。
2. 安装OpenCV:使用pip安装OpenCV库。
bash
pip install opencv-python

3. 安装PyTorch:从PyTorch官方网站下载安装脚本,并按照指示进行安装。
4. 下载YOLOv5:从GitHub仓库克隆YOLOv5代码库。
bash
git clone https://github.com/ultralytics/yolov5.git

YOLOv5模型介绍

YOLOv5是一种基于深度学习的目标检测算法,具有速度快、准确率高、易于部署等优点。它将目标检测任务分为两个阶段:特征提取和目标分类。

特征提取

YOLOv5使用PyTorch作为深度学习框架,并采用CSPDarknet53作为主干网络。CSPDarknet53是一种改进的Darknet网络,具有更深的网络结构和更好的性能。

目标分类

在特征提取的基础上,YOLOv5使用锚框(anchor boxes)对图像进行划分,并预测每个锚框的类别和位置。通过非极大值抑制(NMS)算法,将重叠的锚框合并,最终得到检测到的目标。

实现步骤

1. 导入必要的库

python
import cv2
import torch
from PIL import Image
import numpy as np
import os
import sys
sys.path.append('yolov5') 添加YOLOv5路径
from models.experimental import attempt_load
from utils.datasets import LoadStreams, LoadImages
from utils.general import check_img_size, non_max_suppression, scale_coords
from utils.torch_utils import select_device, time_synchronized

2. 加载模型

python
device = select_device('cuda:0' if torch.cuda.is_available() else 'cpu')
model = attempt_load('yolov5s.pt', map_location=device) 加载预训练模型
model.to(device).eval()

3. 加载图像

python
imgsz = 640 设置图像大小
source = 'data/images' 设置图像路径
stream = False 是否使用视频流
img = Image.open(source) if source.endswith('.jpg') or source.endswith('.jpeg') or source.endswith('.png') else source
if img.is_dir(): 如果是目录,则加载目录中的所有图像
images = [os.path.join(img, f) for f in os.listdir(img)]
else:
images = [img]

4. 检测图像

python
for path in images:
img = Image.open(path)
img = img.resize((imgsz, imgsz))
img = np.array(img)
img = img.transpose((2, 0, 1))
img = np.expand_dims(img, 0)
img = torch.from_numpy(img).to(device)
img = img.float() uint8 to fp16/32
img /= 255.0 归一化
if img.ndimension() == 3:
img = img.unsqueeze(0)

pred = model(img, augment=False)[0]

pred = non_max_suppression(pred, 0.4, 0.5, classes=None, agnostic=False)
for i, det in enumerate(pred): 检测到的目标
p, s, im0 = path, '', img

p = path
s += '%gx%g ' % img.shape[2:] 图像大小
if len(det):
det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()

for c in det[:, -1].unique():
n = (det[:, -1] == c).sum() 每个类别的数量
s += f'{n} {model.names[int(c)]}s, ' 添加类别信息

for xyxy, conf, cls in reversed(det):
label = f'{model.names[int(cls)]} {conf:.2f}'
print(label, xyxy)
cv2.rectangle(im0, xyxy, (255, 0, 0), 2)
cv2.putText(im0, label, xyxy[0:2], cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

print(s)
cv2.imshow('Image', im0)
cv2.waitKey(0)

5. 保存检测结果

python
保存检测结果
cv2.imwrite('检测结果.jpg', im0)

总结

本文介绍了如何使用OpenCV和DNN模块,结合YOLOv5模型实现道路车辆检测。通过以上步骤,您可以快速搭建一个基于YOLOv5的道路车辆检测系统。在实际应用中,您可以根据需求调整模型参数和图像大小,以提高检测效果。