用合成数据训练边缘侧火灾检测器

火灾是人类面临的重大威胁,检测火灾至关重要。目前的火焰传感器在距离检测方面存在局限性。为了克服这个问题,我的目标是使用机器学习方法创建一个轻量级且高度准确的火灾检测系统。当需要实时数据处理或机器学习模型可用的数据集很少时,这个问题变得非常具有挑战性。因此,这里合成数据集就派上用场了。该项目为在火灾检测系统中使用合成数据集的优势提供了概念验证。

合成数据集是一种数据类型,使我们能够模拟在现实生活中可能很少遇到但需要解决的情况。它提供了一种使用真实数据的高度经济高效的替代方案。用于训练深度神经网络的合成数据集在计算机视觉中的应用越来越多。存在不同的策略,例如域随机化,以弥合合成训练数据和实际应用之间的差距。

本指南将引导你完成为火灾检测系统训练对象检测模型的过程。下图可以更好地解释项目的整体架构。

如上图所示,Nvidia Omniverse 工具可用于创建合成数据集。该平台提供逼真的渲染和动态场景创建,能够生成具有不同环境因素(如光线、颜色、背景等)的高度逼真的场景。

然后使用 Edge Impulse Web 平台,我们可以快速在云中的数据上训练 ML 模型。

完成训练过程后,优化的火灾检测模型将部署到 Arduino Nicla Vision 上。Nicla Vision 体积小巧、功耗低,是边缘计算应用的理想选择。该模型在此平台上的部署可实现实时火灾检测,因为它可以在本地处理数据,而无需依赖云连接。

机器学习模型的输出可能用于触发操作,例如打开灯或向智能手机发送通知。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、使用Omniverse Replicator 生成合成数据

与任何机器学习任务一样,最重要的任务是准备数据集。Omniverse Replicator 是 Nvidia Omniverse 生态系统的一部分,这是一个可在 Omniverse Code 应用程序中使用的虚拟世界模拟。

通过访问此链接从 NVIDIA 官方网站下载 Omniverse。你可以选择从此链接下载适用于 Windows 或 Linux 操作系统的应用程序。下载 Omniverse 后,导航到 Exchange 选项卡并继续安装 Omniverse Code。

然后,创建本地 Nucleus 服务,转到 Nucleus 选项卡并按照那里提供的说明进行操作。

设置 Nucleus 服务后,导航到 Library 选项卡。从那里,打开 Omniverse Code 开始使用它。

你可能会遇到以下消息:

2023-05-13 10:20:29  [Warning] [rtx.flow.plugin] rtx.flow.plugin failed to load Flow dynamic libraries (error: libnvflow.so: cannot open shared object file: No such file or directory)! Flow rendering will not be available. Try enabling the omni.flowusd extension.

要解决此问题,你应该启用 omni.flowusd 扩展以自动加载。这可以在 Omniverse 应用程序设置中完成。找到 omni.flowusd 扩展并确保已启用或选中“自动加载”选项。

保存设置并重新启动 Omniverse 应用程序。

为了进行测试,您可以从下面的“示例”选项卡中找到一个火焰示例,然后执行拖放操作将其添加到场景中。然后,单击“播放”按钮以启动火焰动画。

现在,我们将使用 Python 代码生成合成数据集。我们将有机会使用两个从不同角度观察每一帧的摄像头来生成不同的数据。

请导航到脚本编辑器并粘贴以下代码片段。

