效果预览

B站链接
AIStudio链接

项目背景

  2019年3月30日17时 ,凉山州木里县境内发生森林火灾,30名扑火人员牺牲。

  2020年3月30日15时35分,凉山州西昌市经久乡和安哈镇交界的皮家山山脊处发生森林火灾,参与火灾扑救的19人牺牲、3人受伤。这起森林火灾造成各类土地过火总面积3047.7805公顷,综合计算受害森林面积791.6公顷,直接经济损失9731.12万元。

  2020年4月14日17时35分,西藏自治区林芝市巴宜区尼西村附近发生森林火灾,3000余人历时4昼夜持续扑救,明火于4月18日17时全部扑灭。此次扑救,共扑打火线13公里,清理烟点4200余处、站杆倒木3900余根,开设防火隔离带3.5公里,实施了两次人工增雨。

  2021年3月13日12时许,宁夏固原市原州区张易镇马场村二林沟荒山起火,扑火过程中造成2人死亡,6人受伤。火场共有3处着火点,在3个不同山头,过火面积500余亩。

  2021年3月14日13时许,云南省昆明市盘龙区茨坝街道与龙泉街道交界处三丘田附近发生森林火灾。火情发生后,昆明市森林消防支队249名指战员迅速赶往现场处置,地方扑救力量(地方专业扑火队员256人、半专业扑火队员160人、干部群众155人)紧密配合扑救。

  1950年以来,中国年均发生森林火灾13067起,受害林地面积653019公顷,因灾伤亡580人。其中1988年以前,全国年均发生森林火灾15932起,受害林地面积947238公顷,因灾伤亡788人(其中受伤678人,死亡110人)。1988年以后,全国年均发生森林火灾7623起,受害林地面积94002公顷,因灾伤亡196人(其中受伤142人,死亡54人),分别下降52.2%、90.1%和75.3%。

  森林火灾由于在野外,人烟稀少,故而难以在初始阶段就发现并及时扑灭,更大程度上只有当火情演变为较大规模后,才能够被发现并扑救,而这时,扑救难度及损失程度已呈指数级上升。而如何在野外这样的恶劣环境下及时捕捉火情并通报是人工智能时代下防火灭火的新命题。
  本项目基于PaddleX,选取PPYOLO进行项目开发,并实现了windows端的部署,后期将结合PaddleSlim裁剪模型大小以及PaddleLite部署于树莓派上。

实地操作

1. 数据处理
2. 模型训练
3. 模型导出

# 首先安装两个依赖包
!pip install paddlex
!pip install paddle2onnx

数据处理

#解压数据集并将其移动至dataset中
!tar -xf /home/aistudio/data/data90352/fire_detection.tar
!mv VOC2020 dataset

数据处理

  在本数据集中,由于文件名及文件内容不符合PaddleX所提供的数据集读取API,故需要对其进行处理。观察数据集可知,有两个问题:一为标注文件的文件名中存在空格,这极大地影响了PaddleX数据集读取;二为标注文件中的内容需要进行对应性修改。

# 修改.xml文件名,去掉文件名中的空格
# -*- coding: utf-8 -*-
import os
#设定文件路径
jpg_path='dataset/JPEGImages/'
anno_path = 'dataset/Annotations/'
i=1
#对目录下的文件进行遍历
for file in os.listdir(jpg_path):
#判断是否是文件if os.path.isfile(os.path.join(jpg_path,file))==True:
#设置新文件名main = file.split('.')[0]if " " in main:new_main = main.replace(' ','')new_main_jpg = new_main + '.jpg'new_main_anno = new_main + '.xml'print(os.path.join(jpg_path,new_main_jpg))print(os.path.join(anno_path,new_main_anno))#         new_name=file.replace(file,"rgb_%d.jpg"%i)
# #重命名os.rename(os.path.join(jpg_path,main+'.jpg'),os.path.join(jpg_path,new_main_jpg))os.rename(os.path.join(anno_path,main+'.xml'),os.path.join(anno_path,new_main_anno))i+=1
#结束
print ("End")
# 这里修改.xml文件中的<path>元素
!mkdir dataset/Annotations1
import xml.dom.minidom
import ospath = r'dataset/Annotations'  # xml文件存放路径
sv_path = r'dataset/Annotations1'  # 修改后的xml文件存放路径
files = os.listdir(path)
cnt = 1for xmlFile in files:dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))  # 打开xml文件,送到dom解析root = dom.documentElement  # 得到文档元素对象item = root.getElementsByTagName('path')  # 获取path这一node名字及相关属性值for i in item:i.firstChild.data = '/home/aistudio/dataset/JPEGImages/' + str(cnt).zfill(6) + '.jpg'  # xml文件对应的图片路径with open(os.path.join(sv_path, xmlFile), 'w') as fh:dom.writexml(fh)cnt += 1
# 这里修改.xml文件中的<failname>元素
!mkdir dataset/Annotations2
import xml.dom.minidom
import ospath = r'dataset/Annotations1'  # xml文件存放路径
sv_path = r'dataset/Annotations2'  # 修改后的xml文件存放路径
files = os.listdir(path)for xmlFile in files:dom = xml.dom.minidom.parse(os.path.join(path, xmlFile))  # 打开xml文件,送到dom解析root = dom.documentElement  # 得到文档元素对象names = root.getElementsByTagName('filename')a, b = os.path.splitext(xmlFile)  # 分离出文件名afor n in names:n.firstChild.data = a + '.jpg'with open(os.path.join(sv_path, xmlFile), 'w') as fh:dom.writexml(fh)

