极市导读
本文主要内容还是围绕着场景分析与数据理解、方法论与算法设计、工具链与部署落地等方面进行展开,重点关注的是顶层设计。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
注意:本文从我的一个PPT整理而来,行文可能比较随意,很多细节没有写清楚,后续有时间会持续修改。
上次说到,要写一个系列,最后整理才发现,还是合成一篇比较好一点。
皮特潘:AI 工业缺陷检测 —— 写在前面的话
https://zhuanlan.zhihu.com/p/375383384
主要内容还是围绕着场景分析与数据理解、方法论与算法设计、工具链与部署落地等方面进行展开。重点关注的还是顶层设计,因此涉及到的很多具体的细节没有说太多,仁者见仁智者见智吧。在平时工作中和思考问题上,我喜欢用简单粗暴的手段去分析,比如:本质上,和某某没有区别,说白了就这等语气。目的就是透过现象看本质,抓住主要矛盾。
皮特潘:谈一谈我对AI项目落地的看法
https://zhuanlan.zhihu.com/p/336671388
本文大致的脉络是按照场景、数据分析,方法论算法设计,工具链与部署等进行展开。行文中一些比较重要点的,会单独开篇幅进行展开。包含以下论点:
我认为缺陷检测没有啥难的,基本上都可以做。那为啥槽点还那么多?我认为很大一部分是AI的槽点,因为目前使用AI来做是主流,或者说只传统方法搞不定的,没办法,只有上AI的方法。AI的槽点有很多,例如:
当然,学术界和工业界也有一条巨大的鸿沟。学术界在于新,有创新点,在开源数据上各种尝试。工业界强调的是精度、成本、落地。再者场景过于分散,没办法达成一致的共识,场景、数据、需求等均是如此。
单单从工业界来看,在“缺陷检测”这一个细分的场景(其实也不是啥细分场景,所有找异常的都可以叫缺陷检测)。也有很多的槽点或者坑点,我认为原因如下:
从业务、工具、管理上来说,有三大难点:
本文讨论的是工业场景,那就先和自然场景比一比吧!如下:
当然有一个非常重要的特性没有说:
自然场景一般是强语义信息,缺陷检测一般为弱语义信息。近期利用轻量级语义分割训练缺陷检测不好使有感而发。缺陷检测不需要特别大的感受野,一般为纹路上的缺陷,局部区域就可以判别。
貌似难度比自然场景少不少,再仔细分析一下,工业场景其实有以下几个特点:
以上是工业缺陷检测场景的固有属性。针对该场景,主要有以下三点需求:
做好缺陷的归类,才容易下手。这里给出三种归纳方法:
归纳一:
归纳二(站在正常样本建模的角度):
归纳三(形态上):
需求非常多,有时甚至来不及打光验证。因此我有一套简单粗暴的可行性分析办法。主要针对业务场景来说。当然这只是粗糙的可行性分析,只能建立大致的、初步的印象。具体能不能做,还要从光学、结构复杂度、成本、运维、打开市场、推广等多个维度进行评估。
简单粗暴包括以下两个点:
基本上满足以上两点,就可以认为该case是可行的,基本可以做的。不过实际的情况是比较复杂的。仅仅靠“明显”和“明确”会把很多机会拦截在外。这种定义无可厚非,但是不够深入,给算法设限。缺陷检测,很难做到这两点的理想情况。且看下一小结数据的详细分析。
难分、多样性、不平衡、数据脏。把握难点,针对举措。
直接后果就是标准难定,学术一点来说就是正负样本类间差距较小,不是非黑既白的一刀切能够搞定的,很难有一个一致性的标注将正负样本分开。也就是需求标准难定,即便是人工也很难保证。标准可能还比较好定,但是执行起来较为困难。
这个放到第一点,因为它是场景和数据的固有属性,人工很难改变,这也是大家吐槽缺陷检测难做的主要原因。不管用任何手段去描述缺陷,都不能做到明显可分。比如按照面积、灰度值等绘制其直方图,中间过渡区域永远存在一定量的样本,处于灰色地带,模棱两可。不管你是多人标注也好,不管你是做量化指标也好,总很难有好的办法改变这一现状。
有人可能会说,直接给阈值进行一刀切或两刀切,阈值交给客户来定。不过我们自己本身要想明白这个事情:不管是AI,还是人工,都会检出灰色地带。该场景存在这种情况,那么说明其需求本应该能够接受灰色地带的数据分错。
标注测试集就很难做,例如甲方合同明确要给出准确率。该问题的存在,很难达到理想的指标。所以如果面临该场景,建议在统计指标上,给出明显漏、明显误等。不然会陷入“清洗数据”、“更改需求”、“重复试验”的死循环,无法解脱。
能否给出对应的量化指标,也是很大的问题,比如明显的缺陷判分很低,微弱的缺陷置信度又很高。降低客户的期望也好,让客户理解AI判定过程也好,总之就是既然想让AI代替人工,我是可以做到。
针对该场景,我们要做的是:易分样本(也就是明显缺陷和明显不是缺陷)不能出错,然后在漏检和误检的tradeoff寻求一个平衡。一般客户会有“直通率”这个概念,可以多次磨合,多次迭代,趋向用户期待。
这点表现为类内差异过大。比如同样是划痕,表现形式各种各样,有的发白,有的发黑,有的吃视角,有的发生在边缘地带等等,出现在不同位置,表现形式都不一样。因此导致一个问题:你很难收集到全部形态的缺陷样本,所以在测试集上很难有一个不错的表现。也就是你的训练集和测试集存在的明显影响性能的偏差,这里的偏差不是标注导致的,而是数据本身导致的。这种情况还是比较高频率能够遇到,比如和客户聊一个需求的时候,对于某一种缺陷,他会说比较大概率发生在A处,但是不能排除发生在其他地方的概率。问题就是目前很难收集到样本,即便收集到样本,也很难覆盖所有的情况。
一般我们做一个任务,会有一份标准测试集,方便我们的方案、算法进行迭代。没有测试集,精度指标无从谈起。由于缺陷表现的多样性问题,我们的标准测试集可能就没有那么的“标准”。实际数据集构建的过程中,尽量保证较大的覆盖率。多样性图片拿不到,但是“缺陷描述”还是可以拿得到的。因此需要结合一些正常样本学习和数据生成的方法来降低“多样性不够”带来的影响。
表现在3个方面:
工程上的问题,必须考虑数据脏的情况。
数据脏就是标注的时候把标注类别搞错。搞错大家一般会认为是数据难分的原因,其实不然,数据难分,也就是标准难定或者无法清晰给出,因此这部分导致的原因不能单纯归纳为数据脏。但是这里为了便于分析,我们区别对待。脏数据会对网络训练带来不利的影响,强行训练会有过拟合的风险。因为网络提取通用特征,拟合不到缺陷只能去拟合其他噪声了。不过也有说法是,脏数据作为噪声,也能给网络带来好的收益,让网络搜索参数的时候增加扰动,避免陷入局部最优,却能防止网络过拟合。不过一般任务:数据还是越干净越好。
那就是数据清洗,例如交叉验证。学术上也有一些噪声样本学习的方案。数据脏还比较好办,归根到底是数据标注的问题。随着训练迭代以及人工清洗,可以很好的改善这一情况。
虽然是工业场景,数据会源源不断过来。但是上文提到数据的几大问题,例如样本不平衡等,所以有时我们会需要生成一部分的数据。还有一种情况,在项目初期,我们往往“打样”。所谓demo阶段,是拿不到足够多的数据的。另外,数据肯定是多多益善,如果我们有生成数据的巧妙方法,训练从中受益的话,也很大程度上降低了数据收集、标注、清洗的成本。
数据生成有传统方法和深度学习方法两种可用。传统方法可以进行一些图像融合,例如直接将缺陷裁剪下来到处贴,为了保证生成的逼真一点,还是需要一些融合的手段,例如泊松融合和边缘融合等。当然,有些场景,直接修改图片局部的灰度值也可以生成逼真的缺陷。我就单单利用修改图片的灰度和对比度就生成了很多以假乱真的图片。深度学习方法一般用GAN和VAE等生成模型可用,利用GAN可以直接从噪声生成数据,不过产生新的对网络训练有受益的信息比较有限。可以利用类似pix2pix的方案进行图片编辑。传统方法中的图片融合也可以利用GAN来做。
前面主要说了场景和数据的一些东西,这里对比再看一下。场景是客观的,固有属性,你做与不做,它都在那里。
数据是有主观的成分在里面:从其光学设计、标准执行等上来说,有很大人为因素。也是上文说的可控。具有很大的操作和设计空间。
但是有时还要思考:值不值得做?可能是时间、成本、性价比、大规模推广等方面的原因。当然,大部分场景还是很容易做的,因为在工业领域,至少是受限的和可控的场景。关键要分清主要矛盾和次要矛盾。
这里重要要建设四种意识,要进行全员建设。从产品经理、光学工程、结构工程师、算法工程师、应用工程师、运维工程师,当然也包括决策者:
在进行需求挖掘和可行性分析的时候,有一些一些值得思考点
当然,上面也说了,数据场景复杂,一致性问题难以保证。而且面临的数据量比较大,因此你还可以使用一些半监督、弱监督的手段来降低标注的工作量。
任务拆分,可以降低算法的难度。多个结果进行分摊任务难度,另外不同阶段对数据的依赖不一样,多个阶段拆分更容易控制,尤其是在样本平衡方面。多个阶段对标的是端到端,可以做到精度方面的提升。
定制特性:
当然再配合一些训练tricks,可以达到事半功倍的效果:
众所周知,diceloss是语义分割,尤其是应对正负样本不平衡的一把利器。但是它也有一些槽点,因此必须整明白。下面提出diceloss十问,暂时不给出答案。之前也写过一个diceloss的深度解析,可以参考一下:
皮特潘:语义分割之dice loss深度分析(梯度可视化)
https://zhuanlan.zhihu.com/p/269592183
分类是最简单的任务,当然缺陷检测可能会对它提出了更高的要求。例如下面这个方法
皮特潘:DCL细粒度分类网络小记
https://zhuanlan.zhihu.com/p/328377321
分类任务有时会结合交叉验证、多模型boosting、弱监督语义分割。
很多技巧性的东西,都是通用的目标检测技巧,例如:尺度问题、形变问题等等;本文不再叙述。
传统方法:(场景受限,需要调参数,可用于防呆,明显缺陷没问题,微弱缺陷效果不行)
深度学习:
对场景进行筛选,从简单、对齐入手。注意:可以利用监督学习寻找算法的上限
如上图,缺陷检测落地需要非常多的工具支撑:
难点:整合散乱的工具,甚至完全交给用户。市面是有很多做自动训练软件的,例如比较知名的VIDI,国内也有AIDI、Alpha等。可能大家选择的模型不是非常先进,但是从标注到训练,再到模型导出,用户体验和跨平台做的比较好。工业场景,特定场景特定算法,工具做好,不必追求SOTA模型,SOTA模型只是提高了自然场景精度的上限,而我们需要把握模型的下限。
部署没啥可说的,可其他任务没有太大区别,这里列举一些总结的点吧!
部署两大任务:
模型加速:
部署的两种方式:
常用推理库:
所以缺陷检测不单单是一个算法模型的问题,而是整个系统工程。可能不需要非常前言的算法,但是需要成熟的工具链。即便是基础的算法、看似容易的场景,也可以形成技术壁垒。如果想复刻,也没有那么轻松。很多时候,不是不能做,而是值不值得做?
Nothing is impossible, what you want is simply expensive
最后,缺陷检测都是可以做的。那些非常难的,AI是目前最好的方案。
本文亮点总结
如果觉得有用,就请分享到朋友圈吧!
公众号后台回复“CVPR21检测”获取CVPR2021目标检测论文下载~
# 极市平台签约作者#
皮特潘
知乎:皮特潘
作品精选