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

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景

在现代工业和建筑行业中,安全始终是首要考虑的因素之一。特别是在施工现场,工人佩戴安全帽是确保人身安全的基本要求。然而,人工监督难免会有疏漏,尤其是在大型工地或复杂环境中,确保每个人都佩戴安全帽变得非常具有挑战性。
为了解决这一问题,计算机视觉技术提供了一个有效的解决方案。通过使用深度学习模型(如YOLOv5)进行实时目标检测,我们可以自动识别视频流中的工人是否佩戴了安全帽。结合Flask框架,我们可以将这一功能封装为一个Web服务,方便在任何地方通过浏览器或其他设备进行访问。

项目目标

  • 使用YOLOv5模型实现对RTSP视频流的工人是否佩戴安全帽实时目标检测。
  • 将检测功能集成到Flask Web应用中,以便通过简单的HTTP请求访问检测结果。
  • 提供一个用户友好的前端界面,实时展示检测结果。

技术栈

  • YOLOv5:一个高效的实时目标检测模型,适用于多种场景的物体检测。
  • Flask:一个轻量级的Python Web框架,用于构建RESTful API和Web应用。
  • OpenCV:一个强大的计算机视觉库,用于处理视频流和图像。
  • RTSP:实时流传输协议,用于从摄像头获取视频流。

接下来,我将详细介绍如何构建这样一个系统,从环境准备到最终的部署。

2、环境准备

pip install Flask
pip install opencv-python
# 安装YOLOv5依赖:
pip install -r requirements.txt
#下载预训练权重:
wget https://github.com/ultralytics/yolov5/releases/download/v4.0/yolov5s.pt

3、模型训练

数据集为各类场景下的安全帽图片,并使用Labelimg标注工具对每张图片中的目标边框(Bounding Box)及类别进行标注。一共包含22789张图片,其中训练集包含15887张图片,验证集包含4641张图片,测试包含2261张图片。
在这里插入图片描述

  • 数据集目录结构:

    yolov5/
    ├── datasets/
    │   ├── train/
    │   │   ├── images/ 
    │   │   └── labels/      
    │   ├── val/
    │   │   ├── images/
    │   │   └── labels/
    │   └── test/
    │       ├── images/
    │       └── labels/
    
  • 创建数据配置文件:

    在 datasets 文件夹下创建一个 data.yaml 文件,内容如下:

    train: E:\yolo\mydata\train\images
    val: E:\yolo\mydata\val\images
    test: E:\yolo\mydata\test\images# number of classes
    nc: 2# class names
    names: ['head', 'helmet']
    
  • 在YOLOv5项目目录下,运行以下命令开始训练模型:

    python train.py --img 640 --batch 16 --epochs 50 --data datasets/data.yaml --cfg models/yolov5s.yaml --weights yolov5s.pt --project runs/train --name safety_helmet
    

4、训练结果评估

在深度学习中,我们通常用损失函数下降的曲线来观察模型训练的情况。YOLOv5在训练时主要包含三个方面的损失:定位损失(box_loss)、分类损失(cls_loss)和动态特征损失(dfl_loss),在训练结束后,可以在runs/目录下找到训练过程及结果文件,如下所示:
在这里插入图片描述
在这里插入图片描述
本文训练结果如下:
在这里插入图片描述
PR曲线:
在这里插入图片描述

5、实现RTSP视频流处理

使用OpenCV可以方便地处理RTSP视频流逻辑集成到Flask Web服务中,以便通过HTTP请求访问目标检测结果。在这个获取视频流过程中利用海康或者大华摄像头。

