深度学习基础与实践 课件 单元十 基于ResNet的行人重识别项目实战_第1页
深度学习基础与实践 课件 单元十 基于ResNet的行人重识别项目实战_第2页
深度学习基础与实践 课件 单元十 基于ResNet的行人重识别项目实战_第3页
深度学习基础与实践 课件 单元十 基于ResNet的行人重识别项目实战_第4页
深度学习基础与实践 课件 单元十 基于ResNet的行人重识别项目实战_第5页
已阅读5页,还剩38页未读, 继续免费阅读

下载本文档

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

文档简介

ResNet网络ResNet网络解决的问题ResNet的辉煌成就ResNet深度残差网络(Deep

residual

network,ResNet)的提出是CNN图像史上的一件里程碑事件,ResNet深度残差网络声名鹊起,是在ILSVRC和COCO2015大赛上的出色战绩,ResNet的作者何凯明博士一举拿下了五个国际赛事的第一名。分别在ImageNet目标分类利用152层深度学习网络拿下第一名,在ImageNet目标检测以超过第二名16%的成绩拿下第一。在ImageNet目标定位以超过第二名27%的成绩拿下第一。在COCO目标检测又以超过第二名11%的成绩轻松拿下第一;最后在COCO目标分割以超过第二名12%的成绩拿下第一。在2015年,何博士凭借着ResNet模型碾压各路群雄,刷新了CNN模型在ImageNet上的历史战绩。图像来源:https://my.oschina.net/freeshow/blog/442887601ResNet网络解决的问题ResNet的辉煌成就如下面所示:2014年,VGG才19层,而15年的ResNet多达152层,网络深度完全不是一个量级选手。ResNet也是依靠发挥了网络深度优势,才有它如此强大的性能。但是网络深度加深,会带来问题网络深度退化等一系列问题,而ResNet网络解决的就是网络深度退化问题。图像来源:https://my.oschina.net/freeshow/blog/442887601深层网络模型会相比浅层网络模型,能进行更加复杂的特征模式的提取,所以从理论角度来说更深网络会取得更好的结果,但是结合上图发现,无论是在训练阶段,还是在测试阶段,56层的网络结构都比20的网络结构的表现效果要差一些。(左图为训练集图,y轴代表训练损失函数损失值,x轴代表网络迭代的次数,当网络迭代趋于稳定的时候,20层的网络结构的损失值要比56层的网络结构的损失还要低,这说明20层网络结构,网络收敛效果要更好一些,同理右图是测试集也是类似的。)网络深度增加会带来许多问题,例如梯度消失或者梯度爆炸的问题,但是这个问题可以依靠BatchNorm来缓解,最关键的一个问题还是网络退化问题,网络退化问题是指:随着网络层级的不断增加,模型精度不断得到提升,而当网络层

级增加到一定的数目以后,训练精度和测试精度迅速下降,这说明当网络变得很深以后,深度网络就变

得更加难以训练了,即网络出现了性能饱和,甚至性能下降现象。而ResNet就是依靠残差块解决之前没人能够解决的网络退化问题。图像来源:https://my.oschina.net/freeshow/blog/4428876ResNet网络解决的问题深层网络的退化问题01ResNet残差网络的介绍残差块(恒等快捷连接

identity

shortcut

connection)假设x是输入,F(x)表示隐藏层操作,一般神经网络输出为H

x=F(x)而残差网络的输出为H=F

X+X

,具体结构如下:是网络输出结果,想要变成浅网络只需要让F(x)学习为F(x)=0,就可

以变浅了,及H(x)=x,这比从头到尾的直接学习,要容易的多。残差块包含两个部分:前向神经网络和shortcut连接。F(X)是前向神经网络,用上图左侧表示,图中weight

