人物识别精准度提升至91.14%,TOP1团队如何实现
iQIYI&ACMMM2019多模态视频人物识别挑战赛已圆满落幕,从本周起,爱奇艺技术产品团队公众号将陆续推出优胜团队文章,分享大赛经验与成果。
Watchdog团队在去年的挑战赛中小试牛刀,吸取相关经验,于今年的比赛中获得了TOP1的成绩,以下内容为该团队对本次比赛的经验总结与分享。
首先,在设计方案时,本团队尝试了继续沿用去年的思路,即:
从视频中按照一定的帧率抽取图片;
从图片中检测人脸并对齐;
提取人脸特征;
利用MLP进行人脸特征分类;
这是一个只利用纯人脸特征进行分类的方案,但是这一方案在今年遇到了一些困难。按照今年的比赛要求,需要将测试工程打包成docker镜像,上传到远程服务器在线运行,并且规定了运行时间不能超过8个小时。考虑到远程服务器的硬件配置,即使降低检测帧率,也很难保证在8个小时以内完成人脸检测、对齐、特征提取和分类。于是,在尝试了一段时间的检测方案无果之后,只能暂时放弃这一方案,尝试使用官方提出的特征直接进行特征分类。
在今年的竞赛中,官方已经预先提取了face、head、audio和body这几种类型的特征,具体结构如下:
face:n * 512(n为每段视频中检测到的人脸的数量)
head:n * 512
audio:512
body:n * 512
这相当于官方已经完成了上面四步当中的三步,只需要利用这些特征,设计分类器,就能够得到提交结果。
首先合并了官方提供的训练集和验证集,然后重新将数据集划分为10折,每个验证集占数据总量的10%。
接下来的实验中,首先在验证集中测试算法的性能,为了节省提交次数,只有当算法在验证集中取得了一定提升之后,才会提交结果并测试得分和排名。
1. 纯人脸方案
由于不同模态特征理论上的分类性能存在差异,其中人脸特征应该远强于其它几类特征,因此,我们首先尝试使用纯人脸特征进行特征分类。通过实验,选定了一个包含三个fc层的分类器,具体结构如下:
input -> fc1 -> bn1 -> relu1 -> fc2 -> bn2 -> relu2 -> fc3 -> softmax
其中所有全连接层的通道数均为1024。
然后,将512维人脸特征作为输入训练分类器,使用softmax loss作为损失函数。
测试阶段,在计算一段视频中所有人脸特征对某一类别的分类置信度的最大值作为这段视频的分类置信度。
我们通过这一方案,在自己的验证集上获得了~87%的得分(在参考提交时的得分计算方法,在自己的验证集上计算了得分)。
2. 多模态特征融合
利用相同的方法单独训练了head特征分类器,并在验证集上取得了52%的得分,对于两种模型得到的验证结果,按照各自的验证得分进行加权融合,使融合后的验证得分获得了~1%的提升。
但是,结果层面上的融合有一定的局限性,我们认为这种方案更接近于ensemble,而不是特征融合,因此,我们又尝试了将多模态特征直接作为输入训练分类器的方案,具体的做法是:
保持每张图片的512维特征不变,作为主特征;
对每段视频的head、audio和body三种特征分别取均值,得到3条512维特征,与每张图片的512维特征融合成一个2048维特征,作为新的一张图片的输入。
图1 最终版多模态特征MLP分类器网络结构
为了使模型更好地适应2048维输入,我们对模型进行了如下调整:
将所有fc层的通道数调整为2048;
使用prelu层替换relu层;
使用bce loss作为损失函数,替换softmax loss。原因是softmax loss不能有效地利用空类样本(根据去年的竞赛经验,将空类作为一个单独的分类加入到分类器中并不会使结果获得明显的提升,但如果不将空类加入训练会损失大量的训练数据),于是,我们参考了Humpback Whale Identification竞赛中top-1的方案,使用了一个10034分类的BCE loss作为损失函数;
对输入数据进行标准化处理,并且使用了更多的数据增强方法,包括random drop、random noise等;
尝试了添加shortcut-connection、attention module等模块,但都没有在结果上取得明显的提升,因此,在最终方案中并没有使用这些策略。
经过上述修改后,在自己的验证集上的得分提高到了91%。
3. re-ranking
在从视频级的分类结果生成提交结果的过程中,借鉴了re-ranking的思想,认为“如果要将一个样本判断为某个类别,那么不仅要求这个样本属于该类别的置信度在所有样本中排名较高,同时也要求这个样本属于该类别的置信度在所有类别中排名较高,即:样本和类别互为最近邻时,才认为样本属于类别”。具体的做法是,一段视频的10034维分类置信度中排名靠前的k项可以得到一个额外的加分。
通过反复实验,最终,我们选定了如下函数形式:
s(j)= s(j) + exp(- rank(j)) if rank(j) <= 10
这个策略使我们在自己的验证集上获得了92.2%的得分,并在测试集上得到了87.3%的提交结果,这是我们最早的有效提交结果。
比赛进行到这里的时候,在特征层面上的优化就进入了瓶颈,开始尝试了利用shortcut-connection、attentionmodule等策略优化网络,但都没有在结果上取得明显的提升。接下来训练了6个模型进行融合,将结果提高到89.5。然而,当时成绩排行榜中top1的成绩已经超过90%。这时,继续对特征网络进行优化的性价比比较低,于是,将注意力转向了官方提供的特征本身。
特征本身的表达能力决定了分类网络的性能上限,而官方提供的人脸特征至少在两个方面存在不足,:
官方的人脸特征提取器应该没有针对该数据集的10034个ID进行过优化。
官方没有对人脸进行对齐。
根据以往的经验,以上这两点都会对人脸特征的质量产生一定的影响,因此,重新开始尝试对人脸进行检测和对齐的方案。
图2 对齐人脸并提取特征
1. 人脸检测和对齐
本次比赛在运行时间方面的限制使我们无法按照传统的方法进行抽帧、检测、对齐、特征提取和分类,虽然官方已经给出了8fps的抽帧图片以及对应的人脸检测框,但从硬盘中读取图片仍然是速度瓶颈。
于是,我们针对官方给出的数据进一步优化了检测与对齐的过程,具体如下:
使用NVIDIA DALI(NVIDIA DataLoading Library)库取代pytorch(和其它框架)内置的通用dataloader,这使得我们从硬盘中加载图片的速度有了明显提高(~380fps,测试集中一共包含270w+张图片,face特征中有bbox信息的图片约200w+);
原始图像的尺寸比较大,会影响检测网络的运行速度,因此,我们利用官方提供的检测框,放大一定比例后,从原图中截取出相应的区域,作为人脸的候选区域;
然后将该区域resize到192*192的尺寸,使用RetinaFace作为人脸检测器,进行检测与对齐(~180fps)。
考虑到每段视频中包含的人脸数量有较大的差异,对于包含较多人脸图片的视频,图像之间的变化程度往往比较低,这对融合后的分类结果影响不大,因此,我们将人脸数量超过threshold的视频下采样到threshold,以降低检测和特征提取的时间消耗(在最后的实验中,我们选取threshold=30,这在我们的验证集中对结果的影响极低,但参与分类的图片数量由~200w降低到~150w)。
在官方检测框的基础上进行重检测,可能出现检测失败的情况,这会损失一些人脸图片。具体来说,在测试集中,重检测结果相对于官方检测框减少了~3.37%,但考虑到这部分人脸往往是质量较差的人脸,所以不会降低最终的分类准确率。
2. 特征提取与分类
我们利用新的人脸图片重新训练了insightface用于特征提取,并将提取到的特征作为新的特征维度,与原先的2048维向量组成了新的2560维向量,在保持其它参数不变的情况下继续训练分类器,最终,我们在自己的验证集上获得了93.2%的得分,并在测试集上得到了~89%的提交结果。
最后,利用起初划分的交叉验证数据集训练了多个模型,当使用3模型融合时,并在测试集上获得了90.62%的提交结果;当使用6模型进行融合时,在测试集上获得了91.13%的提交结果。
最后也尝试了将新的2560维特征得到的结果与原先的2048维特征得到的结果进行融合,提交结果也只提高到91.14%,没有明显的提升,这也是最终得到的最高得分,到提交截止时间为止,这一成绩在所有参赛队伍中排名TOP-1。
图3 实验结果
事实上,受到比赛时间以及提交次数的限制,我们还有许多测试没有完成,例如:
关于多模态特征的利用方面,只使用了简单的特征拼接方法,这相当于直接将各模态特征之间的权重信息隐含到了网络参数中。但在这一领域,还有一些值得借鉴的方案,例如CentralNet,LMF等。
没有利用到检测框的置信度得分信息,只在很早的实验中粗略地测试了将置信度得分作为权重,加权得到输出结果的方案,但并没有明显的效果,所有后期放弃了这部分信息。但在答辩过程中,通过和小伙伴们交流,收获了一些很不错的加权融合的idea,如果能够将这部分信息融合到方案中,应该也能使结果有一定的提升。
总的来说,通过这次比赛,积累了许多模型搭建、训练、测试方面的经验,关于人脸识别和多模态融合思想也有了新的认识。前期走过的一些弯路使我们在比赛中浪费了许多时间,直到最后一天才完成所有模型的训练与测试,如何更好地规划时间安排,让有限的设备得到更有效率的应用,也是以后参加比赛要考虑的重要问题。
本文作者:北京邮电大学自动化学院 watchdog团队
end
也许你还想看