台风作为一种极具破坏性的热带气旋天气系统,其年际变化特征(包括生成频数、强度等级、影响范围、路径分布等)的精准分析的对防灾减灾、水资源调控、农业生产布局具有重要的现实意义和应用价值。传统台风年际变化分析方法多依赖于统计模型和经验公式,存在特征提取不全面、非线性拟合能力弱、预测精度有限等问题,难以适应复杂气象环境下台风变化的不确定性。随着深度学习技术的快速发展,卷积神经网络(Convolutional Neural Network, CNN)凭借其强大的空间特征提取能力和非线性映射能力,在气象数据处理领域展现出显著优势。

本文针对传统台风年际变化分析方法的不足,设计并实现了一套基于卷积神经网络的台风年际变化分析系统。首先,系统梳理了台风年际变化的核心影响因素和特征指标,收集整理了近40年全球台风观测数据、海温数据、大气环流数据等多源气象数据,构建了标准化的台风年际变化数据集,并通过数据清洗、归一化、特征筛选等预处理操作,提升数据质量。其次,针对台风数据的时序性和空间关联性特点,改进传统CNN模型结构,引入时序卷积模块和注意力机制,设计了适用于台风年际变化特征提取与分析的TC-CNN(Typhoon Change-CNN)模型,实现对台风年际变化核心特征的精准提取和非线性拟合。

系统采用模块化设计思想,分为数据采集与预处理模块、模型训练与优化模块、年际变化分析与预测模块、结果可视化模块四个核心模块,基于Python语言和TensorFlow框架开发,结合MATLAB实现数据可视化与仿真验证。通过对比实验验证,本文设计的TC-CNN模型在台风生成频数预测、最大强度等级评估、影响范围估算等任务中的精度均优于传统统计模型(ARIMA、SVM)和基础CNN模型,平均误差降低15%-22%,具备良好的泛化能力和稳定性。

本文完成的台风年际变化分析系统,能够实现台风年际变化特征的自动化提取、多维度分析和短期预测,为气象部门提供精准、高效的台风变化分析工具,助力防灾减灾决策的科学性和前瞻性。同时,系统具备良好的扩展性和可维护性,可根据实际需求扩展数据来源和分析功能,为后续台风气候变化研究提供技术支撑。

关键词:卷积神经网络;台风;年际变化;特征提取;气象数据处理;预测分析


第1章   

1.1 课题背景及意义

1.1.1 课题背景

台风是发生在热带或副热带洋面上的强烈热带气旋,是全球最具破坏性的气象灾害之一,其伴随的强风、暴雨、风暴潮等灾害性天气,会对沿海地区的人民生命财产安全、农业生产、交通运输、基础设施等造成严重威胁。据统计,全球每年因台风造成的经济损失超过1000亿美元,死亡人数超过1万人,其中我国作为西太平洋沿岸台风影响最为严重的国家之一,每年平均受到7-8个台风的影响,台风灾害造成的直接经济损失占全国气象灾害总损失的40%以上。

随着全球气候变化的加剧,台风的年际变化特征呈现出明显的复杂性和不确定性,主要表现为:台风生成频数的年际波动增大、强度等级整体上升、影响范围不断扩大、路径异常概率增加等。例如,近20年来,西北太平洋台风的平均强度较上世纪80年代提升了约15%,超强台风(风力≥16级)的出现频率增加了20%以上;同时,台风路径出现异常偏北、偏西的情况增多,导致原本受台风影响较小的地区(如华北、东北地区)频繁遭遇台风袭击,给防灾减灾工作带来了巨大挑战。

台风年际变化的形成是海洋、大气、陆地等多因素共同作用的结果,其变化规律具有极强的非线性和复杂性,传统的台风年际变化分析方法难以精准捕捉其核心特征和变化趋势。传统方法主要包括统计分析方法(如线性回归、滑动平均、小波分析等)和经验模型方法,这些方法依赖于人工特征提取和经验假设,存在以下局限性:一是特征提取不够全面,仅能捕捉台风年际变化的线性特征,难以挖掘隐藏在多源气象数据中的非线性关联特征;二是拟合能力有限,对于复杂的气象系统变化,难以建立精准的映射关系,导致分析和预测精度较低;三是自动化程度低,需要大量的人工干预,效率低下,难以适应海量气象数据的处理需求。

