使用NTS理解细粒度图像分类
共 3894字,需浏览 8分钟
·
2022-08-08 19:54
点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
细粒度图像分类的一些问题和挑战。
自从2012年的ILSVRC竞赛Alexnet赢得冠军以来,计算机视觉已经非常出色了。这是人们在开始研究这项快速发展的技术时经常会遇到的说法。这个博客是为了理解细粒度视觉分类(FGVC)这一具有挑战性的问题,下面的文章将对此进行详细描述。
有关Pytorch代码实现,请参考以下github库:https://github.com/yangze0930/NTS-Net
在这个过程中,人们可以理解最初可能面临的挑战,以及如何使用本文有趣的架构从刚开始时的42%达到87%的验证精度(数字是基于我的经验)。使用的数据集是FGVC Aircraft variant。后面,我还在Stanford-Cars数据集上进行了训练。
这篇文章分为以下部分:
第一部分简要叙述了我是如何开始的以及从这个问题开始所面临的挑战。
第2部分描述了上面提到的研究论文,其中第1节,第2节和第3节分别描述了Region Proposal,它在NTS和各种自定义损失中的用法。
第一部分:初始尝试和误差
细粒度视觉分类
我们知道,视觉分类任务指创建一个模型来捕获从输入图像到相应输出类的关系。然而,FGVC的任务和普通的分类不太一样,因为类内差异比类间差异更多。这就是为什么我们的目标是在视觉上类似的类中捕获有区别的特征。寻找这样的特征具有挑战性。此外,对样本中信息最丰富的区域进行边界框的标注代价昂贵。
当开始处理问题时,可以使用图像分类的一般方法,即使用标准的预训练模型,并对其进行微调,以达到正确的任务参数集合。如本文所述,以下链接的数据集有三个层次进行分类,即manufacturer、family和variant 层次。细粒度分类是variant级别的。
开始的时候,我使用标准的pre-trained模型,并尝试了不同的调整,在manufacturer上能得到66%的验证准确性,在variant上可以得到42%的准确率,尝试了NTS后,在variant上第一次就可以得到87%。对于像我这样的初学者来说,理解一个复杂问题的工作代码并获得正确的见解是非常有帮助的。
第二部分:是什么导致了这个效果
NTS-NET
如前所述,收集每个样本中信息最丰富区域的边界框的标注样本是非常昂贵的。这正是本文所提供的帮助。它有效地局部化了这些信息区域,而不需要边界框标注。
本文中创建的模型称为NTS-NET,使用三个协同工作的“agent”在基准数据集( FGVC aircraft、Stanford Cars、Caltech-UCSD Birds)中实现最先进的性能。
这三个代理被定义为Navigator、Teacher和Scrutinizer。让我们讨论一下它们的作用。
The Navigator agent 网络导航模型,以关注信息最丰富的区域。对于图像中的每个区域,Navigator通过对损失排序来预测该区域的信息量(如下所述),并利用这些预测来提出信息最丰富的区域。现在的问题是:如何在图像中得到有用的可变长度的“区域”?好了,这个问题前面已经有了答案,所以请耐心等待我来理解每个agent的高级功能。
Teacher agent 对Navigator提出的信息量最大的区域进行评估,并提供反馈:对于每个提出的区域,Teacher评估其概率为ground-truth class。置信度评估指导navigator网络使用排序一致性损失函数(在代码实现中称为“ranking loss”),提出信息更丰富的区域。
当teacher提供更精确的监督时,navigator会将更多的信息区域局部化,从而使teacher受益。
Scrutinizer agent 从Navigator中对提出的区域进行审查并进行细粒度分类:将每个提出的区域扩大到相同大小,agent从中提取特征,将区域特征与整幅图像的特征联合处理,进行细粒度分类,是解决这一复杂问题的主要方法。
信息区域有助于更好地表征物体,因此将信息区域的特征与全图像融合将获得更好的性能。
因此,目标是局部化物体中信息最丰富的区域。
现在让我们回到上面讨论的问题,即如何在图像中得到有用的可变长度“区域”?导航到可能的信息区域可以看作是在R-CNN论文中引入的区域建议网络(RPN)的问题,我将在这里讨论它的相关性。
第1节:区域建议
在讨论区域建议如何在NTS上实施之前,我应该先简单介绍一下它的起源。如果你知道,请随意跳过这个部分。
有几个进行区域建议的方法:
i) 滑动窗口:滑动窗口中,你在所有固定大小的滑动图像的窗口上运行一个训练分类器,然后运行检测器来查看物体是什么。我们可以使用这种算法,但缺点是它可能会检查许多这样的没有物体的窗口,因此提出了R-CNN算法。
ii) R-CNN:在这个方法中进行分割算法,获取可能包含物体的区域,只在这些区域上运行分类器。缺点是速度慢,因为建议的区域一次只分类一个类别。
iii) Fast R-CNN:用分割算法进行区域建议,与R-CNN不同的是,所有建议的区域都使用卷积式滑动窗口实现同时分类。
iv) Faster R-CNN:使用区域建议网络,简称RPN,它需要锚(以不同的大小、尺度和长宽比分布在图像各处的边界框)和ground truth边界框来建议信息区域,而不是传统的分割算法。
第2节:NTS中的区域建议是什么样的?
在本文中,默认的锚被放置在整个图像中,而NTS-model,通过代码实现中的自定义损失(学习是因为我们没有使用带标注的边框)从这些锚点中学习了最具信息的锚点。这些锚定义了代码中定义的由Prosposal_Net(或Navigator Network)给出的建议区域的坐标,并使用NMS(非最大抑制)去除冗余(重叠区域)并给出top_n的建议区域。
第3节:NTS-NET中各种损失的描述
在论文中使用的自定义损失有很多,后来累计在总损失中,即原始损失、concat损失、rank损失和part_cls损失。
注:代码中使用的损失术语与论文中的不同,分别是Navigator、Teacher和Scrutinizer的损失,这里我使用代码中使用的损失。
Total loss= Raw_loss+Rank_loss+Concat_loss+Part_cls_loss
注:我们使用RESNET50模型作为原始图像和建议区域的特征提取器。
RAW LOSS:这是针对RESNET网络参数的图像分类的分类交叉熵损失。我们对原始图像的特征进行raw loss,然后将其与我们的建议区域图像的特征结合进行细粒度分类。这里的输出是图像的标签。
CONCAT LOSS:在Scrutinizer网络中,我们从原始图像特征和建议区域特征CONCAT,输入到这个分类交叉熵损失中国,输出图像的标签。
PART LOSS(LIST LOSS):它被用作navigator网络的反馈,因为在这里我们找到了每个建议的图像和它的ground truth类之间的交叉熵损失。
RANK LOSS:使用top_n rpn分数(建议区域特征)和相应的损失作为每一个建议区域收到的反馈损失的一部分,对于每一个建议区域,所有排序在建议区域之前的loss添加到rank loss中,这样rank loss可以进行优化。
PART_CLS LOSS:这是部分特征和标签之间的交叉熵损失。部分特征使用代码中定义的part_images从RESNET-50中提取,该代码使用top_n建议区域的坐标从原始图像中生成。
现在part loss和part_cls损失是相同的,但是part_cls损失对total损失有贡献,而其他loss则没有,并且part_loss在rank loss中还用作指导/反馈。
好消息!
小白学视觉知识星球
开始面向外开放啦👇👇👇
下载1:OpenCV-Contrib扩展模块中文版教程 在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。 下载2:Python视觉实战项目52讲 在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。 下载3:OpenCV实战项目20讲 在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。 交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~