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

news2024/11/12 21:37:47

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

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

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

如上图所示,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 datetime

now = 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():
    # Camera1
    camera1 = 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'
    )

    # Camera2
    camera2 = 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 plane
    floor = rep.create.plane(
        position=(0, 0, 0),
        rotation=(0, 0, 0),
        scale=(50, 50, 50),
        semantics=[('class', 'floor')],
        name='floor',
    )

    # Randomize the floor material
    def random_Floor_Material():
        floor_material = rep.randomizer.materials(
            materials=rep.get.material(path_pattern="/Fire/Looks/*"),
            input_prims=floor
        )
        return floor_material.node
    rep.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 shutil

def copy_images(source_folders, destination_folder):
    # Create the destination folder if it doesn't exist
    if not os.path.exists(destination_folder):
        os.makedirs(destination_folder)

    for folder in source_folders:
        # List all files in the source folder
        files = 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 file
                counter = 0
                while os.path.exists(destination_file_path):
                    counter += 1
                    new_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 folder
                shutil.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 ET

def draw_bounding_box(image_path, annotation_path, output_path):
    # Load the image
    img = cv2.imread(image_path)

    # Parse the annotation file
    tree = ET.parse(annotation_path)
    root = tree.getroot()

    for obj in root.findall('object'):
        # Retrieve bounding box coordinates
        xmin = 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 image
        cv2.rectangle(img, (xmin, ymin), (xmax, ymax), (0, 255, 0), 2)

    # Save the image with bounding box
    cv2.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.coloradmin.cn/o/1872766.html

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

相关文章

《昇思25天学习打卡营第5天 | 昇思MindSpore网络构建》

第五天 今天学习了神经网络模型是由神经网络层和Tensor操作构成的&#xff0c;mindspore.nn提供了常见神经网络层的实现&#xff0c;在MindSpore中&#xff0c;Cell类是构建所有网络的基类&#xff0c;也是网络的基本单元。一个神经网络模型表示为一个Cell&#xff0c;它由不同…

大厂程序员上班猝死成常态?

大家好&#xff0c;我是瑶琴呀&#xff0c;拥有一头黑长直秀发的女程序员。 近日&#xff0c;连续看到大厂程序员猝死、低血糖晕倒的新闻&#xff0c;同为程序员感到很难受。互联网加班成常态这是既定事实&#xff0c;尤其在这个内卷严重、经济不景气的环境中&#xff0c;加班…

CAM350如何移动元素?

CAM350如何移动元素&#xff1f; 1、选择菜单栏Edit→Move 2、然后按W键&#xff0c;光标变为下图的形状&#xff0c;然后框选需要移动的元素。 3、框选元素后如下图所示&#xff0c;然后右击&#xff0c;退出框选命令。 4、然后点选一个原点开始移动所选的元素。 移动后如下图…

数据分析ClickHouse学习笔记

一、ClickHouse基础 1.1 ClickHouse介绍 ClickHouse是一个用于联机分析(OLAP)的列式DBMS。 简单来说&#xff0c;相比MySQL等行式数据库&#xff0c;数据存储方式是&#xff1a; Rowidis_deltitlesexcreateAt#021a12024/2/18 5:19#130b12024/2/18 8:10#241c12024/2/18 7:38…

车载测试工程师在行业中有哪些挑战需要面对?

车载测试工程师在行业中面临着多方面的挑战&#xff0c;这些挑战涵盖了技术、安全、法规以及市场环境等多个层面。 1. 技术挑战&#xff1a; 复杂性与集成性&#xff1a;现代汽车系统由众多模块和子系统组成&#xff0c;包括发动机控制、安全系统、娱乐系统、导航系统等。这些系…

新品Coming Soon!OAK-D-SR-PoE:使用3D+AI视觉结合ToF实现箱体测量和鉴别!

OAKChina 新品&#xff1a;OAK-D SR PoE结合ToF实现箱体检测 3DAI解决方案提供商 手动测量箱体、缺陷、大小等操作可能是一项繁琐并且劳累而机械的任务&#xff0c;但OAK中国本次将提供了更好的解决方案&#xff1a;3DAI视觉处理箱体的识别和检测&#xff0c;使用了即将发布的…

KVM性能优化之网络性能优化

1、使用virtio半虚拟化网卡 在Virt- Manager图形界面里指定下&#xff1a; 当然也可以编辑XML文件&#xff0c;添加<model typevirtio/> 如果你不指定&#xff0c;那么虚拟机会默认使用8139的全虚拟化网卡&#xff0c;8139网卡是Realtek的百兆。 2、使用vhost_net v…

Windows和Linux C++判断磁盘空间是否充足

基本是由百度Ai写代码生成的&#xff0c;记录一下。实现此功能需要调用系统的API函数。 对于Windows&#xff0c;可调用函数GetDiskFreeSpaceEx&#xff0c;使用该函数需要包含头文件windows.h。该函数的原型&#xff1a; 它的四个参数&#xff1a; lpDirectoryName&#xff0…

Gitlab上传代码时自动触发Jenkins构建代码配置

Jenkins配置构建触发器&#xff0c;勾选Build when a change is pushed to GitLab 记得记住对应url 在下面生成一个Jenkins的Secret token 打开Gitlab配置Webhooks 保存后测试 可正常构建并推送

DIY:在您的 PC 上本地使用 Stable Diffusion AI 模型生成图像

前言 随着DALL-E-2和Midjourney的发布&#xff0c;您可能听说过最近 AI 生成艺术的繁荣。这些人工智能模型如何在几秒钟内创造性地生成逼真的图像&#xff0c;这绝对是令人兴奋的。您可以在这里查看其中的一些&#xff1a;DALL-E-2 gallery和Midjourney gallery 但是这些模型…

Linux-引导过程与服务控制

目录 一、Linux操作系统引导过程 1、引导过程总览 2、引导过程详解 2.1、开机自检&#xff08;BIOS&#xff09; 2.2、 MBR引导 2.3、GRUB菜单 2.4、加载内核(kernel) 2.5、init进程初始化 3、系统初始化进程 3.1、Systemd单元类型 3.2、运行级别所对应的 Systemd 目…

湖北大学2024年成人高考函授报名专升本汉语言文学专业介绍

湖北大学&#xff0c;这所历史底蕴深厚的学府&#xff0c;自创办以来&#xff0c;始终致力于为社会各界人士提供高质量的成人高等继续教育。而今&#xff0c;为了满足广大成年人对于知识更新的渴求&#xff0c;学校特别开放了专升本汉语言文学专业的报名通道&#xff0c;为那些…

揭开免费可视化工具流行背后的原因

免费可视化工具为什么越来越受欢迎&#xff1f;在大数据时代&#xff0c;数据可视化已经成为各行各业的重要工具。它不仅帮助企业和个人更直观地理解数据&#xff0c;还在决策过程中起到关键作用。尽管市场上有许多付费的数据可视化工具&#xff0c;但免费工具的受欢迎程度却在…

rtthread 设备驱动 示例

添加自定义驱动效果 驱动 my_test_driver.c #include <stdint.h> #include <stdio.h> #include <rtthread.h> /*** brief 驱动初始化设备* * param device 需要初始化的设备* return rt_err_t 返回初始化状态*/ rt_err_t my_test_driver_init(struct rt_de…

RAID在VPS主机中的作用是什么?

您是否担心过网站的可靠性&#xff1f;有时候网站会崩溃。服务器会不稳定。 在高峰时段&#xff0c;即使最好的网站也会变得很慢&#xff0c;让人很烦。 这就是VPS主机发挥作用的地方——为您的在线网络奠定坚实的基础。 想进一步提升稳定和可扩展&#xff1f;这就是RAID…

【YOLOv8模型onnx部署详解】YOLOv8模型转onnx格式并使用onnxruntime 进行推理部署

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

讲透一个强大算法模型,Transformer !!

好像一直以来都没有和大家讨论过一个贼牛的模型 – Transformer&#xff01; 首先&#xff0c;咱们先用很直白的语言描述一下&#xff1a;想象你在读一本书&#xff0c;每一页都有很多词。如果你每次只能看到一个词&#xff0c;那么理解整本书会很慢。而Transformer模型就像是…

备忘录标签怎么弄 备忘录标签设置方法

在繁忙的生活中&#xff0c;我们常常需要记录各种琐事、工作任务和灵感闪现。备忘录成了我们不可或缺的助手&#xff0c;但随着时间的推移&#xff0c;备忘录里的内容越来越多&#xff0c;如何高效地管理和查找这些信息成了一个大问题。这时&#xff0c;备忘录的标签功能就显得…

TDengine 推出新连接器,与 Wonderware Historian 无缝连接

在最新发布的TDengine 3.2.3.0 版本中&#xff0c;我们进一步更新了 TDengine 的数据接入功能&#xff0c;推出了一款新的连接器&#xff0c;旨在实现 Wonderware Historian&#xff08;现称为 AVEVA Historian&#xff09;与 TDengine 的集成。这一更新提供了更加便捷和高效的…

【新手友好】计算机SCI期刊,IF=3+,编辑负责,修改稿件认真

一、期刊名称 Journal of Communications and Networks 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;3.6 中科院分区&#xff1a;3区 三、期刊征稿范围 《通信与网络杂志》每年出版六期&#xff0c;致力于发表高质量的…