layer代表着卷积操作,一般一个残差部分包含2-3个卷积操作,将卷积后的特征图与x相加得到新的特征图。图像来源:https://my.oschina.net/freeshow/blog/4428876作用:更深的网络也可以弹性转化浅网络,快捷连接可以帮助网络更容易转化为浅网络,H(x)=F(x)+x02前向神经网络快捷连接X再通过一个有残差块和没有残差块的进行对比,有残差块表示为:H(x)=F(x)+x;没有残差块表示为H(x)。假设模型发生了网络退化,X是网络的最优解。看下有残差块的网络会怎么做。此时H(x)=x是最优解,那么只需要将F(x)=0即可,而F(x)代表少量的卷积操作。这样的恒等学习是非常容易的。而没有残差块的网络H(x)=x是最优解时,从上到下整个网络都要学习,这是一种硬性变化,让H(x)=x。相比之下残差块网络是一种弹性变化,它能让深度层网络收缩成浅层网络,又可以伸展成深层网络。这样拥有残差块的网络是不会比浅层网络差的(它可以变成浅层网络),又有更强学习能力(可以伸展成深层网络)。

图像来源:https://my.oschina.net/freeshow/blog/4428876ResNet残差网络的介绍残差块(恒等快捷连接

identity

shortcutconnection)x02Weigh

layert⊕H(x)

reluWeigh

layert残差块有两种结构类型,一种有“bottleneck

block”结构,如上右图所示,它添加了瓶颈层卷积,用于先降通道维度,再升维度,这就像塑料瓶的的瓶颈,入口狭窄,里面内容很大。这主要是出于降低计算复杂度的现实考虑。另一种称之为:“basicblock”,它没有bottleneck结构,如上图左所示,称为“basic

block”。basic

block由2个3×3卷积层构成,它不需要前后添加1×1瓶颈层,进行降维再升维的操作。图片来源:arXiv:1512.03385v1[cs.CV]10Dec2015Deep

Residual

Learning

forImageRecognitionResNet残差网络的介绍残差块的种类(恒等快捷连接

identity

shortcut

connection)021

×1

02ResNet残差网络的介绍ResNet

网络结构

•与普通34层网络相比,ResNet多了很多“旁路”,即shortcut路径,其首尾圈出的layers构成一个ResidualBlock;•ResNet中,所有的ResidualBlock都没有pooling层,降采样是通过conv(kernel_size=(1,1),stride=(2,2))这类的卷积操作实现的;•分别在conv3_1、conv4_1和conv5_1ResidualBlock,降采样1倍,同时featuremap数量增加1倍,如图中虚线划定的block;•通过AveragePooling得到最终的特征,而不是通过全连接层。

图片来源:arXiv:1512.03385v1[cs.CV]10Dec2015Deep

Residual

Learning

forImageRecognitionResNet网络系列结构如上表所示:每个ResNet由5个layer组成最后加上一个全连接层,因为这里是ImageNet数据集分类类别是1000个,所有对应最后全连接有1000个神经元,以34层的ResNet为例:它的第一个layer层没有残差块,所有层ResNet都共享相同的结构(一个64维的7*7卷积层和一个3*3池化层)。第二个layer层,由三个相同的两个64维3*3组成的残差块组成。第三个layer层,由四个相同由两个128*3*3堆叠的残差块组成。第四个layer层,由六个相同的两个256*3*3堆叠的残差块组成。第五个layer层,由三个相同的两个512*3*3堆叠的残差块组成。(1+2*3+2*4+2*6+2*3+1)刚好等于34。其他的ResNet50,ResNet152也是类似的结构。图片来源:arXiv:1512.03385v1[cs.CV]10Dec2015Deep

Residual

Learning

forImageRecognitionResNet残差网络的介绍02ResNet

网络结构

02ResNet残差网络的介绍ResNet

网络的性能对比在ImageNet测试集上的结构如下图所示:可以看到ResNet-152比同时期的VGG-16和GoogleNet上表现的更加出色。提高4%~7%左右。ResNet结构非常容易修改和扩展,通过调整block内的channel数量以及堆叠的block数量,就可以很容易地调整网络的宽度和深度,来得到不同表达能力的网络,而不用过多地担心网络的“退化”问题,只要训练数据足够,逐步加深网络,就可以获得更好的性能表现。图片来源:arXiv:1512.03385v1[cs.CV]10Dec2015DeepResidualLearningfor

Image

Recognition

