大家好,传统的火灾检测系统多依赖于敏感的电子传感器,但这些系统易受环境影响而产生误报,且在大型空间中安装成本高、维护繁琐。相比之下,基于计算机视觉的火灾检测技术具有快速识别率和响应时间,适用于多变环境和广阔空间,且无需额外硬件,能有效提供直观全面的火灾数据。YOLOv5模型能够快速准确地检测到火灾火焰,在火灾初期甚至是刚刚出现火苗时就发出警报。这为及时采取灭火措施争取了宝贵的时间,极大地降低了火灾造成的损失。系统可以对特定区域进行持续实时监测,无论白天还是夜晚,都能及时察觉火灾的发生。相比传统的人工巡检或基于传感器的检测方法,具有更高的时效性和可靠性。本文将介绍基于YOLOv5算法的火灾火焰检测系统,涵盖准备工作、模型训练等方面。
下载地址:基于YOLOv5算法的火焰识别系统
1.准备工作
在PC机上配置环境,即正常按照requirements安装依赖包,根据实际情况可以自身爬取图片。通过网上的资料下载相关数据集,大部分数据集是无标注的数据集。如下载的数据集无标注,那么使用lableImg进行标注,且将标注文件的保存格式设置为PascalVOC的类型,即xml格式的label文件,而后通过脚本将标签格式转换为.txt文件,并在文件上添加类别信息和对数据进行归一化。脚本脚本代码如下:
import os
import xml.etree.ElementTree as ET
from decimal import Decimal
dirpath = '/home/jiu/data_change/label_0' # 原来存放xml文件的目录
newdir = '/home/jiu/data_change/labels' # 修改label后形成的txt目录
if not os.path.exists(newdir):
os.makedirs(newdir)
for fp in os.listdir(dirpath):
root = ET.parse(os.path.join(dirpath, fp)).getroot()
xmin, ymin, xmax, ymax = 0, 0, 0, 0
sz = root.find('size')
width = float(sz[0].text)
height = float(sz[1].text)
filename = root.find('filename').text
print(fp)
with open(os.path.join(newdir, fp.split('.')[0] + '.txt'), 'a+') as f:
for child in root.findall('object'): # 找到图片中的所有框
sub = child.find('bndbox') # 找到框的标注值并进行读取
sub_label = child.find('name')
xmin = float(sub[0].text)
ymin = float(sub[1].text)
xmax = float(sub[2].text)
ymax = float(sub[3].text)
try: # 转换成yolov的标签格式,需要归一化到(0-1)的范围内
x_center = Decimal(str(round(float((xmin + xmax) / (2 * width)),6))).quantize(Decimal('0.000000'))
y_center = Decimal(str(round(float((ymin + ymax) / (2 * height)),6))).quantize(Decimal('0.000000'))
w = Decimal(str(round(float((xmax - xmin) / width),6))).quantize(Decimal('0.000000'))
h = Decimal(str(round(float((ymax - ymin) / height),6))).quantize(Decimal('0.000000'))
print(str(x_center) + ' ' + str(y_center)+ ' '+str(w)+ ' '+str(h))
#读取需要的标签
if sub_label.text == 'fire':
f.write(' '.join([str(0), str(x_center), str(y_center), str(w), str(h) + '\n']))
except ZeroDivisionError:
print(filename, '的 width有问题')
此处提供所使用的火焰数据集,该数据集一共2059张带火焰的图片,并将其分为训练集和测试集,其中训练集1442张,测试集617张;同样的将label也分为训练集和测试集,其图片和其label相对应。
根据火焰图片,生成相应的txt标签,图片和其label相对应,命名一致:
2.项目实现
当前深度学习技术的流行,优秀的目标检测算法不断涌现,YOLO系列由于实现简单、检测速度快、精度高等特点得到了众多应用。这里的火焰检测系统基于YoloV5实现,它可以看作是单阶段目标检测。单阶段目标检测器的体系结构比两阶段目标检测器更简单,不需要生成候选区域,通过卷积神经网络提取特征直接输出目标的类别、概率和位置坐标,从而实现端到端的目标检测。单阶段目标检测器又包含基于锚框(anchor-based)的和非锚框(anchor-free)的两种方法。
SSD、YOLO 和 Retina Net 等都是 anchor-based 的单阶段检测器,它们处理速度快而但精度相对有限。Anchor-based 方法使用密集的锚框直接进行目标分类和回归,能有效提高网络的召回能力,但是冗余框很多。Anchor-free 目标检测器则抛弃锚框的设计,取而代之的使用关键点进行目标检测,诸如CornerNet,CenterNet 等,都取得了不俗的效果。
使用使用Python爬虫利用关键字在互联网上获得的图片数据,爬取数据包含室内场景下的火焰、写字楼和房屋燃烧、森林火灾和车辆燃烧等场景下的火焰图片,经过筛选后留下质量较好的图片制作成VOC格式的实验数据集。对配置文件修改,新建一个.yaml文件,在其中添加(根据实际情况修改文件路径):
# train and val data as 1) directory: path/images/, 2) file: path/images.txt, or 3) list: [path1/images/, path2/images/]
train: D:\a\fire_yolo_format\images\train
val: D:\a\fire_yolo_format\images\val
# number of classes
nc