import omni.replicator.core as rep
import datetimenow = datetime.datetime.now()# Camera1
focal_length1 = 25
focus_distance1 = 1200
f_stop1 = 0.4
pixel_resolution1 = (512, 512)
horizontal_aperture1 = 8.5
camera1_pos = [(0, 270, 500), (500, 270, 500), (-500, 270, 500)]# Camera2 (Top view)
focal_length2 = 50
focus_distance2 = 5000
f_stop2 = 2.8
pixel_resolution2 = (512, 512)
horizontal_aperture2 = 8.5
camera2_pos = [(0, 1800, 0)]with rep.new_layer():# Camera1camera1 = rep.create.camera(position=(0, 0, 1200),rotation=(0, -90, 0),focal_length=focal_length1,focus_distance=focus_distance1,f_stop=f_stop1,horizontal_aperture=horizontal_aperture1,name='Camera1')# Camera2camera2 = rep.create.camera(position=(0, 1500, 0),rotation=(-90, 0, 0),focal_length=focal_length2,focus_distance=focus_distance2,f_stop=f_stop2,horizontal_aperture=horizontal_aperture2,name='Camera2')# Create a new render_product (1 for each camera)render_product1 = rep.create.render_product(camera1, pixel_resolution1)render_product2 = rep.create.render_product(camera2, pixel_resolution2)# Create the floor planefloor = rep.create.plane(position=(0, 0, 0),rotation=(0, 0, 0),scale=(50, 50, 50),semantics=[('class', 'floor')],name='floor',)# Randomize the floor materialdef random_Floor_Material():floor_material = rep.randomizer.materials(materials=rep.get.material(path_pattern="/Fire/Looks/*"),input_prims=floor)return floor_material.noderep.randomizer.register(random_Floor_Material)with rep.trigger.on_frame(num_frames=300):rep.randomizer.random_Floor_Material()with camera1:rep.modify.pose(look_at=(0, 0, 0), position=rep.distribution.sequence(camera1_pos))with camera2:rep.modify.pose(look_at=(0, 0, 0), position=rep.distribution.sequence(camera2_pos))writer = rep.WriterRegistry.get("BasicWriter")
now = now.strftime("%Y-%m-%d")
output_dir = "fire_data_" + now
writer.initialize(output_dir=output_dir, rgb=True)
writer.attach([render_product1, render_product2])

将火焰元素从流程选项卡拖放到场景中。

单击脚本编辑器选项卡中的运行按钮。然后,将不同的材料从材料选项卡拖放到场景中。

在上面的代码中,编写器已初始化并附加到渲染器以生成没有注释的图像输出。

现在,让我们通过单击开始按钮来开始合成数据生成。

我们不断改变地板的材料,这将增加数据的多样性。这会导致数据集的多样性增加。它将创建两个文件夹,名称如下:RenderProduct_Replicator、RenderProduct_Replicator_01。图像将填充到这些相应文件夹内的 img 文件夹中。

生成完成后,您可以查看这些文件夹中的合成图像,如下所示。

文件夹“RenderProduct_Replicator”包含火灾的正面图像

文件夹“RenderProduct_Replicator_01”包含火灾的顶视图

至此,合成数据集生成过程结束。

由于我们没有带边界框的火灾标注,因此我们需要找到一种方法来自动化此过程。此步骤将在下一节中介绍。

2、使用 Grounding DINO 自动标记图像

众所周知,数据标记已成为一项极其昂贵且耗时的任务。根据 NVIDIA 论坛,使用 NVIDIA Omniverse Code 中的内部工具对流对象进行输出标注是不可行的。因此,我发现了一个解决方案,利用突破性的零样本对象检测器(例如 Grounding DINO),它彻底改变了图像标记过程。

首先,使用下面的 Python 代码将这些文件夹中的图像复制到一个文件夹中。

import os
import shutildef copy_images(source_folders, destination_folder):# Create the destination folder if it doesn't existif not os.path.exists(destination_folder):os.makedirs(destination_folder)for folder in source_folders:# List all files in the source folderfiles = os.listdir(folder)for file in files:# Check if the file is an image (you can add more image extensions if needed)if file.endswith('.png'):source_file_path = os.path.join(folder, file)destination_file_path = os.path.join(destination_folder, file)# If the destination file already exists, rename the filecounter = 0while os.path.exists(destination_file_path):counter += 1new_filename = f"{os.path.splitext(file)[0]}_{counter}.png"destination_file_path = os.path.join(destination_folder, new_filename)# Copy the file to the destination foldershutil.copy(source_file_path, destination_file_path)if __name__ == "__main__":source_folders  = ["./RenderProduct_Replicator/rgb/", "./RenderProduct_Replicator_01/rgb/"] destination_folder  = "./output_folder"copy_images(source_folders, destination_folder)

完成上一个任务后,请按照 Parthiban Marimuthu 在“如何使用 Grounding DINO 自动标记图像”中描述的步骤进行操作。

