基于深度学习的电动自行车头盔佩戴检测系统是一种基于YOLOv5和DeepSORT算法的实现方案。它主要解决了电动自行车使用过程中对头盔佩戴的管理问题,有效提高了行车安全性。
首先,YOLOv5算法是一种目标检测算法,其主要思想是从输入图像中自动确定图像中的物体位置和类别,可用于各种基于视觉的应用程序。在电动自行车头盔佩戴检测系统中,我们可以使用YOLOv5算法来检测电动自行车骑手是否佩戴头盔。YOLOv5算法的主要流程包括:通过卷积神经网络提取图像特征,生成候选框并计算出候选框内物体的置信度得分和类别得分。然后,使用置信度得分和类别得分对所有候选框进行排序,并筛选出置信度最高的候选框作为目标框。
接下来,我们将使用DeepSORT算法对目标框进行跟踪,以实现多目标跟踪。DeepSORT算法是一种多目标跟踪算法,可用于跟踪多个目标在图像序列中的运动轨迹。在电动自行车头盔佩戴检测系统中,我们可以使用DeepSORT算法来跟踪骑手佩戴头盔的状态。DeepSORT算法的主要流程包括:通过卷积神经网络提取图像特征,并使用余弦相似度计算目标之间的相似度,以判断它们是否属于同一目标;然后,结合卡尔曼滤波器预测目标在下一帧中的位置,并根据当前帧和前N帧的特征信息更新目标的跟踪状态。
最终,通过结合YOLOv5算法检测和DeepSORT算法跟踪,在电动自行车头盔佩戴检测系统中可以实现对骑手佩戴头盔情况的快速、准确检测和跟踪。具体实现过程如下:首先,使用YOLOv5算法对输入的视频序列中的每一帧进行目标检测,得到目标框的位置和类别信息。然后,通过DeepSORT算法对目标框进行跟踪,并在多个连续帧中识别骑手是否佩戴头盔。
import numpy as np
import torch
import torch.backends.cudnn as cudnn
from utils.parser import get_config
from utils.torch_utils import select_device
from models.experimental import attempt_load
from utils.datasets import letterbox
from utils.general import check_img_size, non_max_suppression, scale_coords
class Detector:
def __init__(self, target):
# Init YOLOv5
yolov5_cfg = get_config()
# select weights
if target == 'EB':
yolov5_cfg.merge_from_file('configs/eb.yaml')
self.weights, self.imgsz, self.conf_thres, self.iou_thres, self.device, self.agnostic_nms, self.augment= yolov5_cfg.YOLOV5.WEIGHTS, yolov5_cfg.YOLOV5.IMG_SIZE, yolov5_cfg.YOLOV5.CONF_THRES, yolov5_cfg.YOLOV5.IOU_THRES, yolov5_cfg.YOLOV5.DEVICE, yolov5_cfg.YOLOV5.AGNOSTIC_NMS, yolov5_cfg.YOLOV5.AUGMENT
elif target == 'Helmet':
yolov5_cfg.merge_from_file('configs/helmet.yaml')
self.weights, self.imgsz, self.conf_thres, self.iou_thres, self.device, self.agnostic_nms, self.augment= yolov5_cfg.YOLOV5.WEIGHTS, yolov5_cfg.YOLOV5.IMG_SIZE, yolov5_cfg.YOLOV5.CONF_THRES, yolov5_cfg.YOLOV5.IOU_THRES, yolov5_cfg.YOLOV5.DEVICE, yolov5_cfg.YOLOV5.AGNOSTIC_NMS, yolov5_cfg.YOLOV5.AUGMENT
# Initialize
self.device = select_device(self.device)
self.half = self.device.type != 'cpu' # half precision only supported on CUDA
# Load model
self.model = attempt_load(self.weights, map_location=self.device) # load FP32 model
self.imgsz = check_img_size(self.imgsz, s=self.model.stride.max()) # check img_size
if self.half:
self.model.half() # to FP16
cudnn.benchmark = True # set True to speed up constant image size inference
# Get names
self.names = self.model.module.names if hasattr(self.model, 'module') else self.model.names
def detect(self, img, classes):
im0 = img.copy()
img = letterbox(img, new_shape=self.imgsz)[0]
img = img[:, :, ::-1].transpose(2, 0, 1)
img = np.ascontiguousarray(img)
img = torch.from_numpy(img).to(self.device)
img = img.half() if self.half else img.float() # uint8 to fp16/32
img /= 255.0 # 0 - 255 to 0.0 - 1.0
if img.ndimension() == 3:
img = img.unsqueeze(0)
# Inference
pred = self.model(img, augment=self.augment)[0]
# Apply NMS
pred = non_max_suppression(pred, self.conf_thres, self.iou_thres, classes=classes, agnostic=self.agnostic_nms)
bboxes = []
# Process detections
for det in pred: # detections per image
if det is not None and len(det):
# Rescale boxes from img_size to im0 size
det[:, :4] = scale_coords(img.shape[2:], det[:, :4], im0.shape).round()
for *xyxy, conf, cls in reversed(det):
className = self.names[int(cls)]
bboxes.append((*xyxy, conf, className))
return bboxes
在运行程序前需要执行如下操作:
(1)利用MySQL导入程序主目录下database文件夹下的eb_helmet.sql数据库文件
(2)在webcam数据表下填入相应信息:
字段名 | 类型 | 含义 |
---|---|---|
device | varchar(10) | 监控视频设备名 |
longitude | float(9,6) | 监控视频所处地理位置的经度 |
latitude | float(9,6) | 监控视频所处地理位置的纬度 |
source | varchar(100) | 监控视频RTSP地址 |
设置完成后执行程序主目录下的app.py即可运行程序,在浏览器中输入127.0.0.1:8000即可显示系统界面,系统界面如下图所示: