作者:我爱机器学习(52ml.net)
链接:https://www.zhihu.com/question/52143412/answer/130037578
在只需要时候输出image含有object的label而不需要定位的情况下,使用multi-label训练一个分类网络(例如 resnet)能否达到object detection的效果。跟Faster R-CNN系列的方法比起来,结果相差会很大吗?
by Julius
只需判断是否含有目标而不需要定位时候Multi-Label是非常合适的,当然用Faster R-CNN之类也是可以的,只是有点杀鸡用牛刀,因为其中最重要也最复杂的定位你根本就用不着。当然就算真的用Multi-Label,R-CNN和SSD/YOLO之类的思想是非常值得借鉴的。
从定义上来说,分类(Classification)、定位(Localization)和检测(Detection)的区别如下:
其中检测=分类+定位,下图是对应的例子:
(1)目标分类
(2)目标定位
(3)目标检测
那么题主只需判断是否含有目标而不需要定位的问题是属于分类范畴的,只是因为是多个目标,并不是普通的二分类问题,这个问题的一种直接解决方案正是Multi-Label。
那么首先来区分几个概念:
多分类问题,比如常见的OCR问题是多分类问题,Detection中针对每个候选框的分类是多分类问题。
传统的解决办法是拆成二分类问题,然后使用SVM等传统分类器,分拆的方法有一对一、一对多等。但在这类问题中,输入的图片或者候选框默认是最多含有一类物体的,比如要么是车、要么是人、要么是猫等其它分类。
Deep Learning中Softmax是再自然不过的解决方案。团队中有同学之前问过我一个相关问题:为何传统的机器学习多分类要拆成二分类来做,而不是直接用Softmax?我的理解是传统的分类模型大多是LR、SVM或者GBDT,天生都是做二分类的。LR、FTRL之类在计算广告点击率预测、推荐等领域广泛使用,一般来说就是经典的二分类业务;SVM在视觉之类应用很广泛,都是提完复杂的视觉特征之后套一层SVM;GBDT则在竞赛之类中大放异彩,也在很多业界应用中取得成功。那时候其实Softmax大家也在用,但是有些是场景不合适(本身是二分类问题),有些可能是效果不行(浅层),比如人工提了很多有效特征之后,SVM之类是要秒杀全场的;另外可能也有惯性思维,更多的目光都投在SVM之类上。从另一个角度分析就是神经网络的血泪史,老早就有带着Softmax的神经网络了,但是数据量和计算力不够导致层次不能太深,效果也上不去。(这块纯属是个人猜测,不当之处烦请指出)
多标签问题。输入的图片或候选框含有多个物体,标注的label也是多个,比如下图的标签有:猫、狗。
传统的Multi-Label也有拆为二分类来解决的,但Deep Learning盛行的今天,全连接层后套多个Logistic输出是一种性价比很高的做法。
顾名思义,有多个任务。典型的例子是Fast RCNN,同时做Softmax分类和bbox的回归,这是两个完全不同的任务。
如果多个任务都是二分类的话,这种Multi-Task就是一种广义上的Multi-Label。
一般来说,Multi-Task的不同任务之间区别较大,所以往往不共享所有层,比如上图中的Fast RCNN就是独立的两个全连接层(FC),根据你任务之间的区别大小,可以决定在不同的层开始分道扬镳。这种底层共享,高层分道扬镳的做法也是Transfer Learning,这篇不再展开。
个人理解,连最后的全连接层都共享的多个二分类的Multi-Task就是Multi-Label。
扯远了,总之,题主这个问题是Multi-Label的分类问题,不是检测(Detection)问题,解决这个问题有几种可能的解决方案:
1. 直接用Faster R-CNN也是可以的,浪费就浪费了,因为牛刀是现成的(感谢开源!),最终就是对位置信息视而不见,只处理分类信息。
最终的解决方案可能类似Faster R-CNN:对每个Anchor Box对应的区域进行object/non-object二分类,并用k个回归模型(各自对应不同的Anchor Box)微调候选框位置与大小,最后进行目标分类,最后综合各路分类结果。
2. 使用去掉回归部分的Fast R-CNN之类,也就是只做区域提名和分类,然后再综合一下分类结果即可。
最终的解决方案可能为:对每个Anchor Box对应的区域进行目标分类(softmax共n 1路输出,n个类别加一个非目标类别),也可以先进行object/non-object二分类,再进行n路输出的目标分类,最后综合各路分类结果。
这种方案在速度上应该更快,但效果可能比第一种差,因为提名的候选框可能有偏差,导致分类的置信度不高,从而引入部分误差。当然,可以针对这种置信度不高的候选框再进行微调,也可以在提名时尽量多保留一些候选框,但这个可能又要影响速度了。
3. 用Selective Search RPN之类从图片或卷机层中挑选一些候选框,每个候选框可以单独进行Multi-Label的识别。这个地方也许可以发paper,动机部分大概可以这样写:R-CNN大多是用Selective Search之类在原图或卷积特征层上进行候选框的提名,分类一般采用Softmax进行,因为归一化的影响,做不到同时识别多个目标,但本文提出的Multi-Label方法可以很好的解决这个问题……当然,Multi-Label、Multi-Task、Transfer Learning这些水很深,再加上Deep Learning是当前热点,这方面的paper再灌个三五年问题不大。
4. 借鉴SSD的思想
SSD的核心思想除了延续YOLO的端到端,更重要的是支持不同尺度的目标识别。比如下图中大尺度的红框负责定位狗,小尺度的篮框可以定位猫。
SSD的网络分为两部分,前面的是用于图像分类的标准网络(去掉了分类相关的层),后面的网络是用于检测的多尺度特征映射层,从而达到检测不同大小的目标。SSD和YOLO的网络结构对比如下图所示:
可选的方案有:
1)直接用SSD,综合最终的分类;
2)替换SSD中最终的分类层为Multi-Label,这个模型看上去是个很经典的端到端的Multi-Class分类模型,剩下的最重要的事情是准备大量合适的标注数据。
5. 我爱机器学习QQ群中的“一狼”在讨论中提到目标检测中的框这种方式反而增加训练的难度,可以尝试语义分割的方法。
确实是这样的,目标检测目前的区域提名或者SSD之类的大小框选择都是比较暴力的,在ImageNet这种特定数据上其实是有点过拟合了,因为ImageNet上的物体大多能被这样的框框中,而且每个框也只需要负责一个目标即可。
FCN语义分割与检测相结合也是一个不错的研究点。当然如果是应用,选择一些适合自己的框也是性价比较高的方法,比如只做电线杆检测,就规定瘦长的框即可。
还会有很多种Multi-Label的结合方式,欢迎大家补充。
R-CNN/YOLO/SSD(具体可以参考我们公众号的文章:#Deep Learning回顾#之基于深度学习的目标检测)都非常灵活,有很多可以创新的点,Multi-Label只是其中一个点。
Multi-Label的综述可以参考周志华老师的《A Review on Multi-Label Learning Algorithms》:http://cse.seu.edu.cn/people/zhangml/files/TKDE%2713.pdf