通过保持shortcut路径的“纯净”,可以让信息在前向传播和反向传播中平滑传递,这点十分重要。为此,如无必要,不引入1×1卷积等操作,同时将上图灰色路径上的ReLU移到了F(x)路径上。

在残差路径上,将BN(Batch

norm)和ReLU统一放在weight前作为pre-activation

,获得了“Ease

of

optimization”以及“Reducingoverfitting”的效果。ResNet残差网络的介绍Residual

Block的分析与改进如下图:b是改进后的ResidualBlock,a是原始的Residual力,能更好地避免“退化”,堆叠大于1000层后,性能仍在变好。Block,b就a来说具有更强的泛化能具体变化如下:图片来源:arXiv:1603.05027v3[cs.CV]25Jul2016Identity

Mappings

in

Deep

ResidualNetworks02ResNet残差网络实现Pytorch实现ResNet

网络Torchvision.models包,包含了常用的卷积神经网络包括:Alexnet;Vgg;resnet;

densenet;inception;squeezenet、等常用的网络结构,并且提供了预训练模型,可以通过简单调用来读取网络的结构和预训练模型。

Pretrained(bool):如果为True,则返回对ImageNet进行预训练的权重加载。

Progress(True):如果为True,则显示下载到stderr的进度条。03ResNet残差网络实现Pytorch实现ResNet

网络这里不下载ImageNet预训练权重,打印Resnet50网络结构,可以看到resnet50第一部分与之前介绍是一样的7×7卷积层,没有残差块,到了第二层是一个bottleneck

block,残差块加一个下采样操作,后面几层与之类似。03torch.nn.Module类,且重写了__init__和forward方法。在forward方法中可以看到,是我们熟悉的卷积层、BN层和激活层,最后的out+=residual就是out与residual对应元素相加。ResNet残差网络实现Pytorch实现Bottleneck

BlockResNet类中的重要部分就是Bottleneck这个类,可以看到Bottleneck类继承了03ResNet残差网络实现Pytorch实现basic

BlockBasicBlock类和Bottleneck类类似,前者主要是用来构建ResNet18和ResNet34网络,因为这两个网络本身层级不深,没有必要通过bottleneck来为模型瘦身。它也包括卷积,批正则化和relu激活操作。03

03ResNet残差网络实现Pytorch实现ResNet主体结构构建ResNet网络是通过ResNet这个类进行的。首先还是继承PyTorch中网络的基类:torch.nn.Module,其次主要的是重载了初始化__init__和forward方法。在初始化__init__中主要是定义一些层的参数。forward方法中主要是定义数据在层之间的流动顺序,也就是层的连接顺序。另外还可以在类中定义其他私有方法用来模块化一些操作,比如这里的_make_layer方法。

03ResNet残差网络实现Pytorch实现ResNet主体结构resnet共用五个阶段,其中第一个阶段为7×7的卷积处理,stride为2,然后经过池化处理,接下来是四个阶段,这四个阶段是都是由_make_layer函数实现的,需要用户输入每个layer的block残差块的种类是basic

block还是bottleneck,以及block残差块的个数,还有残差块中卷积的步长。具体实现如下图所示:

03ResNet残差网络实现Pytorch实现ResNet模型load_url加载首先model_dir是下载下来的模型的保存地址,如果没有指定的话就会保存在项目的.torch目录下,最好指定。cached_file是保存模型的路径加上模型名称。接下来的ifnotos.path.exists(cached_file)语句用来判断是否指定目录下已经存在要下载模型,如果已经存在,就直接调用torch.load接口导入模型,如果不存在,则从网上下载,下载是通过_download_url_to_file(url,cached_file,hash_prefix,progress=progress)进行的。请结合所学知识,利用pytorch动手实现resnet50的定义与实现(不借助torchvision.mode类)。ResNet残差网络实现03思考题:谢谢ResNet行人重识别实战行人重识别的介绍行人重识别,是指在给定某个监控摄像机下的行人图像,利用行人的外观特征,在不重叠的跨域场景下摄像机拍摄的行人图像集合中准确的检索到该特定行人。广泛应用于智能城市,刑事侦查等重要的应用场景中。图片来源:https://zhuanlan.zhihu.com/p人重识别主要是在多摄像头多场景下,识别行人身份一项技术。由于是在无约束场景下识别行人,因此会受到外观;姿态;遮挡;光线;检测误差等一些难点问题,比如行人外观上会存在非常相似的问题,在姿态方面会存在非刚性变换,造成检测部位不匹配,在遮挡方面会存在行人身体遮挡,这也是行人识别需要克服一大难题,光线较

