近日,百度发布了用于花卉识别的移动端应用,这种基于全卷积注意力网络的细粒度识别方法在计算和准确度上都有非常强大的优势。在百度主任研发架构师陈凯和资深研发工程师胡翔宇的解释下,本文首先将介绍什么是细粒度识别,以及一般的细粒度识别方法,然后重点解析百度基于强化学习和全卷积注意力网络的细粒度识别模型。五一出游赏花,为女朋友解释解释细粒度识别也是极好的。
细粒度识别的概念其实非常简单,即模型需要识别非常精细的子类别。例如百度的花卉识别应用,模型不仅需要如一般识别问题那样检测出物体是不是花,同时还需要检测出物体具体属于哪一品种的花。而通常属于不同子类别的物体是非常相似的,例如樱花和桃花等,我们不仅需要花的整体信息来识别它是「花」,同时还需要局部信息来确定「花」的品种。
从这一观点出发,细粒度识别基本上就是同时使用全局信息和局部信息的分类任务。对于花的细粒度识别来说,全局信息就是用户拍摄的整张图像,而局部信息则是图像中的花或花的重要部位。这两部分信息都包括在整张图像中,我们希望模型根据整张图像预测出具体的细分类别。
百度借助了知识图谱对世界上的花卉名字进行科学的科、属、种划分,建立了一个非常专业的花卉类别库。而对于其它巨量优质的花卉图像,标注人员通过权威样本库中的文字描述,并在中科院老师的帮助下,根据花卉的叶子、形状、颜色等微观特征进行挑选与标注。此外,百度还进行了标注质量的检查,标注准确率在 95% 以上。最后,这些巨量的标注数据包含了花卉的整体图像和对应的精细品种。
其实整体图像隐含地包括了全局信息与局部信息,但一般来说,局部信息同样也需要标注,而利用这些局部标注的方法即基于强监督信息的细粒度识别。不过这种局部标注是非常昂贵的,因此很多模型尝试自己学习重要的局部区域,这一类方法即基于弱监督信息的细粒度识别。
百度所采用的全卷积注意力网络是一种基于弱监督信息的细粒度识别方法,它不需要标注局部特征,并通过下文描述的全卷积注意力网络和马尔科夫决策过程自动学习重要的区域。
细粒度识别
如上所述,细粒度识别可分为强监督和弱监督两种。最开始优秀的模型一般都是基于强监督的,它们在测试集上有更好的性能。但基于强监督的方法标注成本非常高,且局部标注在遇到遮挡等情况时就会完全失去作用,因此更多的研究者开始探讨基于弱监督的细粒度识别方法。以下简单地介绍了这两种方法的实例,即基于强监督的 Part-based R-CNN 和弱监督的 Bilinear CNN。
基于强监督信息的细粒度识别通常需要使用边界框和局部标注信息,例如 2014 年提出的 Part-based R-CNN 利用自底向上的候选区域(region proposals)计算深度卷积特征而实现细粒度识别。这种方法会学习建模局部外观,并加强局部信息之间的几何约束。
如上所示,局部区域将从自底向上的候选区域开始(左上角),我们将基于深度卷积特征同时训练目标和局部区域。在推断阶段,所有的窗口都会由检测器评分(中间),且我们可以应用非参几何约束(底部)重新评估窗口并选择最优的目标和局部检测(右上角)。最后的步骤就是抽取局部语义信息来用于细粒度识别,并训练一个分类器预测最终类别。
而基于弱监督信息的细粒度识别也有很多方法,例如 15 年提出的 Bilinear CNN,它由两个特征提取器组成,它们在每个图像位置的输出使用外积相乘,并池化以获得一个图像描述子。这种架构能以转译不变的方式对局部成对特征的交互进行建模,这对于细粒度识别非常重要。
Bilinear CNN 所使用的外积捕捉了特征通道之间的成对相关性,因此可以建模局部特征的交互,即如果一个网络是局部检测器,那么另一个网络就是局部特征抽取器。以下展示了用于细粒度分类的 Bilinear CNN 模型,在推断过程中,一张图像将传入两个卷积神经网络 A 和 B,然后对应位置的外积相乘得出双线性向量,并传入 Softmax 层以完成分类。
百度所采用的细粒度识别方法也是一种使用弱监督的策略,它通过全卷积注意力网络实现类别预测,并基于强化学习调整需要注意的局部区域。
全卷积注意力网络
尽管最近研究社区将目光投向弱监督的细粒度识别方法,但它的效果和实践上都有一些差距。百度的细粒度模型通过利用强化学习选择注意区域而大大减少了强监督所需要的图像标注量,且还能以非常高的准确度部署到应用中。他们构建一种全卷积注意网络,并根据马尔科夫决策过程确定哪些局部图像块对最终预测有帮助,因此图像的细粒度分类将同时利用全局图像和那些重要的局部图像完成预测。
百度提出的这种架构首先基于弱监督强化学习而不需要昂贵的标注,其次它所采用的全卷积网络可以加速训练和推断过程,最后贪婪的奖励策略可以加速学习的收敛,这三点也是百度细粒度模型的显著特点。
胡翔宇表示:「这种网络其实和人类的视觉系统非常像,在我们识别细分类别时,首先会查看整体特征而确定大概的类别,然后再仔细观察有区分度的特征确定细分类别。」百度的全卷积注意力网络(FCANs)同样首先会抽取整张图的特征进行分类,然后截取一小块特征图(Feature Map)作为当前网络注意的区域,当这样的区域是具有区分度的特征时,模型就更能正确预测出细分类别。
模型架构
该模型主要的架构如下图所示可以分为特征抽取阶段、局部特征注意区域和分类过程。总体而言模型会先使用预训练卷积神经网络抽取图像特征,然后再结合整体图像信息和局部重要信息预测最终类别。
如上所示,在下部分的训练过程中,抽取的特征图会在所有通道上做一些截取,截取的部分就相当于模型关注的局部原始图像。如果说这个截取在最后的分类阶段中提升了预测效果,那么它就是值得注意的区域。在上部分的推断过程中,模型将利用输入图像的全局特征和所有重要的局部图像预测精细类别。
特征图的抽取
特征图会通过全卷积神经网络进行抽取,一般我们可以选择 VGG 或 ResNet 等流行的网络架构,并在 ImageNet 数据集上预训练而能抽取一般图像的特征。胡翔宇表示:「百度很早就开始重视数据方面的建设,借助搜索方面的经验与对网页数据的理解,我们可以获取很多优质的样本。抽取特征的全卷积网络会在百度内部的数据集上预训练,它的规模要比 ImageNet 大很多,特征抽取的效果也要好一些。」
在训练过程中,特征抽取只会运行一次,因此一张输入图像最后只会输出一组特征图。这组特征图首先可以直接用于预测图像类别,其次我们可以截取特征图的一个小部分(包含所有通道)作为模型可能需要注意的区域。这样的截取其实就近似于在输入图像上截取一个部分(感受视野),只不过直接截取特征图不需要重新抽取特征,因此会极大地减少计算量。
在推断过程中,特征图的抽取需要执行很多次,但它们都能并行地处理。直观而言,训练学习到的注意力区域其实就相当于一种掩码,它表示该区域的特征对最终预测有很重要的作用。百度并行地从输入图像抽取各个重要部分和全局的特征图,并结合它们的信息预测精细类别。
注意力区域
在抽取特征后,模型需要学习哪些局部区域对最终分类是重要的,而确定重要性的标准即局部区域对最终预测是否有帮助。在这一阶段中,注意力网络会将基本的局部卷积特征图生成一张评分图或置信图,即通过叠加的两个卷积层将特征图转换为通道数为 1 的评分图。一般第一个卷积层可使用 64 个 3×3 的卷积核,而第二个卷积层可使用 1 个 3×3 的卷积核将通道数降为 1,这一张置信图展示了模型关注的兴趣点。
胡翔宇说:「兴趣点是网络自己学到的,而裁剪的大小是我们给定的。我们首先会给一个 8×8 的较大裁剪窗口,相当于关注较大的区域。随着迭代的进行,我们会慢慢减小裁剪窗口,这相当于关注更小的细节。」裁剪后的特征图一般需要馈送到 Softmax 层以将置信图转换为概率图。
其实在训练或推断中直接截取输入图像作为注意的局部特征有最好的效果,但这种方法在训练中计算量太大,且因为分类网络的时序预测而不能并行处理。不过在推断中可以直接使用图像的局部区域,因为后面的分类网络允许并行计算。此外,百度通过强化学习确定注意力区域,这一点将在后面讨论。
分类网络
最后的分类网络将结合全局图像信息和局部特征信息预测最终的精细类别,训练阶段和推断阶段的分类网络架构也不一样。这种架构上的区别主要在于训练阶段需要根据分类结果动态地调整注意力区域,而推断过程直接使用重要的注意力区域联合预测最终类别。
胡翔宇表示:「在训练阶段中,前向传播的过程有点类似循环神经网络。首先模型会根据全局特征图预测图像类别,然后再结合第一个抽取的局部特征图重新预测类别,这里的方法可以简单地将前一次的 Softmax 结果与后一次的 Softmax 结果求平均。」最后,考虑加入第一个注意力区域后是否提升预测效果,我们可以确定该区域是否重要。这样继续添加新的局部注意力区域可以搜索所有重要的局部区域。
在推断中,我们可以并行地使用全卷积神经网络抽取全局特征图和所有重要局部特征图,然后馈送到 Softmax 中以分别计算出对应的分类概率。最后,我们可以采用简单的求均值方法对所有的分类器做集成处理,因此最终的分类将结合了所有的重要信息而提升精细类别的预测结果。
模型训练
模型中最重要的部分就是选取重要的局部区域,这也称为注意力问题。百度在这一部分采取了马尔科夫决策过程,在每一个时间步中,上文所述的全卷积注意力网络可作为智能体,它将基于观察采取行动并收到奖励。在百度的模型中,全卷积注意力网络观察到的信息就是输入图像与根据注意力区域裁剪的图像,而行动对应于选择新的注意力区域。根据行动是否提升分类准确度,我们可以调整奖励来确定最优的行动或注意力区域。
在前面全卷积注意力网络的架构中,训练过程中的分类网络非常类似于循环网络,即时间步 t 的分类结果将集成之前所有时间步的分类分数。如下所示为计算最终分类分数的表达式,我们可以简单地对所有时间步上的分类分数求平均:
其中 S_t 为时间步 t 以内所有预测分数的均值, 表示在给定分类网络的参数 θ^τ 和第 τ 个注意力区域的特征图下,在时间步τ的预测分数。智能体 FCANs 在采取了动作(选择 l^t 作为注意力区域)后可获得奖励 r^t,一般 r^t 会通过度量预测分数 S_t 和真实标注 y 之间的匹配度获得。
陈凯表示:「在技术上,百度的细粒度识别能做到在线学习以根据用户反馈实时更新参数,但在产品价值观上,细粒度识别并不会使用用户数据在线调整模型。」因此,以下的模型训练都是在百度服务器中进行的,训练好的模型直接部署到服务器并实现云端推断。
在训练过程中,我们没有标注哪些局部图像或特征比较重要,且奖励函数不可微,因此百度采用了强化学习方法来训练注意力区域。若给定一组训练样本,我们希望能同时优化特征抽取网络的参数 θ^f、注意力网络的参数 θ^l 和分类网络的参数 θ^c,并最大化以下目标函数:
其中 L(θ_f, θ_c) 为平均交叉熵损失函数,它度量了 N 个训练样本和 T 个时间步上的平均分类损失,而最大化负的交叉熵函数即最小化分类损失。此外,给定注意力区域,分类损失将只和特征抽取网络的与分类网络的参数相关。R(θ_f, θ_l) 表示 N 个训练完本和 T 个时间步上的平均期望奖励,最大化 R 将确定最重要的注意力区域。简单来说,该函数度量了选择注意力区域 l 时获得的期望奖励 E[r],在每一个时间步上都选择最好的注意力区域将获得最大的期望奖励。
在最大化上述目标函数的过程中,奖励策略非常重要,因为不同的奖励 r 将直接影响到注意力区域的选取,从而进一步影响分类损失。奖励策略主要体现在选择确定 r 值上,一般直观的奖励策略可以将最终分类结果作为度量整体注意力区域选择策略的标准,即如果 t=T 且 ,则 r^t =1,否则 r^t 都等于 0。
尽管使用以上朴素的奖励策略可以通过循环的方式学习,但它可能会造成不同时间步上选择区域的困难,且导致收敛问题。因此,百度提出了一种新型奖励策略:
其中 表示第 n 个样本在第 t 个时间步上的分类损失。如果图像在第一个时间步就分类正确,那么它能立即收到一个奖励 1,这相当于在仅使用全图特征的情况下能正确分类。当我们奖励不同的注意力区域时,我们要求当前时间步需要分类正确,且同时分类损失相比上一时间步有降低。如果不满足这两个条件,我们将不奖励注意力区域。
胡翔宇解释说:「对于细粒度分类问题,裁剪出来的区域是好是坏比较容易确定。例如裁剪出一个局部细节,且它已经足够证明图像是怎样的细分类,那么我们就可以确定这个区域是有价值的。其实自然图像的信息冗余度非常大,甚至只需要 1 到 2 个细节就能帮助我们识别花的具体品种,那么我们也认为这样的策略是优秀的。」
最后,结合上述所有过程就可构建整个模型的前向传播与反向传播过程。如下图所示,在前向传播的过程中,我们先使用全卷积神经网络 φ 抽取输入图像的特征图,然后使用注意力网络将多通道的特征图变换到单通道的置信图π。在依据置信图对完整特征图进行裁剪后,我们就得到了注意力区域 l。将注意力区域投入到分类网络就能计算出分类结果,并且当前时间步的结果和上一时间步的结果相结合就能给出对该注意力区域的奖励。
在反向传播中,上文(2)式的目标函数需要对参数求梯度以将误差向前传,并更新参数。其中 L 是经典交叉熵损失函数,它的梯度很容易计算,而奖励的平均期望 R 是不可微的,所以百度采用了蒙特卡洛方法来逼近期望奖励 E[r] 的梯度。因此在上图(b)中,分类结果 s 将按常规实现反向传播,而期望奖励的梯度可直接调整注意力网络的参数,并向前传递调整特征卷积网络的参数。
百度基于全卷积注意力网络和强化学习构建的细粒度识别应用目前已经部署到了云端,模型的实现都是通过 PaddlePaddle 架构完成的。胡翔宇表示:「该应用目前部署在云端,但随着移动端硬件的发展,我们会在一些场景中将网络部署到更靠近用户的地方。但即使部署在云端,考虑到推断的性价比,我们也会采用一些模型压缩方法。这些压缩方法一般可以分为两大类,首先是采用半精度(FP16)等和硬件相关的方法,其次就是将批归一化的参数压缩到卷积层等和硬件无关的方法。」
说到移动端的部署,百度其实有开源 PaddlePaddle Mobile 框架,陈凯表示:「PaddlePaddle 的移动端框架其实也在和移动硬件的厂商合作,它后续会加强对 NPU 等硬件的优化,包括内存管理和功耗控制等。」