本文共 4017 字,大约阅读时间需要 13 分钟。
想要一个深度学习模型的效果出众,很重要的两个点是数据和结构。结构上的优化,可以通过研究backbone和neck的特点进行调整,门槛较低,但是从数据的角度去增强模型,其门槛和成本就高很多了。为了获得一个泛化能力强、精度高的模型,往往需要大量的标注数据,但是短时间内又无法获取,该怎么办呢?这个时候,就要使用迁移学习的思路。
迁移学习的其中一种普遍的用法,是用一个预训练好的图像分类模型,转化成目标检测模型、或者关键点回归模型,这么做的原因在于图像分类模型可以用图像分类的数据集来训练,我们比较容易获得大量的图像分类数据集,比如我们熟悉的imagenet,而目标检测数据集的图片数量则少很多,关键点回归数据集的样本数量更少,如果不通过迁移学习,直接用这些少量的图片进行训练,效果就没法达到想要的精度,还有可能造成过拟合的现象。因此,用imagenet预训练的模型来进行迁移学习,对模型的泛华能力和精度的提升都有重要意义。
下面我将分三个部分依次介绍这三类任务的具体内容,以及它们之间该如何进行迁移学习。本节讨论的是用深度学习网络来做图像分类任务,先从一个典型的网络vggnet开始讲解。下图是vggnet的网络结构图。
了解了vggnet的网络结构之后,思考一个问题:这样的结构,其可迁移的部分有哪些呢?或者说,我们该如何修改它,使其能够转为关键点回归任务和目标检测任务所需的结构呢?
首先,三类任务的模型输入都是一致的,224x224分辨率的RGB三通道图像,当然,有些模型改变了图像的分辨率,或者对图像进行预处理,改变了图像的通道数,这些都是值得去研究的tricks,本篇暂时不讨论这方面的idea,所以先规定三类任务的输入一致。
从上面的分析可以看出,图像分类的输出是对位置信息无关的,而关键点回归和目标检测的输出都与位置相关,有较大差异。在将图像分类模型迁移到另外两类任务时,需要尽可能地保留位置信息。下面我将分别针对关键点回归和目标检测任务进行分析。
关键点回归任务本质上是获取一系列相关的特征点,它是对一种特定的目标或者特定区域的空间物理关系的描述。比如以人脸68点关键点回归为例,68点的输出中,包含了眼睛、鼻翼、鼻梁、眉毛、嘴唇以及脸部轮廓等部分,而这些部分有着很强的空间相关性,鼻梁和鼻翼一定是上下相连的,两个眼睛大概率是以鼻梁为轴对称的,眉毛是在眼睛上方的,这些空间关系对于人们来说都是非常容易理解的,但是对于深度学习模型来说,可就不一定了。
事实上,CNN网络对这种人类的先验知识并不了解,它只知道根据我们给它的标签去训练出一个函数,来拟合输入输出的对应规则,至于这输出代表了什么,它一点也不知道。所以我们在设计CNN网络的时候,必须用人类的先验知识来给它设计规则,让它在规则的限制下去学习,才能更快更好地达到我们想要的目标。
那么,在人脸关键点回归任务中,我们就可以用这种空间关系规则去指导CNN网络的训练。一种比较常见的作法是特征融合,将高层的特征描述与低层的相融合,能够使其在保持局部精度的情况下,学习到高层的语义信息。这里来解释一下为什么高层的语义信息比低层的丰富。
我们知道卷积神经网络的特点是逐级提炼特征描述,浅层的特征图提取纹理特征,高层的特征图将纹理特征组合成目标的语义特征,例如在VGGNET的结构中,56x56的特征图能够提炼出一定的人脸局部,例如眼睛、眉毛等,而7x7的特征图能够提炼出人脸整体的信息,一张人脸必须要具备眼睛鼻子嘴巴等部件,它才符合一个人脸的要求,此时它输出的人脸类别概率才会较高,也就是说7x7的特征图包含了各个部件之间的空间约束关系,而这对于我们的关键点回归任务非常重要。
根据以上几点分析,回到我们的话题:该如何将图像分类模型迁移到人脸关键点模型呢?这里我给出三种做法:
上面这张结构图对应上述三种做法,在实际运用中都可以有一定的效果,后两种方法会比第一种稍好一点,原因前面已经分析过了,当然,后两种方法的参数量要大于第一种,速度上会稍慢一点,但影响不大。
在进行迁移学习的时候,我们只加载Imagenet预训练的模型的一部分,也就是从第一层到最后一个maxpool层,后面的两个FC我们需要初始化参数后重新训练,训练的时候可以选择frozen前面几层的参数,也可以选择训练所有层,如果你的数据集非常小的话我建议还是frozen到最后一个maxpool层,只训练FC层就行,这样可以最大化利用预训练模型的效果。
目标检测的任务,可以比较笼统地分为两种:one-stage和two-stage,one-stage是指在提出完特征图后,直接回归出目标的类别和bbox;two-stage是指在第一个网络(RPN网络)中提取完特征图后,回归出一系列的bbox,将这些bbox取roi然后送入第二个网络(RCNN网络)进行分类。换句话说,two-stage的第一个步骤实际上跟one-stage是相似的,只不过RPN网络只做二分类,只输出该bbox是否为目标的概率,而one-stage网络是对整个数据集的所有类别都输出一个概率。大致上来说,two-stage的速度会比one-stage要慢,但是精度会好一些,毕竟是有两次分类网络,质量会比较高。在作迁移学习的时候,得把这两种模式分开来讨论。
对于one-stage的目标检测网络,这里以coco的80类数据集为例。要想从分类模型迁移过来,首先要砍掉FC-4096这两层和FC-1000这层,然后在最后一个maxpooling层后面接上一个1x1的卷积层,将通道数由512变为255。为什么是255呢,因为(80+1+4)x3等于255,80的意思是80类,1代表是否为目标的概率,4代表bbox的坐标,x3代表有三种尺度的anchor,这个anchor的尺度需要预先设置好,可以参考yolov3的设置。经过了这个1x1的卷积后,假如原先的输入图像是224x224,那到这一步输出的特征图就变成了7x7x255,也就是说对于7x7特征图上的每一个点,都有3个anchor,每个anchor都有80类概率和1类是否为目标的概率以及bbox的坐标。在训练的时候,frozen到最后一个maxpool层之前,只训练最后这个1x1的卷积层即可。当然这样的效果可能不太好,因为一个1x1的卷积层参数量太低,可能不太能够拟合数据集,所以可以frozen到倒数第二个maxpool之前,这样可以多一些参数加入进来训练。
实际上,目前绝大多数的目标检测网络的做法都加上了fpn的分支,也就是在原来的网络基础上,将7x7x512的特征图上采样2x后,与14x14x512的特征图相加,再做1x1的卷积,得到14x14x255,再将14x14x512的特征图上采样2x后,与28x28x512的特征图相加,做1x1的卷积后输出,这样总体算起来有7x7x255,14x14x255,28x28x255等三个尺寸的特征图输出,这样anchor的数量就多得多了,对不同大小的目标都有一定的检测效果。
对于two-stage的目标检测网络,实际上我们能够迁移学习的部分只有RPN网络,对于RCNN网络,我们是需要重新训练的,因为分类模型中的参数对于RCNN网络不适用。前面已经提到,RPN网络只输出bbox的坐标和是否为目标的概率,所以只需要输出(4+1)x3个通道,3表示特征图上单点的anchor数量,fpn的部分与one-stage类似,也是输出3个尺度的特征图。
本文通过对迁移学习的讲解,深入分析了图像分类、关键点回归、目标检测这三类任务的异同,给出了迁移学习的方法,如有疏漏之处,欢迎大家来交流。
转载地址:http://qjqqd.baihongyu.com/