暗,起雾,也会问题识别上的问题。行人重识别的介绍图片来源:《基于深度学习的行人重识别研究进展_罗浩》01行人重识别系统一般是分两步骤:先检测+再识别。而当前的行人重识别研究重点是识别。它的主要任务包含特征提取和相似度量两个步骤。传统的方法思路为手工提取图像特征,例如颜色。但是它很难适应

复杂场景下的大量数据量任务。近年来,更多以卷积神经网络来提取行人图像的深层次特征。行人重识别的介绍图片来源:《基于深度学习的行人重识别研究进展_罗浩》01行人重识别的介绍基于不同损失函数的行人识别模型:表征学习和度量学习表征学习:直接在训练网络的时候考虑图片间的相似度,而把行人重识别任务当做分类问题或者验证问题来看待。表征学习下的损失函数包括:分类损失和验证损失。分类损失包括两大类,一类是属性损失,例如行人外貌标签,有没有戴帽子,是否为短头发,一类是ID损失,是否是小明,及确定行人的ID。验证损失:输入一对(两张)行人图片,让网络来学习这两张图片是否属于同一个行人,等效于二分类问题。下图中:图片通过主干是Resnet网络提取到的特征后,再经过平均池化,与各个全连接层连接分别计算分类损失。图片来源:《基于深度学习的行人重识别研究进展_罗浩》01行人重识别的介绍度量学习:基于表征模型的Re-id模型存在一个问题,因为最后一层是分类ID层,它会随着行人ID的n的增大而增大。因此只适用于闭集下的情况。将行人重识别问题看作是距离问题

:

通过网络提取到样本的特征,然后定义一个度量函数来计算两个特征向量的距离,最后通过最小化网络度量损失,来寻找一个最优的映射f

x

。使得相同行人两张图片的距离尽可能小,不同行人图片尽可能大。如下图:Triplet

Loss是度量学习的一种基准损失函数,Anchor(锚示例)(是指选择的已知ID的示例,正示例、负示例都要以Anchor作为参照)、Positive(正示例,与Anchor

ID相同)、Negative(负示例,与Anchor

ID相反),通过优化让锚示例与正示例的距离尽可能的小,让锚示例与负示例的距离尽可能的大来解决Re-id问题。图片来源:arXiv:1503.03832v3[cs.CV]17Jun2015FaceNet:A

Unified

Embedding

for

FaceRecognitionandClustering01Market1501行人重识别数据集Market1501数据集简介Market-1501数据集在清华大学校园中采集,夏天拍摄,在2015年构建并公开。它包括由6个摄像头(其中5个高清摄像头和1个低清摄像头)拍摄到的1501个行人、32668个检测到的行人矩形框。每个行人至少由2个摄像头捕获到,并且在一个摄像头中可能具有多张图像。训练集有751人,包含12,936张图像,平均每个人有17.2张训练数据;测试集有750人,包含19,732张图像,平均每个人有26.3张测试数据。3368张查询集图像的行人检测矩形框是人工绘制的,而gallery候选集中的行人检测矩形框则是使用DPM检测器检测得到的。该数据集提供的固定数量的训练集和测试集均可以在single-shot或multi-shot测试设置下使用。该数据集仅用于学习和学术研究,不能用于商业目的。02bounding_box_test——用于测试集的750人,包含19,732张图像,前缀为0000表示-1表示为垃圾图片,也就是不完整图片,可以图仅拍摄到了四肢等情况。bounding_box_train——用于训练集的751个不同的人,包含12,936张图像。训练集中没有与测试集中的人。query——为750人在每个摄像头中随机选择一张图像作为query,因此一个人的query最多有6个,共有3,368张图像,都来自测试集。gt_query——对query集中3,368张图像加注了好或坏的标签,可用于图像质量评估。gt_bbox——包括对25259张图片手工标注的bounding

