助力打造清洁环境,基于轻量级DETR(DEtectionTRansformer)开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统

公共社区环境生活垃圾基本上是我们每个人每天几乎都无法避免的一个问题,公共环境下垃圾投放点都会有固定的值班时间,但是考虑到实际扔垃圾的无规律性,往往会出现在无人值守的时段内垃圾堆放垃圾桶溢出等问题,有些容易扩散的垃圾比如:碎纸屑、泡沫粒等等,一旦遇上大风天气往往就会被吹得遍地都是给垃圾清理工作带来负担。
 

本文的主要目的及时想要探索分析通过接入社区实时视频流数据来对公共环境下的垃圾投放点进行自动化的智能分析计算,当探测到异常问题比如:随意堆放垃圾、垃圾桶溢出等问题的时候结合一些人工业务预设的规则来自动通过短信等形式推送事件给相关的工作人员来进行及时的处置这一方案的可行性,博文主要是侧重对检测模型的开发实现,业务规则需要到具体的项目中去细化,这块就不作为文本的实践内容。

在前文中,我们已经陆续开发了相关的实践项目,感兴趣的话可以自行移步阅读即可:

《助力打造清洁环境,基于YOLOv3开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统》

《助力打造清洁环境,基于YOLOv4开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统》

《助力打造清洁环境,基于YOLOv5全系列模型【n/s/m/l/x】开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统》

《助力打造清洁环境,基于美团最新YOLOv6-4.0开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统》 

《助力打造清洁环境,基于YOLOv7开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统》

《助力打造清洁环境,基于轻量级YOLOv8开发构建公共场景下垃圾堆放垃圾桶溢出检测识别系统》

本文主要是想要基于DETR模型来开发实践性质的项目,首先看下实例效果:

DETR (DEtection TRansformer) 是一种基于Transformer架构的端到端目标检测模型。与传统的基于区域提议的目标检测方法(如Faster R-CNN)不同,DETR采用了全新的思路,将目标检测问题转化为一个序列到序列的问题,通过Transformer模型实现目标检测和目标分类的联合训练。

DETR的工作流程如下:

输入图像通过卷积神经网络(CNN)提取特征图。
特征图作为编码器输入,经过一系列的编码器层得到图像特征的表示。
目标检测问题被建模为一个序列到序列的转换任务,其中编码器的输出作为解码器的输入。
解码器使用自注意力机制(self-attention)对编码器的输出进行处理,以获取目标的位置和类别信息。
最终,DETR通过一个线性层和softmax函数对解码器的输出进行分类,并通过一个线性层预测目标框的坐标。
DETR的优点包括:

端到端训练:DETR模型能够直接从原始图像到目标检测结果进行端到端训练,避免了传统目标检测方法中复杂的区域提议生成和特征对齐的过程,简化了模型的设计和训练流程。
不受固定数量的目标限制:DETR可以处理变长的输入序列,因此不受固定数量目标的限制。这使得DETR能够同时检测图像中的多个目标,并且不需要设置预先确定的目标数量。
全局上下文信息:DETR通过Transformer的自注意力机制,能够捕捉到图像中不同位置的目标之间的关系,提供了更大范围的上下文信息。这有助于提高目标检测的准确性和鲁棒性。
然而,DETR也存在一些缺点:

计算复杂度高:由于DETR采用了Transformer模型,它在处理大尺寸图像时需要大量的计算资源,导致其训练和推理速度相对较慢。
对小目标的检测性能较差:DETR模型在处理小目标时容易出现性能下降的情况。这是因为Transformer模型在处理小尺寸目标时可能会丢失细节信息,导致难以准确地定位和分类小目标。

接下来看下我们自己构建的数据集:

官方项目地址在这里,如下所示:

可以看到目前已经收获了超过1.2w的star量,还是很不错的了。

DETR整体数据流程示意图如下所示:

官方也提供了对应的预训练模型,可以自行使用:

namebackbonescheduleinf_timebox APurlsize
0DETRR505000.03642.0model | logs159Mb
1DETR-DC5R505000.08343.3model | logs159Mb
2DETRR1015000.05043.5model | logs232Mb
3DETR-DC5R1015000.09744.9model | logs232Mb

COCO panoptic val5k models:

namebackbonebox APsegm APPQurlsize
0DETRR5038.831.143.4download165Mb
1DETR-DC5R5040.231.944.6download165Mb
2DETRR10140.13345.1download237Mb

如果对如何使用DETR模型来开发构建自己的个性化目标检测模型有疑问的话,可以参考我的超详细教程文章,如下:

《DETR (DEtection TRansformer)基于自建数据集开发构建目标检测模型超详细教程》

本文选择的预训练官方权重是detr-r50-e632da11.pth,首先需要基于官方的预训练权重开发能够用于自己的 个性化数据集的权重,如下所示:

pretrained_weights = torch.load("./weights/detr-r50-e632da11.pth")
num_class = 3 + 1
pretrained_weights["model"]["class_embed.weight"].resize_(num_class+1,256)
pretrained_weights["model"]["class_embed.bias"].resize_(num_class+1)
torch.save(pretrained_weights,'./weights/detr_r50_%d.pth'%num_class)

因为这里我的类别数量为3,所以num_class修改为:3+1,根据自己的实际情况修改即可。生成后如下所示:

终端执行:

python main.py --dataset_file "coco" --coco_path "/0000" --epoch 100 --lr=1e-4 --batch_size=32 --num_workers=0 --output_dir="outputs" --resume="weights/detr_r50_4.pth"

即可启动训练。训练启动如下:

DETR模型的训练依旧是很耗费算力资源。

等待漫长的训练过程完成后,我们来对结果进行可视化,核心代码如下:
【日志可视化】

def plot_logs(logs, fields=('class_error', 'loss_bbox_unscaled', 'mAP'), ewm_col=0, log_name='log.txt'):'''Function to plot specific fields from training log(s). Plots both training and test results.:: Inputs - logs = list containing Path objects, each pointing to individual dir with a log file- fields = which results to plot from each log file - plots both training and test for each field.- ewm_col = optional, which column to use as the exponential weighted smoothing of the plots- log_name = optional, name of log file if different than default 'log.txt'.:: Outputs - matplotlib plots of results in fields, color coded for each log file.- solid lines are training results, dashed lines are test results.'''func_name = "plot_utils.py::plot_logs"# verify logs is a list of Paths (list[Paths]) or single Pathlib object Path,# convert single Path to list to avoid 'not iterable' errorif not isinstance(logs, list):if isinstance(logs, PurePath):logs = [logs]print(f"{func_name} info: logs param expects a list argument, converted to list[Path].")else:raise ValueError(f"{func_name} - invalid argument for logs parameter.\n \Expect list[Path] or single Path obj, received {type(logs)}")# Quality checks - verify valid dir(s), that every item in list is Path object, and that log_name exists in each dirfor i, dir in enumerate(logs):if not isinstance(dir, PurePath):raise ValueError(f"{func_name} - non-Path object in logs argument of {type(dir)}: \n{dir}")if not dir.exists():raise ValueError(f"{func_name} - invalid directory in logs argument:\n{dir}")# verify log_name existsfn = Path(dir / log_name)if not fn.exists():print(f"-> missing {log_name}.  Have you gotten to Epoch 1 in training?")print(f"--> full path of missing log file: {fn}")return# load log file(s) and plotdfs = [pd.read_json(Path(p) / log_name, lines=True) for p in logs]fig, axs = plt.subplots(ncols=len(fields), figsize=(16, 5))for df, color in zip(dfs, sns.color_palette(n_colors=len(logs))):for j, field in enumerate(fields):if field == 'mAP':coco_eval = pd.DataFrame(np.stack(df.test_coco_eval_bbox.dropna().values)[:, 1]).ewm(com=ewm_col).mean()axs[j].plot(coco_eval, c=color)else:df.interpolate().ewm(com=ewm_col).mean().plot(y=[f'train_{field}', f'test_{field}'],ax=axs[j],color=[color] * 2,style=['-', '--'])for ax, field in zip(axs, fields):ax.legend([Path(p).name for p in logs])ax.set_title(field)