from flask import Flask, render_template, Response
import cv2from models.experimental import attempt_load
from utils.general import set_logging, check_img_size
from utils.torch_utils import select_deviceapp = Flask(__name__)from camera_ready import detectclass VideoCamera(object):def __init__(self):# 通过opencv获取实时视频流(海康摄像头)self.count = 0self.video = cv2.VideoCapture("rtsp://admin:Tc246800@ya.tenchan.cn:61554/Streaming/Channels/102")# 大华摄像头# self.video = cv2.VideoCapture("rtsp://%s:%s@%s/cam/realmonitor?channel=%d&subtype=0" % (user, pwd, ip, channel))self.weights, imgsz = 'best.pt', 640set_logging()self.device = select_device('')self.half = self.device.type != 'cpu'  # half precision only supported on CUDAself.model = attempt_load(self.weights, map_location=self.device)  # load FP32 modelself.stride = int(self.model.stride.max())  # model strideself.imgsz = check_img_size(imgsz, s=self.stride)  # check img_sizeif self.half:self.model.half()  # to FP16def __del__(self):self.video.release()def get_frame(self):for i in range(1):success, image = self.video.read()image = detect(source=image, half=self.half, model=self.model, device=self.device, imgsz=self.imgsz,stride=self.stride)ret, jpeg = cv2.imencode('.jpg', image)return jpeg.tobytes()@app.route('/xyhaw')
def xyhaw():return render_template('index.html')def gen(camera):while True:frame = camera.get_frame()yield (b'--frame\r\n'b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n')@app.route('/video_feed')
def video_feed():return Response(gen(VideoCamera()),mimetype='multipart/x-mixed-replace; boundary=frame')if __name__ == '__main__':app.run(host='0.0.0.0', debug=True)

前端简单页面:index.html

<!DOCTYPE html>
<html>
<head><title>安全帽检测</title><style>body {font-family: Arial, sans-serif;text-align: center;margin: 0;padding: 0;}.header {background-color: #4CAF50;color: white;padding: 15px;}.video-container {margin-top: 20px;}img {border: 1px solid #ddd;border-radius: 4px;padding: 5px;}</style>
</head>
<body><div class="header"><h1>安全帽RTSP视频流实时目标检测</h1></div><div class="video-container"><img src="{{ url_for('video_feed') }}" width="640" height="480"></div>
</body>
</html>

6、检测结果

相关文章:

基于YOLOV5+Flask安全帽RTSP视频流实时目标检测

1、背景 在现代工业和建筑行业中&#xff0c;安全始终是首要考虑的因素之一。特别是在施工现场&#xff0c;工人佩戴安全帽是确保人身安全的基本要求。然而&#xff0c;人工监督难免会有疏漏&#xff0c;尤其是在大型工地或复杂环境中&#xff0c;确保每个人都佩戴安全帽变得非…...

Windows内置的服务器IIS(Internet Information Services)托管网站

一. 安装IIS 打开控制面板&#xff1a;在开始菜单搜索“控制面板”并打开它。程序和功能&#xff1a;点击“程序”然后选择“程序和功能”。启用或关闭Windows功能&#xff1a;在左侧菜单中选择“启用或关闭Windows功能”。查找并勾选IIS&#xff1a;在弹出的窗口中&#xff0c…...

虚幻引擎结构之UObject

一. UObject 的介绍 UObject 是虚幻引擎中的核心基础类,所有其他游戏对象和资源类都直接或间接地继承自它。作为虚幻引擎的基石,UObject 提供了多项关键功能,包括内存管理、序列化、反射(introspection)、垃圾回收以及元数据支持。在虚幻引擎中,UObject 类的实例通常被称…...

js的Reflect对象

Reflect 对象是 JavaScript ES6 中引入的一个内建对象&#xff0c;它提供了一系列与对象操作相关的方法。这些方法与 Object 对象上的方法类似&#xff0c;但在行为上有一些差异&#xff0c;并且更加规范和统一。Reflect 对象并不是一个构造函数&#xff0c;不能被 new 操作符调…...

this指向了谁?

看函数在执行的时候是如何调用的&#xff0c; 1 如果这个函数是用普通函数调用模式来进行调用&#xff0c;它内部的this指向了window; 2 如果一个函数在调用的时候是通过对象方法模式来进行调用&#xff0c;则它内部的this就是我们的对象; 3 如果一个函数在调用的时候通过构…...

基于Resnet、LSTM、Shufflenet及CNN网络的Daily_and_Sports_Activities数据集仿真

在深度学习领域&#xff0c;不同的网络结构设计用于解决特定的问题。本文将详细分析四种主流网络结构&#xff1a;卷积神经网络&#xff08;CNN&#xff09;、残差网络&#xff08;ResNet&#xff09;、长短期记忆网络&#xff08;LSTM&#xff09;和洗牌网络&#xff08;Shuff…...

mac系统vsCode中使用Better Comments在.vue文件里失效

问题&#xff1a;关于Better Comments默认在html、TS、JS中有效&#xff0c;在vue中无效,需要单独进行配置 windows系统可以参考友链Better Comments&#xff08;注释高亮&#xff09;在vue文件里失效的问题 关于Better Comments电脑的配置路径&#xff1a; Windows系统&…...

UE5.3 C++ Ceiusm中的POI 制作3DUI 结合坐标转化

一.核心思路WidgetComponent CesiumGloberAnchor 二.先制作POI 创建C Actor来制作&#xff0c;APOI。直接上代码 #pragma once#include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "CesiumGlobeAnchorComponent.h" #includ…...

一起学Git【第六节:查看版本差异】

git diff是 Git 版本控制系统中用于展示差异的强大工具。他可以用于查看文件在工作区、暂存区和版本库之间的差异、任意两个指定版本之间的差异和两个分支之间的差异等,接下来进行详细的介绍。 1.显示工作区与暂存区之间的差异 # 显示工作区和暂存区之间的差异,后面不加参数…...

numpy np.newaxis介绍

np.newaxis 是 NumPy 中用于增加数组维度的关键字。它的作用是为数组插入一个新的维度&#xff0c;从而改变数组的形状&#xff08;shape&#xff09;。 基本用法 np.newaxis 等价于 None&#xff0c;可以作为索引使用&#xff0c;用于在指定位置增加一个维度。增加的维度的大…...

小程序配置文件 —— 16 项目配置文件和配置 sass

目录 项目配置文件配置 sass 项目配置文件 在创建项目的时候&#xff0c;每个项目的根目录生成两个 config.json 文件&#xff08;project.config.json 和 project.private.config.json &#xff09;&#xff0c;用于保存开发者在工具上做的个性化配置&#xff0c;例如和编译有…...

【yolov5】实现FPS游戏人物检测,并定位到矩形框上中部分,实现自瞄

介绍 本人机器学习小白&#xff0c;通过语言大模型百度进行搜索&#xff0c;磕磕绊绊的实现了初步效果&#xff0c;能有一些锁头效果&#xff0c;但识别速度不是非常快&#xff0c;且没有做敌友区分&#xff0c;效果不是非常的理想&#xff0c;但在4399小游戏中爽一下还是可以…...

概率统计与随机过程--作业5

一、推导题 二、计算题 1、某单位为了研究太阳镜销售和广告费用之间的关系&#xff0c;搜集了以下数据&#xff0c;使用回归分析方法得到线性回归模型&#xff1a; 广告费用&#xff08;万元&#xff09;x 2 5 6 7 22 25 28 30 22 18 销售量&#xff08;个&#xf…...

“802.11g”,“802.11n”,“802.11ac”,“802.11ax”

802.11g、802.11n、802.11ac、802.11ax都是IEEE制定的无线局域网&#xff08;WLAN&#xff09;标准&#xff0c;它们各自具有不同的特点和性能。以下是对这四个标准的详细介绍&#xff1a; 1. 802.11g 定义&#xff1a;802.11g是IEEE制定的一种无线局域网标准&#xff0c;它提…...

Kubernetes 常用的网络插件

上篇内容跟大家简单聊了k8s网络模型原理。分别围绕着容器、Pod、Service、网络策略等展开了详细的讲解。这次想跟大家聊聊k8s的CNI网络插件。 CNI 是 Kubernetes 网络模型的核心组件&#xff0c;它是一个插件接口&#xff0c;允许用户选择和配置网络插件来管理 Pod 的网络。CN…...

Retrofit和rxjava 实现窜行请求,并行请求,循环多次请求,递归请求,错误重试

在使用 Retrofit 和 RxJava 时&#xff0c;可以通过多种方式实现多次请求&#xff0c;比如串行请求、并行请求、依赖请求等。以下是一些常见的实现方式&#xff1a; 1. 串行请求&#xff08;依赖关系&#xff09; 一个请求的结果作为另一个请求的输入&#xff0c;可以用 flat…...

2025年度好用便签推荐,电脑桌面便签app分享

在快节奏的现代生活中&#xff0c;高效的时间管理和任务规划变得尤为重要。一款好用的便签软件不仅能帮助我们记录灵感、待办事项&#xff0c;还能极大地提升我们的工作效率。 在众多电脑桌面便签中&#xff0c;好用便签以其出色的桌面便签功能脱颖而出&#xff0c;备受用户青…...

【论文解读】Arbitrary-steps Image Super-resolution via Diffusion Inversion

级别:arXiv Computer Vision and Pattern Recognition(2024)作者:Zongsheng Yue,Kang Liao,Chen Change Loy时间:2024论文链接:Arbitrary-steps Image Super-resolution via Diffusion Inversion摘要 技术概述:该技术基于扩散反转,通过设计部分噪声预测策略来构建扩散…...

kkFileView集成springboot:使用自定义预览接口(非minio预览接口),发现无法预览资源

目录 1、背景2、原因分析3、解决办法 1、背景 按照项目验收要求&#xff0c;需要对minio中存储的数据进行加密 之前提供给kkFileView的预览地址都是获取的minio预览地址 由于minio中的资源进行了加密处理&#xff0c;所以我们自定义预览接口&#xff08;进行解密操作&#xff…...

被裁20240927 --- 嵌入式硬件开发 STM32篇

人很容易原谅别人的错误但很难原谅别人的正确 1. 文档、手册、指南、资源2. MCU 结构3. MCU 和 MPU 的区别4. 一些概念什么是看门狗 &#xff1f;什么是 DMA &#xff1f;什么是晶振 &#xff1f;什么是片内外设&#xff1f;软件协议、硬件协议、数据协议、通讯协议、通信协议u…...

div或button一些好看实用的 CSS 样式示例

1&#xff1a;现代渐变按钮 .count {width: 800px;background: linear-gradient(135deg, #72EDF2 0%, #5151E5 100%);padding: 12px 24px;border-radius: 10px;box-shadow: 0 4px 15px rgba(81, 81, 229, 0.3);color: white;font-weight: bold;border: none;cursor: pointer;t…...

如何查询服务器的端口号

要查询服务器上某个服务正在使用的端口号&#xff0c;可以使用几个不同的工具和方法&#xff0c;具体方法取决于你对服务器的访问权限以及具体的操作系统。以下是一些常用的方法&#xff1a; 1. 在Linux系统上 1.1 使用 netstat 命令&#xff08;需要管理员权限&#xff09;&…...

计算机网络 | 1.1 计算机网络概述思维导图

附大纲&#xff1a; 计算机网络的概念 一个通过通信设备与线路把不同计算机系统连接起来&#xff0c;实现资源共享和信息传递的系统 计算机网络的组成 从组成成分上 硬件&#xff1a;主机、通信链路、交换设备、通信处理机软件&#xff1a;网络操作系统、聊天软件等协议&…...

联想小新笔记本电脑静电问题导致无法开机/充电的解决方案

一、问题背景 近期部分用户反馈联想小新系列笔记本电脑在特定环境下&#xff08;如秋冬干燥季节&#xff09;出现无法开机或充电的问题。经分析&#xff0c;此类现象多由静电积累触发主板保护机制导致&#xff0c;少数情况可能与电源适配器、电池老化或环境因素相关。本文将从技…...

LangChain-Tool和Agent结合智谱AI大模型应用实例2

1.Tool(工具) 定义与功能 单一功能模块:Tool是完成特定任务的独立工具,每个工具专注于一项具体的操作,例如:搜索、计算、API调用等 无决策能力:工具本身不决定何时被调用,仅在被触发时执行预设操作 输入输出明确:每个工具需明确定义输入、输出参数及格式 2.Agent(…...

redis五种数据结构底层实现

参考文档&#xff1a; redis5种数据结构底层实现...

国产化Word处理控件Spire.Doc教程:通过Java简单快速的将 HTML 转换为 PDF

在处理 HTML 文件时&#xff0c;你可能会发现它们在不同的浏览器和屏幕尺寸下的显示效果并不一致。而将 HTML 转换为 PDF 则可以有效地保留其布局和格式&#xff0c;从而确保内容在不同设备和平台上的呈现保持一致。本文将介绍如何在 Spire.Doc for Java 的帮助下通过 Java 将 …...

Git 使用规范

Git 使用规范 一、版本控制的核心原则 &#x1f9ed;二、分支策略&#xff08;Branch Strategy&#xff09; &#x1f33f;2.1 分支类型与命名规范2.2 可视化流程图 三、提交信息规范&#xff08;Commit Message&#xff09;✍️3.1 提交格式3.2 Type 类型说明 四、Tag 版本规范…...

文档处理的相关工具

目前网页端的文档&#xff0c;可以通过沉浸式翻译来进行翻译阅读和学习。 但是某些文献只有pdf下载的版本&#xff0c;所以需要一个免费的针对pdf的翻译工具。 保留公式和图片格式。 推荐一个pdf翻译的工具&#xff0c;可以自己部署使用。如果需要word版本&#xff0c;后面讨论…...

白杨SEO:做AI搜索优化的DeepSeek、豆包、Kimi、百度文心一言、腾讯元宝、通义、智谱、天工等AI生成内容信息采集主要来自哪?占比是多少?

大家好&#xff0c;我是白杨SEO&#xff0c;专注SEO十年以上&#xff0c;全网SEO流量实战派&#xff0c;AI搜索优化研究者。 在开始写之前&#xff0c;先说个抱歉。 上周在上海客户以及线下聚会AI搜索优化分享说各大AI模型的联网搜索是关闭的&#xff0c;最开始上来确实是的。…...