使用FPGA进行 AI 火灾定位-FirAI

news2024/11/26 15:33:47

7a91b88a6bb4e082e1f9a00e66ec618e.jpeg

部署在 FPGA 上加速的 AI 火灾侦查。助力消防人员快速应对火灾事故~

8f284c7c4be9a8e4a8d3b3ea5b039993.gif

绪论

问题:近年来,不断增加的城市人口、更复杂的人口密集建筑以及与大流行病相关的问题增加了火灾侦查的难度。因此,为了增强消防人员对火灾事件的快速反应,安装视频分析系统,可以及早发现火灾爆发。

目标:解决方案包括建立一个分布式计算机视觉系统,增加建筑物火灾的早期检测。该系统的分布式和模块化特性可以轻松部署,而无需增加更多基础设施。在不增加人力规模的情况下,可以明显增强消防能力。系统通过使用 Xilinx FPGA实现边缘 AI 加速图像处理功能来实现。

d96277b4564e9ed707057c95f018d573.png

开发流程介绍

使用的硬件是 Xilinx Kria KV260,用于加速计算机视觉处理和以太网连接的相机套件。嵌入式软件使用 Vitis AI。在 PC 上,使用现有的火灾探测数据集对自定义 Yolo-V4 模型进行训练。之后,对Xilinx YoloV4 模型进行量化、裁剪和编译 DPU ,最后部署在FPGA上。

d23d761343832caffc67e306be26895d.png

系统框图

ed8adbfdb6303453c4c6865a509c4450.png

PC:设置 SD 卡镜像

首先我们需要为 FPGA Vision AI Starter Kit 准备 SD 卡(至少 32GB)。

这次将使用 Ubuntu 20.04.3 LTS 作为系统。可以从下面网站下载镜像。

https://ubuntu.com/download/xilinx

bc848cee36392d76175b806eb56fe33f.png

在 PC 上,下载 Balena Etcher 将其写入 SD 卡。

https://www.balena.io/etcher/

或者,可以使用下面命令行(警告:请确保系统下/dev/sdb必须是 SD 卡)进行操作:

xzcat ~/Downloads/iot-kria-classic-desktop-2004-x03-20211110-98.img.xz | sudo dd of=/dev/sdb bs=32M
80057077ead859f803278611ca92f889.png

完成后, SD 卡就准备好了,将其插入 开发板上。

设置 Xilinx Ubuntu

将 USB 键盘、USB 鼠标、USB 摄像头、HDMI/DisplayPort 和以太网连接到开发板。

ef561ad08ab24bdb125b64ad5101d2ce.png

连接电源,将看到 Ubuntu 登录屏幕。

默认用户名:ubuntu密码:ubuntu

启动时,系统ui可能会非常慢,可以运行下面这些命令来禁用一些组件以加快速度。

gsettings set org.gnome.desktop.interface enable-animations false
gsettings set org.gnome.shell.extensions.dash-to-dock animate-show-apps false

接下来,调用下面命令将系统更新到最新版本

sudo apt upgrade

早期版本的 Vitis-AI 不支持 Python,详见:

https://support.xilinx.com/s/question/0D52E00006o96PISAY/how-to-install-vart-for-vitis-ai-python-scripts?language=en_US

安装用于系统管理的 xlnx-config snap 并对其进行配置(https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/2037317633/Getting+Started+with+Certified+Ubuntu+20.04+LTS+for+Xilinx+Devices):

sudo snap install xlnx-config --classic
xlnx-config.sysinit

接下来检查设备配置是否工作正常。

sudo xlnx-config --xmutil boardid -b som

安装带有示例的 Smart Vision 应用程序和 Vitis AI 库。(智能视觉应用程序包含我们将重复使用的 DPU 的比特流,库样本稍后也将用于测试我们训练的模型)

sudo xlnx-config --snap --install xlnx-nlp-smartvision
sudo snap install xlnx-vai-lib-samples

检查已安装的示例和应用程序

xlnx-vai-lib-samples.info
sudo xlnx-config --xmutil listapps

运行上述命令后,就会注意到 DPU 需要 Model Zoo 样本。

d5d28202ba03943b4c29240f48c378db.png

接下俩运行其中一个示例。在运行示例之前,需要将 USB 摄像头连接到开发板并确保系统驱动能检测到视频设备。这次使用的是 Logitech C170,它被挂载到/dev/video1

v4l2-ctl --list-devices
c874afb14b1be5b9a6db7a5ef07c7eac.png

加载并启动智能视觉应用程序。

sudo xlnx-config --xmutil loadapp nlp-smartvision
xlnx-nlp-smartvision.nlp-smartvision -u