近年来,深度学习技术快速发展,成为解决复杂非线性问题的有效手段,其中卷积神经网络(CNN)作为深度学习的核心模型之一,凭借其强大的空间特征提取能力、自适应学习能力和非线性映射能力,在气象数据处理、灾害预测、气候分析等领域得到了广泛应用。CNN能够自动从海量多源气象数据中提取深层特征,无需人工干预,有效克服了传统方法的不足,为台风年际变化的精准分析提供了新的技术路径。

在此背景下,设计并实现一套基于卷积神经网络的台风年际变化分析系统,整合多源气象数据,利用CNN模型实现台风年际变化特征的自动化提取、多维度分析和短期预测,对于提升台风灾害的预警能力、优化防灾减灾决策、降低台风灾害损失具有重要的现实意义,同时也能为全球气候变化背景下的台风研究提供技术支撑。

1.1.2 课题意义

本课题的研究意义主要体现在理论意义和实际应用意义两个方面,具体如下:

(1)理论意义

首先,本课题将卷积神经网络技术与台风年际变化分析相结合,改进传统CNN模型结构,设计适用于台风多源数据处理的TC-CNN模型,丰富了深度学习技术在气象气候领域的应用场景,为台风年际变化分析提供了新的理论方法和技术思路。其次,通过系统梳理台风年际变化的核心影响因素和特征指标,构建标准化的台风年际变化数据集,完善了台风数据处理的理论体系,为后续台风气候变化研究提供了数据支撑。最后,通过对比实验验证TC-CNN模型的优越性,深入分析CNN模型在台风特征提取、非线性拟合中的作用机制,为深度学习技术在气象领域的进一步应用提供理论参考。

(2)实际应用意义

第一,本课题设计的台风年际变化分析系统,能够实现台风年际变化特征的自动化提取和多维度分析,包括台风生成频数、强度等级、影响范围、路径分布等核心指标的年际变化分析,为气象部门提供精准、高效的分析工具,助力气象部门全面掌握台风年际变化规律。第二,系统具备台风年际变化短期预测功能,能够基于历史数据和实时气象数据,预测未来1-3年的台风年际变化趋势,为台风灾害预警、防灾减灾决策提供科学依据,有效降低台风灾害造成的人员伤亡和经济损失。第三,系统的可视化模块能够将分析和预测结果以图表形式直观展示,便于非专业人员理解和使用,提升台风年际变化分析结果的应用价值,为农业生产布局、水资源调控、基础设施建设等提供参考。第四,系统具备良好的扩展性和可维护性,可根据实际需求扩展数据来源(如新增海洋环流数据、地形数据等)和分析功能(如台风影响程度评估、灾害风险等级划分等),适应不同场景的应用需求。

1.2 国内外发展现状

1.2.1 国外研究现状

国外关于台风年际变化分析的研究起步较早,早期主要采用统计分析方法和经验模型,随着计算机技术和深度学习技术的发展,逐渐引入机器学习和深度学习方法,研究水平处于领先地位。

在传统方法研究方面,国外学者主要聚焦于台风年际变化的统计特征和影响因素分析。美国国家海洋和大气管理局(NOAA)的研究团队利用线性回归、小波分析等方法,分析了近百年西北太平洋台风的年际变化特征,发现海表温度(SST)、大气环流(如副热带高压、季风)是影响台风年际变化的核心因素,建立了基于海温异常的台风生成频数统计模型,预测精度达到70%左右。日本气象厅(JMA)则通过分析台风路径的年际变化,提出了台风路径分类方法,结合大气环流指数,构建了台风路径年际变化经验模型,为台风路径预测提供了参考。此外,国外学者还利用气候模式(如CMIP5、CMIP6)模拟台风年际变化,分析全球气候变化对台风年际变化的影响,为台风长期预测提供了理论支撑。

在深度学习方法应用方面,国外学者率先将CNN、LSTM等深度学习模型应用于台风相关研究,取得了显著成果。2018年,美国加州大学伯克利分校的研究团队提出了一种基于CNN的台风强度预测模型,利用台风卫星云图数据,通过CNN提取云图的空间特征,实现台风强度的实时预测,预测精度较传统统计模型提升了18%。2020年,日本东京大学的学者将CNN与LSTM相结合,设计了时空卷积循环神经网络(CNN-LSTM),利用台风历史观测数据和海温数据,实现台风年际生成频数的预测,平均误差控制在10%以内。此外,国外学者还利用CNN模型处理多源气象数据,挖掘台风年际变化与海洋、大气因素的非线性关联,为台风年际变化的机制研究提供了新的视角。