打开“generate_annotation”Jupyter 笔记本并执行以下代码片段。确保您已在 Jupyter 环境中安装了所有必要的依赖项和库,以成功执行代码。

它将在导出文件夹中生成 Pascal VOC 格式的注释,如下所示。Pascal VOC(视觉对象类)格式是对象检测数据集中广泛采用的标准。它存储图像及其相应的注释,包括边界框标签。

你可以利用 OpenCV 库使用下面的 Python 代码来检查边界框的正确性。

import cv2
import xml.etree.ElementTree as ETdef draw_bounding_box(image_path, annotation_path, output_path):# Load the imageimg = cv2.imread(image_path)# Parse the annotation filetree = ET.parse(annotation_path)root = tree.getroot()for obj in root.findall('object'):# Retrieve bounding box coordinatesxmin = int(obj.find('bndbox/xmin').text)ymin = int(obj.find('bndbox/ymin').text)xmax = int(obj.find('bndbox/xmax').text)ymax = int(obj.find('bndbox/ymax').text)# Draw the bounding box on the imagecv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)# Save the image with bounding boxcv2.imwrite(output_path, img)if __name__ == "__main__":image_path = "path/to/your/image.jpg"annotation_path = "path/to/your/annotation.xml"output_path = "path/to/save/output_image.jpg"draw_bounding_box(image_path, annotation_path, output_path)

下面你可以看到图像:

图像标记现已完成。如你所见,通过使用 Grounding DINO 零样本方法,初始图像标记过程可以在几分钟内完成。

下一步是使用 Edge Impulse 训练火灾探测系统的模型,并最终将其部署到 Arduino Nicla Vision。

3、使用 Edge Impulse 平台进行训练

Edge Impulse 为在 TinyML 设备上部署模型提供了端到端解决方案。该过程从使用 IoT 设备收集数据开始,然后是特征提取、模型训练,最后是 TinyML 设备的部署和优化。

创建如下所示的目录结构。

.
├── annotations
│   ├── rgb_0000.xml
│   ├── rgb_0001.xml
│   ├── rgb_0002.xml
│   ├── rgb_0003.xml
│   ...
└── images├── rgb_0000.png├── rgb_0001.xml    ├── rgb_0002.png├── rgb_0003.png├── rgb_0004.png├── rgb_0005.png...

Edge Impulse 最近发布了以 Pascal VOC 格式上传数据集的功能。就我而言,我上传了大约 600 张图像和标注文件。

你应该确保每个图像都正确标记并分组到各自的火灾类别中,以避免在训练期间出现任何混淆。

设置好所有类别并对数据集感到满意后,就可以开始训练模型了。在左侧导航菜单中导航至“create impulse”。

最后,单击“save impulse”。

然后导航到“图像”。在此步骤中,你将从输入数据中生成特征。特征是分类算法将用来对图像进行分类的独特属性。

使用完功能探索器后,点击左侧导航菜单中的对象检测项。

对于此项目,训练周期数设置为 100,学习率设置为 0.005。

Edge Impulse 开发了 FOMO,这是一种用于边缘设备的实时物体检测的 TinyML 深度学习架构,它使得在计算和内存容量非常小的设备上运行实时物体检测成为可能。FOMO 不是检测边界框,而是预测物体的中心。这些模型的大小设计为 <100KB,可以部署到 Arduino Nicla Vision。

神经网络架构具有以下结构。它将使用基于 FOMO 的迁移学习来训练我们的模型。

按下“开始训练”按钮来训练模型。此过程可能需要大约 5-10 分钟,具体取决于你的数据集大小。如果一切顺利,你应该在 Edge Impulse 中看到以下内容。

F1 得分为 86.8%,这意味着该模型在准确率和召回率之间取得了良好的平衡,并且在该对象检测任务上表现良好。一旦你对模型的性能感到满意,就可以将其部署到你的 Arduino Nicla Vision 上。

我们的量化模型的大小为 56KB。Arduino Nicla Vision 的可用内存限制为 400 千字节 (KB),因为处理器已经为操作系统和图像缓冲区使用了 1 兆字节 (MB) 的随机存取存储器 (RAM)。它还具有 2MB 的闪存和 16MB 的 QSPI 闪存,可为您提供额外的存储空间。

4、将训练模型部署到 Arduino Nicla Vision