结果如下所示:

【precision recall可视化】

def plot_precision_recall(files, naming_scheme='iter'):if naming_scheme == 'exp_id':# name becomes exp_idnames = [f.parts[-3] for f in files]elif naming_scheme == 'iter':names = [f.stem for f in files]else:raise ValueError(f'not supported {naming_scheme}')fig, axs = plt.subplots(ncols=2, figsize=(16, 5))for f, color, name in zip(files, sns.color_palette("Blues", n_colors=len(files)), names):data = torch.load(f)# precision is n_iou, n_points, n_cat, n_area, max_detprecision = data['precision']recall = data['params'].recThrsscores = data['scores']# take precision for all classes, all areas and 100 detectionsprecision = precision[0, :, :, 0, -1].mean(1)scores = scores[0, :, :, 0, -1].mean(1)prec = precision.mean()rec = data['recall'][0, :, 0, -1].mean()print(f'{naming_scheme} {name}: mAP@50={prec * 100: 05.1f}, ' +f'score={scores.mean():0.3f}, ' +f'f1={2 * prec * rec / (prec + rec + 1e-8):0.3f}')axs[0].plot(recall, precision, c=color)axs[1].plot(recall, scores, c=color)axs[0].set_title('Precision / Recall')axs[0].legend(names)axs[1].set_title('Scores / Recall')axs[1].legend(names)return fig, axs

结果如下所示:

这里我们对其计算了F1值,代码如下:

def F1(P,R):"""F1值"""return 2*P*R/(P+R)

结果如下:

感兴趣的话都可以自行尝试下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/578246.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年PMP考试新考纲-PMBOK第七版-项目绩效域真题解析

如何一次性通过PMP考试,取得3A等级的PMP证书?华研荟根据十多年的培训和辅导,以及数千名学员的建议是: 先把PMBOK第六版、第七版和敏捷实践指南的三本官方教材研读一遍(如果觉得自己看书慢,可以看讲解视频&…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)Dispatcher模块的实现思路和定义

(四)Dispatcher模块的实现思路 关于dispatcher,它应该是反应堆模型里边的核心组成部分,因为如果说这个反应堆模型里边有事件需要处理,或者说有事件需要检测,那么是需要通过这个poll、epoll 或者 select来完…

Spring Boot3 Web开发技术

前期回顾 springboot项目常见的配置文件类型有哪些?哪种类型的优先级最高 yml properties yaml 读取配置文件里的数据用什么注解? value restful风格 RESTful 风格与传统的 HTTP 请求方式相比,更加简洁,安全,能隐…

Kind创建k8s - JAVA操作控制

kind 简介kind 架构安装 Kind (必备工具)docker官网kubectl官网kind官网校验安装结果 关于kind 命令 安装一个集群查看当前 Kubernetes 集群中的节点信息。查看当前命名空间下中的Pod(容器实例)的信息。使用 kind create cluster 安装,关于安…

MYSQL一一函数一一流程函数

咱今天讲的是MySQL函数中的流程函数,会有3小题和一个综合案例帮助大家理解 流程函数是很常用的一类函数,可以在SQL语句中实现条件筛选,从而提高语句的效率 小题: ①if语句: select if(flash,ok,error); //如果…

Java之Atomic 原子类总结

Java之Atomic 原子类总结 Atomic 原子类介绍 Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学反应中是不可分割的。在我们这里 Atomic 是指一个操作是不可中断的。即使是在多个线程一起执行的时候,一…

【Java】你掌握了多线程吗?

【文末送书】今天推荐一本Java多线程编程领域新书《一本书讲透Java线程》 摘要 互联网的每一个角落,无论是大型电商平台的秒杀活动,社交平台的实时消息推送,还是在线视频平台的流量洪峰,背后都离不开多线程技术的支持。在数字化转…

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势

FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势 本章节主要参考书籍《Xilinx Zynq-7000 嵌入式系统设计与实现 基于ARM Cortex-A9双核处理器和Vivado的设计方法 (何宾,张艳辉编著)》 本章节主要讲述FPGA-ZYNQ-7000 SoC在嵌入式系统中的优势,学习笔…

LeetCode刷题--- 优美的排列

个人主页:元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​​http://t.cs…

UGUI Panel的显示和隐藏优化

unity UI如何开启(显示)或者关闭(隐藏)Panel界面,相信大家都是知道的,但是如何做最好呢? 可能大家一般开启/关闭界面的方法就是直接SetActive吧。这样做通常是可以的,简答快速地解决…

排序算法--------计数排序

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

【Unity】万人同屏高级篇, 自定义BRGdots合批渲染,海量物体目标搜索

博文介绍了最基本的实现原理,有些老板懒得折腾,所以特意熬了几个秃头的夜把RVO、BRG、GPU动画、海量物体目标搜索等高度封装成了开箱即用的插件。 划重点!!此方案是绕开Entities(ECS),不用写一行ECS代码,现…

关于个人Git学习记录及相关

前言 可以看一下猴子都能懂的git入门,图文并茂不枯燥 猴子都能懂的git入门 学习东西还是建议尽可能的去看官方文档 权威且详细 官方文档 强烈建议看一下GitHub漫游指南及开源指北,可以对开源深入了解一下,打开新世界的大门! …

【Jmeter、postman、python 三大主流技术如何操作数据库?】

前言 1、前言 只要是做测试工作的,必然会接触到数据库,数据库在工作中的主要应用场景包括但不限于以下: 功能测试中,涉及数据展示功能,需查库校验数据正确及完整性;例如商品搜索功能 自动化测试或性能测试…

【开源】基于JAVA的学校热点新闻推送系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 新闻类型模块2.2 新闻档案模块2.3 新闻留言模块2.4 新闻评论模块2.5 新闻收藏模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 新闻类型表3.2.2 新闻表3.2.3 新闻留言表3.2.4 新闻评论表3.2.5 新闻收藏表 四、系统展…

Ubuntu20.04-设置合上盖子电脑不熄屏,不休眠等

1.配置文件 /etc/systemd/logind.conf 1.1 配置文件解析 输入命令 sudo nano /etc/systemd/logind.conf打开的文件内容 # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modify it # under the terms of the GNU Lesser G…

【深度学习目标检测】十一、基于深度学习的电网绝缘子缺陷识别(python,目标检测,yolov8)

YOLOv8是一种物体检测算法,是YOLO系列算法的最新版本。 YOLO(You Only Look Once)是一种实时物体检测算法,其优势在于快速且准确的检测结果。YOLOv8在之前的版本基础上进行了一系列改进和优化,提高了检测速度和准确性。…

【OAuth2】用户授权第三方应用,流程详解及模式

目录 一、讲述 1. 是什么 2. 工作流程 3. OAuth2的好处 二、协议流程 1. 应用场景 2. 实例 3. 安全体现 4. 角色 5. 认证流程 三、授权模式 1. 授权码模式 2. 简化(隐式)模式 3. 密码模式 4. 客户端模式 每篇一获 一、讲述 1. 是什么 OAuth(开放授…

【开源】基于Vue+SpringBoot的新能源电池回收系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用户档案模块2.2 电池品类模块2.3 回收机构模块2.4 电池订单模块2.5 客服咨询模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 E-R 图设计 四、系统展示五、核心代码5.1 增改电池类型5.2 查询电池品类5.3 查询电池回…

蓝桥杯备赛 day 1 —— 递归 、递归、枚举算法(C/C++,零基础,配图)

目录 🌈前言 📁 枚举的概念 📁递归的概念 例题: 1. 递归实现指数型枚举 2. 递归实现排列型枚举 3. 递归实现组合型枚举 📁 递推的概念 例题: 斐波那契数列 📁习题 1. 带分数 2. 反硬币 3. 费解的…