在运行任何加速器应用程序之前,我们需要先加载 DPU。我们可以简单地调用 smartvision 应用程序,它会为我们加载比特流。或者,可以打包自己的应用程序(https://www.hackster.io/AlbertaBeef/creating-a-custom-kria-app-091625)。

注意:加速器比特流位于/lib/firmware/xilinx/nlp-smartvision/.

由于我们计划是使用YOLOv4框架,所以让我们测试一个模型的例子。有“ yolov4_leaky_spp_m”预训练模型。

sudo xlnx-config --xmutil loadapp nlp-smartvision

# the number 1 is because my webcam is on video1
xlnx-vai-lib-samples.test-video yolov4 yolov4_leaky_spp_m 1

上面的命令将在第一次运行时下载模型。模型将被安装到 ~/snap/xlnx-vai-lib-samples/current/models 目录中。

128aa9e64c529e3886a723f6b2fa2857.png

上面测试良好,接下来就可以训练我们自己的模型。

PC:运行 YOLOv4 模型训练

要训练模型,请遵循Xilinx 提供的07-yolov4-tutorial文档。它是为 Vitis v1.3 编写的,但步骤与当前的 Vitis v2.0 完全相同。

https://xilinx.github.io/Vitis-Tutorials/2020-2/docs/Machine_Learning/Design_Tutorials/07-yolov4-tutorial/README.html

我们的应用程序用于检测火灾事件,因此请在下面链接中下载火灾图像开源数据集:

https://github.com/gengyanlei/fire-smoke-detect-yolov4/blob/master/readmes/README_EN.md

fire-smoke (2059's images, include labels)-GoogleDrive

https://drive.google.com/file/d/1ydVpGphAJzVPCkUTcJxJhsnp_baGrZa7/view?usp=sharing

请参考.cfg此处的火灾数据集文件。

https://raw.githubusercontent.com/gengyanlei/fire-smoke-detect-yolov4/master/yolov4/cfg/yolov4-fire.cfg

我们必须修改此.cfg配置文件以与 Xilinx Zynq Ultrascale+ DPU 兼容:

  • Xilinx 建议文件输入大小为 512x512(或 416x416 以加快推理速度)

f772127520d934f0dea4afdaf5c4e941.png
  • DPU 不支持 MISH 激活层,因此将它们全部替换为 Leaky 激活层

835183370e1ef6bddb21a0f49375c368.png
  • DPU 仅支持最大 SPP maxpool 内核大小为 8。默认设置为 5、9、13。但决定将其更改为 5、6、8。

120a960795836cc5d82d38788f5f4d25.png

在 Google Colab 上对其进行了训练。遵循了 YOLOv4 的标准训练过程,没有做太多修改。

在 github 页面中找到带有分步说明的 Jupyter notebook。

https://github.com/zst123/xilinx_kria_firai

下图是损失的进展图。运行了大约 1000 次迭代我觉得这个原型的准确性已经足够好了,但如果可以的话,建议进行几千次迭代训练。

51fcc00ad655f78196ee285f9cd9dd3f.png

下载最佳权重文件 ( yolov4-fire-xilinx_1000.weights)。在本地运行了 yolov4 推理,一张图像大约需要 20 秒!稍后我们将看到使用 FPGA 可以将其加速到接近实时的速度。

./darknet detector test ../cfg/fire.data ../yolov4-fire.cfg 
../yolov4-fire_1000.weights image.jpg -thresh 0.1
2599f02df94a82d5220070a67a625daf.png

现在有了经过训练的模型,接下来就是将其转换和部署在 FPGA 上。

PC:转换TF模型

下一步是将darknet model转换为frozen tensorflow流图。keras-YOLOv3-model-set 存储库为此提供了一些有用的脚本。我们将运行 Vitis AI 存储库中的一些脚本。

首先安装docker,使用这个命令:

sudo apt install docker.io
sudo service docker start
sudo chmod 666 /var/run/docker.sock # Update your group membership

拉取 docker 镜像。使用以下命令下载最新的 Vitis AI Docker。请注意,此容器是 CPU 版本。(确保运行Docker的磁盘分区至少有100GB的磁盘空间)

$ docker pull xilinx/vitis-ai-cpu:latest
172920ef3789df39abf97caefb5bae65.png

clone Vitis-AI 文件夹

git clone --recurse-submodules https://github.com/Xilinx/Vitis-AI
cd Vitis-AI
ba74df846b7e763152b61d1ec74a1a39.png

启动 Docker

bash -x ./docker_run.sh xilinx/vitis-ai-cpu:latest
104ca831a87caa184f798b78f62e9227.png

进入 docker shell 后,clone教程文件。

> git clone https://github.com/Xilinx/Vitis-AI-Tutorials.git
> cd ./Vitis-AI-Tutorials/
> git reset --hard e53cd4e6565cb56fdce2f88ed38942a569849fbd # Tutorial v1.3

现在我们可以从这些目录访问 YOLOv4 教程:

从主机目录:~/Documents/Vitis-AI/Vitis-AI-Tutorials/Design_Tutorials/07-yolov4-tutorial

从 docker 中:/workspace/Vitis-AI-Tutorials/07-yolov4-tutorial

进入教程文件夹,创建一个名为“ my_models ”的新文件夹并复制这些文件:

训练好的模型权重:yolov4-fire-xilinx_last.weights
训练配置文件:yolov4-fire-xilinx.cfg
83f4e078de4a413e0100f186f5f5534b.png

在 scripts 文件夹下,找到convert_yolov4脚本。编辑文件指向我们自己的模型(cfg 和权重文件):

../my_models/yolov4-fire-xilinx.cfg \
../my_models/yolov4-fire-xilinx_last.weights \
ea59c41a86bdaa0d6deb64ea5966a5c1.png

现在回到终端并输入 docker。激活tensorflow环境。我们将开始转换yolo模型的过程

> conda activate vitis-ai-tensorflow
> cd /workspace/Vitis-AI-Tutorials/Design_Tutorials/07-yolov4-tutorial/scripts/
> bash convert_yolov4.sh

转换后,现在可以在“keras_model”文件夹中看到 Keras 模型(.h5)。以及“tf_model”文件夹下的frozen model(.pb)。

2a2ac608cda083352b2820e0099c250f.png

PC:量化模型

我们需要将部分训练图像复制到文件夹“ yolov4_images ”。这些图像将用于量化期间的校准。

创建一个名为“ my_calibration_images ”的文件夹,并将训练图像的一些随机文件粘贴到那里。然后我们可以列出所有图像的名称到 txt 文件中。

> ls ./my_calibration_images/ > tf_calib.txt
190b1559d4827ee747ed78f041854893.png

然后编辑yolov4_graph_input_keras_fn.py ,指向这些文件位置。

30e6e35af3f53d3f2811d7703da4618b.png

运行./quantize_yolov4.sh。将在yolov4_quantized目录中生成一个量化图。

c90641faa5ad92f7c33fb5a234760f86.png

接下来在“yolov4_quantized”文件夹中看到量化的frozen model。

ec7130030653f00e602295edad6c1588.png

PC:编译 xmodel 和 prototxt

创建用于编译 xmodel 的arch.json ,并将其保存到同一个“ my_models ”文件夹中。

请注意使用我们之前在 FPGA 上看到的相同 DPU。在这种情况下,以下是 FPGA 配置 (Vitis AI 1.3/1.4/2.0)

{
"fingerprint":"0x1000020F6014406"
}
686cb0737c17061bb03ac750875bdb8b.png

修改compile_yolov4.sh指向我们自己的文件

NET_NAME=dpu_yolov4
ARCH=/workspace/Vitis-AI-Tutorials/Design_Tutorials/07-yolov4-tutorial/my_models/arch.json
vai_c_tensorflow --frozen_pb ../yolov4_quantized/quantize_eval_model.pb \
--arch ${ARCH} \
--output_dir ../yolov4_compiled/ \
--net_name ${NET_NAME} \
--options "{'mode':'normal','save_kernel':'', 'input_shape':'1,512,512,3'}"

运行编译

> bash -x  compile_yolov4.sh
b253ef9378659e7588f89b765e1af495.png

在“yolov4_compiled”文件夹中,将看到 meta.json 和 dpu_yolov4.xmodel。这两个文件构成了可部署模型。将这些文件复制到 FPGA。

67d93d7f271d5424754ccebd10835d69.png

请注意,如果使用官方较旧的指南,能会看到正在使用 *.elf 文件。新指南替换为 *.xmodel 文件

从 Vitis-AI v1.3 开始,该工具不再生成 *.elf 文件,而是 *.xmodel 并且将用于在边缘设备上部署模型。

对于某些应用程序,需要*.prototxt文件和*.xmodel文件。要创建prototxt,我们可以复制示例并进行修改。

https://github.com/Xilinx/Vitis-AI-Tutorials/blob/1.3/Design_Tutorials/07-yolov4-tutorial/dpu_yolov4/dpu_yolov4.prototxt

根据你的YOLO配置需要遵循的事项:

“biases”:必须与yolo.cfg文件中的“anchors”相同
“num_classes”:必须与 yolo.cfg 文件中的“classes”相同
“layer_name”:必须与 xmodel 文件中的输出相同
252afbb2bfa7c3defbd2341e7ab8ad33.png

对于 layer_name,可以转到 Netron ( https://netron.app/ ) 并打开 .xmodel 文件。由于 YOLO 模型有 3 个输出,还会看到 3 个结束节点。

对于这些节点中的每一个 (fix2float),都可以从名称中找到编号。

4b53ea00a9cecda5379ad76e878fac86.png

如果在运行模型时可能遇到分段错误,很可能是由于.prototxt文件配置错误。如果是这样,请重新运行这一章节的操作并验证是否正确。

FPGA:在 FPGA Ubuntu 上测试部署

创建一个名为“dpu_yolov4”的文件夹并复制所有模型文件。该应用程序需要这 3 个文件:

  • meta.json

  • dpu_yolov4.xmodel

  • dpu_yolov4.prototxt

579c8b02689a37dde8fedb64713886e7.png

我们可以通过直接从 snap bin 文件夹调用test_video_yolov4可执行文件来测试模型。

> sudo xlnx-config --xmutil loadapp nlp-smartvision # Load the DPU bitstream

> cd ~/Documents/
> /snap/xlnx-vai-lib-samples/current/bin/test_video_yolov4 dpu_yolov4 0

就会看到它检测到所有的火。在这种情况下,有多个重叠的框。我们在创建 python 应用程序时会考虑到这一点。

03a2337ff93a051f0f305b72e9680f4d.png

FPGA:Python 应用程序实现

在 Github 页面中,将找到完整应用程序实现。它考虑了重叠框并执行非最大抑制 (NMS) 边界框算法。它还打印边界框的置信度。此外,每个坐标记录在帧中。在现实系统中,这些信息将被发送到服务器并提醒负责人员。

dbdcd19b4b630922201ad210b65e1f9e.png

视频

b7254c4bceca5e860ab8eb4c3810fc9f.gif

参考

https://www.hackster.io/zst123/project-firai-ai-fire-spotting-with-xilinx-kria-kv260-f9dad2

https://github.com/Xilinx/Vitis-AI-Tutorials/blob/1.3/Design_Tutorials/07-yolov4-tutorial/dpu_yolov4/dpu_yolov4.prototxt

https://github.com/zst123/xilinx_kria_firai

源码

https://github.com/zst123/xilinx_kria_firai

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

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

相关文章

delmia机器人建模与装配

1 可以用catia中的模型或其他三维建模软件中的模型转化为step格式即可 2 在demlia中打开 3 打开单个零件保存为cgr格式 对机械臂所有零件都做同样的转化 4 新建装配设计,并导入带有坐标的零件 将转化后的零件都选中导入即是装配好的 5 将模式修改为device buildin…

用户行为数据采集:常见埋点方案优劣势对比及选型建议

数据采集是大数据的基石,用户在使用App、微信小程序等各种线上应用产生的行为,只有通过埋点才能进行采集。没有埋点,数据分析决策、数据化运营都是无源之水,巧妇难为无米之炊。但很多时候,“埋点”两个字却成了C端产品…

STM32——关于NVIC讲解及标准库应用(基础篇)

简介: NVIC是指STM32中的中断控制器(Nested Vectored Interrupt Controller)。中断是STM32中的重要机制,通过中断可以实现异步事件处理。NVIC提供了灵活、高效、可扩展的中断处理机制,支持多级优先级、多向中断、嵌套向…

深入理解网络协议

hi 大家好,之前带小伙伴,一起复习了一遍网络协议,对网络协议的核心知识进行梳理,希望大家早日掌握这些核心知识,打造自己坚实的基础,为自己目标慢慢积累,厚积薄发。 详细点击查看-> 极客星球…

傅一平:一文讲透ERP的下一代架构!

”5月22日,华为宣布仅用15小时便完成了全球88家子公司MetaERP系统的切换。这也意味着华为MetaERP系统研发取得胜利,成功摆脱外国供应商断供停服威胁,实现该系统的全栈自主可控。“ 自己最近对ERP下一代架构有了兴趣,原因有四个&am…

阿里拆成1+6+N,中台还搞不搞了?

📣📣📣📣📣📣📣 🎍大家好,我是慕枫 🎍前阿里巴巴高级工程师,InfoQ签约作者、阿里云专家博主,一直致力于用大白话讲解技术知识 &#x…

推荐 6 个上周 火火火 的开源项目

本期推荐开源项目目录: 1. ChatGPT 网页应用(AI) 2. AI 换脸(AI) 3. API 调用 Midjourney 进行 AI 画图(AI) 4. 如何使用 Open AI 的 API?(AI) 5. 中华古诗词…

写在2023年乐夏前

(1)白衬衣的少年 勇敢的你 站在这里 脸庞清瘦却骄傲 (2)来啊,一起摇摆啊 这首歌发表在2016年。那时候的他们已经功成名就,彭磊却还能写出这样的词。 纸醉金迷不应该是:防晒霜、付税单、玫瑰金、…

Python海龟有了新技能,这回画了个印度美女。Python海龟洪水填充命令fill的用法

Python海龟有了新技能,这回画了个印度美女。看官想一想,如果要填充圆环区域,该如何填充呢?Python的海龟模块本质是对凸多边形的填充,对于凹多边形的填充无法胜任。 真正的Python海龟绘图在这,视频里还有点…

AI绘画真的是太神奇!

最近会员群的同学一直研究AI绘画,AI技术真的太神奇了,以前是插画师的看家本领,现在通过AI技术一下子让平头老百姓也能有这样的技能!好像路痴有了导航也能开车了。最近在研究如何利用AI做卡通头像,发现这个不仅好玩&…

深度图解 Redis Hash(散列表)实现原理

1. 是什么 Redis Hash(散列表)是一种 field-value pairs(键值对)集合类型,类似于 Python 中的字典、Java 中的 HashMap。一个 field 对应一个 value,你可以通过 field 在 O(1) 时间复杂度查 field 找关联的…

更换Mysql数据库-----基于Abo.io 的书籍管理Web应用程序

之前公司一直使用的是ASP.NET Boilerplate (ABP),但是当解决方案变得很大时,项目启动就变得非常慢,虽然也想了一些办法,将一些基础模块做成Nuget包的形式,让整个解决方案去引用。但是整个项目还是很臃肿,各…

双轴高精度倾角传感器安装方式和485协议

倾角安装注意事项 在安装传感器时,不正确安装会导致测量角度误差偏大。安装时请注意以下两点: 1.“两面”指安装面与被测物体的安装面紧靠(被测物体的安装面要尽可能水平),不能有夹角产生(如A图中的角a&a…

【靶场】vulfocus搭建和场景编排

前言 Vulfocus 是一个漏洞集成平台,将漏洞环境 docker 镜像,放入即可使用,开箱即用,这里我们搭建在云服务器上,需要高一点的配置,搭建可以按需搭建本地和自己的服务器上,我们主要使用场景编排功…

【系统学习】Java基础1之多线程

前言 被公司换岗一年多了,从Linux C换到了java开发,奈何大环境不好,半吊子经验找不到好工作。 接触了spring cloud, spring boot k8s等许多新的知识。已经开发Java生态相关项目已一年半,但都止步于用的阶段,自知毫无竞…

小航编程题库蓝桥杯stem科技素养模拟练习试卷(初级第2套)(含题库教师学生账号)

需要在线模拟训练的题库账号请点击 小航助学编程在线模拟试卷系统(含题库答题软件账号)_程序猿下山的博客-CSDN博客 25. 百度公司是一家于 2000 年创立的互联网公司,其业务范围十分广泛。以下选 项中,( )不…

v4L2应用开发学习!

一.什么是V4L2框架? V4L2英文全称是Video for Linux2,它是专门为视频设备设计的内核驱动。在做视频的开发中,一般我们操控V4L2的设备节点就可以直接对摄像头进行操作。通常V4L2在Linux的设备节点是**/dev/video0**。无论是MIPI摄像头还是UVC摄…

SpringBoot项目快速添加新依赖框架的插件---->EditStarters

在SpringBoot项目中,我们往往会因为项目的需要经常需要添加一些新的依赖来支持项目的运行,此时可能会有人去Maven中央仓库去下载相关依赖,再来导入pom.xml。 但是可以有另外一种更快速的方法:那就是IDEA已经提供了一种快速的插件&…

HTB PC

HTB PC 链接:https://qing3feng.github.io/2023/05/29/HTB%20PC/ 今天又学一招,配置好/etc/hosts​文件: ​[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传 如图所示,这样子就可以直接ping pc​了&#x…

Mongodb 为什么提起处理JSON 就是MOGNODB 的,因为我没得选

开头还是介绍一下群,如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题,有需求都可以加群群内有各大数据库行业大咖,CTO,可以解决你的问题。加群请联系 liuaustin3 ,在新加的朋友会分到2群(共…