主页 > 案例大全 > 论文方法介绍-基于Jetson Nano的火灾预警系统的设计与实现

论文方法介绍-基于Jetson Nano的火灾预警系统的设计与实现

2021-06-16 09:32:02

  在日常生活中,火灾是一种易发的灾难事故,给我们的生活和财产都带来了巨大的威胁,因此对火灾的监控和预警工作具有重大的意义。近些年来,随着嵌入式设备的发展与成熟,基于视频图像并结合深度学习相关算法再结合嵌入式设备来实行对火灾的监控倍受人们关注,并一度成为了人们的焦点话题。

  首先,本文通过将Jetson Nano人工智能开发板连接摄像头使其能够采集监控环境的图像信息并传输至开发板。其次,对几种基于轻量化网络的目标检测算法研究比较后,选择了适用于移动端嵌入式设备运行的YOLOV3-TINY检测算法。基于自己标定的火灾数据集对YOLOV3-TINY模型进行训练,实现对视频流信息的火灾检测,完成检测部分的设计。再次,实现了系统对火灾的预警操作,完成预警部分的设计。最后,结合各个模块的设计实现了一个能够基于视频图像信息结合基于深度学习的算法对监控环境中的火灾进行监控检测并及时预警的系统。

  本文进行了对监控环境下的多次火灾监控预警演示实验,实验结果表明了基于Jetson Nano的火灾预警系统的可行性与有效性。

  火,从古至今与人类文明有着千丝万缕的联系,亦是人类文明进步的体现[1]。可以说,正是火促进了我们人类的发展,因为有了火,它将我们人类从过去那个茹毛饮血的时代带进了熟食时代。现如今,火更是渗透进了我们人类社会的方方面面,在生活中,不仅仅是我们的饮食,冬天取暖的暖气、汽车的启动等;在工业上,钢铁的冶炼、发电厂发电等;在军事上,燃烧弹的制作、火箭的发射、子弹的制造等这些方方面面都需要来用到火[2]。可以说,我们人类离不开火,离开了火,我们将寸步难行。

  火的出现,极大的方便了我们的生活,也将我们带进了更高的文明。但另一方面,水能载舟,亦可覆舟。火亦如此,火的出现,也给我们带来的极大的隐患;火灾会给人们的财产造成了巨大的损失,甚至吞噬掉了许多的生命。在刚刚过去的2019年中,突发的凉山火灾事件,为了全力扑灭森林火灾,保护好凉山周围生态环境,我们的消防员夜以继日的拼尽全力去挽救损失,最终,森林大火被扑灭了,但为此,我们竟牺牲了31名可敬的消防员战士[3],为此,我们感到心痛和惋惜。在我们的日常生活中,随手丢弃烟头,点燃鞭炮等危险行为,还有常年暴露在外的电线外表的老化、干燥天气下输电线路的电火花等,都是引起火灾的安全隐患,都会引起一场火灾,给我们的生活带来不小的损失。因此,及时的发现火灾并进行预警是一项理论意义和实际价值兼备的重要课题。

  传统的火灾检测方法通常使用温度、烟雾或感光传感器等[4],当火灾发生时,随之带来的也有刺眼的光、大量的烟以及温度的急速上升[5]。伴随这些现象的发生,一些参数也会随之改变,我们可以对这些参数进行测量,然后对测量出的参数评估分析来确定火灾是否发生[6],用于测量温度、光以及烟的这些敏感元件能够测量火灾特征的设备被称为火灾探测器。在1890年,英国首先开发出火灾温度探测器,从而开启了自动探测预防火灾的新时代[7],从这之后,火灾检测的技术发展越来越迅速。

  传统型的火灾检测方法有很多弊端,由于需要对光、温度等这些火灾参数进行测量分析,而当这个传感器能够检测到火灾时,往往是火灾已经发生到了一定的程度,火灾传感器才检测到火灾然后再进行报警,这很难满足火灾早期报警的需求[8],而且,当环境中存在强光、高温等干扰因素时,也会引起传感器的误报,甚至会导致传感器的失效。针对传统检测方法的这些弊端,近些年来,人们开始致力于研究通过视频中火焰燃烧时特有的颜色、纹理等视觉特征来提高对火焰的识别准确率和成功率。随着人工智能的崛起[9]和计算机视觉等技术的创新发展和成熟,诞生了基于视频的火灾检测技术[10]。

  基于视频的火灾检测技术是指使用摄像机作为探测器[11],实时采集当前监控区域的视频图像,通过数字图像处理技术从图像中提取丰富的信息,然后再通过基于深度学习的目标检测技术对提取的图像信息进行火灾识别进而得出结果[12]。这种基于视频的火灾检测技术能够在较短的时间内成功检测出火灾,这可以给消防人员或者其他人员更多的时间来采取措施,及时的完成对火灾的扑灭,甚至在火灾早期识别到并及时预警后可以直接扑灭,这可以避免更大的财产损失和挽救更多的生命。由于基于深度学习的目标检测技术的网络十分庞大复杂,普通的嵌入式设备达不到算力要求,一般需要计算机来提供算力支持,因此早期这种方法需要将摄像头联网,并将摄像头拍摄的视频图像实时传输至计算机中,在计算机中利用目标检测技术对视频图像进行推理分析,判断当前区域是否发生火灾。但是在实际生活中,将所有的摄像头通上网络,并且配备一台计算机来实行对火灾的检测几乎是不可能的,因此这种方法并未被大规模实施。随着嵌入式开发板的发展,现如今,一些嵌入式开发板的算力已经达到一台微型计算机的水平,如Jetson TX系列、Jetson Nano开发板[13]等。因此本文考虑用Jetson Nano嵌入式移动端开发板来连接摄像头,将摄像头拍摄的视频传输至Jetson Nano开发板并利用目标检测技术实现对监控区域环境进行火灾识别分析,进而实现对火灾的检测及预防。利用Jetson Nano嵌入式移动端开发板的优点是:

  (1)开发板的体积小,方便携带,操作简单快捷

  (2)算力强,可以达到火灾检测算法需求标准

  (3)适应环境能力强,需求小,仅仅需要通电而无需联网

  (4)并且开发板价格便宜,成本低,无需安装调试等费用

  (5)开发板的可扩展能力强,还可连接其他硬件向其更多方面扩展

  基于以上优点,使用Jetson Nano嵌入式移动端开发板连接摄像头进行火灾检测的方案更适用于实际生活,也是最具性价比和贴合实际生活的方案。

  1.2国内外研究现状

  基于视频图像的火灾检测技术,其核心问题是火焰检测算法的识别精准度及识别反应时间。目前为止,国内国外都进行了广泛深入的研究与开发,经过大量研究人员的努力,检测算法在火灾检测方面取得了实质性的进展,理论层面的研究大致经过了三个阶段,分别是:基于传统图像处理、基于浅层机器学习和基于深度学习的检测[14]。

  基于传统图像处理的火灾检测的研究主要结合图像处理技术,着重提取火灾发生后的火焰特征、烟雾特征,掘取火灾图像的特征规律,通过大量的规律预设判别火灾的规则,进而实现火灾识别。如Chen等人认为,基于颜色特征去分析火焰像素的颜色在于红色分量的饱和度以及色调上,以HIS和RGB两种颜色模型作为基础设计火焰的判断依据,实现了像素上对火焰的识别[15]。

  基于浅层机器学习的火灾检测的研究是结合机器学习、模式识别等技术,利用人工神经网络(ANN)、支持向量机(SVM)等算法设计火灾分类器,这种设计受到了许多学者和研究人员的关注。如Gubbi等人对图像的倾斜度、偏度、高频能量等共60个特征用小波变换做计算组成一组特征向量,然后采用SVM做分类识别,在火焰检测方面取得了很大的进展[16]。

  基于浅层机器学习技术设计成的火灾分类器,虽然在一定程度上提高了火灾识别的识别准确率,但是火灾分类器所使用的特征向量是人工设计的。既然是人工设计的,那这种火灾分类器的设计首先必须要求设计者具备扎实的理论知识基础以及丰富的专业经验,其次,当视频中的环境因素比较复杂时,人为提取合理且有效的特征变得更加困难。

  近些年来,随着深度学习技术的不断发展与成熟,利用深度学习技术设计自学习分类器来解决火灾检测问题是一个新思路。基于深度学习的火灾检测是先设计一个网络模型,然后将数据集中的原始图像送到网络模型中进行训练,模型将自动从更深的层次学习掘取特征并分析,经过规定次数的迭代学习后,得出学习的最优解模型,然后我们利用训练好的模型对待检测数据进行识别[17]。深度学习应用在图像识别领域上的新思路,由于模型是自学习的过程,这在一定程度上避免了特征提取过程的盲目性,理论上可以从数据集中提取更多更深层的特征,这样可以大幅提升火灾识别的检测正确率。因此,近些年,越来越对的研究人员将深度学习技术应用在基于视频图像的火灾识别中。

  Sebastien Frizzi等人以美国有线电视新闻网报道过的火灾烟雾视频为数据集提出了一种卷积神经网络火灾烟雾检测模型[18]。在训练卷积神经网络过程中,Frizzi提出的方法没有特征提取阶段,而是直接将原始RGB图像送至模型进行训练,并且他用到了滑动窗口来检测原始图像或重新构造图像,滑动窗口通过卷积神经网络后,最终通过完全连接层得出分类结果。相比于其他的传统视频火灾检测方法,他们的方法实现了更好的分类性能。此外,Khan Muhammad等人受到GoogleNet架构的灵感提出了一个火灾检测CNN架构,并在CCTV监控系统上与检测火灾的先进方法相对比,证明了该方法的有效性和适用性[19]。

  目前,由于嵌入式移动端开发板的不断发展前进和成熟,其在处理数据方面的算力基本可以达到家用电脑的算力,并且开发板的体积很小,便于携带,使用方便快捷,在使用体验方面对开发人员十分友好,同时也便于安装维护。因此,国内外越来越多的研究人员越来越多的着重在嵌入式移动端开发板上做检测工作。太原理工大学的黄耀雄同学提出了一种基于支持向量机的火灾烟雾识别算法,他将Linux系统和OpenCV移植到S3C2440实验板上进行实验,充分发挥嵌入式系统的优势,实现了基于视频的火灾烟雾检测[20]。华南理工大学广州学院的李宇翔同学等人以NVIDIA的Jetson Nano为平台,通过C++语言实现的基于深度学习的OTSU算法来识别手势从而实现控制台灯的操作[21]。充分发挥嵌入式移动端开发板安装方便、硬件成本低和实时性强的优势,将基于深度学习技术的火灾检测算法部署在嵌入式开发板上进行火灾检测是一项对实际生活有着极大价值和重要意义的工作。

  1.3主要工作内容

  本文在对火灾预警系统的相关技术分析的基础上,使用Python语言在Pycharm的编译环境下,通过对基于深度学习的目标检测算法(YOLOV3-TINY算法)的研究,利用YOLOV3-TINY算法[22]实现了基于视频的火灾检测,并将该算法部署在Jetson Nano开发板上实现了火灾预警系统。

  本文的主要工作内容包括:

  (1)在Jetson Nano板上用OpenCV读取摄像头采集到的视频流信息。

  (2)基于YOLOV3-TINY算法的火灾检测实现。

  (3)YOLOV3-TINY算法识别到火灾后的火灾预警操作的实现。

  (4)基于Jetson Nano的火灾预警系统的设计与实现。

  1.4论文结构

  本文共分为4章,各章主要内容如下:

  第1章:绪论,首先对当前课题基于Jetson Nano的火灾预警系统的设计的研究背景与意义进行了分析,接着对火灾预警系统的国内外研究现状与基于嵌入式开发板的研究现状进行讨论和总结,最后给出了本文的主要工作内容和整体论文结构。

  第2章:相关理论知识背景,介绍实现对视频中的火灾检测的YOLOV3-TINY算法、NMS算法、YOLOV3-TINY算法中预设候选框用到的K-MEANS聚类算法的主要思想。

  第3章:实验设计部分,首先介绍了系统的硬件配置情况和系统模块间的通信情况。接着详细介绍了YOLOV3-TINY模型的训练过程。最后,介绍了系统的预警机制和预警部分实现。

  第4章:实验结果验证与分析,介绍了系统对火灾图片和火灾视频的检测结果情况并展示相关效果图,并对结果进行验证和分析。最后,展示了系统在视频中或监控环境下检测到火灾后的预警图。

  最后对全文进行适当总结,指出系统中尚未完成或不足的地方,并明确未来的系统的优化方向、计划和展望。

  第2章相关理论知识背景

  基于Jetson Nano的火灾预警系统主要是依靠YOLOV3-TINY算法实现对视频流信息的火灾检测,本章主要介绍系统中应用到的YOLOV3-TINY算法、NMS算法以及K-MEANS算法。

  2.1 YOLOV3-TINY算法

  2.1.1 YOLO设计思路

  YOLOV3算法以及YOLOV2算法[23]都是基于YOLO[24]做出改进而来,核心思想差不多,不同的是前面两者在YOLO的基础上针对一些细节做出改进,在性能方面做了优化,提升了检测的准确率。因此,本小节主要介绍YOLO算法的原理。

  YOLO是YOLO系列目标检测论文的开山之作,全名为:You Look Only Once。YOLO的原理如图2.1所示,输入一张图片后,图片经过YOLO的卷积神经网络,由于卷积神经网络是端到端的,因此YOLO直接输出图片中物体的位置和类别概率。

  图2.1 YOLO目标检测系统

  YOLO直接将整个图像放进网络来预测每个目标的边界框(bounding boxes)和类别,其可以同时预测一张图像中出现所有目标的类别和边界框。YOLO奠定了YOLO系列算法在整体上“分而治之”的思想,YOLO将输入的图像划分成S×S个网格,如果图片上某个物体的中心在某个网格中,那么这个网格就负责预测该物体。每个网格都要负责预测落入其中对应目标的置信度和其对应边界框。每个网格输出B个边界框信息以及C个物体属于某种类别的概率。边界框信息包含5个信息:x,y,w,h和置信度。(x,y)表示物体中心相对于网格单元框的位置坐标,w,h则表示边界框的宽度和高度(这里注意在实际训练过程中,x,y是边界框当前网格位置的偏移值且被归一化到[0,1]之间,w,h的值相对图片本身的高度和宽度被归一化到[0,1]之间)。置信度用预测框和标注框的IOU(Intersection Over Union)[25]来表示,记作。如图3.2所示:

  图2.2 IOU表示图

  那么IOU的计算公式为式2-1:

  (2-1)

  把边界框包含物体的可能性记为,如果边界框包含物体,那么=1,不包含则为0,那么边界框的置信度为:。

  在测试阶段,每个网格都会回归出边界框,并且会预测出边界框包含目标相对于所有类的概率,即指C个物体所属某种类别的概率,公式为:。边界框包含目标所属类别的置信度分数利用公式(2-2)计算。YOLO整体模型如图2.3所示。

  (2-2)

  图2.3 YOLO整体模型

  总结来讲,YOLO最终输出的预测是一个的张量,比如,YOLO在PASCAL VOC数据集[26]上的验证实验,将图像划分为的网格,共分20个类别(C=20),每个网格负责预测两个边界框(B=2),整个模型最终预测就是的张量。

  2.1.2网络结构

  在整体网络结构上,YOLO与GoogLeNet[27]比较相似,一张448*448的图片进入模型后,首先经过24层的卷积层,然后经过两层全连接层得出预测结果。其整体结构如图2.4所示:

  图2.4 YOLO网络结构

  2.1.3损失函数

  由于YOLO系列属于目标检测领域的论文,而目标检测技术对图像做检测时,有两个任务,即需要框定预测图像中目标物体(位置信息)和给出目标所属类别(类别信息),两个任务分别对应3类损失值,分别是坐标误差,置信度误差和分类误差。YOLO使用均方和误差将3类损失值合并到一个Loss函数中。由于开始3类误差的权值一样,在早期的训练过程中,模型训练损失值很不稳定,极其容易发散。因此,YOLO对误差损失进行了修正,通过对误差损失设置不同的权值的方式使模型更加容易收敛,具体是提高了定位坐标误差的权值,降低了不包含物体中心的网格的置信度误差的权值。YOLO的损失函数公式如2-3所示:

  (2-3)

  其中,表示第i个单元格中有无目标,表示第i个单元格中的第j个边界框对单元格的预测进行负责。在公式中,前两行为边界框坐标信息误差,第一行是对图像中物体中心坐标预测的平方误差,第二行是对边界框的高度和宽度预测的平方误差。第三、四行为边界框的置信度损失,置信度损失以物体中心是否落在网格中心为标准分为两部分来分别计算。第五行为分类误差[28]。

  2.1.4 YOLO预测实现

  YOLO模型训练完成后,对一张新图片进行预测,我们将这张新图片输入到模型中,得到7*7*30的张量,表示图片中所有网格包含的对象以及该对象可能的两个位置信息(bounding box)和置信度。从这个7*7*30的张量中提取出最有可能的目标和目标信息,YOLO采用了NMS(Non-maximal suppression,非极大值抑制)算法。该算法会在本章中的第2小节进行详细介绍,这里不再赘述。在提取出最有可能的信息后,YOLO会在图像上根据信息标注预测目标的位置以及给出目标所属类别。

  2.1.5 YOLOV3-TINY算法

  YOLOV3是在YOLO、YOLOV2的基础上改进而来,而YOLOV3-TINY算法则是YOLOV3的简化版本,与YOLOV3或其他算法相比,YOLOV3-TINY具有更少的卷积层并且检测速度比较快。下面介绍YOLOV3-TINY在YOLO的基础上做出的改进。

  (1)先验框

  由于在之前的YOLO中没有先验框,YOLO中的两个边界框在被初始化时位置是随机的,网络预测出的边界框也是随机估计的,然后将预测出的边界框与标定好的正确边界框计算IOU,再选择IOU较大的预测边界框,在训练的过程中,网络逐步学习到正确的参数,得到正确的预测结果。从YOLOV2检测算法开始,算法借鉴了Faster-RCNN中的Archor Box(先验框)思想[29],YOLOV3-TINY用先验框来预测边界框。先验框将YOLO中的两组边界框信息和一组类别的概率的组合分离开来,每个边界框信息都会包含置信度和一组类别的概率。但是作者在使用Archor Box时遇到了一些问题,虽然在训练网络的过程中,网络也会学习和调整boxes的宽高维度,最终得到较为准确的预测框,但是如果我们从训练开始就确定了较好、在数据集中较具代表性的Archor Box维度信息,这会帮助网络的训练快速的收敛,网络在训练过程中就能够更容易的学习权重参数,更快更准确的预测位置。所以Archor Box的宽和高两个维度往往是精选的先验框(hand-picked priors),是经过人工分析并挑选出来的。但在YOLOV3-TINY中,没有使用人工挑选先验框的方法,其用K-MEANS算法对数据集中标定框的宽高进行聚类,得到合适的先验框的尺寸。其中K-MEANS算法会在本章的第三小节中详细介绍,这里不再赘述。

  (2)正则化(Batch Normalization)

  YOLOV3-TINY算法中,每层卷积层的后面都加入了BN层和Leaky ReLu层[30],BN层负责将卷积层的输出值批量归一化(Batch Normalization),其能够给模型收敛带来显著的提升。因此,有了Batch Normalization便可以去掉用Dropout来避免模型过拟合的必要。Leaky ReLu层则为激活函数,用来提升模型的表达能力。

  (3)YOLOV3-TINY网络结构

  YOLOV3-TINY的网络结构图如图2.5所示。YOLOV3-TINY的网络结构和YOLO稍微有所不同,在YOLOV3-TINY的网络结构中,从第0层到12层是YOLOV3-TINY自设计的特征提取网络,这个特征提取网络由3*3卷积层(7个)和最大池化层(6个)组成。YOLOV3-TINY的网络结构中还有Concat操作,Concat操作是将张量拼接在一起,与残差层的add操作不同,拼接改变了张量的维度,没有改变张量内部的数据,而add操作是将两个张量直接相加,不会改变张量的维度。这里的Concat是将特征提取中间层的输出张量和后面经过上采样后的张量进行拼接。

  在YOLOV3-TINY网络结构中,一张416*416尺寸的图片经过特征提取网络后,特征图尺寸变为13*13,除后面上采样操作外,特征图的尺度不再变化。YOLOV3-TINY模型将图片分为两个不同尺度的特征图进行预测。第一个特征图的尺寸为13*13,这继承自YOLO“分而治之”的思想,将特征图分为13*13个网格进行预测,每个网格预测3个边界框,每个边界框信息都要有坐标4个参数、1个置信度和n个所属预测种类的概率。因为在COCO数据集上n=80,因此输出尺寸为13*13*(3*(4+1+80))即13*13*255。第二个特征图尺寸为26*26,其输出尺寸为26*26*255。不同的是13*13尺寸的特征图具有较大的感受野,用来预测大尺寸目标。而26*26尺寸的特征图的感受野相对13*13变小了很多,因此主要用来预测中尺寸目标。YOLOV3-TINY中共需要6个先验框,其中3个是13*13特征图使用,而另一半是26*26特征图使用。

  图2.5 YOLOV3-TINY网络结构图

  (4)YOLOV3-TINY损失函数

  YOLOV3-TINY的损失函数中,w,h的损失函数延续了YOLO中的平方和误差损失函数,其余部分用的是二值交叉熵(Binary Cross-Entropy Loss)。

  2.2 NMS算法

  NMS(Non maximum suppression)算法是非极大值抑制算法,与它的名字的意义相同,算法主要是找出局部最大值,抑制极大值周围的数据。如图2.6所示,当我们向YOLO模型中输入一张图片,算法最终会从这张图片中找出很多个可能是物体的矩形框,然后为每个矩形框做类别概率。算法从图片预测出了很多矩形框,我们需要判别哪些矩形框是没用的,然后剔除这些矩形框,留下概率最大的矩形框,如图2.7,剔除的过程需要NMS算法来实现。

  图2.6图2.7

  NMS算法的原理是:对预测到的边界框(bounding box)的列表B及其对应的置信度d:

  (1)在预测得到的列表B中,选择具有最大置信度分数的边界框,然后将从列表B中移除并加入到检测结果C中。

  (2)将列表B中剩余的边界框逐个计算与边界框的IOU值,将IOU值大于设置阈值的边界框直接从列表B中移除。

  (3)一轮过后,再次从列表B中选出当前具有最大置信度的边界框并加入检测结果C。

  (4)重复上述过程,直到B为空,检测结果C中就是所有被保留下来的框。

  2.3 K-MEANS算法

  YOLOV3-TINY中借鉴了先验框的思想,通过选取合适的先验框,能够让网络的训练迅速的收敛,并且亦可以使网络对图片进行更准确的预测。在YOLOV3-TINY中,默认包含了6个不同大小的先验框,先验框是利用K-MEANS算法聚类挑选得到的。

  K-MEANS算法是一种迭代求解的无监督式学习的聚类算法,样本点到选取类中心的欧式距离是聚类好坏的评价标准,通过迭代选取聚类中心,最终使总体聚类结果的欧式距离变得最小。K-MEANS算法的步骤为:

  (1)从数据集中随机选取K个点作为初始聚类中心,中心点为:。

  (2)针对数据集中每个样本,用规定的距离函数分别逐个计算样本点到每个中心点的距离,到哪个中心点的距离小,就将其划分到该聚类中心的类中。

  (3)针对每一个类别,根据聚类中现有的对象重新计算每一个聚类的聚类中心。

  (4)重复第2,3步骤,直到没有任何样本被重新分配给不同的聚类中心,或者聚类中心没有再发生变化,或者达到了我们设置的迭代次数。

  在YOLOV3-TINY中,并没有采用标准的K-MEANS算法,因为采用欧式距离来衡量差异会导致当边界框的尺寸比较大的时候,误差也会更大,但是误差和边界框的尺寸没有太大关系,因此,YOLOV3-TINY通过IOU重新定义了距离函数,使误差和尺寸无关。距离函数为公式2-4:

  (2-4)

  对于该距离函数的解读,我们希望网络能够对图片进行准确的预测,因此,我们希望挑选出来的先验框能够代表数据集中目标常见出现位置,也就是聚类挑选出来的先验框能够和数据集中所有的标定样本框有最大的IOU,又由于IOU的最大值为1,所以我们可以设置距离函数为,距离函数的值越小代表聚类挑选出的先验框与数据集中的样本框的IOU越大,这样挑选出来的先验框越具有代表性,更符合我们的需求。

  2.4本章小结

  本章中,首先详细介绍了YOLO系列目标检测算法“分而治之”的设计思路,然后深入介绍了YOLO实现目标检测的细节,包括网络结构、损失函数以及YOLO预测实现的过程。然后介绍了YOLOV3-TINY算法相对于YOLO的改进之处,包括先验框思想、正则化、YOLOV3-TINY自设计的特征提取层网络以及损失函数的变动。最后,介绍了YOLOV3-TINY实现检测时用来剔除多余预测框的NMS算法的原理以及用来从数据集中聚类得到适合自己数据集的先验框信息的K-MEANS算法。

  第3章火灾预警系统设计

  基于Jetson Nano的火灾预警系统包括火灾检测模块和火灾预警模块,该系统需要连接摄像头,并将训练好的YOLOV3-TINY模型部署在Jetson Nano开发板上实现对摄像头下监控环境的火灾检测以及预警功能,本章将详细介绍基于Jetson Nano的火灾预警系统的整体系统设计和实现。

  3.1系统介绍

  3.1.1系统硬件配置介绍

  作为智能化识别和集高性能计算为一体的系统,并且检测火灾的算法是基于深度学习的YOLOV3-TINY算法,那么系统对硬件环境依赖性很强,要求也很高。硬件性能的大小可以影响系统检测的工作效率以及系统的实时性。当然,性能越好的硬件对系统的检测效果会有更大的提升,整个系统的运行情况也就更加良好,但是硬件的价格也就会越昂贵。但考虑到实际生活,人们的对系统的关注点还是性价比。因此考虑到这一点,本文依照性价比的原则,对硬件进行了选型。本节主要介绍用于运行目标检测算法的高性能嵌入式开发板Jetson Nano和用于采集图像信息的摄像头。

  (1)Jetson Nano嵌入式开发板

  基于Jetson Nano的火灾预警系统,其核心是对火灾进行检测的基于深度学习的YOLOV3-TINY算法。因此,运行算法的硬件平台应具备较强的运算能力以来执行深度学习模型的预测,一般硬件平台需要配备GPU,而以往来讲,一般硬件平台都是配备GPU的台式主机,而台式主机的成本比较高并且体积大。由于近年来嵌入式开发板硬件平台的不断发展,许多开发板也配备了GPU。本文采用的是NVIDIA开发的Jetson Nano开发板作为硬件运行平台。

  Jetson Nano是一台模块化的人工智能计算机,使用的是NVIDIA Maxwell架构,配备有128个NVIDIA CUDA核心,其功耗仅在5-10W,但它可以提供高达472 GFLOPS的浮点运算能力,其外观和树莓派一样小巧玲珑,但性能非常强大。简单的讲,Jetson Nano是一块具备GPU浮点数运算能力的嵌入式开发板,它的大小和普通的嵌入式设备相类似,但是计算能力要远远高于普通的嵌入式设备。它允许并行运行多个神经网络,用于图像分类、图像分割、目标检测和语音处理等应用程序,是一块专门应用在深度学习和计算机视觉领域的开发板。Jetson Nano的外观图如图3.1。

  (a)(b)

  图3.1 Jetson Nano外观图

  本文采用的Jetson Nano开发板技术规格如表3.1所示。

  表3.1 Jetson Nano技术规格表

  名称配置

  GPU 128-core Maxwell

  CPU Quad-core ARM A57 1.43GHz

  Memory 4GB 64-bit LPDDR4 25.6 GB/s

  Storage microSD(not included)

  USB 4×USB 3.0,USB 2.0 Micro-B

  Mechanical 100mm×80mm×29mm

  Jetson Nano的软件环境由JetPack[31]构建,NVIDIA JetPack SDK是当前NVIDIA构建AI应用程序最全面的解决方案。由于Jetson Nano需要microSD卡做存 段,所以,我们直接在NVIDIA Jetson Nano的官网上下载相应的镜像,然后将镜像用NVIDIA官方提供的Etcher软件将镜像刷入microSD卡中。我所下载的镜像版本号为:nv-jetson-nano-sd-card-image-r32.3.1,对应的JetPack版本4.4,配置的软件环境如表3.2所示。

  Jetson Nano通过稳压器和电源树设计来优化电源效率,整体采用的是高效电源管理集成电路(PMIC)。在实际使用过程中,Jetson Nano支持两种电源模式,分别为5W和MaxN(10W)。每种模式的配置不同,例如CPU、GPU频率和在线核心数。当然,我们也可以根据自己的需求自定义模式下的配置,比如自定义内存、CPU、GPU频率和内核数量,但自定义值不能超过Jetson Nano本身最大配置。切换两种模式的命令为:sudo/usr/sbin/nvpmodel-m<x>。其中,<x>对应0或1,0表示MaxN模式。表3.3显示了NVIDIA预定义的电源模式以及模块资源使用的相关上限。

  表3.2 Jetson Nano软件环境配置表

  名称介绍

  操作系统OS Linux Ubunto18.04 LTS(ARM定制版本)

  TensorRT高性能深度学习推理库,为所有深度学习框架优化推理

  提供低延迟和高吞吐量的深度学习应用程序

  cuDNN深层神经网络的GPU加速库

  CUDA通用并行计算架构,该架构可使GPU解决复杂计算问题

  该架构为深度学习框架提供API

  Vision Works专门用于计算机视觉和图像处理的软件开发包

  OpenCV用于计算机视觉和图像处理的开源库

  表3.3 Jetson Nano电源模式设置

  电源模式MaxN 5W

  功率预算10W 5W

  模式ID 0 1

  CPU可用数量4 2

  CPU最大频率(MHz)1479 918

  GPU最大频率(MHz)921.6 640

  将Jetson Nano应用在火灾预警系统中,结合YOLOV3-TINY算法需要处理视频帧信息的高计算量的实际情况,在实际使用中,我们选择Jetson Nano的MaxN模式获得Jetson Nano最好的计算性能,使火灾检测的效率达到最高。

  Jetson Nano是整个火灾预警系统的“大脑”,对视频流信息中火灾的检测行为以及检测火灾出现后的预警操作都需要将对应算法在Jetson Nano开发板上运行得到实现。

  (2)摄像头

  Jetson Nano可以支持USB摄像头和CSI摄像头。USB摄像头和CSI摄像头各有得失。表3.4中列出了两种摄像头的对比情况。

  表3.4 USB摄像头和CSI摄像头对比

  USB摄像头CSI摄像头

  优点使用体验良好;USB线很长很灵活;

  易整合、成像质量好;支持从底层访问;

  根据CPI和内存进行优化

  缺点CPU占用率高软排线特殊,支持距离短,价格贵

  由于USB摄像头大多数是免驱的,即插即用,因此即便是非专业人员,也可以获得良好的使用体验,并且USB摄像头的价格成本较低,可以满足大众的日常需求。另外,CSI摄像头需要特定的软排线连接,这种软排线不仅短,而容易折断,非常不灵活,并且CSI摄像头的接口是特定的接口,没有USB接口通用。综合表2.4以及上述内容,最终本文选取USB摄像头作为采集图像设备。

  3.1.2系统实物图

  系统实物连接图如图3.2所示。

  (a)

  (b)

  图3.2系统实物连接图

  基于Jetson Nano的火灾预警系统由摄像头、Jetson Nano开发板、显示屏组成。其中摄像头负责拍摄监控环境、收集监控环境的视频流信息,通过USB传输将信息传输给Jetson Nano;Jetson Nano开发板负责对摄像头传输来的视频流信息检测,判断当前监控环境中是否发生火灾,若发生火灾,则立即进行预警。

  3.1.3系统检测流程图

  火灾预警系统的检测流程图如图3.3所示。

  图3.3火灾预警系统检测流程图

  将火灾预警系统连接完毕后,启动Jetson Nano开发板,在开发板中运行YOLOV3-TINY算法,摄像头开始采集当前监控环境的图像信息并通过USB线有线传输到Jetson Nano开发板中,YOLOV3-TINY算法通过OpenCV读取到传输来的图像信息并对图像信息做检测,若检测到火灾,进行火灾预警,否则,YOLOV3-TINY算法将持续对监控环境的图像信息检测。

  3.2系统模块通信机制

  火灾预警系统由多个硬件模块协同合作组成,硬件之间的通信自然不可避免。本节主要介绍系统各模块间的通信办法。

  3.2.1摄像头与Jetson Nano通信

  摄像头需要将采集到的图像信息传递给Jetson Nano开发板,因此需要摄像头和Jetson Nano开发板两者之间的通信。一般通信办法有:蓝牙、WIFI和USB通信等。蓝牙、WIFI属于无线通信方式,而USB属于有线通信方式。无线通信虽然可以使摄像头的位置不受线和Jetson Nano开发板位置的束缚,适合经常变动位置的设备通信,但是无线通信的传输速率远远不如有线通信,不能保证传输的实时性。考虑到本文的预警系统使用摄像头和Jetson Nano开发板的位置一般均为固定位置,并且火灾预警系统需要保证一定的实时性才能实现对火灾的预防,因此,本文中采用了摄像头和Jetson Nano开发板为USB有线通信。

  由于Jetson Nano开发板提供了4个USB3.0[32]接口,因此,本系统中使用的USB版本为USB3.0版本,传输速度高达5Gbit/s,足以保证图像传输质量和速度。

  3.2.2显示屏与Jetson Nano通信

  在火灾预警系统中,预警操作是在显示屏中显示警示图来进行火灾报警,因此我们需要将显示屏和Jetson Nano通信。显示屏和Jetson Nano通信可以分为有线通信和无线通信两种方式。

  (1)有线通信

  由于Jetson Nano开发板提供了HDMI的接口,那么可以用HDMI接口类型的线直接连接Jetson Nano开发板和显示屏。由于本文使用的显示屏只有VGA的接口,连接Jetson Nano和显示屏有两种方法。

  第一种是购买HDMI转VGA的转换头,用HDMI线插入Jetson Nano开发板的HDMI接口,另一端接入HDMI转VGA转换头,转换头再通过VGA线连接显示屏。不过这里需要注意的是,HDMI转VGA的转换头需要单独供电,不可以让Jetson Nano为转换头供电,否则将不能在显示屏中得到就显示结果。这种转换头如图3.4所示。

  图3.4单独供电HDMI转VGA转换头

  第二种办法是购买HDMI转VGA的线,即一端为HDMI类型接口,另一端为VGA类型接口。这种线可以略去中间转换头接插的操作,但是这种转接线的价格一般比较昂贵。HDMI转VGA线如图3.5所示。

  图3.5 HDMI转VGA线

  (2)无线通信

  显示屏和Jetson Nano开发板无线通信是指用电脑远程连接Jetson Nano开发板,因此,无线通信需要Jetson Nano连接网络。Jetson Nano开发板搭载了千兆以太网卡,可以为Jetson Nano连接网线或者直接为Jetson Nano开发板连接一块无线网卡。

  本文将笔记本电脑和Jetson Nano开发板连接在同一局域网下尝试了用笔记本电脑用VNC Viewer软件远程桌面连接Jetson Nano开发板。在远程桌面共享的过程,直接打开Jetson Nano开发板的桌面共享一般都会失败,我们需要通过下面这些步骤修复桌面共享。

  ①首先安装vino,在命令行中输入sudo apt install vino来安装vino。安装完成后,接着在命令行中输入sudo gedit/usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml,其中,gedit是ubunto系统中类似记事本的工具,可通过gedit来修改文件内代码等内容,打开后,在文件最后添加一段允许设备通过RFB协议[33]进行远程连接分享桌面的代码。最后在命令行中输入/usr/lib/vino/vino-server来启动vino-server。

  ②紧接着需要继续安装配置dconf-editor,命令行中输入sudo apt-get install dconf-editor安装dconf-editor,打开dconf-editor,在远程连接的页面中取消勾选prompt-enabled和require-encryption。

  ③最后找到Jetson Nano开发板在路由器下分配的IP地址,在笔记本电脑中打开VNC Viewer软件,输入IP地址即可完成远程桌面共享。远程桌面共享如图3.6所示。

  图3.6远程桌面共享图

  3.3 YOLOV3-TINY模型训练

  基于Jetson Nano的火灾预警系统用YOLOV3-TINY模型来实现对火灾的检测。由于原来的YOLOV3-TINY模型是针对COCO数据集[34]上的80分类的,我们需要修改相关算法代码并在火灾数据集中重新训练YOLOV3-TINY模型,使模型符合系统的需求。

  3.3.1数据集标注

  基于深度学习的目标检测模型是有监督学习,有监督学习需要大量的标注好的样本作为学习对象,从数据集中不断学习,优化更新网络参数,使损失函数达到最小,得到网络的最优解。训练一个深度模型,第一步是获取数据,数据是我们训练模型的基础和前提。由于现有的YOLOV3-TINY模型是在COCO数据集上训练出来的,COCO数据集中包含80个目标种类,其中没有火焰,因此,我们需要制作自己的火灾图片数据集。可能是现在火灾数据集公开较少的原因,在Github、CSDN论坛等网站没有找到标注好的火灾数据集,我决定自己标注一套火灾数据集。

  在网上总共搜集到了6223张图片,如图3.7所示。对收集到的6223张火灾图片,我们使用LabelImg工具进行标注,LabelImg标注界面如图3.8所示。每张图片标注完成并保存后,都会在文件夹中生成一个与图片同名的txt文件,txt文件的内容如图3.9所示。文件中共5个值,对应的含义见表3.5。

  图3.7数据集图片

  图3.8 LabelImg标注界面

  图3.9标签内容图

  表3.5标注数据含义

  0 0.585417 0.562500 0.270833 0.225000

  物体所属类别所占编号物体中心横坐标x占整张图片宽度的比例物体中心纵坐标y占整张图片高度的比例标注框宽度w占整张图片宽度的比例标注框高度h占整张图片高度的比例

  3.3.2深度学习框架选择

  在深度学习初期,由于没有明确的规范,再加上深度学习训练网络模型的过程需要用到工具如激活函数、损失函数和优化器等大体相同,因此每个深度学习的研究人员在进行网络训练的过程中都需要写很多的别人写过的代码,这势必导致研究的效率低下,进程缓慢,为了提高工作效率,有些研究人员就把这些重复的代码整合成一个框架放在网上让所有的深度学习研究人员一起使用。就这样,不同的深度学习框架接连诞生了。目前,已经出现了多种深度学习框架,各有优势和劣势,不同的研究人员则是根据自己的喜好选择不同的深度学习框架,有TensorFlow、Caffe、MXNet、PyTorch等。

  TensorFlow,是当今最火的深度学习框架之一,TensorFlow是Google公司推出的机器学习开源工具,Google公司下机器智能研究部门Google Brain团队基于早先在2011年同为Google公司开发的DistBelief基础架构研发而成TensorFlow。不言而喻,由于Google公司本身极具强大的推广能力,因此TensorFlow一经推出,便受到了广大研究人员的关注,这导致2016年是TensorFlow的一年,TensorFlow获得了极大的成功。但是TensorFlow还是有很多缺点,比如,TensorFlow的系统设计过于复杂、接口变动频繁、兼容性差、TensorFlow文档教程混乱,缺乏管理,新手初上手TensorFlow难以入门。因此,虽然作为最为炙手可热的深度学习框架,TensorFlow依旧存在着不少问题,并且TensorFlow是基于静态计算图的深度学习框架,对新手而言,上手并不是很简单。

  Caffe是一个清晰、高效、表达性很强的深度学习框架,它由伯克利人工智能研究中心开发。Caffe的核心语言是C++,但它支持多种语言的接口,比如,命令行、Python和Matlab,同时,无论是CPU还是GPU,Caffe都可以在其上面运行。Caffe的优点是易用、方便、简洁快速和性能出众,但是Caffe本身设计不够灵活,并且内存占用高。这导致了许多Caffe使用者使用Caffe时遇到了很多问题,比如难以扩展Caffe、Caffe应用局限以及难以配置Caffe依赖环境等问题。Caffe受热捧之际也曾占领深度学习半壁江山,但在深度学习新时代到来之际,Caffe已给诸多的研究人员沉重的乏力感。

  MXNet是一个深度学习库,支持众多编程语言,比如:Python、R、C++、Matlab、JavaScript等语言,这点对主修不同编程语言的研究人员十分友好。它可以在日常使用的设备中运行,比如CPU、GPU、移动设备和服务器等。MXNet优点为内存显存优化效果好,占用低、性能强悍并且有着超强的分布式支持。同在分布式环境下运行,可以明显体会到MXNet优于其他框架的扩展性能。但是由于MXNet最初只是十几个大学生抱着对技术探索开发的纯粹热情做出来的,MXNet的知名度非常低,基本就是无人问津,直至2016年11月,亚马逊宣布收购MXNet为其官方深度学习计算平台,这才稍微获得了一些人的支持,注入了活力,但后续推广力度太小,并且官方提供接口文档不完善,教程不完善,使一些研究人员望而却步,因此MXNet一直处于不温不火的状态。

  PyTorch是一个开源的Python机器学习库,其前身是Torch,主要用于自然语言处理和计算机视觉等应用领域,它是在2017年1月由Facebook人工智能研究院在GitHub上开源。PyTorch一经推出就立刻引起了广大研究人员的追捧热潮,并迅速登上了深度学习框架流行的热门。PyTorch有着简洁、速度快、易用和活跃的社区等优点,但由于它是最近几年内推出的,所以实际工程中,可能我们能找到别人写过的可利用代码很少,这需要我们自己亲自动手使用PyTorch来逐步实现自己的想法,但近两年来,PyTorch用户的爆炸式增长使得我们已经可以在一些开源网站轻松找到一些基于PyTorch的项目工程代码。PyTorch在2018年已经可以和TensorFlow平分秋色,在2019年深度学习框架的竞争中,甚至比TensorFlow略占上风。

  综上所述,本文主要在TensorFlow和PyTorch中进行选择,两者都是目前最流行和最受追捧的深度学习框架。使用TensorFlow可以轻松的找到别人发布的值得自己借鉴的工程代码,使用PyTorch则可以让我们轻松简单的实现自己的想法。两者还有一点不同点就是,TensorFlow是基于静态计算图的深度学习框架,静态图对新手并不友好,这需要新手再去学习静态图的定义创建语法,并且静态图被创建之后无法再进行修改,许多新手止步于静态图设计语法的学习过程中。而PyTorch是基于动态计算图的深度学习框架,在PyTorch中每一次前向传播都会创建一副新的计算图,并且PyTorch运行代码的基础是Python语言,简单直观,不需要另学动态图的创建语法等,这点对新手十分友好。最后,基于PyTorch对新手的友好性,本文最终选择了PyTorch作为深度学习框架。

  3.3.3工程部分代码修改

  下载好开源的YOLOV3-TINY工程后,由于需要重新训练YOLOV3-TINY模型使其适用于自己制作的数据集,因此我们需要修改YOLOV3-TINY工程下的部分代码,修改后再重新训练,步骤如下。

  (1)YOLOV3-TINY工程下的data文件夹是用来存放训练用的数据集图片和标签的,因此,我们将图片和标签完整放入data文件夹中。接着,训练过程中的训练和验证阶段需要不同的标注图片,需要准备两个txt文档存放训练和验证用的图片的地址供训练模型过程中寻址和提取,最终在data文件夹下应该有四个文件,分别是2个文件夹和2个txt文档。如图3.10所示。

  图3.10 data文件夹文件

  (2)config文件夹用来存放YOLOV3-TINY的配置文件,应当包括data文件、name文件和YOLOV3-TINY.cfg文件。其中,data文件中存放目标检测的总类别数、训练和验证图片txt文件的地址以及name文件的地址,如图3.11所示。因为标注的标签中只有目标对应类别的编号,所以我们需要另外准备一个.names文件存放每个目标编号对应的类别名称。对本文而言,由于只需检测火灾,因此,目标编号只有0,对应目标名称也只有Fire。

  图3.11 config文件夹

  最后就是YOLOV3-TINY.cfg文件,该文件中存放YOLOV3-TINY网络结构,PyTorch通过解读这个文件来搭建模型。其中,我们需要修改YOLO层中的Archor信息。原来的YOLO层中的Archor信息是基于COCO数据集的基础上通过K-MEANS算法聚类分析出的,而现在数据集是自己标定的火灾数据集,我们需要通过K-MEANS算法聚类分析得到火灾数据集上的Archor信息。在对火灾数据集经过1000次K-MEANS聚类后,得到的6个Archor维度信息为:[19,30]、[43,56]、[59,113]、[100,191]、[125,98]和[220,245],将Archor信息替换掉原来COCO数据集聚类出的Archor信息。

  3.3.4模型训练

  由于深度学习模型的训练一般都需要GPU服务器,为了能够对YOLOV3-TINY模型训练,本文使用了搭载GTX1050Ti型GPU显卡的笔记本电脑进行训练,电脑系统为WIN10,系统中安装了Anaconda[35],在Anaconda安装了Python3.7、CUDA10.1、cuDNN7.0、PyTorch1.4等环境用于训练。其中笔记本电脑的配置见表3.6。

  表3.6模型训练笔记本电脑配置表

  系统处理器核心/线程主频内存显卡

  WIN10 Intel(R)Core(TM)i5-7300HQ

  四核/八线程

  2.5GHz

  8GB NVIDIA GeForce GTX1050Ti

  重新训练模型,训练过程总共分为100个epoch,每个epoch有347个batch,每个batch的大小为16张图片,每隔10个epoch保存一次模型权重文件。训练过程的参数初始化如图3.12所示。

  图3.12初始化训练参数

  训练过程中的Loss值如图3.13和图3.14所示。

  (a)(b)

  图3.13初期训练过程Loss值

  (a)(b)

  图3.14后期训练过程Loss值

  可以从图3.13图(a)中看到,由于没有预训练权重,所以模型在刚开始完全是随机初始化网络权重参数,因此,网络刚开始训练得到的Loss值为147.6,这是一个非常大的损失值。随着网络不断学习,优化网络参数,在40多个epoch时,Loss值已经达到了5左右。如图3.13中图(b),这是训练过程中第47个epoch的第251个epoch,此时网络的权重就比较适合该batch中的训练图片,对这个batch的Loss值达到了2.4左右。在60个epoch后,Loss值到了4左右,如图3.14图(a)。最终,经过90多个epoch的训练后,Loss稳定在2.1左右。如图3.14图(b),最后一个epoch的第324个batch的Loss值为2.11。

  训练完成后,我们会在checkpoints文件夹中得到10个训练好的模型权重文件,权重文件中保存的是模型从数据集图片中学到的网络参数。

  3.4 TensorRT模型加速

  获得训练后的YOLOV3-TINY模型权重文件后,我们将YOLOV3-TINY模型部署在Jetson Nano开发板上进行对火灾图片的检测实验。在初期检测实验过程中,我们直接对一些未用于训练的火灾图片进行检测,模型对于每张图片的检测时间在0.15s左右,如图3.15所示,那么对于视频而言,YOLOV3-TINY模型每秒钟检测的视频帧数为6帧左右,这明显达不到使用模型检测视频的标准,对于火灾预警系统而言,应用场景正是一个要求高实时性的场所。为了解决推理速度慢、延迟高这些问题,本文使用了TensorRT对模型进行优化加速检测过程。

  图3.15模型未加速对每张图片检测时间

  TensorRT是一个高性能的深度学习推理优化器,保证推理过程中的低延迟、高吞吐率,为深度学习应用的推理加速。可将TensorRT用于对超大规模数据中心、嵌入式平台进行推理加速。具体来讲,TensorRT是一个C++库,从TensorRT 3开始提供C++程序接口和Python程序接口,现在TensorRT已经更新到了TensorRT6.0。目前TensorRT可以支持几乎所有的深度学习框架,比如前文中提到的PyTorch、TensorFlow和Caffe等。

  TensorRT是NVIDIA针对自家平台做的加速包,主要用来针对NVIDIA GPU进行高性能推理加速。TensorRT做的优化如下:

  (1)TensorRT支持INT8和FP16的计算。深度学习网络在训练时,通常使用32位或16位数据。但使用TensorRT对模型推理加速时,会选择较低的数据精度,一般为8位或16位,数据精度低意味着运算时间消耗越少,其以此达到加速推理的目的。(2)TensorRT对于网络结构进行了重构,把一些能够合并的运算合并在了一起,并针对GPU的特性做了优化。比如,某网络中有三层,分别是卷积层、偏置层和reload层,对于一个没有优化过的深度学习模型,推理运算的过程中,这三层是需要依次调用三次cuDNN对应的API,但是,实际上这三层的实现是完全可以合并到一起的,合并到一起之后,仅需要调用一次cuDNN的API即可完成当前三层的运算。再比如说,目前的深度学习网络越来越深的同时也越来越宽,可能会并行做若干个相同大小的卷积,这些卷积计算其实也是可以合并到一起来做的。通过合并一些计算,可以减少一些调用过程消耗的时间,以此来达到加速目的。(3)TensorRT可以直接取消Concat层。Concat层主要是实现张量拼接的操作,比如说,一个1×26×26×128的张量和一个1×26×26×256的张量到了concat层拼接成一个1×26×26×384的张量。使用TrnsorRT对模型加速后,Concat这层将会直接被取消掉,因为这层的操作可以直接由TensorRT来实现。(4)在GPU上跑的函数为Kernel,TensorRT对模型加速后,Kernel可以根据不同的batch size大小和问题的复杂程度,去选择最合适的算法,TensorRT预先写了很多GPU实现,会有一个自动选择的过程。

  使用TensorRT对YOLOV3-TINY模型加速,由于PyTorch没有像TensorFlow一样集成TensorRT,因此需要先将PyTorch转TensorRT,本文原准备将PyTorch转为ONNX,然后再转为TensorRT,后几经周转,在Github上发现了提供将基于PyTorch的YOLOV3和YOLOV3-TINY模型直接转换为TensorRT模型的包。因此本文最终选择了将PyTorch直接转为TensorRT,需要用到YOLOV3-Torch2TRT的包。另外需要注意由于Jetson Nano开发板的系统架构是aarch,因此NVIDIA专门开辟了一个给aarch架构用的TensorRT版本,这个架构对应的TensorRT5.0版本没有Leaky Relu激活函数,因此必须使用TensorRT最新的6.0版本。

  在使用TensorRT加速后,模型对于每张图片的检测时间达到了0.07s左右,如图3.16所示。那么模型每秒钟检测的视频帧数在11-12帧左右,较加速之前有了大约一倍的提升,已经基本可以满足检测视频的标准。加速前和加速后对比表如表3.7所示。

  图3.16模型加速后对每张图片检测时间

  表3.7 TensorRT加速前和加速后对比表

  TensorRT加速前TensorRT加速后

  一张图片检测时间0.15s 0.07s

  一秒检测视频帧数6帧左右11-12帧

  3.5数据增强

  使用TensorRT完成对模型的检测加速后,本文初步对一些火灾图片以及火灾视频进行检测,对火灾图片的检测效果还算比较理想,但是针对火灾视频的检测效果远远没有达到预想的效果,在火灾视频中,模型大部分时间处于未检测到火灾的情况,具体结果将在第四章实验结果中详细叙述。

  为了解决检测效果不佳的问题,我向学长和指导老师等人探讨请教、在网上各大论坛搜索模型检测效果不佳的原因,最终得出结果应该是数据集不足的原因,但现有的数据集仅有这么多,最终为了解决数据集不足的问题,本文对原有的6223张图片数据集做数据增强扩充数据集以此来增强模型的泛化能力,更好的让模型适应应用场景。

  数据增强技术,通过对训练数据集中的图片做一系列的随机变换来产生与原图相似但又不同的训练样本,从而扩大数据集的规模。虽然数据增强后的一些图片,在我们看来与原图相差不多,但是在计算机识别的过程中,图片是以数据的形式被读入,而此时的图片的数据有了很大改变,计算机会将两张图片当作两张截然不同的图片来进行处理。通过执行数据增强,我们可以阻止神经网络学习不相关的特征,从根本上提升模型整体性能,增强模型网络的泛化能力。

  常见的数据增强方法有:(1)旋转变换:将图片随机地旋转一定角度。(2)缩放变换:将图片按照一定的比例放大或者缩小。(3)移位变换:在平面上对图片进行平移得到平移后图片。(4)尺度变换:将图片按照指定的尺度因子进行放大或缩小;或者参照SIFT特征提取思想,对图片利用指定的尺度因子滤波构造尺度空间,改变图片的内容或模糊程度。(5)翻转变换:将图片进行水平或垂直翻转。(6)对比度变换:在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变,对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间),增加光照变化。(7)噪声扰动:对图片的每个像素RGB进行随机扰动。(8)颜色变化:在图片通道上添加随机扰动。

  在YOLOV3-TINY模型工程的训练代码中有对数据集做数据增强,不过其数据增强仅仅只用到了水平翻转,从这点也可以看到模型的泛化能力差的原因。我在工程原有的基础上加入了饱和度变化、明亮度变换、色调变换、高斯噪声扰乱、对比度变换、随机裁剪以及扩展变换。这些数据增强的变换在训练过程是随机发生的,通过设置一个取值只能为0或1的随机数,0代表不进行变换,1则代表进行变换。

  使用数据增强技术对数据集进行处理过后,重新训练模型,获得模型的权重文件后,再次进行对火灾视频的检测实验,这次的检测效果比未做数据增强之前有了很大的提升,经过数据增强处理后的模型可以对火灾视频中的火灾位置进行比较准确的预测,并且检测不出视频中发生火灾的情况也不再出现。因此,可以看到数据增强提高了模型的泛化能力,使模型可以适应更多的应用场景。

  3.6预警部分实现

  当YOLOV3-TINY模型对摄像头采集并传输来的图像信息检测到火灾时,火灾预警系统需要进行预警,最初设计系统时,计划使用火灾警报音频作为火灾预警信号,由于Jetson Nano没用单独的音频输出接口,直接通过HDMI输出视频信号和音频信号,若以音频方式进行预警,需要配置一台自带音响的显示器。由于系统使用的显示器没有音响,因此本文最后选择的预警方式为在显示器上展示预警图的形式来进行火灾预警。

  YOLOV3-TINY模型将图片分为13×13和26×26两个尺度的特征图来进行目标检测,两个尺度分别对应检测图片中的大型物体和中型物体,因此,YOLOV3-TINY模型对小型目标的检测效果并非很好。所以,YOLOV3-TINY模型对图像信息中的大火检测比较准确,而模型对小火的检测准确度没有对大火的检测准确度高。

  考虑到上述因素,最终本文设计的预警机制将大火和小火区分开来进行预警。对于火灾图像信息中的大火,由于模型的识别率比较高,考虑到模型对视频每秒钟可检测的帧数为12帧,对于大火的预警机制是:在2秒钟内,视频检测共24帧,有20帧都被模型检测到图像中有火灾发生,此时判断监控环境内发生火灾,触发预警。而针对图像信息中的小火,在模型识别率比较低的情况下,对于小火的预警机制是:连续5秒钟内,视频检测共60帧,每隔12帧中有4帧被模型检测到有火灾发生,此时判断监控环境内发生火灾,触发预警。

  3.7本章小结

  本章中,首先对基于Jetson Nano的火灾预警系统配置进行介绍,接着介绍了系统间各模块的通信机制,然后实现了基于自己标定的火灾数据集对YOLOV3-TINY模型的重新训练,接着,在检测过程中,遇到了模型检测速度过慢以及检测不出火灾等问题,最终通过使用TensorRT加速YOLOV3-TINY模型解决模型检测速度慢的问题,通过采用数据增强技术增强了模型的泛化能力解决模型无检测的问题,最后,介绍了主要的预警机制,实现了火灾预警系统的预警操作。

  第4章实验结果验证与分析

  本章将在第3章系统设计的基础上展示实验过程中取得的成果以及重点讨论对比数据增强前后的YOLOV3-TINY模型对火灾图片和火灾视频的检测效果及检测准确率。

  4.1 K-MEANS聚类结果展示

  在训练模型之前,需要提前设置先验框维度信息来帮助训练模型,加速模型网络训练的收敛。在YOLOV3-TINY模型中,Archor Box的维度信息是在数据集中所有的标定框信息上通过K-MEANS算法聚类得出。

  由于K-MEANS算法需要将所有的标定框信息与选出的中心框逐一计算IOU来得到。因此,我们直接从所有的标签中提取标定框信息,并创建一个临时TXT文档存放所有的数据集标定框信息。如图4.1所示。

  图4.1所有标定框信息存放TXT文件

  在进行了1000次K-MEANS聚类后,最终,选出来的6个Archor Box维度信息为:[19,30]、[43,56]、[59,113]、[100,191]、[125,98]和[220,245]。最终的准确率是64.419%,准确率指的是数据集中所有标定框与聚类选出的中心框的平均IOU,这里聚类出的Archor Box对应的平均IOU值是0.64419。聚类结果如图4.2所示。

  图4.2 K-MEANS聚类结果展示

  4.2模型训练结果

  将数据集图片和标签放入相应的文件夹中,更改好YOLO层中Archor Box的维度信息后即可对网络进行训练,训练总共迭代100个epoch,每训练10个epoch保存一次训练得到的权重文件,因此训练结束后,共得到10个权重文件。如图4.3所示。

  图4.3模型训练权重文件

  4.3火灾图片检测实验结果

  在获得训练后的模型权重后,将YOLOV3-TINY模型部署到Jetson Nano开发板,本文首先进行了对火灾图片的预测实验,一共对500张未用于训练和验证的图片进行预测。

  在预测火灾图片的实验过程中,涉及到Conf_thres参数以及nms_thres参数的调整,其中Conf_thres参数是控制预测目标是否画框的阈值,当预测目标得分未超过Conf_thres参数值时,预测目标将直接被忽略,不会预测其位置信息。nms_thres参数是NMS算法的参数,一张图片经过模型预测后可能会出现多个预测框,其中大部分的框是重复无用的,因此我们需要用NMS算法从预测的信息中挑选中最有可能的预测框和预测目标,NMS算法会将那些IOU超过nms_thres参数值的后者预测框淘汰。经过多次检测实验取值后,本文选取了一组实验情况较好的取值,选用两个参数值分别是:Conf_thres=0.5,nms_thres=0.4。其数据增强前后的检测结果如表4.1所示。

  表4.1火灾图片检测表

  数据增强前模型检测数据增强后模型检测

  图片总数量500 500

  误检测数量8 16

  检测不全数量34 21

  无检测数量24 4

  检测正确数量434 459

  检测准确率86.8%91.8%

  从表4.1中我们可以看出,数据增强之前,YOLOV3-TINY模型对500张图片的预测情况为:检测不正确的共有66张图片,其中检测火灾不全的图片数量最多,达到34张,其次是无检测的图片,有24张,最后是误检测的图片数量有8张。此时,YOLOV3-TINY模型的检测准确率达到了86.8%。而数据增强之后,预测情况为:检测不正确的图片共有41张,其中,检测不全面的图片数量依旧是最多,但与数据增强之前相比还是减少了很多,为21张,其次是误检测,数量有16张,最后是无检测的图片数量有4张。经过数据增强后训练出的YOLOV3-TINY模型检测准确率达到了91.8%。

  相比于未经过数据增强的YOLOV3-TINY模型,数据增强使模型的预测准确率提升了5%,并且经过数据增强后,无检测的图片数量从24变为了4,这说明模型的检测能力有了较好的提升。虽然经过数据增强,模型的误检测图片数量有了较少的提升,但从整体来看,数据增强提升了总体的检测准确率,并且,对于火灾预警系统而言,无检测是件比误检测更可怕的事情,对火灾的无检测会导致一场灾难的发生,致使我们人力物力财力的巨额损失,但是误检测则不会导致如此可怕的后果发生。因此,不管是从整体的预测准确率而言,还是站在无检测或误检测的角度来看,YOLOV3-TINY模型经过数据增强后,提升了模型的泛化能力,更加符合火灾预警系统的需求。

  数据增强后的YOLOV3-TINY模型火灾预测图如图4.4所示。

  (a)(b)

  (c)(d)

  (e)(f)

  图4.4火灾图片预测效果图

  4.4火灾视频检测实验结果

  在进行对火灾视频检测的实验过程中,本文选用了两段从网络上搜集的火灾现场视频以及调用摄像头对监控环境进行检测,两段火灾现场视频时间均为3分钟左右。同样,本文用经过数据增强训练前后的YOLOV3-TINY模型进行了先后实验。

  首先,用未对数据集图片经过数据增强处理训练的模型对火灾视频做检测。在对视频检测的实验过程中,首先设置Conf_thres参数值为0.5,nms_thres参数为0.4,接着模型只能间续的检测出视频中的火灾位置,并且大多数时间中,模型均处于未检测到视频中火灾的状态。在算法调用摄像头对监控环境的视频检测过程中,将点燃的蜡烛放置在摄像头前面不同的位置,在整个检测过程中,模型仅仅检测到几次蜡烛的火焰,并且识别时间非常短,仅仅是两帧或者三帧内检测到火焰,其余时间均无识别。

  由于第一次实验过程中,模型一直处于无识别的状态。接着,我降低了Conf_thres的参数值,将其设置为0.25后重新对火灾视频进行检测。在对第一个火灾视频检测过程中,模型可以对视频中的部分火灾场景进行识别,但定位精准度并不高,并且在大多数时间中模型仍处于无识别状态,如图4.5所示。在对第二段火灾视频检测过程中,情况与第一段火灾视频的检测情况相同,如图4.6所示。在调用摄像头对监控环境进行检测的实验过程中,模型可以对一些固定位置的蜡烛的火焰进行识别,并且识别到的位置并非是火焰位置,而是火焰稍下方,对于其他情况,模型仍无识别。如图4.7所示。

  因此,使用未对数据集进行数据增强训练出的YOLOV3-TINY模型对火灾视频中火灾的检测效果比较差,对监控环境下的火灾检测效果也较差,达不到火灾检测的标准。

  (a)(b)

  图4.5第二次实验第一段火灾视频检测效果图

  (a)(b)

  图4.6第二次实验第二段火灾视频检测效果图

  (a)(b)

  图4.7第三次实验调用摄像头视频检测效果图

  接着,对数据集图片经过数据增强处理后,重新训练模型,将模型再次部署到Jetson Nano开发板上,重新对火灾视频进行检测。

  第三次实验中,首先将Conf_thres参数值设置为0.5,nms_thres值为0.4。实验过程中,模型能够对视频中的火灾进行识别,并进行较为精准的定位。相对于之前实验中的模型,其检测能力有了大幅的提升。但在实验过程中,有一些误识别情况发生,即模型将视频中其他内容识别为火灾并进行定位。如图4.8所示。

  图4.8第三次实验误检测图

  为了尽量避免误检测情况的发生,本文将Conf_thres参数值提高,由于将Conf_thres参数值提高会影响模型的检测效果,因为只有模型预测的目标得分大于Conf_thres参数值的目标才会有预测信息,因此,提高Conf_thres参数值会影响模型检测小火的效果。本文多次进行实验检测,综合模型的检测效果和误检测情况,最终选定Conf_thres值为0.8,nms_thres参数为0.4。检测效果图如图4.9、图4.10和图4.11所示。

  (a)(b)

  图4.9第四次实验第一段火灾视频检测效果图

  (a)(b)

  图4.10第四次实验第二段火灾视频检测效果图

  (a)(b)

  图4.11第四次实验调用摄像头视频检测效果图

  由以上展示效果图可见,对数据集进行数据增强能够有效的提升模型的检测能力和泛化能力,使模型能够适应多种不同的应用场景,改善模型的检测效果。最终,本文选用第四次实验的YOLOV3-TINY模型以及其参数设置。

  4.5预警图展示

  模型检测到视频中发生火灾后,当视频中的火灾满足第三章中第六小节的报警机制条件后,进行预警操作,即在视频旁弹出预警图进行预警。预警图展示如图4.12、图4.13和图4.14所示。

  图4.12第一段视频火灾预警图

  图4.13第二段视频火灾预警图

  图4.14调用摄像头检测火灾预警图

  4.6本章小结

  本章中,首先介绍了实验过程中利用K-MEANS算法聚类出Archor Box维度信息的结果和训练出的模型结果的展示。接着,介绍了用YOLOV3-TINY模型对火灾图片检测验证的实验,在实验中分别用对数据集进行数据增强前后训练的YOLOV3-TINY模型进行预测对比,共预测500张图片并统计了检测不准确的图片数量以及检测准确率等。接着,介绍了用YOLOV3-TINY模型对火灾视频以及调用摄像头对监控环境进行检测的实验。最后,介绍了当系统从视频中检测出火灾并满足火灾预警条件后进行预警的情况。