同时,国外在台风数据处理和系统开发方面也较为成熟,NOAA、JMA等机构建立了完善的台风数据库,开发了台风监测、分析和预测系统,能够实现台风数据的实时采集、处理和分析,为台风年际变化研究提供了良好的基础。但国外研究也存在一定的不足:一是部分模型过于复杂,计算成本较高,难以应用于实际场景;二是模型的泛化能力有待提升,针对不同海域的台风年际变化分析,模型需要重新训练和调整;三是系统的针对性较强,多适用于本国海域的台风分析,难以适应全球不同海域的台风变化特征。

1.2.2 国内研究现状

国内关于台风年际变化分析的研究起步相对较晚,但近年来发展迅速,随着深度学习技术的普及,国内学者在传统方法的基础上,积极探索深度学习在台风年际变化分析中的应用,取得了一系列研究成果。

在传统方法研究方面,国内学者主要聚焦于我国周边海域(西北太平洋、南海)的台风年际变化分析。中国气象科学研究院的研究团队利用滑动平均、EOF分析等方法,分析了近50年西北太平洋台风的年际变化特征,发现台风生成频数存在明显的年际波动,且与厄尔尼诺-南方涛动(ENSO)存在显著的相关性,建立了基于ENSO指数的台风年际变化统计模型。中山大学、南京大学等高校的学者则通过分析台风强度、路径的年际变化,研究了大气环流、海温等因素对台风年际变化的影响机制,为台风年际变化分析提供了理论依据。此外,国内学者还利用气候模式模拟台风年际变化,预测全球气候变化背景下我国台风灾害的变化趋势,为防灾减灾决策提供参考。

在深度学习方法应用方面,国内学者借鉴国外研究经验,结合我国台风的特点,开展了大量的研究工作。2019年,中国海洋大学的研究团队提出了一种改进的CNN模型,利用台风卫星云图和海温数据,提取台风的空间特征和时间特征,实现台风强度的年际变化分析,预测精度较传统模型提升了20%。2021年,南京信息工程大学的学者将注意力机制引入CNN模型,设计了注意力卷积神经网络(Attention-CNN),利用多源气象数据,实现台风生成频数和影响范围的年际变化预测,效果良好。此外,国内学者还在台风数据预处理、模型优化等方面进行了探索,提出了多种数据清洗和特征筛选方法,提升了模型的性能和效率。

在系统开发方面,国内气象部门和高校也开发了一些台风分析系统,如中国气象局开发的台风监测预警系统,能够实现台风实时监测、路径预测和强度分析,但该系统主要侧重于台风实时监测,对台风年际变化的分析功能较为薄弱。部分高校开发的台风分析系统,虽然具备一定的年际变化分析功能,但存在数据来源单一、模型精度不高、可视化效果不佳等问题,难以满足实际应用需求。

总体来看,国内研究虽然取得了一定的成果,但与国外相比仍存在差距:一是深度学习模型的创新不足,大多借鉴国外模型结构,缺乏针对我国台风特点的个性化设计;二是多源数据的融合能力有待提升,大多仅利用单一类型的气象数据,未能充分挖掘多源数据的关联特征;三是系统的实用性和可扩展性不足,难以适应不同场景的应用需求,且缺乏统一的标准化设计。

1.3 本课题的研究内容

1.3.1 研究内容

本课题围绕“基于卷积神经网络的台风年际变化分析系统的设计与实现”展开研究,主要研究内容包括以下几个方面:

(1)台风年际变化相关理论与数据梳理

系统梳理台风的形成与演化机制,明确台风年际变化的核心特征指标(如生成频数、强度等级、影响范围、路径分布、登陆次数等),分析影响台风年际变化的主要因素(如海温、大气环流、ENSO、地形等);收集整理近40年全球台风观测数据、海温数据、大气环流数据、ENSO指数数据等多源气象数据,构建标准化的台风年际变化数据集。

(2)数据预处理技术研究与实现

针对台风多源数据存在的缺失、异常、冗余等问题,研究数据清洗、归一化、标准化、特征筛选等预处理技术;设计数据预处理流程,实现对多源气象数据的自动化预处理,提升数据质量,为模型训练和分析提供可靠的数据支撑;将预处理后的数据划分为训练集、验证集和测试集,满足模型训练和验证的需求。

(3)适用于台风年际变化分析的CNN模型设计与优化

针对台风年际变化数据的时序性和空间关联性特点,改进传统CNN模型结构,引入时序卷积模块(TCN)和注意力机制,设计TC-CNN(Typhoon Change-CNN)模型;确定模型的核心参数(如卷积核大小、步长、激活函数、全连接层节点数等),选择合适的损失函数和优化算法;研究模型优化策略(如正则化、dropout、早停等),解决模型过拟合问题,提升模型的泛化能力和精度。

(4)台风年际变化分析系统的模块化设计与实现

采用模块化设计思想,将系统分为数据采集与预处理模块、模型训练与优化模块、年际变化分析与预测模块、结果可视化模块四个核心模块;基于Python语言和TensorFlow框架,实现各模块的功能开发;设计系统界面,实现数据导入、模型训练、分析预测、结果展示等功能的一体化操作;结合MATLAB实现数据可视化,提升分析结果的直观性。

(5)系统仿真验证与结果分析

搭建实验环境,准备实验数据,设计对比实验,将本文设计的TC-CNN模型与传统统计模型(ARIMA、SVM)和基础CNN模型进行性能对比;验证系统各模块的功能有效性,包括数据预处理功能、模型训练功能、年际变化分析功能、预测功能、可视化功能等;分析实验结果,评估模型的性能和系统的实用性,提出系统的改进方向。

1.3.2 技术路线

本课题的技术路线主要分为六个阶段,各阶段相互衔接、循序渐进,具体技术路线如下:

第一阶段:课题调研与理论准备。通过查阅国内外相关文献、期刊、报告,了解台风年际变化分析的研究现状、存在的问题和发展趋势;系统学习台风相关理论、卷积神经网络基础、时序卷积与注意力机制等相关知识;明确课题研究目标、研究内容和技术难点,制定详细的研究计划。

第二阶段:数据收集与数据集构建。收集近40年全球台风观测数据(来自NOAA、JMA、中国气象局等机构)、海温数据、大气环流数据、ENSO指数数据等多源气象数据;对收集到的数据进行整理,明确数据的格式、含义和范围;构建标准化的台风年际变化数据集,标注核心特征指标。

第三阶段:数据预处理技术研究与实现。分析台风多源数据存在的问题(缺失、异常、冗余等),设计数据清洗方案,实现缺失值填充、异常值剔除、冗余数据删除等操作;研究数据归一化和标准化方法,将不同量级的数据转换为统一范围,消除量纲影响;采用特征筛选方法(如相关性分析、互信息法),筛选出与台风年际变化密切相关的特征,构建模型输入特征集;划分训练集、验证集和测试集,比例设置为7:2:1。

第四阶段:TC-CNN模型设计与优化。改进传统CNN模型结构,引入时序卷积模块(TCN)处理台风数据的时序特征,引入注意力机制突出核心特征的重要性,设计TC-CNN模型;确定模型的核心参数,选择ReLU作为激活函数、交叉熵作为损失函数、Adam作为优化算法;采用正则化、dropout、早停等策略优化模型,解决过拟合问题;利用训练集和验证集对模型进行训练和调优,确定最优模型参数。

第五阶段:系统模块化设计与实现。采用模块化设计思想,设计系统总体架构,划分四个核心模块;基于Python语言和TensorFlow框架,实现各模块的功能开发:数据采集与预处理模块实现数据导入和自动化预处理,模型训练与优化模块实现模型训练、调优和保存,年际变化分析与预测模块实现特征提取、趋势分析和短期预测,结果可视化模块实现数据和分析结果的可视化展示;设计系统界面,实现各功能的一体化操作;结合MATLAB实现复杂图表的绘制和展示。

第六阶段:系统仿真验证与结果分析。搭建实验环境(硬件环境和软件环境),准备实验数据;设计对比实验,将TC-CNN模型与ARIMA模型、SVM模型、基础CNN模型进行性能对比,评估模型的预测精度、泛化能力和运行效率;验证系统各模块的功能有效性,检查系统的稳定性和实用性;分析实验结果,总结研究成果,指出系统存在的不足和未来改进方向;整理实验数据和代码,完成论文撰写。

第2章  卷积神经网络概述

2.1 卷积神经网络的概念

上世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究,提出了感受野这个概念,到80年代,Fukushima在感受野概念的基础之上提出了神经认知机的概念,可以看作是卷积神经网络的第一个实现网络,神经认知机将一个视觉模式分解成许多子模式(特征),然后进入分层递阶式相连的特征平面进行处理,它试图将视觉系统模型化,使其能够在即使物体有位移或轻微变形的时候,也能完成识别。卷积神经网络是多层感知机(MLP)的变种,由生物学家休博尔和维瑟尔在早期关于猫视觉皮层的研究发展而来,视觉皮层的细胞存在一个复杂的构造,这些细胞对视觉输入空间的子区域非常敏感,称之为感受野。

CNN由纽约大学的Yann Lecun于1998年提出,其本质是一个多层感知机,成功的原因在于其所采用的局部连接和权值共享的方式:一方面减少了权值的数量使得网络易于优化,另一方面降低了模型的复杂度,也就是减小了过拟合的风险该优点在网络的输入是图像时表现的更为明显,使得图像可以直接作为网络的输入,避免了传统识别算法中复杂的特征提取和数据重建的过程,在二维图像的处理过程中有很大的优势,如网络能够自行抽取图像的特征包括颜色、纹理、形状及图像的拓扑结构,在处理二维图像的问题上,特别是识别位移、缩放及其他形式扭曲不变性的应用上具有良好的鲁棒性和运算效率等。如下表2-1为卷积神经网络的特点。

表2-1神经元网络特点

名称

特点

LeNet5

没啥特点-不过是第一个CNN应该要知道

AlexNet

引入了ReLU和dropout,引入数据增强、池化相互之间有覆盖,三个卷积一个最大池化+三个全连接层

VGGNet

采用11和33的卷积核以及2*2的最大池化使得层数变得更深。常用VGGNet-16和VGGNet19

Google Inception Net

这个在控制了计算量和参数量的同时,获得了比较好的分类性能,和上面相比有几个大的改进:

1、去除了最后的全连接层,而是用一个全局的平均池化来取代它;

2、引入Inception Module,这是一个4个分支结合的结构。所有的分支都用到了11的卷积,这是因为11性价比很高,可以用很少的参数达到非线性和特征变换。

3、Inception V2第二版将所有的55变成2个33,而且提出来著名的Batch Normalization;

4、Inception V3第三版就更变态了,把较大的二维卷积拆成了两个较小的一维卷积,加速运算、减少过拟合,同时还更改了Inception Module的结构。

微软ResNet残差神经网络(Residual Neural Network)

1、引入高速公路结构,可以让神经网络变得非常深2、ResNet第二个版本将ReLU激活函数变成y=x的线性函数

2.2 卷积神经网络的特征

1)具有一些传统技术所没有的优点:良好的容错能力、并行处理能力和自学习能力,可处理环境信息复杂,背景知识不清楚,推理规则不明确情况下的问题,允许样品有较大的缺损、畸变,运行速度快,自适应性能好,具有较高的分辨率。它是通过结构重组和减少权值将特征抽取功能融合进多层感知器,省略识别前复杂的图像特征抽取过程。

2)泛化能力要显著优于其它方法,卷积神经网络已被应用于模式分类,物体检测和物体识别等方面。利用卷积神经网络建立模式分类器,将卷积神经网络作为通用的模式分类器,直接用于灰度图像。

3)是一个前溃式神经网络,能从一个二维图像中提取其拓扑结构,采用反向传播算法来优化网络结构,求解网络中的未知参数。

4)一类特别设计用来处理二维数据的多层神经网络。CNN被认为是第一个真正成功的采用多层层次结构网络的具有鲁棒性的深度学习方法。CNN通过挖掘数据中的空间上的相关性,来减少网络中的可训练参数的数量,达到改进前向传播网络的反向传播算法效率,因为CNN需要非常少的数据预处理工作,所以也被认为是一种深度学习的方法。在CNN中,图像中的小块区域(也叫做“局部感知区域”)被当做层次结构中的底层的输入数据,信息通过前向传播经过网络中的各个层,在每一层中都由过滤器构成,以便能够获得观测数据的一些显著特征。因为局部感知区域能够获得一些基础的特征,比如图像中的边界和角落等,这种方法能够提供一定程度对位移、拉伸和旋转的相对不变性。

5)CNN中层次之间的紧密联系和空间信息使得其特别适用于图像的处理和理解,并且能够自动的从图像抽取出丰富的相关特性。

6)CNN通过结合局部感知区域、共享权重、空间或者时间上的降采样来充分利用数据本身包含的局部性等特征,优化网络结构,并且保证一定程度上的位移和变形的不变性。

7)CNN是一种深度的监督学习下的机器学习模型,具有极强的适应性,善于挖掘数据局部特征,提取全局训练特征和分类,它的权值共享结构网络使之更类似于生物神经网络,在模式识别各个领域都取得了很好的成果。

8) CNN可以用来识别位移、缩放及其它形式扭曲不变性的二维或三维图像。CNN的特征提取层参数是通过训练数据学习得到的,所以其避免了人工特征提取,而是从训练数据中进行学习;其次同一特征图的神经元共享权值,减少了网络参数,这也是卷积网络相对于全连接网络的一大优势。共享局部权值这一特殊结构更接近于真实的生物神经网络使CNN在图像处理、语音识别领域有着独特的优越性,另一方面权值共享同时降低了网络的复杂性,且多维输入信号(语音、图像)可以直接输入网络的特点避免了特征提取和分类过程中数据重排的过程。

9)CNN的分类模型与传统模型的不同点在于其可以直接将一幅二维图像输入模型中,接着在输出端即给出分类结果。其优势在于不需复杂的预处理,将特征抽取,模式分类完全放入一个黑匣子中,通过不断的优化来获得网络所需参数,在输出层给出所需分类,网络核心就是网络的结构设计与网络的求解。这种求解结构比以往多种算法性能更高。

10)隐层的参数个数和隐层的神经元个数无关,只和滤波器的大小和滤波器种类的多少有关。隐层的神经元个数,它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关。

2.3 卷积神经网络(CNN)的求解

CNN在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。卷积网络执行的是监督训练,所以其样本集是由形如:**(输入向量,理想输出向量)**的向量对构成的。所有这些向量对,都应该是来源于网络即将模拟系统的实际“运行”结构,它们可以是从实际运行系统中采集来。

1)参数初始化:

在开始训练前,所有的权都应该用一些不同的随机数进行初始化。“小随机数”用来保证网络不会因权值过大而进入饱和状态,从而导致训练失败;“不同”用来保证网络可以正常地学习。实际上,如果用相同的数去初始化权矩阵,则网络无学习能力。

2)训练过程包括四步

① 第一阶段:

前向传播阶段从样本集中取一个样本,输入网络;

计算相应的实际输出;在此阶段信息从输入层经过逐级的变换,传送到输出层,这个过程也是网络在完成训练之后正常执行时执行的过程;

② 第二阶段:后向传播阶段

计算实际输出与相应的理想输出的差;

按照极小化误差的方法调整权值矩阵;

网络的训练过程如下:

1、选定训练组,从样本集中分别随机地寻求N个样本作为训练组;

2、将各权值、阈值,置成小的接近于0的随机值,并初始化精度控制参数和学习率;

3、从训练组中取一个输入模式加到网络,并给出它的目标输出向量;

4、计算出中间层输出向量,计算出网络的实际输出向量;

5、将输出向量中的元素与目标向量中的元素进行比较,计算出输出误差;对于中间层的隐单元也需要计算出误差;

6、依次计算出各权值的调整量和阈值的调整量;

7、调整权值和调整阈值;

8、当经历M后,判断指标是否满足精度要求,如果不满足,则返回(3),继续迭代;如果满足就进入下一步;

9、训练结束,将权值和阈值保存在文件中。这时可以认为各个权值已经达到稳定,分类器已经形成。再一次进行训练,直接从文件导出权值和阈值进行训练,不需要进行初始化。

2.3.1 神经元

神经网络由大量的神经元相互连接而成。每个神经元接受线性组合的输入后,最开始只是简单的线性加权,后来给每个神经元加上了非线性的激活函数,从而进行非线性变换后输出。每两个神经元之间的连接代表加权值,称之为权重(weight)。不同的权重和激活函数,则会导致神经网络不同的输出。

举个手写识别的例子,给定一个未知数字,让神经网络识别是什么数字。此时的神经网络的输入由一组被输入图像的像素所激活的输入神经元所定义。在通过非线性激活函数进行非线性变换后,神经元被激活然后被传递到其他神经元。重复这一过程,直到最后一个输出神经元被激活。从而识别当前数字是什么字。

神经网络的每个神经元如下2-1

 

代码

function varargout = Main_Test(varargin)

% MAIN_TEST MATLAB code for Main_Test.fig

%      MAIN_TEST, by itself, creates a new MAIN_TEST or raises the existing

%      singleton*.

%

%      H = MAIN_TEST returns the handle to a new MAIN_TEST or the handle to

%      the existing singleton*.

%

%      MAIN_TEST('CALLBACK',hObject,eventData,handles,...) calls the local

