50

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

 4 years ago
source link: https://www.tuicool.com/articles/EjmuEvU
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

加入极市 专业CV交流群,与 6000+来自腾讯,华为,百度,北大,清华,中科院 等名企名校视觉开发者互动交流!更有机会与 李开复老师 等大牛群内互动!

同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。 关注  极市平台  公众号  , 回复  加群, 立刻申请入群~

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

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

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

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

eu2IRrF.jpg!web不要在意这些细节

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

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

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

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

QfAf6ny.jpg!web颜艺(正例)的类内区别其实非常大

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

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

eMfYNvz.jpg!web

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

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

qAJJrq3.jpg!webGMM过滤后的图片。 相比随机采样颜艺表情多了很多

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

rmumqin.jpg!web更换feature后重新做GMM过滤,并没有更多的正例

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

3I3meyQ.jpg!web某次迭代的decison boundary附近的例子

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

EvEnI3J.jpg!web

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

reaAvyn.jpg!web4轮迭代后模型预测的正例

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

QNBnUze.jpg!web模型预测的正例做GMM密度过滤的结果

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

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

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

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

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

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

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

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

jiYbIrb.jpg!web

好了可以做冰箱贴了。

-完-

*延伸阅读

添加极市小助手微信( ID :  cv-mart ), 备注:进 -姓名-研究方向即可申请加入 极市 技术交流群, 更有每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流, 一起来让思想之光照的更远吧~

RrYj22I.jpg!web

△长按添加极市小助手

Yjqyyiq.jpg!web

△长按关注极市平台

觉得有用麻烦给个在看啦~    uE7RJjy.gif


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK