Files
ascend_community_projects/fire_detection
2022-10-31 21:34:13 +08:00
..
.
2022-10-27 11:31:01 +08:00
.
2022-09-28 22:38:00 +08:00
.
2022-09-29 10:38:39 +08:00
.
2022-09-28 22:38:00 +08:00
.
2022-09-28 22:38:00 +08:00
.
2022-09-28 22:38:00 +08:00
.
2022-10-31 21:34:13 +08:00
.
2022-09-28 22:38:00 +08:00
.
2022-10-30 17:14:30 +08:00

火灾识别

1 介绍

1.1 概要描述

火灾识别项目是基于MindX SDK在华为云昇腾平台上进行开发并部署到昇腾Atlas200 DK上实现对图像中是否为火灾场景进行识别的功能。在Atlas200 DK上对火灾场景测试集进行推理整体精度为94.15%,达到功能要求。

1.2 模型介绍

项目中用于火灾识别的是DenseNet模型模型相关文件可以在此处下载https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Fire_identification/models.zip

1.3 实现流程

1、在昇腾云服务器上搭建开发环境设置环境变量配置mxVision、Ascend-CANN-toolkit。

2、下载模型https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Fire_identification/models.zip ,将模型文件放至 fire_detection/models 文件夹下并按流程将PyTorch模型转换为昇腾离线模型densenet.pt --> densemet.onnx --> densenet.om。

3、业务流程编排与配置。

4、python推理流程代码开发。

5、将项目移植至Atlas200 DK测试精度性能。

火灾识别SDK流程图如图1-3所示


图1-3 火灾检测SDK流程图

1.4 特性及适用场景

本项目能够能够针对火灾场景进行识别并输出是否为火灾的结果。对于大多数火灾场景都能达到较好的识别效果如在大型火灾、汽车失火、房屋失火以及较多烟雾的火灾场景都能够达到预期效果。对于较高分辨率的图像识别时解码插件对图像处理会有较多耗时最终整体能够满足25fps的性能需求。

以下为可能存在错误识别的情况: 1.当图像只拍摄到小部分火苗和少量烟雾时,会误将火灾场景错误地识别为没有火灾的场景。 2.当图像场景与火灾和烟雾相似时会被错误地识别为火灾场景。例如部分夕阳场景。

总的来说,该项目在大多数火灾场景下识别的准确度较高,但受限于原始模型的功能和性能,对于一些场景会出现识别错误。

2 软件方案介绍

2.1 项目方案架构介绍

本项目架构主要流程为图片进入流中将图片解码之后放缩到特定尺寸再利用densenet模型对图像中是否为火灾场景进行推理最后输出结果。

表2.1 项目方案架构中各模块功能:

表2.1 火灾检测SDK流程图
序号 子系统 功能描述
1 图像输入 调用Mindx SDK的appsrc输入图片
2 图像解码 调用Mindx SDK的mxpi_imagedecoder用于图像解码当前只支持JPG/JPEG/BMP格式
3 图像放缩 调用Mindx SDK的mxpi_imageresize放缩到224*224大小
4 火灾识别 调用Mindx SDK的mxpi_tensorinfer选取torch框架下densenet模型对图像进行火灾预测
5 结果输出 调用Mindx SDK的appsink提供端口从流中获取数据用于输出结果

2.2 代码目录结构与说明

本工程名称为fire_detection,工程目录如下所示:

.
|-- README.md
|-- data
|   |-- other
|   `-- test
|-- envs
|   `-- atc_env.txt
|-- figures
|   `-- 火灾检测SDK流程图.png
|-- main.py
|-- models
|   `-- pth2onnx_310.py
|-- pipeline
|   `-- fire.pipeline
|-- run.sh
`-- test.py


3 设置开发环境

此项目在昇腾310云服务器开发并移植至Atlas200 DK上运行需要在昇腾云服务器进行编译执行后在Atlas200 DK上搭建运行环境并将项目部署到Atlas200 DK。

3.1 环境变量设置

查看文件 fire_detection/env/atc_env.txt 进行环境变量配置:

# 导入SDK路径
export MX_SDK_HOME=${SDK安装路径}

export GST_PLUGIN_SCANNER="${MX_SDK_HOME}/opensource/libexec/gstreamer-1.0/gst-plugin-scanner"

export GST_PLUGIN_PATH="${MX_SDK_HOME}/opensource/lib/gstreamer-1.0":"${MX_SDK_HOME}/lib/plugins"

export LD_LIBRARY_PATH="${MX_SDK_HOME}/lib/modelpostprocessors":"${MX_SDK_HOME}/lib":"${MX_SDK_HOME}/opensource/lib":"${MX_SDK_HOME}/opensource/lib64":${LD_LIBRARY_PATH}

export PYTHONPATH=${MX_SDK_HOME}/python:$PYTHONPATH

# 执行CANN下ascend-toolkit的set_env.sh
. ${ascend-toolkit-path}/set_env.sh
# 执行MindX_SDK的set_env.sh
. ${SDKpath}/setenv.sh