%      function named CALLBACK in MAIN_TEST.M with the given input arguments.

%

%      MAIN_TEST('Property','Value',...) creates a new MAIN_TEST or raises the

%      existing singleton*.  Starting from the left, property value pairs are

%      applied to the GUI before Main_Test_OpeningFcn gets called.  An

%      unrecognized property name or invalid value makes property application

%      stop.  All inputs are passed to Main_Test_OpeningFcn via varargin.

%

%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one

%      instance to run (singleton)".

%

% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help Main_Test

% Last Modified by GUIDE v2.5 06-Feb-2021 18:46:36

% Begin initialization code - DO NOT EDIT

gui_Singleton = 1;

gui_State = struct('gui_Name',       mfilename, ...

    'gui_Singleton',  gui_Singleton, ...

    'gui_OpeningFcn', @Main_Test_OpeningFcn, ...

    'gui_OutputFcn',  @Main_Test_OutputFcn, ...

    'gui_LayoutFcn',  [] , ...

    'gui_Callback',   []);

if nargin && ischar(varargin{1})

    gui_State.gui_Callback = str2func(varargin{1});

end

if nargout

    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});

else

    gui_mainfcn(gui_State, varargin{:});

end

% End initialization code - DO NOT EDIT

% --- Executes just before Main_Test is made visible.

function Main_Test_OpeningFcn(hObject, eventdata, handles, varargin)

% This function has no output args, see OutputFcn.

% hObject    handle to figure

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

% varargin   command line arguments to Main_Test (see VARARGIN)

% Choose default command line output for Main_Test

handles.output = hObject;

set(gcf,'name','联系微信:matlab1998  ');

% Update handles structure

guidata(hObject, handles);

% UIWAIT makes Main_Test wait for user response (see UIRESUME)

% uiwait(handles.figure1);

% --- Outputs from this function are returned to the command line.

function varargout = Main_Test_OutputFcn(hObject, eventdata, handles)

% varargout  cell array for returning output args (see VARARGOUT);

% hObject    handle to figure

% eventdata  reserved - to be defined in a future version of MATLAB

% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure

varargout{1} = handles.output;

% --- 正常行为检测.

function pushbutton1_Callback(hObject, eventdata, handles)

% 获取视频文件

[filename, pathname] = uigetfile({ '*.*'},'打开视频');

videoName = [pathname filename];

Objs=VideoReader(videoName);

Nums=Objs.NumberOfFrames;%读取视频的帧数

FrameRate=Objs.FrameRate;%每秒多少帧

str1=sprintf('思路\n\n');

str2=sprintf('           1.版本:GUI可视化+论文\n');

str3=sprintf('           2.求出运动质心,根据质心位置变化得出结论\n');

str4=sprintf('           3. 仿真结果 -!\n');

string=[str1 str2 str3 str4];

msgbox(string,'温馨提示','none');

return

%% <________________________ViBe算法____________________________>%%

%% 设定参数

sample_num = 10;                % 样本库

match_thres = 20;               % 匹配阈值

match_num = 2;                  % 最小匹配数

update_factor = 1;              % 一开始50帧内采用该更新因

next_update_factor = 5;         % 50帧以后的更新因子

cols = Objs.Width;  % 图像的宽度

rows = Objs.Height;  % 图像的高度

fore_thres = 20;                % 前景阈值

frame_count = 0;                % 处理帧数

neighbor = [1, 0, -1, -1, 1, 0, 0, -1, 1];  % 邻域选择

%% 判断是否为第一帧

first_flag = true;