Arduino Nicla Vision 可以在 MicroPython 环境中使用 OpenMV IDE 进行编程。下载它。

然后,转到 Edge Impulse 的部署选项卡。单击部署选项。在我的情况下,它是 OpenMV 库。

在该部分的底部,按下构建按钮。一个 zip 文件将自动下载到您的计算机。解压它。

使用 USB 线将 Arduino Nicla Vision 设备连接到你的计算机。

将“labels.txt”和“trained.tflite”文件复制到 Arduino Nicla Vision 设备的根目录。确保将文件直接粘贴到主文件夹中。

在 OpenMV IDE 中,找到 ei_object_detection.py python 脚本,该脚本处理对象检测过程。最后,运行它。这里是演示视频。


原文链接:火灾检测边缘设备开发 - BimAnt

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

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

相关文章

ELK企业级实战

一、Elstic stack在企业的常⻅架构 https://www.bilibili.com/video/BV1x94y1674x/?buvidXY705117E90F73A790429C9CFBD5F70F22168&vd_source939ea718db29535a3847d861e5fe37ef ELK 解决取得问题 痛点1: ⽣产出现故障后&#xff0c;运维需要不停的查看各种不同的⽇志进⾏…

深入解析Java和Go语言中String与byte数组的转换原理

1.Java String与byte[]互相转换存在的问题 java中&#xff0c;按照byte[] 》string 》byte[]的流程转换后&#xff0c;byte数据与最初的byte不一致。 多说无益&#xff0c;上代码&#xff0c;本地macos机器执行&#xff0c;统一使用的UTF-8编码。 import java.nio.charset.S…

逻辑操作符

目录 && --- 逻辑与操作符 || --- 逻辑或操作符 && --- 逻辑与操作符 逻辑与操作符有并且的意思&#xff0c;一般用于判断语句中 逻辑与操作符运行规则是都要为真&#xff0c;才会继续执行或计算 360笔试题&#xff1a; 有关前置(--)&#xff0c;后置(-…

树莓派安装windows系统

第1步&#xff1a; https://uupdump.net/下载对应的系统文件&#xff0c;所有选择项都默认选择。 第2步&#xff1a; 解压下载后的文件&#xff0c;双击运行下面文件。等待下载完成&#xff0c;等待过程很漫长&#xff0c;很考验耐心。 第3步&#xff1a; 提示已经finish了&…

Streamer-Sales 销冠 —— 卖货主播大模型来了,一键让你成为销冠!

今天给大家推荐一个在GitHub上非常火的卖货主播大模型 Streamer-Sales&#xff0c;旨在让你成为销冠。 这是一个能够根据商品特点进行解说的卖货主播大模型&#xff0c;通过生成的细腻、独到的解说词&#xff0c;激发用户的购买欲望。 相关链接 项目地址&#xff1a;github.c…

一文入门Nanomsg通信库

转载自本人博客&#xff1a;https://www.jjy2023.cn/2024/06/27/%e4%b8%80%e6%96%87%e5%85%a5%e9%97%a8nanomsg%e9%80%9a%e4%bf%a1%e5%ba%93/ 1. Nanomsg介绍 Nanomsg官方在线文档&#xff1a;https://nanomsg.org/index.html 本文全部代码用C实现。 以前一直在使用ZeroMQ库处理…

关于Unity运行时动态修改材质的小秘密

一、问题背景 在以往的Unity项目中涉及到修改材质的需求时&#xff0c;也只是改改材质贴图&#xff0c;材质颜色等&#xff0c;也没遇到那么多动态修改材质的坑。最近在做Unity App Demo时也遇到了要修改材质的小需求&#xff0c;本以为几分钟就能完成了&#xff0c;却花费了我…

Cesium Model 中的剪裁平面 (ClippingPlane)

Cesium Model 中的剪裁平面 (ClippingPlane) 参考: https://www.cnblogs.com/webgl-angela/p/9197672.html Cesium Model 中的剪裁平面 (ClippingPlane) // 相关类: class ClippingPlaneCollection {} class ClippingPlane {}// 剪裁的整体流程: Model.prototype.update () …

牛客小白月赛97 (个人题解)(待补完)

