【《受电弓关键点定位训练算法设计案例分析》7800字】_第1页
【《受电弓关键点定位训练算法设计案例分析》7800字】_第2页
【《受电弓关键点定位训练算法设计案例分析》7800字】_第3页
【《受电弓关键点定位训练算法设计案例分析》7800字】_第4页
【《受电弓关键点定位训练算法设计案例分析》7800字】_第5页
已阅读5页,还剩8页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

受电弓关键点定位训练算法设计案例分析本章首先分析CenterNet卷积神经网络的结构,根据结构原理复现CenterNet原文所得到的测试结果。在官网所给的训练人体关键点的检测函数基础之上,依据受电弓关键点的定位原理修改代码结构,成功训练复杂背景下受电弓关键点定位模型。1.1CenterNet基本网络框架CenterNet用到的主干特征网络有多种,一般是以HourglassNetwork、DLANet或者Resnet为主干特征提取网络,Hourglass网络是在ECCV2016中的Stackedhourglassnetworksforhumanposeestimation论文中提出的一种网络,用来解决人体位姿估计问题,其思路主要通过将多个漏斗形状的网络堆叠起来,从而获得多尺度信息[31]。DLA全称是DeepLayerAggregation,Aggregation聚合是目前设计网络结构的常用的一种技术,能够迭代式地将网络结构的特征信息融合起来,让模型有更高的精度和更少的参数[32]。由于Centernet所用到的HourglassNetwork参数量太大,有19000W参数,DLANet并没有Keras资源,相比而言,本项目以Resnet101作为主干网络,结构图1.1所示。图1.1ResNet101的整体结构ResNet101有两个基本的块,分别名为ConvBlock和IdentityBlock。Conv2d为卷积,BatchNorm为标准化,Relu为激活函数[33]。如图中所示,ConvBlock和IdentityBlock的基本模块是一致的,而区别就是在于是否有残差边部分。其中ConvBlock在残差边部分有Conv2d(卷积模块)和BatchNorm(标准化模块),而IdentityBlock没有残差边部分,从而导致ConvBlock输入和输出的维度是不一样的,不可以连续叠加,而IdentityBlock输入和输出的维度是相同的,可以相互关联。右边框图显示了ResNet101的主体结构,ConvBlock改变网络的维度,而IdentityBlock用于增加网络深度。在CenterNet神经网络的搭建过程中,有卷积层,反卷积层,池化层,线性激活层和残差连接等小的单元。卷积层是卷积神经网络的核心,其最大的优点在于参数共享和稀疏连接,同时也是卷积神经网络的最基本的功能性单元。在上面框图中所提到的Conv2d卷积模块就是2D卷积。卷积层通常定义的参数如下,分别是in_channel,out_channel,这两个参数分别指的是输入和输出的通道数,本项目的训练图片高度和宽度分别为1536*2048。经过CenterNet神经网络预处理之后的图片大小为512*512*3,其中3就是指代的输入通道数,RGB图像一般对应通道数为3。stride是步长,即卷积核在原图像中每次移动的像素数,padding是填充补零的行(列)数,bias是偏差。在上述对Conv2D二维卷积层的表述中,我们可以看出卷积神经网络的两大优点:权值共享和稀疏连接[34]。权值共享的意思是在每一次迭代训练中,卷积核的权值不变,也就是说是被同一个卷积核所过滤的,无论卷积核在原图中如何移动,这些权值都是共享的,这样的话有效减少了参数个数。稀疏连接的意思是在一次卷积计算中,输出层的一个像素点只与输入层的有限个像素点的数值相联系,也就是说只学习训练图片中局部的特征。卷积神经网络的这两大优点,大大减少了其参数数量,使得训练速度得到算法上的保障。卷积神经网络需要一层非线性的激活层,因为卷积过程、全结合层包括池化都是线性的。如果不使用非线性激活函数,不论卷积神经网络的层数是多少,得到的输出结果都将是与输入值是线性的,也就是说最后一层卷积层其实是输入层的线性组合,可以用一个隐藏层组合,所以没有必要设计隐藏层。因此,非线性激活函数必须在卷积神经元网络中应用。在CenterNet卷积神经网络结构中,ReLu作为非线性激活函数。如图1.2所示,ReLu非线性激活函数的计算公式是将输入分为两个段进行映射,函数表达式为。如果输入值小于0,则原始值映射为0。如果输入值大于0,则根据输入值原值进行传输。也就是说,在做正向计算的时候,会损失大量的特征,实现局部特征提取。从导数可以看出,在逆向计算中,梯度没有损失。ReLu非线性激活函数的优势在于相比于一些需要计算指数、计算复杂性较高的函数,Relu非线性激活函数只需要一个阈值来获得激活值,但是由于x<0时Relu梯度为0,所以该Relu的负梯度被设置为零,神经元再也不能被任何数据激活。神经元的梯度如果发生这种情况,之后将永远被置零。这也就是说明ReLu非线性激活函数神经元坏死了,对于输入数据将没有响应,因此,在卷积神经网络中,如果ReLu非线性激活函数神经元坏死,将导致非线性激活层在整个网络中失去作用,输出结果将是输入结果的线性组合。这也是上文提到过的,将导致输出范围不可变,结果线性单调。因此,在实际应用卷积神经网络中,需要注重学习率的控制,如果学习率超过一定值,将会导致非线性激活函数神经元坏死,从而产生线性输出。图1.2ReLu非线性激活函数[35]池化层有两种池化方式,分为最大值池化和平均值池。池化层的特性主要有两个,一是不变性,即对平移、旋转和缩放变换的不变性;另一个是参数的减少,也就是降参性。通过池化的操作,可以减少参数的数量,降低神经网络的维度,防止过度拟合,提高训练出的模型的通用性和鲁棒性。除此之外,池化层与非线性激活函数相似,也可以保证卷积神经网络的非线性,为了不忽略细节信息和提高精确度,在本项目中我采用的是最大池化,最大池化的原理如图1.3所示,假设输入层大小4*4,使用大小为2*2的卷积核对输入层进行卷积过滤,步长大小为2,输出层大小为2*2。以右上角绿色框为例,输入层的四个数中最大为8,则经过大小为2*2的卷积核过滤之后,只保留最大值8作为输出,这就是最大池化的基本原理。最大池化的作用在于提取更多的纹理信息,这与本项目所追求的目标是一致的。在受电弓关键点定位过程中,需要应用CenterNet卷积神经网络从复杂的背景中提取出受电弓六个关键点的坐标,而平均池化的功能在于保留图片背景信息,显然这与本项目任务要求不符。输入的六个受电弓关键点坐标经过最大池化后,可以更好地与复杂背景分离,更容易被提取出来。图1.3最大池化流程示意图[35]Resnet101卷积网络的卷积核大小为7*7,步长为2*2,通道数为64。本项目所训练图片的大小为1536*2048,从ResNet101的神经网络结构代码中可以看出,训练图像要经过一步pre_process,也就是预处理部分。经过预处理之后,原训练图片转换为典型输入图片大小为512*512*3,其中3的含义是代表RGB图像通道数为3。预处理之后的图片经过卷积层,当输入图片经过Conv2d卷积之后,将变为256*256*64。之后ResNet101卷积网络就开始ConvBlock与IdentityBlock的堆叠过程,具体堆叠方法被定义为make_layer,其中Conv2d与BatchNorm被定义为downsample。判断downsample是否为None,也就是判断是否有残差边部分。如果是None执行IdentityBlock堆叠,反之执行ConvBlock。如下图所示,Make_layer执行一次ConvBlock之后,执行多次IdentityBlock,最终输出图片的shape为16*16*2048,即为输入图片的初步特征,具体流程如图1.4所示。图1.4典型图片经历ResNet101大小变换流程根据CenterNet神经网络源代码,对于初步特征采用DCNv2可变卷积网络进行上采样。在引入DCnv2可变卷积网络之前,视觉识别的一个核心问题是适应几何变化或对目标尺度、姿态、视图和组件变形中的几何变化进行建模。解决这个问题有两种方法,第一种方法是创建具有足够期望变化的训练数据集。这通常是通过添加现有数据的样本来实现的,例如仿射变换。训练出来的模型鲁棒性可以通过大量数据的训练而有所提升,但这种方式的弊端在于过于庞大的训练数据集和复杂的模型参数。实践表明,当训练数据集过大会导致显卡崩溃,训练失败。而更换高级的显卡和显卡驱动,必然会意味着过高的资金成本。第二种方法是使用不变的转换特征和算法,包括许多常见的技术,如SIFT(比例不变的特征转换)和滑动窗口对象目标检测范例。这种方法的问题是几何变换必须是固定且已知的。然而,面对像本项目这样从复杂的背景中提取受电弓关键点的情况,需要根据已经输入的训练图片作为基础,不断增加数据、提取特征,并且改变训练算法参数。这样一来,几何变换固定的假设防止了应对未知几何变换的能力,这些未知几何变换没有得到适当的建模,会导致结果误差较大。除此之外,对于更复杂的转换,不变性质和固定设计的特征算法相对比较困难甚至是不可能实现的。即使是在复杂变换已知的条件下,固定的几何变换也避免避免不了粗大误差的出现,而且这样会导致工作量过大,不是可取的训练方式。卷积神经元网络(CNN)在图像分类、语义分割和目标识别方面取得了显著的成功,但仍然没有避免上述的两个问题[36~37]。卷积神经元网络对几何变换建模的能力主要来自于大量的数据增强、高容量模型计算和一些简单的人工构建模块(例如,对于小的平移具有不变性的最大池化)。简而言之,CNN本质上仅限于几何变换。限制来自CNN模块的固定几何变换。首先,卷积单元将输入的采样区间固定在一个位置。池化层的步长与过滤核参数固定,则卷积神经网络将以不变的速度对输入图片做池化处理,空间分辨率降低速度固定。ROI(感兴趣区域)也是池化层划分为固定的空间块。例如,同一CNN层的所有活动单元都具有相同的接收视野。对于在空间位置编码的高质量CNN层来说,这是不可取的。应对不同的位置有不同的尺度,或者可能对应有可变形的目标,因此在这种情况下,全卷积网络是具有精细定位的视觉识别的理想选择。全卷积网络相对于感兴趣区域的固定空间块具有完整的卷积网络和自适应尺度,更适合精细定位的视觉识别项目。随着卷积神经网络的深入研究,基于可变卷积核的DCN网络也被引入到计算机视觉项目研发中[38]。DCN可变性卷积网络的卷积和池化相较于CNN卷积和特征映射的三维空间,都是在2D的空间域上进行的,固定通道操作维度不变。具体来讲,传统卷积的3*3卷积核定义与卷积核映射如下: (1.1) (1.2)在可变形卷积中,卷积的映射是由下式表示的: (1.3)从公式可见,DCN卷积神经网络的可变形卷积在传统卷积核上加了一个偏移量,这个偏移量就是位置偏移,一般来说,在原始图像的(0,0)位置有一个点,通过偏移,可以将其位置定位于(1.4,1.6)。由于偏移位置的偏移量可能是浮点数,因此上述公式的具体值必须通过双线性插值来计算。卷积核具有与当前卷积层相同的空间分辨率和扩张,输出偏移量与输入特征映射具有相同的空间分辨率。偏移量是通过对原始特征层进行卷积得到的。比如输入特征层是w×h×c,应用卷积操作输入特征得到w×h×2c的偏移场[39]。这里的w和h即图像的宽度和高度和原始特征层的图像高度和宽度是相同的,偏移场里面的值是相对于输入的原始特征层的偏移量,由于可变性卷积网络应用于二维图像,所以偏移量有x和y两个方向,也就是横纵两个偏移方向,偏移场的通道数是2c。偏移场里的偏移量是卷积得到的,它可以是一个浮点数,因此偏移位置的固有值必须通过双向插值来计算。对于正相关的样本,样本特征应集中在感兴趣区域,如果特征中包含了过多超出感兴趣区域的内容,输出结果会受到影响与损失,与预期模型效果有较大的偏差。而负相关样本则恰恰相反,引入一些超出感兴趣区域的特征反而有助于帮助卷积神经网络划分这个区域是否是背景区域。DCNv1卷积神经网络引入一种可变形卷积,这种卷积能更好的适应目标的几何变换,但是DCNv1可视化结果显示其接受范围对应位置超出了相应靶区,导致不影响特征的训练图片内容,为了得到合适得训练模型,按理来说,理想的情况是所有的对应位置都分布在靶区。为了解决该问题,Zhu等人的团队于2018年提出DCNv2可变卷积神经网络,相比DCNv1卷积神经网络的拓展点有以下两点,第一点是开发可变形卷积,提高可变卷积神经网络构建训练模型的能力[40]。第二点是提供特征模拟方案指导卷积神经网络训练的形成。测试结果表明,DCNv2可变卷积神经网络性能更好,目标检测和分割效果显著提高。在DCNv2可变卷积神经网络文献中,提出了三个概念,有效接收范围、有效采样点和显著误差限制。有效接受范围是指网络中每个节点都会计算特征图像中的像素点,而每个像素点都有它自己的接受区域。然而,接受范围中的所有像素对这个点的响应的都不具有相同的贡献,贡献大小与卷积核权重有关,因此使用实际的接收场来表示该贡献的差异。有效采样点意味着是对于卷积核的采样点和池化的执行文件位置进行分析可以帮助理解DCN可变卷积神经网络。有效的采样位置不仅反映了采样点的位置,也反映了每个位置的贡献。显著误差区域的定义是指网络中每个节点的响应,不是图像的所有的区域对其都有影响,也就是说,如果去掉一些对节点没有作用效果的区域,节点的响应保持不变。根据这个属性,DCNv2可变卷积神经网络的研究团队将每个节点的支持域设置为最小值,该最小值可以产生与整个图相同的响应,它被称之为错误边界显著性区域。从有效接受范围的角度来看,CNN卷积神经网络也具备一定的对于接受区域形变建模能力,并非为完全的方形。DCNv1版本的可变卷积神经网络在此基础之上,增加了CNN卷积神经网络对形变建模能力,对正相关样本更好地突出了物体特征,对负相关样本概括了更多的背景信息。从有效采样位置可以确定,传统CNN卷积神经网络对形变的建模能力很有可能是通过调整卷积核的值来实现的,中心位置幅值相对较大、边缘幅值越小。DCNv1可变卷积神经网络只偏移补偿普通的卷积采样点,DCNv2可变卷积神经网络还允许调整每个采样位置或者执行函数的峰值,即该点的特征乘以一个系数,如果系数为0,这就意味着该区域这一部分的特征不影响产出,因此这也是调节支持域的一种方法,卷积核映射公式如下: (1.4)Zhu等人的团队发现对于ROI分类时,普通CNN卷积神经网络或者DCNv1可变卷积神经网络的错误边界显著性区域都会延伸到ROI之外,于是这就导致并不与感兴趣区域相关的背景内容就会影响ROI特征的提取,必然会影响目标检测或关键点定位的结果。对于DCNv2可变卷积神经网络来说,利用执行函数峰值可调整性,将ROI之外的调节系数设为0,则可以直接去除无关的背景,最终DCNv2相比于DCNv1提高了1.7个百分点。在本项目中,采用DCNv2可变卷积神经网络作为上采样神经网络,具体环境搭建步骤将在1.2中说明。受电弓训练图片经过CenterNet神经网络计算流程总结如下:图片大小1536×2048的带有已标记好六个关键点的受电弓训练图片缩放到512x512尺寸(长边缩放到512,短边补0),随后将缩放为1x3x512x512的图片输入网络,图片经过Resnet101卷积网络提取特征得到Feature1尺寸为1x2048x16x16Feature1经过上采样DCNv2可变卷积神经网络,三次上采样后得到Feature2尺寸为1x64x128x128将Feature2分别送入三个分支进行预测,预测heatmap尺寸为1x80x128x128(表示80个类别),预测长宽尺寸为1x2x128x128(2表示长和宽),预测中心点偏移量尺寸为1x2x128x128(2表示x,y),然而本项目所做的是受电弓关键点定位,而heatmap与长宽尺寸是应用于目标检测项目中的,所以只需要关注中心点的偏移量即可。计算中心点偏移的Loss函数:Loff损失函数公式如下,其只对正样本的偏移值损失进行计算。其中表示预测的偏移值,p为图片中目标中心点坐标,R为缩放尺度,为缩放后中心点的近似整数坐标。假设图片实际中心点p为(125,63),由于图片的尺寸为512*512,缩放尺度R=4,因此缩放后的128x128尺寸下中心点坐标为(31.25,15.75),相对于整数坐标(31,15)的偏移值为(0.25,0.75),在CenterNet卷积神经网络结构中,有命令为loss.backward。训练过程中,在每一个epoch之后都会将Loss函数的值返回神经网络,指导模型在训练过程中朝着收敛的方向前进,最终需要损失函数值要低于一个预设值则表示训练成功。本项目中,设定的epoch(训练次数)为120次,lr(损失函数预设值)为,batchsize(单次训练的个数)为1。1.2CenterNet神经网络环境搭建根据Github官网上所给的搭建流程,在Windows系统下的Anaconda环境开始进行CenterNet神经网络环境搭建,核心步骤如下:首先下载基础软件为:VS2017,pytorch1.4.0,torchvision0.5.0,CUDA10.1以及Cudnn7.6.5。首先现在python环境下搭建CenterNet深度学习环境并激活,在CenterNet深度学习环境下安装pytorch与torchvision。在安装好环境所需的各种数据库之后,在编译编译DCNv2的时候遇到了如下问题:Error:command’C:\\ProgramFiles\\NVIDIAGPUComputingTookit\\CUDA\\v10.1\\bin\\nvcc.exe’failedwithexitstatus1按照CSDN网站上的问题描述,我做了如下尝试:1.Cudnn.cpp这个文件第144行的cudnnSetConvolution2dDescriptor函数里面缺参数,在这个函数参数里添加CUDNN_DATA_DOUBLE编译,结果还是得到相同的结果。2.卸载CUDA10.1与相应的Cudnn版本,尝试不同版本的CUDA,我尝试安装配置了CUDA9.1与CUDA11.0,CUDA11.0版本与之前所得问题结果相同,而CUDA9.1版本在编译DCNv2网络的时候出现下面的问题:Error:MicrosoftVisualC++14.0isrequired.Getitwith“BuildToolsforVisualStudio”:/downloads/然而在编译DCNv2之前,我已经VisualStudio官网上下载好了VS2017,并能顺利打开VisualC++文件。在尝试VS2015之后,得到同样的问题。后来我对照CenterNet神经网络文件包中的代码,对版本指令进行了一些修改尝试,虽然结果变化,但编译错误原因在上面提到的情况之间互相转换。经过文献资料查阅之后,我了解到大部分深度学习环境是基于Linux系统下面配置的。我决定在Linux系统下面重新尝试配置环境,因为Linux系统相比于Windows系统更加安全稳定,操作方式简明,容易去发现配置环境中问题所在。首先在安装Linux系统之前,我先在磁盘下面预设分配好空间。从D盘中分出100GB空间用来安装Ubuntu20.04双系统。编译好Linux系统之后,我开始按照github官网上的步骤配置centernet深度学习系统环境,完成了CUDA的安装与Pytorch的配置,相比于Windows系统,Linux系统需要安装显卡驱动。安装显卡驱动有几个关键步骤:1.在Nvidia驱动官网下载对应CUDA版本的显卡驱动2.禁用Linux系统自带的nouveau驱动,修改禁用配置文件,同时退出Linux图形界面,在tty模式下安装显卡驱动,并检验。装好驱动之后,成功编译DCNv2网络,当重启电脑之后,我遇到了下面的情况,即无法进入图形界面,如图所示。随后我查阅相关问题解决方式,发现是显卡驱动安装的问题,在tty模式里面是可以看到显卡驱动的显示状态的,但就是无法进入Linux图形界面。尝试卸载了已经装好的显卡驱动之后,图形界面可以重新打开。进入图形界面之后,再次尝试卸载显卡驱动,在保证完全卸载NVIDIA显卡驱动之后,我重新寻找显卡驱动的安装方式,自此之后,我重新寻找显卡驱动的安装方式,并尝试更换了显卡驱动的安装版本包(由NVIDIA.455更换为NVIDIA.460),后来我在尝试用NVIDIA.460版本安装之后,重启之后tty模式与图形界面均无法进入,最后只能在Ubuntu高级选项中选择恢复系统,并卸载NVIDIA.460显卡驱动。我再次尝试先安装lightdm桌面显示管理器,再安装显卡驱动,安装显示如下,可最后得到的结果依然不理想,在安装成功之后,图像界面无法打开,但在tty模式下可以看到显卡驱动的运行情况。与老师沟通之后,也没有找到太好的解决方式。最后我由个人电脑切换到实验室台式机,显卡内存由6G提升到12G,Ubuntu为版本18.04。按照之前流程再次尝试,这次在软件管理下面切换默认显卡驱动的时候,没有出现之前重启之后打不开的情况。自此我顺利地配置好了CenterNet深度学习环境,并编译通过DCNv2网络。1.3CenterNet神经网络训练算法设计在开始训练本项目的受电弓关键点定位图片之前,我先尝试复现了CenterNet神经网络在Github上官网的原文。CenterNet神经网络根据官网所给的功能主要有两种,一种是目标检测,另一种是人脸关键点检测。在C

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论