Press "Enter" to skip to content

异常检测问题的实际挑战?从自动化颜艺挑选说起

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

知乎专栏:挖掘知乎里有趣的东西

来源:https://zhuanlan.zhihu.com/p/75752110

已获作者授权,请勿二次转载。

 

最近入了日常(一部动漫)的坑,里面蓝毛的颜艺实在太搞笑了,让人看的时候忍不住截图。但在截了半部番以后我终于崩溃了。。

不要在意这些细节

于是就开始想,有没有可能自动化地来找到比较搞笑的颜艺呢。其实自从有了 头像检测模型 ,我们在数据上就没什幺担心了,在整部番上跑一把就拿到了3万多个头。但自动化颜艺挑选这个问题应该怎幺做呢?

 

作为炼丹侠,这个图像分类问题从模型的角度来看就是finetune一把完事。但如果深入思考一下,从整个机器学习系统的角度来说这其实是个相当困难的问题:

 

首先数据非常不平衡,正例极少。所以如果就正常随机标注的话,可能看了100张图只有一张颜艺。

 

然后颜艺本身的类内变化极大。比如下面几个图。漏标一个了以后很难通过模型本身的泛化性(generality) 通过其他正例补回来。而因为正例非常难碰到,所以漏标的概率其实蛮大的。

颜艺(正例)的类内区别其实非常大

所以从机器学习的角度来说,这其实不是一个典型的图像分类问题,而是一个异常检测问题。异常检测是个成熟的领域,有不少精巧的算法。但我是非常懒的,希望尽可能快地出结果(比如两三个小时以内),所以不太可能去试各种模型。因而选定的根本思路是标注+训练有机结合 (hybrid approach)。具体地说,我们用了这样的原则/技巧:

 

正因为数据不平衡,所以标注是比较轻松的。我们不需要一张张图看过去画勾画叉,而只要一直往下翻,看到正例点一下就好了。所以我们需要做一个简单的标注工具来让标注尽可能轻松。这里选用的就是HTML,用img tag把图显示出来,然后每个img加个onclick()事件,被点的时候就在一个文本框里面把它的src追加上去。可以说是非常简单粗暴了。这个工具做出来以后,一分钟标个100张还是比较轻松的。

 

 

标注工具的界面,就是ipython notebook生成的一个静态HTML

 

但就算标注轻松,100张里面看一个正例也是非常痛苦了。所以我们需要一种方式用非监督的方法来粗筛。这里有个基本的观察是,一部番大多数表情都是正常的。如果对所有脸训练一个生成式模型 (generative model) 的话,颜艺更可能出现在低概率密度的区域。所以我们用一个简单的GMM+ImageNet ResNet18 feature滤了一把之后,发现颜艺的密度的确高了不少。

GMM过滤后的图片。
相比随机采样颜艺表情多了很多

第三个技巧是active learning迭代。GMM毕竟只是一个bootstrap的手段,它一方面不能反映我们训练的模型拿不准,需要人类干预的地方,一方面也不能随着我们模型的更新而有效更新。比如当我们用了5分钟标了500张图,扔到DenseNet121里面训练以后,用这个feature重新做GMM,低概率密度的部分类似这样:

更换feature后重新做GMM过滤,并没有更多的正例

可以看到并没有什幺新的例子引入。所以一个更有效的方法是active learning,把目前的神经网络拿不准的例子挑出来标。此时正例负例都比较集中,标注效率也非常高了。比如下面是某次迭代中拿不准的例子:

某次迭代的decison boundary附近的例子

这样的迭代非常快,因为我们标注工具得当,数据量小训练起来也快。基本上10分钟就能过一轮。比如在标注了上面所示的例子之后,模型的质量在decision boundary附近就有明显改善:

在经过4轮迭代以后,我们可以得到这样的结果:

4轮迭代后模型预测的正例

可以说是 非常沙雕了 。但其实即使是这样的颜艺表情里面也是有自己的结构的。如果我们再在正例上面训练一个GMM,把其中低密度的部分取出来,会发现这简直是 颜艺中的极品,沙雕中的沙雕 :

模型预测的正例做GMM密度过滤的结果

至此我们的目的基本上就达到了。把里面的蓝毛挑出来相对trivial,在DenseNet feature基础上搞个SVM就好。

 

总结一下,面临这样一个机器学习的实际问题的时候,我们做的事情有:

 

其实最首先应该干的步骤应该是确定数据集和定量评价标准。但因为这个问题的定义明确,结果开放,我们要做的事情就是找数据集本身,所以这一步就跳过了。

 

然后是初步可视化数据,确认问题为什幺困难:正例少,正例漏标后果严重。

 

接下来是用非监督的方法bootstrap,一定程度上解决了正例少的问题。

 

得到标注数据以后用监督方法训练,然后用active learning进一步提升标注的效率,迭代数轮。这样就可以得到一个相对靠谱的模型了。

 

在得到模型以后还要进一步可视化,比如tSNE,Affinity Propagation, GMM等非监督模型都可以揭示数据的内部结构。这往往会给人新的启发。

 

总之,训练模型的过程本身并不关键——就是调参炼丹嘛。 问题的关键往往是 理解数据的特 征和挑战,并据此选择合适的方法。

好了可以做冰箱贴了。

 

Be First to Comment

发表评论

邮箱地址不会被公开。 必填项已用*标注