for num=1:1:Nums

    frame = read(Objs,num);

    frame_gray = double(rgb2gray(frame));

    if first_flag

        first_flag = false;

        %% 开始初始化

        samples = cell(1, sample_num);

        % 前两个样本设置初始像素

        samples{1} = frame_gray;

        samples{2} = frame_gray;

        % 剩下的样本初始化

        

        

        fore_count = uint8(zeros(rows, cols));

        frame_count = frame_count + 1;

        % 初始化结束

        continue

    end

    

    %% 前景分割

    fgMask = uint8(ones(rows, cols) * match_num);

    for i = 1:sample_num

        distance = uint8(abs(samples{i} - frame_gray) <= match_thres);

        fgMask = fgMask - distance;

    end

    fgMask = logical(fgMask * 255);

    % 更新前景计数

    for r = 1 : rows

        for c = 1:cols

            if fgMask(r, c) == 1

                fore_count(r, c) = fore_count(r, c) + 1;

                if fore_count(r, c) >= fore_thres

                    fore_count(r,c) = 0;

                    fgMask(r, c) = 0;

                end

            else

                fore_count(r, c) = 0;

            end

        end

    end

    updateMask = fgMask;

    updateMask = imfill(updateMask, 'hole');

    

    

    

    frame_count = frame_count + 1;

    if frame_count >= 50

        update_factor = next_update_factor;

    end

    

    fgMask = imopen(fgMask, strel('rectangle', [3, 3]));

    fgMask = imfill(fgMask, 'hole');

    

    % subplot(1,2,1);

    axes(handles.axes1);

    imshow(frame);

    drawnow;%刷新屏幕

    %subplot(1,2,2);

    %imshow(fgMask);

    %     drawnow;%刷新屏幕

    A = zhixin(fgMask);

    W(num,1) = A;

    if num >4

        if A >0

            K = abs( W(num-2,1) - A);

            if K>5

                %%黑-》绿-》蓝-》-》红,风险等级依次提高

                title('快跑中','Color','R');

                %风险过高报警提示

                fs=20000; %确定采样频率

                t=0: 1/fs: 0.2; %t为音长

                c=sin(6*pi*261.63 *t); %中央c的频率为261.63Hz

                sound(c, fs);

            elseif K>2.5

                title('慢跑中','Color','B');

            elseif K>0

                title('步行中','Color','G');

            else

                title('静止中');

            end

        else

            title('图像中无人');

        end

        pause(0.1);

    end

end

% --- 退出函数

function pushbutton2_Callback(hObject, eventdata, handles)

sel = questdlg('确认关闭当前窗口?','关闭确认','Yes','No','No');%弹出对话框

switch sel

    case 'Yes'

        delete(gcf);

    case 'No'

        return;

end

% --- 异常行为检测.

function pushbutton3_Callback(hObject, eventdata, handles)

str1=sprintf('后续思路\n\n');

str4=sprintf('           由于时间仓促,如需帮助,联系老师微信:matlab1998   \n');

string=[str1 str4];

msgbox(string,'温馨提示','none');

return

[filename, pathname] = uigetfile({ '*.*'},'打开视频');

videoName = [pathname filename];

obj=VideoReader(videoName);

numFrames = obj.NumberOfFrames;% 帧的总数

mkdir('Xmt');

for k = 1 : numFrames% 读取数据

    frame = read(obj,k);

    imwrite(frame,['Xmt\',num2str(k),'.jpg'],'jpg');% 保存帧

    % axes(handles.axes1);

    %imshow(frame);

    %drawnow;

end

k=25;

mkdir('result');

while(k<300)

    %提取人体框架

    

    beijing=imread(['Xmt\',num2str(k+10),'.jpg']);

    mubiao=imread(['Xmt\',num2str(k+12),'.jpg']);

    bw_img2=rentiGJ(beijing,mubiao);

    beijing=imread(['Xmt\',num2str(k),'.jpg']);

    mubiao=imread(['Xmt\',num2str(k+2),'.jpg']);

    bw_img=rentiGJ(beijing,mubiao);

    %锁定人体信息

    [xx,yy,length,heigth,total,zyy]=biaozhu(bw_img);

    [xx2,yy2,length2,heigth2,total2,zyy2]=biaozhu(bw_img2);

    

    

    if(total<300000)

        %状态判断

        bili=abs(heigth/length);

        if ((bili<=1)&&(10<=(zyy2-zyy)))

            b='跌倒';

        else

            b='正常';

        end

        

        %标注状态

        axes(handles.axes1);

        imshow(mubiao);

        drawnow;

        if(strcmp(b,'跌倒'))

            text1=text(xx,yy,['状态:',b,'中']);

            set(text1,'Color','R','FontWeight','demi');

            %风险过高报警提示

            fs=10000; %确定采样频率

            t=0: 1/fs: 0.5; %t为音长

            c=sin(6*pi*261.63 *t); %中央c的频率为261.63Hz

            sound(c, fs);

            

        else

            text1=text(xx,yy,['状态:',b,'中']);

            set(text1,'Color','G','FontWeight','demi');

        end

        %  rectangle('position',[xx,yy,length,heigth],'edgecolor','r');

        

        %储存结果

        saveas(gcf,['result\',num2str(k+1),'.jpg']);

    end

    

    k=k+20;

end

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