下面删除在数据集处理过程中所生成的冗余文件,并将其更改为适合PaddleX的数据集格式。

!rm -rf dataset/Annotations
!rm -rf dataset/Annotations1
!mv dataset/Annotations2 dataset/Annotations

  PaddleX非常贴心地为开发者准备了数据集划分工具,免去了开发者多写几行代码的需求。这里我们设置训练集、验证集、测试集划分比例为7:2:1。

!paddlex --split_dataset --format VOC --dataset_dir /home/aistudio/dataset/ --val_value 0.2 --test_value 0.1

模型训练

  在使用PaddleX进行模型训练的过程中,我们使用目前PaddleX适配精度最高的PPYolo模型进行训练。其模型较大,预测速度比YOLOv3-DarkNet53更快,适用于服务端。大家也可以更改其他模型尝试一下。这里我训练了大概200个epoch(别问,问就是没算力了也懒得续点了……)当然看趋势还能涨!(有算力的童鞋可以试着调参或者继续往下面去试试)


import os
os.environ['CUDA_VISIBLE_DEVICES'] = '0'from paddlex.det import transforms
import paddlex as pdx# 定义训练和验证时的transforms
# API说明 https://paddlex.readthedocs.io/zh_CN/develop/apis/transforms/det_transforms.html
train_transforms = transforms.Compose([transforms.MixupImage(mixup_epoch=250), transforms.RandomDistort(),transforms.RandomExpand(), transforms.RandomCrop(), transforms.Resize(target_size=608, interp='RANDOM'), transforms.RandomHorizontalFlip(),transforms.Normalize()
])eval_transforms = transforms.Compose([transforms.Resize(target_size=608, interp='CUBIC'), transforms.Normalize()
])# 定义训练和验证所用的数据集
# API说明:https://paddlex.readthedocs.io/zh_CN/develop/apis/datasets.html#paddlex-datasets-vocdetection
train_dataset = pdx.datasets.VOCDetection(data_dir='/home/aistudio/dataset',file_list='/home/aistudio/dataset/train_list.txt',label_list='/home/aistudio/dataset/labels.txt',transforms=train_transforms,parallel_method='thread',shuffle=True)
eval_dataset = pdx.datasets.VOCDetection(data_dir='/home/aistudio/dataset',file_list='/home/aistudio/dataset/val_list.txt',label_list='/home/aistudio/dataset/labels.txt',parallel_method='thread',transforms=eval_transforms)# 初始化模型,并进行训练
# 可使用VisualDL查看训练指标,参考https://paddlex.readthedocs.io/zh_CN/develop/train/visualdl.html
num_classes = len(train_dataset.labels)# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#paddlex-det-ppyolo
model = pdx.det.PPYOLO(num_classes=num_classes)# API说明: https://paddlex.readthedocs.io/zh_CN/develop/apis/models/detection.html#train
# 各参数介绍与调整说明:https://paddlex.readthedocs.io/zh_CN/develop/appendix/parameters.html
model.train(num_epochs=540,train_dataset=train_dataset,train_batch_size=8,eval_dataset=eval_dataset,learning_rate=0.000125,save_interval_epochs=1,lr_decay_epochs=[270,320, 480],save_dir='output/ppyolo',resume_checkpoint='/home/aistudio/output/ppyolo/epoch_197',use_vdl=True)

模型导出

  这里我们将训练过程中保存的模型导出为inference格式模型,其原因在于:PaddlePaddle框架保存的权重文件分为两种:支持前向推理和反向梯度的训练模型 和 只支持前向推理的推理模型。二者的区别是推理模型针对推理速度和显存做了优化,裁剪了一些只在训练过程中才需要的tensor,降低显存占用,并进行了一些类似层融合,kernel选择的速度优化。而导出的inference格式模型包括__model__、__params__和model.yml三个文件,分别表示模型的网络结构、模型权重和模型的配置文件(包括数据预处理参数等)。

!paddlex --export_inference --model_dir=output/ppyolo/best_model --save_dir=./inference_model

模型部署

模型导出后我们可以采用Python端以视频流的形式部署。

import cv2
import paddlex as pdx
from playsound import playsound# 修改模型所在位置
predictor = pdx.deploy.Predictor('D:\\project\\python\\fire\\inference_model')
cap = cv2.VideoCapture('D:\\project\\python\\fire\\mda-kcwgejj7mfckc19e.mp4')while cap.isOpened():ret, frame = cap.read()if ret:result = predictor.predict(frame)score = result[0]['score']if score >= 0.3:print("*"*100)# 修改音频所在位置# playsound('D:\\project\\python\\cigarette\\cigarette.mp3')# print(result)vis_img = pdx.det.visualize(frame, result, threshold=0.3, save_dir=None)cv2.imshow('cigarette', vis_img)if cv2.waitKey(1) & 0xFF == ord('q'):breakelse:break
cap.release()

