草庐IT

【目标检测】YOLO v5 吸烟行为识别检测

youngxor 2023-03-28 原文

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

 

 


前言

YOLO v5模型简单易上手好用,场地吸烟行为实时监测。
YOLO v5 优点:

  1. 可识别视频帧数高。
  2. 技术成熟,有现成模型。
  3. 操作简单。

吸烟行为识别:

  1. 实时监测。
  2. 离线监测。
  3. 毕设需求。

吸烟(抽烟)目标检测痛难点:

  1. 形状:烟细小,在图像中所占比例小,难捕捉。
  2. 颜色:主要有红色、白色和黄或黑色组成,与周围环境颜色难区分。

所以需要收集并制作大量的吸烟图片数据集,同时选择合适的算法模型,以提高目标检测准确率。


相关连接(look评论)

(1)本文视频教程:https://www.bilibili.com/video/BV1S5411Q7Zi/
(2)xml格式转换成YOLO标注格式txt的python脚本
(3)吸烟检测项目YOLO格式数据集
(4)YOLO v5 吸烟行为识别检测项目模型代码及模型权重


一、计算机配置

pytorch安装-GPU版本

pytorch有gpu版本和cpu版本,图片识别最好(必须)使用GPU版本,前提是电脑有GPU。GPU版本安装的具体步骤可以参考这篇文章:GPU版本安装

pycocotools的安装

pip install pycocotools-windows

二、YOLO v5下载

YOLO v5模型官网,有具体的使用说明和介绍。视频识别帧数杠杠的!但这官网YOLO v5 包没有设计Windows界面。

目前官网YOLO v5 包里训练模型主要有v5s、v5m、v5l、v5x,对GPU要求依次增加,其中v5x对GPU要求异常高。


三、模型使用

获取数据集

使用标注好的吸烟数据集,数据集原本是VOC样式,写个脚本,将VOC格式转换成YOLO格式。制作好的吸烟数据集YOLO格式数据集文件如下图所示。

images文件里的分类和数量必须和labels文件相对应。如有需要吸烟检测项目YOLO格式数据集可直接下载,该数据集有6400+张图片。

更改train.py文件

train.py文件修改部分如下图,修改的参数很少,简单易上手,对小白很友好。

本文使用的是YOLO v5s配置文件,预训练模型也是YOLO v5s模型,使用GPU计算,迭代次数为50,训练时间很长,很辛苦!若更改迭代次数为100或更改为更大的模型,训练耗时更长!

模型权重

使用GPU训练模型,训练几十个小时。结果迭代过程损失如图,可以看出,训练结果还是很好的,mAP值可达0.8以上


四、吸烟视频检测效果

直接使用上述YOLO v5s 模型权重,载入Windows界面代码,对吸烟视频进行识别检测,效果还是很好的,吸烟检测置信度稳定在0.75!也可以连接摄像头实时监测!

【目标检测】基于YOLO v5吸烟行为视频检测

 


总结

基于YOLO v5 模型,吸烟目标检测亲测效果好!
相关代码、数据集和模型,如有需要,亦可远程指导。

有关【目标检测】YOLO v5 吸烟行为识别检测的更多相关文章

  1. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  2. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  3. 报告回顾丨模型进化狂飙,DetectGPT能否识别最新模型生成结果? - 2

    导读语言模型给我们的生产生活带来了极大便利,但同时不少人也利用他们从事作弊工作。如何规避这些难辨真伪的文字所产生的负面影响也成为一大难题。在3月9日智源Live第33期活动「DetectGPT:判断文本是否为机器生成的工具」中,主讲人Eric为我们讲解了DetectGPT工作背后的思路——一种基于概率曲率检测的用于检测模型生成文本的工具,它可以帮助我们更好地分辨文章的来源和可信度,对保护信息真实、防止欺诈等方面具有重要意义。本次报告主要围绕其功能,实现和效果等展开。(文末点击“阅读原文”,查看活动回放。)Ericmitchell斯坦福大学计算机系四年级博士生,由ChelseaFinn和Chri

  4. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  5. ruby-on-rails - 在 heroku 的 .fonts 文件夹中包含自定义字体,似乎无法识别它们 - 2

    Heroku支持人员告诉我,为了在我的Web应用程序中使用自定义字体(未安装在系统中,您可以在bash控制台中使用fc-list查看已安装的字体)我必须部署一个包含所有字体的.fonts文件夹里面的字体。问题是我不知道该怎么做。我的意思是,我不知道文件名是否必须遵循heroku的任何特殊模式,或者我必须在我的代码中做一些事情来考虑这种字体,或者如果我将它包含在文件夹中它是自动的......事实是,我尝试以不同的方式更改字体的文件名,但根本没有使用该字体。为了提供更多详细信息,我们使用字体的过程是将PDF转换为图像,更具体地说,使用rghostgem。并且最终图像根本不使用自定义字体。在

  6. ruby - Ruby gsub 替换中的行为不一致? - 2

    两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio

  7. ruby-on-rails - 没有这样的文件或目录 - 用 Mini Magick 识别 - 2

    在我让另一个人重做我的前端UI之前,我的Rails应用程序运行平稳。我已经尝试解决此错误3天了。这是错误:Nosuchfileordirectory-identifyExtractedsource(aroundline#59):575859606162@post=Post.find(params[:id])authorize@postif@post.update_attributes(post_params)flash[:notice]="Postwasupdated."redirect_to[@topic,@post]else{"utf8"=>"✓","_method"=>"patc

  8. ruby-on-rails - Ruby 中意外的大小写行为 - 2

    我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。

  9. ruby - 使对象的行为类似于 ruby​​ 中并行分配的数组 - 2

    假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje

  10. ruby - 了解在 Ruby 中与 lambda 一起使用的 inject 行为 - 2

    我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject

随机推荐