box,这些图片来自训练集和测试集中的1501个人的照片。可用于判断DPM检测的bounding

box是不是一个好的box。Market1501行人重识别数据集Market1501数据集简介02

02Market1501行人重识别数据集图片命名规则图片命名规则:0001_c1s1_000151_01.jpg为例:0001表示每个人的标签编号,从0001到1501;c1表示第一个摄像头(camera1),共有6个摄像头;s1

表示第一个录像片段(sequece1),每个摄像机都有数个录像段;000151表示c1s1的第000151帧图片,视频帧率25fps;01表示c1s1_001051这一帧上的第1个检测框,由于采用DPM检测器,对于每一帧上的行人可能会框出好几个bbox。00表示手工标注框。图片来源:Market1501数据集Market1501行人重识别数据集Junk

imageMarket1501在采样图片时候,会采样到一些垃圾图片,这种图片只拍摄到部分肢体,例如:脚、手、上半身、没有训练价值的图像。在训练阶段时,会选择删除掉这些这些以0000和-1开头的图片。02图片来源:Market1501数据集

03Pytorch实现行人重识别数据集管理器data_manager在数据集管理器,首先指定各个文件路径:使用变量来存储训练集、测试集(查询集和画廊)的文件夹路径,这里定义了一个__process_dir函数它会返回数据集(包括图片路径img_path,图片id(pid),相机id(camid等))以及图片id数量(num_pids),图片数量(num_imgs)。通过__process_dir获取了这些值后,再利用print打印出来。

03Pytorch实现行人重识别数据集管理器_process_dir函数使用re.compile,来提取每张图片的类别值和摄像头的id值。其中pid_container集合对象来存储图片类别值,使用pid2label字典类型来存储图片的类别值与索引值。这里如果relabel为true就将索引值来充当图片类别值。最后为dataset列表添加图片路径、图片类别id、以及摄像头的id值。返回dataset,num_pids,num_imgs,其中num_pids,num_imgs只是做统计用的,最重要的是dataset。Pytorch实现行人重识别图像数据库类ImageDatasetImageDataset(图像数据库类)和之前介绍的一样需要重载之前的__getitem__()方法和__init__()方法。这里__getitem__()方法可以对图片进行预处理并返回每张图片的img,pid,

camid信息。它通过调用read_image来完成数据的加载。03

03Pytorch实现行人重识别网络模型ResNet50由于原ResNet是用于ImageNet库的模型,该库有1000个类别,所以最后的全连接层为1000个神经元。这里需要将ResNet最后一层变换为Market1501的数据集类别数num_classes.如图所示:将原始模型的fc层(2048,1000)变成了(2048,num_classes),训练时num_classes=751,测试时为750。Pytorch实现行人重识别Softmax

损失函数crossEnttropyLoss(交叉熵损失)多分类任务中输出的是目标属于每个类别的概率,所有类别概率的和为1,其中概率最大的类别就是目标所属的分类。而softmax函数能将一个向量的每个分量映射到[0,1]区间,并且对整个向量的输出做了归一化,保证所有分量输出的和为1,正好满足多分类任务的输出要求。所以,在多分类中,在最后就需要将提取的特征经过softmax函数输出为每个类别的概率,然后再使用交叉熵作为损失函数。03Pytorch实现行人重识别优化设计部分Init_optim在初始化,可以训练不同的训练策略,有Adam、SGD(随机梯度下降)、RMSprop。SGD每次更新时对每个样本进行梯度更新,对很大的数据集来说,可能会有相似的样本,SGD一次只进行一次更新,就没有冗余,而且比较快,并且可以新增样本。RMSprop使用了指数加权平均,旨在消除梯度下降中的摆动,与动量(Momentum的效果一样),某维度的导数比较大,则指数加权平均就大,某一维度的导数比较小,则其指数加权平均就小,这样就保证各维度导数都在一个

温馨提示

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

评论

0/150

提交评论