先定义一下图像分类,一般而言,图像分类分为通用类别分类以及细粒度图像分类
那什么是通用类别以及细粒度类别呢?这里简要介绍下:
通用类别是指我们日常生活中的一些大类别物体,比如说,奔驰,宝马,法拉利什么的都可以归到车这个大类别,因为他们视觉特征(形状,外观等)非常相似;
细粒度类别这里就不仅仅要知道他们是奔驰,宝马了,更加要知道他们是奔驰哪个车系,比如S150,宝马7系(ps:这都不算最细粒度的)。
下面来说一说两类任务:
- 通用图像分类是指,有很多个大类别,模型只负责识别出某个物品的大类别,而并不需要识别出他的细粒度类别,相关数据集有:ImageNet,这个数据集大概有1000多万图片,但是类别只有11k左右,要知道我们日常生活中光动物类的细粒度类别就有成千上万种类别,完全不能满足人们的认知需求,所以就有了更加细粒度的识别任务。
- 细粒度图像分类,这个在视觉领域有个术语叫做Fine-grained Image Classification,这个任务具体是怎么样的呢?就是不仅要识别出他的大类别,而且要识别的他的细粒度类别,细粒度到什么程度呢,以昆虫为例子,基本是要到种的级别才算细粒度。
上面两个图中分别是灰绒麝凤蝶和糙绒麝凤蝶,是不是很难辨认,基本是需要专家才能辨认出来,这就是细粒度图像分类,比较好的公开数据集有Caltech-UCSD Birds-200-2011(CUB200),目前state of the art模型效果top1 准确率有85%左右,效果很不错,但是才两百类!!鸟类可远远不止200类,据我所知至少上万类了!可见细粒度的分类还有很长一段路要走。
但是要知道,自然界光昆虫种类就有几十万种,更别提其他的类别,但是这里有个存在一个很严重的问题,细粒度的模型对太多类别的通用图像分类又不是很work,你想训练一个大而全的模型能识别出大类别又能识别出小类别,是基本不可能的(即使训练出来效果也不是很那么令人赏心悦目),那怎么做呢?目前一个比较主流的方案是,训练一个通类模型来识别出物体的大类别,也就是触发模型,再针对各个小类别训练一个fine grain模型识别。
这里讲一讲通用图像分类以及fine-grain的相关工作:
- 通用图像分类:主要是基于CNN,从97年的lenet到12年AlexNet,13年的ZF-Net,14年的GoogleNet(Inception-v1),VGG,15年的Inception v2,16年的Resnet,Inception v3,Inception v4,模型细节去看paper,目前在ImageNet上面state of the art performance大概是top5 5% error,已经完全超过人的表现了,效果十分惊人,但是注意了这毕竟是较为粗粒度的类别,侯晓迪大神说过一句话,我觉得很有道理,当一个benchmark刷到极致的时候,这个benchmark就应该退出历史的舞台了,会有新的benchmark替代,就像coco替代VOC一样,今年也是ImageNet最后一届比赛了。通用图像分类任务已经做到足够好了(实际场景下性能其实不咋样。。各种问题,后续补充),但是针对每个类目底下的细粒度分类还远远不止这样。
- fine-grain:一般而言都是针对每个类目做细粒度分类,这个类目底下的物体有着大致一样的外观,目前有两种主流的方法:
- 基于强监督信息的fine-grain模型,这里指的强监督信息是指bounding box或者landmark,举个例子,针对某一种鸟类,他和其他的类别的差异一般在于它的嘴巴、腿部,羽毛颜色等,针对输入目标图片,我们先通过一个detector检测出这些部件,在经过一个CNN去做分类,主流的方法像Part-based R-CNN,Pose Normalized CNN,Part-Stacked CNN等。
- 基于弱监督信息的fine-grain模型,什么是弱监督信息呢?就是说没有bounding box或者landmark信息,只有类别信息,开山之作应该属于Bilinear CNN,这个模型当时在CUB200上是state of the art,即使和strong supervise 方法也只是差1个点左右,但是这个方法有个极大的缺陷,那就是极大的占用显存,类别一多,速度极其慢,因此后来衍生来的Compact Bilinear Pooling,Low-rank Bilinear Pooling,Factorized Bilinear的performance都差不多,但是速度越来越快。
大致方法是这些,paper太多了,不一一列举了,有疑问的可以互相学习交流下。
fine-grain这个方向,做的人感觉不多,没有什么像RCNN,Resnet这样的突破性质的进展,只能是慢慢摸索了,不过今年CVPR 2017有个fine-grain的workshop,可以期待下。我还参加了这个FGVC比赛,5800类左右,top5准确率90%左右。
至于为什么要叫细粒度图像分类这个非常奇怪的名字,可能只是为了和通用分类任务进行区分而已。对于人类世界来讲,现实世界常用的通用分类类别可能在30000-40000之间,这些全部都是so called 大类别,每个大类别之下都有一系列相关的小类,这些都有现成的结构可以借用。比如动植物的种属关系,现代社会商业产品的产品系列表,有机化学里面严格的命名规则。
正如前文所说,要想训练一个既能够识别大类有能够识别相关大类下属小类的系统可能是很困难的。但困难所在何呢?可能是数据集的收集和制作。这样一个复杂的分类任务,需要的参数可能会远远多于通用分类任务需要的数量,我们有足够体量的数据集来驱动这样的模型吗?驱动这样模型的意义又在那里呢?
仔细回想起来,识别人类和识别具体的某个人是否就是通用分类任务和细粒度分类任务的这种对应关系。像挪威以及东南沿海可能在做的三文鱼个体识别任务,某些猪脸识别,鸟类个体识别,应该都可以划归到细粒度分类任务。