3.2 densenet模型转换

步骤1 下载densenet模型下载地址https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Fire_identification/models.zip ,将*.onnx模型放至 fire_detection/models/ 文件夹下。

步骤2 执行cd ./models到 models 文件加下执行atc命令 atc --model=densenet.onnx --framework=5 --output=densenet --insert_op_conf=fire.cfg --soc_version=Ascend310 利用atc工具将 densenet.onnx 转换为 densenet.om 。atc转换模型时使用aipp预处理aipp配置内容 ./models/fire.cfg 如下:


aipp_op {
    aipp_mode: static
    input_format : YUV420SP_U8
    csc_switch : true
    rbuv_swap_switch : false
    matrix_r0c0 : 256
    matrix_r0c1 : 0
    matrix_r0c2 : 359
    matrix_r1c0 : 256
    matrix_r1c1 : -88
    matrix_r1c2 : -183
    matrix_r2c0 : 256
    matrix_r2c1 : 454
    matrix_r2c2 : 0
    input_bias_0 : 0
    input_bias_1 : 128
    input_bias_2 : 128
    related_input_rank : 0
    mean_chn_0 : 0
    mean_chn_1 : 0
    mean_chn_2 : 0
    min_chn_0: 102.127
    min_chn_1: 94.401
    min_chn_2: 87.184
    var_reci_chn_0: 0.0137213737839432
    var_reci_chn_1: 0.0142654369859985
    var_reci_chn_2: 0.0143018549505871
}

3.3 进行图像推理

下载测试集data:https://mindx.sdk.obs.cn-north-4.myhuaweicloud.com/ascend_community_projects/Fire_identification/data.zip 将data下的test和other文件夹放至 fire_detection/data 下,在 fire_detection 路径下运行 main.py 脚本,从 fire.pipeline 流中得到推理结果。

4 设置运行环境

关于Atlas200 DK硬件说明https://support.huawei.com/enterprise/en/doc/EDOC1100223188/d8adcdca/product-introduction

整体流程为先进行SD制卡将Ubuntu烧入Atlas200 DK烧录成功后通过ssh连接到Atlas200 DK安装CANN和Mindx SDK工具并设置环境变量之后再根据需求安装相应依赖。

4.1 所需依赖准备

Atlas200 DK环境依赖软件和版本表4所示建议按顺序安装

表4.1 运行环境依赖
依赖软件 版本 说明
Ubuntu 18.04.1 LTS 用于烧入Atlas200 DK
CANN 6.0.RC1 用于提供模型转换ATC工具
Mindx SDK 3.0.RC2 用于提供pipeline插件等工具
Python 3.9.12 用于运行*.py文件
numpy 1.21.5 用于处理数组运算
pillow 9.2.0 用于读取图片数据
opencv-python 4.6.0.66 用于图片处理

4.2 进行SD制卡

通过SD卡制作功能可以自行制作Atlas 200 DK开发者板的系统启动盘完成Atlas 200 DK操作系统及驱动固件的安装。

一般制卡方式有两种分别为直接mksd制卡和利用dd镜像制卡后者更为快捷但无法充分地利用tf卡的空间如果需要较大存储空间更推荐前者。

1.mksd制卡https://www.hiascend.com/document/detail/zh/Atlas200DKDeveloperKit/1013/environment/atlased_04_0009.html

2.dd镜像制卡https://bbs.huaweicloud.com/forum/thread-139685-1-1.html

制卡成功后将SD卡插至Atlas200 DK卡槽插入电源启动开发板。

4.3 配置网络连接

进行网络配置前需要确保Atlas 200 DK已完成操作系统及驱动的安装通过制作SD卡的方式进行安装且已正常启动。

通过ssh连接至Atlas200 DK后配置Atlas200 DK连接网络https://www.hiascend.com/document/detail/zh/Atlas200DKDeveloperKit/1013/environment/atlased_04_0012.html

进行配置后通过ping www.huaweicloud.com检查是否配置成功。

注意如果进行网络共享时主机无法上网可能是Windows版本问题可以通过版本回退的方法解决。

4.4 运行环境搭建

ssh连接Atlas200 DK成功后安装CANN和Mindx SDK此时Atlas200 DK为davinci-mini环境su root到root用户下(默认密码Mind@123)进行安装和配置环境变量。

注意CANN版本与Atlas200 DK环境匹配https://gitee.com/ascend/tools/blob/master/makesd/Version_Mapping_CN.md

步骤1 下载并安装CANNhttps://www.hiascend.com/document/detail/zh/Atlas200DKDeveloperKit/1013/environment/atlased_04_0017.html ※注意要将. {ascend-toolkit安装路径}/set_env.sh的命令加入~/.bashrc后执行source ~/bashrc

步骤2 下载并安装Mindx SDK执行步骤2前需安装CANN并且环境设置成功

(1)下载与CANN版本匹配的 Mindx SDK https://www.hiascend.com/zh/software/mindx-sdk/mxVision/community