前言&#xff1a; 前天晚上写的一场牛客上比赛&#xff0c;虽然只写出了三道&#xff0c;但比起之前的成绩感觉自己明显有了一点进步了&#xff0c;继续努力吧&#xff0c; 正文&#xff1a; 链接&#xff1a;牛客小白月赛97_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞…

如何用DCA1000持续采集雷达数据

摘要&#xff1a;本文介绍一下如何通过mmwave studio软件&#xff0c;搭配DCA1000数据采集卡&#xff0c;对AWR1843BOOST进行不间断的数据采集。本文要求读者已经掌握了有关基础知识。 本文开放获取&#xff0c;无需关注。 到SensorConfig页面下&#xff0c;一步步操作&#xf…

ubuntu 18 虚拟机安装(3)安装mysql

ubuntu 18 虚拟机安装&#xff08;3&#xff09;安装mysql 参考 https://cloud.tencent.com/developer/article/1700780 技术分享 | MySQL 设置管理员密码无法生效一例 https://cloud.tencent.com/developer/article/2014384 在Ubuntu18.04上安装MySQL &#xff5c; 超级详细…

无人机挂载抛弹吊舱技术详解

随着无人机技术的飞速发展&#xff0c;无人机在军事、安全、农业、环保等领域的应用越来越广泛。其中&#xff0c;挂载抛弹吊舱的无人机在精确打击、应急处置等场合发挥着重要作用。抛弹吊舱技术通过将弹药、物资等有效载荷挂载在无人机下方&#xff0c;实现了无人机的远程投放…

昇思25天学习打卡营第7天|模型训练

模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 前面几天依次学习了前面几个步骤的操作&#xff0c;今天继续学习模型训练。 数据集和神经网络模型这个前面已经有详细的介绍。准确…

JVM(13):虚拟机性能分析和故障解决工具之Visual VM

1 Visual VM作用 是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序&#xff0c;并且可以遇见在未来一段时间内都是官方主力发展的虚拟机故障处理工具。官方在VisualVM的软件说明中写上了“All-in-One”的描述字样&#xff0c;预示着他除了运行监视、故障处理外&…

ConcurrentHashMap是如何保证线程安全的-put方法简要分析

简介 ConcurrentHashMap 是 Java 中并发编程中常用的线程安全的哈希表&#xff08;HashMap&#xff09;实现。它具有以下几个显著的特点和优点&#xff0c;适合在特定的并发场景中使用&#xff1a; 线程安全性&#xff1a; ConcurrentHashMap 提供了并发访问的线程安全保证&am…

python进阶函数

目录 函数多返回值函数多种传参方式匿名函数 函数多返回值 问&#xff1a;如果一个函数如些两个return&#xff08;如下所示&#xff09;&#xff0c;程序如何执行&#xff1f; def return_num():return 1return 2result return_num() print(result)答&#xff1a;只执行了第…

Web3 前端攻击:原因、影响及经验教训

DeFi的崛起引领了一个创新和金融自由的新时代。然而&#xff0c;这种快速增长也吸引了恶意行为者的注意&#xff0c;他们试图利用漏洞进行攻击。尽管很多焦点都集中在智能合约安全上&#xff0c;但前端攻击也正在成为一个重要的威胁向量。 前端攻击的剖析 理解攻击者利用前端漏…

AWT的菜单组件

AWT的菜单组件 前言一、菜单组件的介绍常见的菜单相关组件常见菜单相关组件集成体系图菜单相关组件使用小要点 二、AWT菜单组件的代码示例示例一示例二实现思路 前言 推荐一个网站给想要了解或者学习人工智能知识的读者&#xff0c;这个网站里内容讲解通俗易懂且风趣幽默&…

springboot汽车租赁管理系统-计算机毕业设计源码08754

目 录 摘 要 第 1 章 引 言 1.1 选题背景和意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析…

基于线调频小波变换的非平稳信号分析方法(MATLAB)

信号处理领域学者为了改进小波变换在各时频区间能量聚集性不高的缺点&#xff0c;有学者在小波分析基础上引入调频算子构成了线性调频小波变换&#xff0c;线调频小波一方面继承了小波变换的理论完善性&#xff0c;另一方面用一个新的参数&#xff08;线调频参数&#xff09;刻…