0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在FPGA上加速 AI 火灾侦查

OpenFPGA 来源:OpenFPGA 2023-05-29 09:11 次阅读

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

绪论

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

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

开发流程介绍

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

系统框图

88f7c5fa-fdb8-11ed-90ce-dac502259ad0.png

PC:设置 SD 卡镜像

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

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

https://ubuntu.com/download/xilinx

895ae3ba-fdb8-11ed-90ce-dac502259ad0.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|sudoddof=/dev/sdbbs=32M
899b37f8-fdb8-11ed-90ce-dac502259ad0.png

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

设置 Xilinx Ubuntu

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

89d264f8-fdb8-11ed-90ce-dac502259ad0.png

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

默认用户名:ubuntu密码:ubuntu

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

gsettingssetorg.gnome.desktop.interfaceenable-animationsfalse
gsettingssetorg.gnome.shell.extensions.dash-to-dockanimate-show-appsfalse

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

sudoaptupgrade

早期版本的 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):

sudosnapinstallxlnx-config--classic
xlnx-config.sysinit

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

sudoxlnx-config--xmutilboardid-bsom

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

sudoxlnx-config--snap--installxlnx-nlp-smartvision
sudosnapinstallxlnx-vai-lib-samples

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

xlnx-vai-lib-samples.info
sudoxlnx-config--xmutillistapps

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

8a54f9d6-fdb8-11ed-90ce-dac502259ad0.png

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

v4l2-ctl--list-devices
8ab9b4fc-fdb8-11ed-90ce-dac502259ad0.png

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

sudoxlnx-config--xmutilloadappnlp-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”预训练模型。

sudoxlnx-config--xmutilloadappnlp-smartvision

#thenumber1isbecausemywebcamisonvideo1
xlnx-vai-lib-samples.test-videoyolov4yolov4_leaky_spp_m1

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

8af5d8f6-fdb8-11ed-90ce-dac502259ad0.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 以加快推理速度)

8b5c1116-fdb8-11ed-90ce-dac502259ad0.png

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

8b9c3d68-fdb8-11ed-90ce-dac502259ad0.png

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

8bd8fbea-fdb8-11ed-90ce-dac502259ad0.png

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

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

https://github.com/zst123/xilinx_kria_firai

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

8c123cfc-fdb8-11ed-90ce-dac502259ad0.png

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

./darknetdetectortest../cfg/fire.data../yolov4-fire.cfg
../yolov4-fire_1000.weightsimage.jpg-thresh0.1
8cc3f5e6-fdb8-11ed-90ce-dac502259ad0.png

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

PC:转换TF模型

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

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

sudoaptinstalldocker.io
sudoservicedockerstart
sudochmod666/var/run/docker.sock#Updateyourgroupmembership

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

$dockerpullxilinx/vitis-ai-cpu:latest
8d2f5ff2-fdb8-11ed-90ce-dac502259ad0.png

clone Vitis-AI 文件夹

gitclone--recurse-submoduleshttps://github.com/Xilinx/Vitis-AI
cdVitis-AI
8e0d191e-fdb8-11ed-90ce-dac502259ad0.png

启动 Docker

bash-x./docker_run.shxilinx/vitis-ai-cpu:latest
8e40770a-fdb8-11ed-90ce-dac502259ad0.png

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

>gitclonehttps://github.com/Xilinx/Vitis-AI-Tutorials.git
>cd./Vitis-AI-Tutorials/
>gitreset--harde53cd4e6565cb56fdce2f88ed38942a569849fbd#Tutorialv1.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
8ea7de4a-fdb8-11ed-90ce-dac502259ad0.png

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

../my_models/yolov4-fire-xilinx.cfg
../my_models/yolov4-fire-xilinx_last.weights
8ef32fe4-fdb8-11ed-90ce-dac502259ad0.png

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

>condaactivatevitis-ai-tensorflow
>cd/workspace/Vitis-AI-Tutorials/Design_Tutorials/07-yolov4-tutorial/scripts/
>bashconvert_yolov4.sh

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

8f60934a-fdb8-11ed-90ce-dac502259ad0.png

PC:量化模型

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

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

>ls./my_calibration_images/>tf_calib.txt
8f9c2518-fdb8-11ed-90ce-dac502259ad0.png

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

9026f31e-fdb8-11ed-90ce-dac502259ad0.png

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

9062ab0c-fdb8-11ed-90ce-dac502259ad0.png

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

90ddb252-fdb8-11ed-90ce-dac502259ad0.png

PC:编译 xmodel 和 prototxt

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

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

{
"fingerprint":"0x1000020F6014406"
}
91203352-fdb8-11ed-90ce-dac502259ad0.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-xcompile_yolov4.sh
916014ae-fdb8-11ed-90ce-dac502259ad0.png

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

91d9a670-fdb8-11ed-90ce-dac502259ad0.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 文件中的输出相同
92206362-fdb8-11ed-90ce-dac502259ad0.png

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

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

92778a84-fdb8-11ed-90ce-dac502259ad0.png

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

FPGA:在 FPGA Ubuntu 上测试部署

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

meta.json

dpu_yolov4.xmodel

dpu_yolov4.prototxt

9288a288-fdb8-11ed-90ce-dac502259ad0.png

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

>sudoxlnx-config--xmutilloadappnlp-smartvision#LoadtheDPUbitstream

>cd~/Documents/
>/snap/xlnx-vai-lib-samples/current/bin/test_video_yolov4dpu_yolov40

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