(2)将下载的 Ascend-mindxsdk_{version}_linux-aarch64.run 移至Atlas200 DK 在Atlas上执行 cd /usr/local/ 在local文件夹下执行 mkdir Mindx_SDK 创建 Mindx_SDK 文件夹,将下载的 Ascend-mindxsdk_{version}_linux-aarch64.run 移至 /usr/local/Mindx_SDK 下。

(3)安装 mxVision 执行 cd /usr/local/Mindx_SDK 后为 Ascend-mindxsdk_{version}_linux-aarch64.run 添加执行权限 ,成功后再执行 Ascend-mindxsdk_{version}_linux-aarch64.run --install安装 mxVision 。

(4)配置环境变量: 安装成功后在 mxVision 路径下存在 set_env.sh ,用户在任意目录下执行 vi ~/.bashrc 命令,打开 .bashrc 文件,在文件最后一行后面添加 . /usr/local/Mindx_SDK/mxVision/set_env.sh ,执行 :wq! 命令保存文件并退出。执行 source ~/.bashrc 命令使其立即生效。

完成上述步骤后Atlas200 DK已成功安装CANN和Mindx SDK。

步骤3 安装python、pip、opencv等依赖Atlas200 DK为mini环境建议通过miniconda安装其他库

(1)下载与Atlas200 DK Ubuntu版本对应的miniconda https://docs.conda.io/en/latest/miniconda.html#linux-installers

(2)执行exit切换到HwHiAiUser用户下为下载的 Miniconda3-latest-Linux-x86_64.sh 添加执行权限。

(3)HwHiAiUser用户下安装minicondash ./Miniconda3-latest-Linux-x86_64.sh

(4)为root用户添加conda环境 su root后进入root用户执行 cat /home/HwHiAiUser/.bashrc 查看HwHiAiUser用户的 .bashrc , 复制 >>> conda initialize >>> 至 <<< conda initialize <<< 的内容将复制内容粘贴至root用户下的 ~/.bashrc ,执行 source ~/.bashrc 为root添加conda环境。

(5)将Atlas200 DK重启reboot再次进入root用户即可看到conda环境。

(6)利用conda在root用户下用conda install安装numpy、opencv-python等库。

至此Atlas200 DK已经成功安装相关依赖。

5 部署与运行

步骤1 部署及环境设置:

如果在4.4小节未将 . set_env.sh 加入到用户下的 .bashrc 中,在编译运行项目前需手动设置环境变量,执行如下命令添加环境变量:

# 执行CANN下ascend-toolkit的set_env.sh
. ${ascend-toolkit-path}/set_env.sh
# 执行MindX_SDK文件夹下的set_env.sh
. ${SDKpath}/setenv.sh

将 fire_detection 文件夹移植到Atlas200 DK的用户HwHiAiUser下执行命令 su root 进入root用户下(默认密码Mind@123)后,执行 cd /home/HwHiAiUser/fire_detection 进入fire_detection路径下。

fire_detection应包含

.
|-- README.md
|-- data
|   |-- other
|   `-- test
|-- envs
|   `-- atc_env.txt
|-- main.py
|-- models
|   |-- densenet121-pretrained.pt
|   |-- densenet.onnx
|   |-- densenet.om
|   `-- pth2onnx_310.py
|-- pipeline
|   `-- fire.pipeline
|-- run.sh
`-- test.py


步骤2 推理运行:

在执行步骤一命令后的路径下运行脚本 main.py 在开发板上进行推理。

步骤3 输出结果:

精度: 94.15041782729804 %
总耗时: 3534.153747000346 ms   总图片数: 359
平均单张耗时: 9.8444394066862 ms

精度为94.15%与原模型推理精度误差小于1%;平均图像单张耗时9.84ms,满足25 fps要求。

6 常见问题

6.1 无法调用plugin插件

问题描述:

在Atlas200 DK上运行 mian.py 无法调用plugin插件。

解决方案:

确保root环境下可以执行atc并且能够调用mindx后在root用户下执行 main.py 脚本文件。

6.2 推理结果精度不达标

问题描述:

在开发环境的推理结果精度不达标。

解决方案:

在利用atc工具进行模型转换时配置aipp提升模型精度


aipp_op {
    aipp_mode: static
    input_format : YUV420SP_U8
    csc_switch : true
    rbuv_swap_switch : false
    matrix_r0c0 : 256
    matrix_r0c1 : 0
    matrix_r0c2 : 359
    matrix_r1c0 : 256
    matrix_r1c1 : -88
    matrix_r1c2 : -183
    matrix_r2c0 : 256
    matrix_r2c1 : 454
    matrix_r2c2 : 0
    input_bias_0 : 0
    input_bias_1 : 128
    input_bias_2 : 128
    related_input_rank : 0
    mean_chn_0 : 0
    mean_chn_1 : 0
    mean_chn_2 : 0
    min_chn_0: 102.127
    min_chn_1: 94.401
    min_chn_2: 87.184
    var_reci_chn_0: 0.0137213737839432
    var_reci_chn_1: 0.0142654369859985
    var_reci_chn_2: 0.0143018549505871
}