请点击此处查看本环境基本用法.

Please click here for more detailed instructions.

『森林火灾检测』基于PaddleX实现森林火灾检测相关推荐

  1. 『深度学习项目四』基于ResNet101人脸特征点检测

    相关文章: [深度学习项目一]全连接神经网络实现mnist数字识别 [深度学习项目二]卷积神经网络LeNet实现minst数字识别 [深度学习项目三]ResNet50多分类任务[十二生肖分类] 『深度 ...

  2. [系统安全] 三十三.恶意代码检测(3)基于机器学习的恶意代码检测技术

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  4. 离群点、异常点检测及Python实现(正态分布3∂,Z-score 异常值检测,基于MAD的Z-score 异常值检测,杠杆值点、DFFITS值、SR学生化残差、cook距离和covratio值)

    有一些准则可以检测离群点,如:正态分布3∂,Z-score 异常值检测,基于MAD的Z-score 异常值检测 以上部分详情与代码请参考:https://blog.csdn.net/weixin_35 ...

  5. 【雷达检测】基于matlab模拟海洋监视雷达检测仿真【含Matlab源码 2268期】

    ⛄一.获取代码方式 获取代码方式1: 完整代码已上传我的资源:[雷达检测]基于matlab模拟海洋监视雷达检测仿真[含Matlab源码 2268期] 点击上面蓝色字体,直接付费下载,即可. 获取代码方 ...

  6. 【火灾检测】基于matlab GUI森林火灾检测系统(带面板)【含Matlab源码 1921期】

    ⛄一.火灾检测简介 1 引言 目前森林火灾是破坏森林的最主要的灾害之一, 影响很大.森林是各种珍禽异兽的家园, 森林遭受火灾后, 会破坏野生动物赖以生存的环境.严重的森林火灾不仅能引起水土流失, 还会 ...

  7. 【火灾检测】基于计算机视觉实现森林火灾检测系统带GUI界面

    1 简介 森林是自然中的宝贵资源,同时还维持着生态平衡.森林火灾一旦发生,危害十分巨大,如果能在林火的萌芽状态就进行识别,则可以减少不必要的损失.随着互联网技术的发展,传统的人工监控森林火灾已经被互联 ...

  8. 【火灾检测】基于HSV特征实现火灾检测附matlab代码

    1 简介 针对传统火灾监测系统对于大空间的室内场合和开阔的室外环境易失效的问题,提出了一种结合火灾火焰特征和烟雾特征来进行判断的数字图像型火灾监测算法.火焰颜色特征是基于RGB颜色模型中的R,G,B三 ...

  9. 基于PaddleX实现的安全帽检测

    安全帽检测 基于PaddleX 2.0开发 1.项目说明 在该项目中,主要向大家介绍如何使用目标检测来实现对安全帽的检测,涉及代码以及优化过程亦可用于其它目标检测任务等. 在施工现场,对于来往人员,以 ...

最新文章

  1. python搭建numpy_python开发环境搭建及numpy基本属性-【老鱼学numpy】
  2. Firefox Quantum 向左,Google Chrome 向右
  3. 【零基础学习iOS开发】【02-C语言】10-函数
  4. 最大似然估计的一个示例
  5. 【运筹学】表上作业法 ( 示例 | 使用 “ 最小元素法 “ 找初始基可行解 )
  6. 鸿蒙自研系统,华为已注册“华为鸿蒙”商标,自研操作系统最快秋季发布
  7. HTML5游戏引擎Playcraft将于近日正式启动
  8. Aruba 推出Instant On 为中小型企业提供安全、高速的无线连接
  9. WMI远程访问问题解决方法
  10. CString转char*
  11. oracle关键字作为字段名使用方法
  12. 请问mysql优化相关
  13. form resetFields并没有清空表单
  14. 调戏木马病毒的正确姿势——上
  15. mobi电子书如何用安卓手机打开?
  16. SMART PLC指针
  17. 去伪、存真、打破、重塑……网贷业暴雷潮之下的敬畏与回归
  18. php 改数字 例如10000变成1万
  19. 快速批量修改文件名字
  20. 【转载】JVM能够开启多少线程

热门文章

  1. JRE与JDK,SDK的区别
  2. 1-4:CSS3课程入门之文本新增属性
  3. 【VS开发】PCIe体系结构的组成部件
  4. 全排列(递归与非递归实现)
  5. hdu 4350 Card(递推循环节,3级)
  6. (转)虚函数和纯虚函数区别
  7. 注释数据库介绍之GO、KEGG数据库
  8. JavaSE(十三)——Swing
  9. java中注解动态传参_SpringMVC之注解、传参、返回值及拦截器
  10. python抢票代码_教你用Python动刷新抢12306火车票,附源码!