FPGA:Python 应用程序实现

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

审核编辑:彭静
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA
    +关注

    关注

    1624

    文章

    21603

    浏览量

    601070
  • 计算机
    +关注

    关注

    19

    文章

    7335

    浏览量

    87614
  • AI
    AI
    +关注

    关注

    87

    文章

    29641

    浏览量

    267985
收藏 人收藏

    评论

    相关推荐

    基于FPGAAI火灾侦查定位解决方案

    解决方案包括建立一个分布式计算机视觉系统,增加建筑物火灾的早期检测。该系统的分布式和模块化特性可以轻松部署,而无需增加更多基础设施。在
    发表于 05-29 09:09 537次阅读
    基于<b class='flag-5'>FPGA</b> 的<b class='flag-5'>AI</b><b class='flag-5'>火灾</b><b class='flag-5'>侦查</b>定位解决方案

    何在RZ/V2L评估板套件使用AI SDK

    本文章介绍如何在RZ/V2L评估板套件使用AI SDK。
    的头像 发表于 10-27 15:53 897次阅读
    如<b class='flag-5'>何在</b>RZ/V2L评估板套件<b class='flag-5'>上</b>使用<b class='flag-5'>AI</b> SDK

    【国产FPGA+OMAPL138开发板体验】(原创)5.FPGAAI加速源代码

    FPGA架构的优化。以下是我写的一个简化版的代码,用来展示FPGA如何加速AI计算中的某个简单操作(比如矩阵乘法)。 // Verilog代码,用于
    发表于 02-12 16:18

    【案例分享】FPGA+AI,领你走进新科技时代

    巨大的优势。首先,FPGA池化打破了CPU和FPGA的界限。在传统的FPGA使用模型中,FPGA往往作为硬件加速单元,用于卸载和
    发表于 08-11 04:00

    AI遇上FPGA会产生怎样的反应

    从网络到板卡处理,无需经过CPU,减低了传输延时。 而在算法,浪潮FPGA深度学习加速解决方案针对CNN卷积神经网络的相关算法进行优化和固化。客户在采用此解决方案后,只需要将目前深度学习的算法
    发表于 09-17 17:08

    FPGA加速过winograd吗

    FPGA加速过winograd吗,有没有和arm端做过加速结果比较
    发表于 09-21 11:28

    基于紫光同创FPGA的多路视频采集与AI轻量化加速的实时目标检测系统

    基于紫光同创FPGA的多路视频采集与AI轻量化加速的实时目标检测系统#2023集创赛#紫光同创#小眼睛科技助力紫光同创高校生态建设@小眼睛科技 获奖作品展示:华南理工大学+CR8_Pro队
    发表于 11-02 17:51

    基于紫光同创FPGA的图像采集及AI加速(盘古50K开发板)

    基于紫光同创FPGA的图像采集及AI加速(盘古50K开发板)
    发表于 11-03 11:02

    基于FPGA异构加速的OCR识别技术解析

    ,2017年初,我们在腾讯云首发了国内第一台FPGA公有云服务器,我们将会逐步把基础AI加速能力推出到公有云AI异构
    发表于 12-14 05:32 2920次阅读
    基于<b class='flag-5'>FPGA</b>异构<b class='flag-5'>加速</b>的OCR识别技术解析

    何在AWS云中加速Xilinx FPGA

    亚马逊网络服务公司的Gadi Hutt于2018年1月9日在法兰克福举行了Xilinx开发者论坛的开幕主题演讲.Gadi解释了Amazon EC2 F1实例的基础知识,如何在AWS云中加速Xilinx FPGA
    的头像 发表于 11-23 06:15 2761次阅读

    FPGAAI的智能加速

    通常提到FPGA,首先想到的是一款可编程的硬件产品,无论是用在嵌入式设备,还是用在网络传输加速方面,与软件似乎都没有太多的直接联系。
    发表于 06-24 17:45 2036次阅读
    <b class='flag-5'>FPGA</b>是<b class='flag-5'>AI</b>的智能<b class='flag-5'>加速</b>器

    何在OCI Ampere A1启动计算密集AI应用程序

    本文将向您展示如何在 OCI Ampere A1 准备和启动计算密集的 AI 应用程序。
    的头像 发表于 05-01 09:05 1873次阅读
    如<b class='flag-5'>何在</b>OCI Ampere A1<b class='flag-5'>上</b>启动计算密集<b class='flag-5'>AI</b>应用程序

    FPGA 实施 AI/ML 的选项

    FPGA 实施 AI/ML 的选项
    的头像 发表于 12-28 09:51 784次阅读

    如何使用HLS加速FPGA的FIR滤波器

    电子发烧友网站提供《如何使用HLS加速FPGA的FIR滤波器.zip》资料免费下载
    发表于 06-14 15:28 3次下载
    如何使用HLS<b class='flag-5'>加速</b><b class='flag-5'>FPGA</b><b class='flag-5'>上</b>的FIR滤波器

    何在KV260快速体验Vitsi AI图像分类示例程序

    本文首先将会对Vitis统一软件平台和Vitsi AI进行简单介绍,然后介绍如何在KV260上部署DPU镜像,最后在KV260 DPU镜像运行Vitis AI自带的图像分类示例。通过
    的头像 发表于 09-12 10:02 1410次阅读
    如<b class='flag-5'>何在</b>KV260<b class='flag-5'>上</b>快速体验Vitsi <b class='flag-5'>AI</b>图像分类示例程序