[C#][winform]基于yolov5的驾驶员抽烟打电话安全带检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
【重要说明】
该系统以opencvsharp作图像处理,onnxruntime做推理引擎,使用CPU进行推理,适合有显卡或者没有显卡windows x64系统均可,不支持macOS和Linux系统,不支持x86的windows操作系统。由于采用CPU推理,要比GPU慢。为了适合大部分操作系统我们暂时只写了CPU推理源码,GPU推理源码后期根据需要可能会调整,目前只考虑CPU推理,主要是为了照顾现在大部分使用该源码是学生,很多人并没有显卡的电脑情况。
【算法介绍】
基于YOLOv5的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统,旨在提高驾驶安全性。该系统利用YOLOv5算法,这是一种基于深度学习的目标检测算法,特别适用于实时目标检测任务。
在驾驶员抽烟、打电话、安全带检测系统中,YOLOv5算法通过将图像分割成网格并对每个网格进行分类,同时回归框的边界框参数,从而在单个前向传递中实现目标检测。为了训练这一系统,需要构建一个包含大量标注图像的数据集,这些图像应覆盖各种驾驶环境下,司机抽烟、打电话以及未系安全带的实例。
在实际应用中,该系统可以通过预置的摄像头或监控系统来实时获取图像或视频流,对输入图像进行处理和分析,通过YOLOv5模型检测驾驶员的行为,并判断是否存在抽烟、打电话或未系安全带等分心或违规行为。如果检测到这些行为,系统可以触发警报、发送通知或采取其他适当的措施,以提醒驾驶员纠正分心行为或违规行为,从而降低事故风险。
此外,该系统还需要考虑隐私保护和合规性相关的问题,确保系统的合法性和有效性。通过不断优化算法性能、扩大高质量数据集规模以及在实际应用中平衡技术与法律伦理考量,该系统将在减少交通事故、保障驾驶安全方面发挥重要作用。
【效果展示】


【测试环境】
windows10 x64系统
VS2019
netframework4.7.2
opencvsharp4.8.0
onnxruntime1.16.3
【模型可以检测出类别】
{0: 'cigarette', 1: 'phone', 2: 'seatbelt'}
【相关数据集(非本文训练的数据集)】
https://download.csdn.net/download/FL1623863129/89319046
【训练信息】
| 参数 | 值 |
| 训练集图片数 | 11932 |
| 验证集图片数 | 2393 |
| 训练map | 73.8% |
| 训练精度(Precision) | 82.2% |
| 训练召回率(Recall) | 69.8% |
验证集每个类别精度统计
| 类别 | MAP0.5(单位:%) |
| all | 73 |
| cigarette | 60 |
| phone | 72 |
| seatbelt | 87 |
【部分实现源码】
using OpenCvSharp;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;namespace FIRC
{public partial class Form1 : Form{public bool videoStart = false;//视频停止标志string weightsPath = Application.StartupPath + "\\weights";//模型目录string labelTxt= Application.StartupPath + "\\weights\\class_names.txt";//类别文件Yolov8Manager detetor = new Yolov8Manager();//推理引擎public Form1(){InitializeComponent();CheckForIllegalCrossThreadCalls = false;//线程更新控件不报错}private void LoadWeightsFromDir(){var di = new DirectoryInfo(weightsPath);foreach(var fi in di.GetFiles("*.onnx")){comboBox1.Items.Add(fi.Name);}if(comboBox1.Items.Count>0){comboBox1.SelectedIndex = 0;}else{tssl_show.Text = "未找到模型,请关闭程序,放入模型到weights文件夹!";tsb_pic.Enabled = false;tsb_video.Enabled = false;tsb_camera.Enabled = false;}}private void Form1_Load(object sender, EventArgs e){LoadWeightsFromDir();//从目录加载模型}public string GetResultString(Result result){Dictionary<string, int> resultDict = new Dictionary<string, int>();for (int i = 0; i < result.length; i++){if(resultDict.ContainsKey( result.classes[i]) ){resultDict[result.classes[i]]++;}else{resultDict[result.classes[i]]=1;}}var resultStr = "";foreach(var item in resultDict){resultStr += string.Format("{0}:{1}\n",item.Key,item.Value);}return resultStr;}private void tsb_pic_Click(object sender, EventArgs e){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "*.*|*.bmp;*.jpg;*.jpeg;*.tiff;*.tiff;*.png";if (ofd.ShowDialog() != DialogResult.OK) return;tssl_show.Text = "正在检测中...";Task.Run(() => {var sw = new Stopwatch();sw.Start();Mat image = Cv2.ImRead(ofd.FileName);detetor.Confidence =Convert.ToSingle(numericUpDown1.Value);detetor.IOU = Convert.ToSingle(numericUpDown2.Value);var results=detetor.Inference(image);var resultImage = detetor.DrawImage(OpenCvSharp.Extensions.BitmapConverter.ToBitmap(image), results);sw.Stop();pb_show.Image = resultImage;tb_res.Text = GetResultString(results);tssl_show.Text = "检测已完成!总计耗时"+sw.Elapsed.TotalSeconds+"秒";});}public void VideoProcess(string videoPath){Task.Run(() => {detetor.Confidence = Convert.ToSingle(numericUpDown1.Value);detetor.IOU = Convert.ToSingle(numericUpDown2.Value);VideoCapture capture = new VideoCapture(videoPath);if (!capture.IsOpened()){tssl_show.Text="视频打开失败!";return;}Mat frame = new Mat();var sw = new Stopwatch();int fps = 0;while (videoStart){capture.Read(frame);if (frame.Empty()){Console.WriteLine("data is empty!");break;}sw.Start();var results = detetor.Inference(frame);var resultImg = detetor.DrawImage(frame,results);sw.Stop();fps = Convert.ToInt32(1 / sw.Elapsed.TotalSeconds);sw.Reset();Cv2.PutText(resultImg, "FPS=" + fps, new OpenCvSharp.Point(30, 30), HersheyFonts.HersheyComplex, 1.0, new Scalar(255, 0, 0), 3);//显示结果pb_show.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultImg);tb_res.Text = GetResultString(results);Thread.Sleep(5);}capture.Release();pb_show.Image = null;tssl_show.Text = "视频已停止!";tsb_video.Text = "选择视频";});}public void CameraProcess(int cameraIndex=0){Task.Run(() => {detetor.Confidence = Convert.ToSingle(numericUpDown1.Value);detetor.IOU = Convert.ToSingle(numericUpDown2.Value);VideoCapture capture = new VideoCapture(cameraIndex);if (!capture.IsOpened()){tssl_show.Text = "摄像头打开失败!";return;}Mat frame = new Mat();var sw = new Stopwatch();int fps = 0;while (videoStart){capture.Read(frame);if (frame.Empty()){Console.WriteLine("data is empty!");break;}sw.Start();var results = detetor.Inference(frame);var resultImg = detetor.DrawImage(frame, results);sw.Stop();fps = Convert.ToInt32(1 / sw.Elapsed.TotalSeconds);sw.Reset();Cv2.PutText(resultImg, "FPS=" + fps, new OpenCvSharp.Point(30, 30), HersheyFonts.HersheyComplex, 1.0, new Scalar(255, 0, 0), 3);//显示结果pb_show.Image = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(resultImg);tb_res.Text = GetResultString(results);Thread.Sleep(5);}capture.Release();pb_show.Image = null;tssl_show.Text = "摄像头已停止!";tsb_camera.Text = "打开摄像头";});}private void tsb_video_Click(object sender, EventArgs e){if(tsb_video.Text=="选择视频"){OpenFileDialog ofd = new OpenFileDialog();ofd.Filter = "视频文件(*.*)|*.mp4;*.avi";if (ofd.ShowDialog() != DialogResult.OK) return;videoStart = true;VideoProcess(ofd.FileName);tsb_video.Text = "停止";tssl_show.Text = "视频正在检测中...";}else{videoStart = false;}}private void tsb_camera_Click(object sender, EventArgs e){if (tsb_camera.Text == "打开摄像头"){videoStart = true;CameraProcess(0);tsb_camera.Text = "停止";tssl_show.Text = "摄像头正在检测中...";}else{videoStart = false;}}private void tsb_exit_Click(object sender, EventArgs e){videoStart = false;this.Close();}private void trackBar1_Scroll(object sender, EventArgs e){numericUpDown1.Value = Convert.ToDecimal(trackBar1.Value / 100.0f);}private void trackBar2_Scroll(object sender, EventArgs e){numericUpDown2.Value = Convert.ToDecimal(trackBar2.Value / 100.0f);}private void numericUpDown1_ValueChanged(object sender, EventArgs e){trackBar1.Value = (int)(Convert.ToSingle(numericUpDown1.Value) * 100);}private void numericUpDown2_ValueChanged(object sender, EventArgs e){trackBar2.Value = (int)(Convert.ToSingle(numericUpDown2.Value) * 100);}private void comboBox1_SelectedIndexChanged(object sender, EventArgs e){tssl_show.Text="加载模型:"+comboBox1.Text;detetor.LoadWeights(weightsPath+"\\"+comboBox1.Text,labelTxt);tssl_show.Text = "模型加载已完成!";}}
}
【使用步骤】
使用步骤:
(1)首先根据官方框架yolov5安装教程安装好yolov5环境,并安装好pyqt5
(2)切换到自己安装的yolov5环境后,并切换到源码目录,执行python main.py即可运行启动界面,进行相应的操作即可
【提供文件】
python源码
yolov5n.onnx模型(不提供pytorch模型)
训练的map,P,R曲线图(在weights\results.png)
测试图片(在test_img文件夹下面)
【源码下载地址】
https://download.csdn.net/download/FL1623863129/88540396
相关文章:
[C#][winform]基于yolov5的驾驶员抽烟打电话安全带检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面
【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎,使用CPU进行推理,适合有显卡或者没有显卡windows x64系统均可,不支持macOS和Linux系统,不支持x86的windows操作系统。由于采用CPU推理,要比GPU慢。…...
【Flutter】基础入门:开发环境搭建
Flutter 是一个强大的跨平台框架,支持在 Android、iOS、Windows、Linux、Web 等多种平台上开发应用。下面将详细介绍如何在各个平台上构建 Flutter 开发环境,并使用相同的项目代码构建出一个可以在多个平台运行的跨平台 Demo。 Flutter 环境配置&#x…...
AI学习指南深度学习篇-对比学习(Contrastive Learning)简介
AI学习指南深度学习篇 - 对比学习(Contrastive Learning)简介 目录 引言对比学习的背景对比学习的定义对比学习在深度学习中的应用 无监督学习表示学习 详细示例 基本示例先进示例 对比学习的优缺点总结与展望 1. 引言 随着人工智能(AI&am…...
【蓝队技能】【规则开发1】Suricata-C2Webshell隧道
蓝队技能 Suricata-C2&Webshell&隧道 蓝队技能总结前言一、C2规则开发1.1 Sliver1.2 CS 二、内网隧道1.1 frps1.2 nps 三、webshell3.1 蚁剑3.2 冰蝎3.3 哥斯拉 总结 前言 本文聚焦于Suricata规则开发,提供针对Sliver、Cobalt Strike(CS…...
全面了解 NGINX 的负载均衡算法
NGINX 提供多种负载均衡方法,以应对不同的流量分发需求。常用的算法包括:最少连接、最短时间、通用哈希、随机算法和 IP 哈希。这些负载均衡算法都通过独立指令来定义,每种算法都有其独特的应用场景。 以下负载均衡方法(IP 哈希除…...
Java-继承与多态-上篇
关于类与对象,内容较多,我们分为两篇进行讲解: 📚 Java-继承与多态-上篇:———— <就是本篇> 📕 继承的概念与使用 📕 父类成员访问 📕 super关键字 📕 supe…...
通过比较list与vector在简单模拟实现时的不同进一步理解STL的底层
cplusplus.com/reference/list/list/?kwlist 当我们大致阅读完list的cplusplus网站的文档时,我们会发现它提供的接口大致上与我们的vector相同。当然的,在常用接口的简单实现上它们也大体相同,但是它们的构造函数与迭代器的实现却大有不同。…...
软件I2C的代码
I2C的函数 GPIO的配置——scl和sda都配置为开漏输出 void MyI2C_Init(void) {RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitTypeDef GPIO_InitStruture;GPIO_InitStruture.GPIO_Mode GPIO_Mode_Out_OD;GPIO_InitStruture.GPIO_PinGPIO_Pin_10 | GPIO_Pin_…...
登录时用户名密码加密传输(包含前后端代码)
页面输入用户名密码登录过程中,如果没有对用户名密码进行加密处理,可能会导致传输过程中数据被窃取,就算使用https协议,在浏览器控制台的Request Payload中也是能直接看到传输的明文,安全感是否还是不足。 大致流程&a…...
ai聊天对话页面-uniapp
流式传输打字机效果,只支持uniapp内使用 ,下载地址 https://download.csdn.net/download/qq_54123885/89899859...
虚拟滚动列表如何实现?
highlight: a11y-dark 虚拟滚动列表,虚拟滚动的关键在于只渲染当前视口内可见的数据项,而不是一次性渲染所有数据项。这可以显著提高性能,尤其是在处理大量数据时。 以下是一个完整的虚拟滚动列表的示例代码: <!DOCTYPE htm…...
07_Linux网络配置与管理:命令与工具指南
本系列文章导航:01_Linux基础操作CentOS7学习笔记-CSDN博客 文章目录 网络配置与管理:命令与工具指南1. ping命令2. ifconfig命令3. ip命令4. route命令5. ip route命令6. nslookup命令7. nmcli命令8. nmtui命令9. RHEL7修改网卡名1. 修改网络(会话)配置…...
首个统一生成和判别任务的条件生成模型框架BiGR:专注于增强生成和表示能力,可执行视觉生成、辨别、编辑等任务
BiGR是一种新型的图像生成模型,它可以生成高质量的图像,同时还能有效地提取图像特征。该方法是通过将图像转换为一系列的二进制代码来工作,这些代码就像是图像的“压缩版”。在训练时会遮住一些代码,然后让模型学习如何根据剩下的…...
【Java知识】Java进阶-服务发现机制SPI
文章目录 SPI概述SPI 工作原理 ServiceLoader代码展示简化的 ServiceLoader 类关键点解释使用示例1. 定义服务接口2. 实现服务提供者3. 配置文件4. 加载服务提供者 总结 SPI使用场景1. 数据库驱动2. 日志框架3. 图像处理4. 加密算法5. 插件系统6. 缓存机制示例代码1. 定义服务接…...
多模态技术的协同表现:从文本生成、语音合成到口型同步综合测评
本文是针对多模态对话系统核心技术栈的使用效果和网络测评整理。 测评内容基于用户体验,侧重于从使用者角度出发,讨论实际操作中的体验感受,如技术的易用性、输出效果如文本的连贯性、语音的自然度、口型同步的准确性等。不涉及具体算法架构…...
Java最全面试题->Java主流框架->Srping面试题
Spring面试题 下边是我自己整理的面试题,基本已经很全面了,想要的可以私信我,我会不定期去更新思维导图 哪里不会点哪里 谈谈你对 Spring 的理解? Spring 是一个开源框架,为简化企业级应用开发而生。Spring 可以是使简单的 JavaBean 实现以前只有 EJB 才能实现的功能。…...
参编国家标准需要注意的事项有哪些?
1. 项目相关性: • 选择与自身企业产品、业务或专业领域紧密相关的国家标准进行参编。这样不仅能确保企业在标准制定过程中发挥自身的优势和专长,使参编工作更有实际意义和价值,也有利于企业将标准更好地应用于自身的生产经营活动,…...
【Dash】feffery_antd_components 按钮组件的应用
一、feffery_antd_componenet 中的 AntdFloatButton 和 AntdFloatButtonGroup AntdFloatButton 和 AntdFloatButtonGroup 是两个用于创建悬浮按钮和悬浮按钮组的组件。 AntdFloatButton 是单个悬浮按钮组件,它提供了多种属性来定义按钮的外观及行为。AntdFloatBut…...
01 springboot-整合日志(logback-config.xml)
logback-config.xml 是一个用于配置 Logback 日志框架的 XML 文件,通常位于项目的 classpath 下的根目录或者 src/main/resources 目录下。 Logback 提供了丰富的配置选项,可以满足各种不同的日志需求。需要根据具体情况进行配置。 项目创建࿰…...
Java最全面试题->计算机基础面试题->计算机网络面试题
计算机网络 下边是我自己整理的面试题,基本已经很全面了,想要的可以私信我,我会不定期去更新思维导图 哪里不会点哪里 1.说一下TCP/IP四层模型 TCP/IP协议是美国国防部高级计划研究局为实现ARPANET互联网而开发的。 网络接口层ÿ…...
新手教程使用Python快速接入Taotoken调用多款大模型
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 新手教程使用Python快速接入Taotoken调用多款大模型 对于刚接触大模型API的开发者而言,直接对接不同厂商的API往往意味…...
H5GG iOS脚本引擎终极指南:三分钟掌握无需越狱的游戏修改神器
H5GG iOS脚本引擎终极指南:三分钟掌握无需越狱的游戏修改神器 【免费下载链接】H5GG an iOS Mod Engine with JavaScript APIs & Html5 UI 项目地址: https://gitcode.com/gh_mirrors/h5/H5GG H5GG是一款革命性的iOS脚本引擎和内存修改工具,通…...
Consul-K8s实战:Kubernetes与Consul服务网格的无缝集成指南
1. 项目概述:当Consul遇见Kubernetes如果你正在Kubernetes集群里管理微服务,并且已经听说过或者正在使用HashiCorp Consul来做服务发现和配置管理,那么hashicorp/consul-k8s这个项目绝对是你绕不开的工具。简单来说,它不是一个独立…...
STM32篇-12.指针函数和函数指针
指针函数是什么指针函数是指返回值类型为指针的函数 比如:int* open(void) { return (an addr); }该函数返回的地址或者变量;函数指针是什么函数指针其实类似变量的指针; 比如下面:#include <stdio.h>void open(void) {prin…...
告别安装报错!Windows 10/11 保姆级 MySQL 5.7.44 配置指南(含my.ini文件详解)
Windows 10/11 下 MySQL 5.7.44 终极安装指南:从避坑到精通配置 每次在Windows系统上安装MySQL,总会有那么几个"经典"错误让人抓狂——服务启动失败、初始化报错、环境变量配置无效... 作为一个经历过无数次安装折磨的老手,我决定…...
VMOS+小黄鸟无root抓包实战:从环境搭建到证书导入的完整避坑指南
1. 为什么需要VMOS小黄鸟组合抓包 很多安卓开发者或者安全爱好者都遇到过这样的困扰:想要分析某个APP的网络请求,却发现抓包工具显示"无网络连接"。这种情况在安卓7.0及以上版本尤为常见,主要是因为系统加强了SSL证书验证机制。传统…...
百度网盘提取码智能获取:如何用3行命令告别密码搜索烦恼
百度网盘提取码智能获取:如何用3行命令告别密码搜索烦恼 【免费下载链接】baidupankey 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经遇到过这样的情况:在网络上找到一份宝贵的学习资料,点击百度网盘分享链接…...
免费开源AMD Ryzen处理器调试工具:SMUDebugTool终极指南
免费开源AMD Ryzen处理器调试工具:SMUDebugTool终极指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://…...
RPG Maker MV/MZ游戏资源解密工具:5分钟解锁游戏素材的完整指南
RPG Maker MV/MZ游戏资源解密工具:5分钟解锁游戏素材的完整指南 【免费下载链接】RPG-Maker-MV-Decrypter You can decrypt RPG-Maker-MV Resource Files with this project ~ If you dont wanna download it, you can use the Script on my HP: 项目地址: https:…...
SoC与SoM:硬件开发的效率革命与双刃剑效应
1. 项目概述:当“系统”成为商品从业十几年,从画第一块51单片机的板子,到参与设计复杂的通信基站,我亲眼见证了硬件开发模式的剧变。如果说早些年我们还在为如何把CPU、内存、Flash、各种接口控制器塞进一块PCB而绞尽脑汁…...
