AI虐我千百遍,我待AI如初恋
首先总结被虐的案例
1.经过N次版本迭代与优化,最终定稿。支持切换型号、云端训练、人工调参等貌似高大上的功能。最后,才发现客户的要求是准确率100%。
2.样机各种灯光闪来闪去,各种运动机构群魔乱舞。什么犄角旮旯都覆盖到,什么划痕、残缺、脏污都面面俱到。但是,一个产品的检测竟然要30s。到过一次生产现场才发现:人工目检只需要2s。
3.光学、算法、界面都ok了。在热火朝天、干劲十足的准备推广成千上百套变现的时候,客户说:抱歉,只要一套。
4.同上,最终客户说你们这个产品真的很先进,容我再考虑一下。当然是杳无音信。算是被耍呢?还是算是白嫖呢?
5.当我们正为识别准确率到达99%而欢呼雀跃的时候,客户把一个识别成功的和一个识别失败拿到一起,问:这两个明明一模一样,为啥这个失败了,这个成功了?
6.我去生产现场培训客户标注。他们非常配合,找来的也是目检老手。我示范了几个后,让他试试。他就是不肯,搞到最后才知道:额,他不会用电脑!
7.我们的算法好牛掰,我们模型好先进。AI+传统方法一起来搞,完美。不过你需要调整这20个超参。人呢?别走啊!
8.已经上线运行了,最后发现某一种型号的某一种缺陷打光不佳,图像上很难判断。最终只能推倒重来。
9.没有意识到数据的重要性,每次都是几张图片在测试,结果是很完美,最匆匆拍板上线。最终大批量测试的时候,发现不work了。
10.算法ok,部署效率也ok,标注-训练-部署的闭环生态也ok。然后客户问:每次更换型号,能不能不训练?
为啥这么难?
工业AI,尤其是缺陷检测这块,都是硬骨头。虽然场景非常简单,虽然数据都是源源不断,虽然算法都是非常纯粹。但是其需求太分散了,不是不能做,而是值不值得去做。因为你要面临以下问题:
1.说不清道不明、模棱两可的标准。
2.某些难以量化的标准。
3.频繁变更的需求,难以做到只靠调后处理参数就能快速响应。
4.频繁更换型号的场景,留给你训练的时间不多。甚至无法提供良好的训练环境。
5.立体的产品,各种吃光照,吃视角的缺陷,极其微弱的缺陷。
6.难以保证的样本一致性问题,这是你过拟合的根源。
7.准确率能不能到100%,真的有人可以拍板保证吗?
8.有没有人工做的更快?
9.有没有人工费用更便宜?
10.需要配合繁复的硬件设备,尤其是运动设备。如何才能保证整套设备的稳定性?
同上,难以保证的硬件可复现性。甚至一机一模型你都要谢天谢地,更不要说通用。
后期维护成本问题,由于涉及的环节太多,需要“全才”才能搞定。
一般流程
AI切记要敏捷开发,更要方法论,更更要稳定的开发流程,一步错很可能就重头再来!
这里要提的是,工业场景的AI不过是整套系统中的一个小小组件,你一定不会靠单纯的AI去make money。即便如此,AI从无到有,依然经过以下几个环节:
需求阶段
包括场景分析、问题定义、可行性分析。很多任务都是从该阶段直接进入end。这个是好事,一定不要盲目自信和盲目乐观。所谓一叶障目不见泰山,只看到算法容易实现就忽略以上的问题,最后只能惨淡收场。最怕投入太多沉没成本之后,想收场却不甘心。
什么是需求,什么是真正需求,什么是隐藏着等待发掘的真正需求。很多时候,和客户一起聊需求的时候,他们给不出明确的需求。最简单直接的办法就是,深入参观他们的生产现场。和工人融到一起,学会他们的判断标准。为他们发掘需求,尤其是下面几点必须提前明确清楚:
1.什么是绝对不能容忍的错误,一旦出现就是质量事故。我们要知道算法的下限在哪里。
2.涉不涉及更换型号,能否提供符合模型训练的场景要求,比如至少得有GPU吧,或者可以上网进行云端训练。
3.对时间上的要求,很多替换人工工位都要要求比人更快。我们要知道系统的物理极限,例如运动设备。
4.对于算法难以界定的灰色地带,接不接受人工二次复检。对于不work的个例,我们要有backup。
其他都比较直白,对于第二点说明一下。大家想必都知道,我们做算法复现的时候,训练部分比推理部分要困难好几个等级。同理,上线部署的时候,如果涉及用户自己训练,那么难度就上来了。要把标注、数据处理、训练参数、测试评估等整个闭环生态都打包在一起,还要实现全自动化。一旦某一个环节出问题,那么足够你手忙脚乱。甚至会遇到诸如用户电脑不能上网&没有GPU的情况,没有错,即便是你提训练必须条件,他也不一定会给你配到。
以上这几点,一定要仔细论证,全局论证,反复论证。论证不是内卷,不是效率不高,不是执行力不高。没有详细论证而匆匆上马的项目,一般后期有无数个坑在等着你。
打光阶段
包括光学设计、成像分析,当然还包括不是那么AI的结构设计等。俗话说:七分靠打光,三分靠调参。打光非常重要,因为后续算法只能为图片负责。一般我会用“明显”和“明确”来进行可行性分析,“明确”来自需求,而“明显”就是来自光学。最直观的判断就是,人肉眼能否通过图片进行精准判断。如果存在模棱两可的部分,那么它也将成为算法模棱两可的地方。
数据阶段
包括数据采集、数据标注、数据处理。数据的重要性不言而喻,正所谓:七分靠数据,三分靠trick。数据到位了,一切都好说。数据的重要性,想必是任何一个从业人员都深有体会的。我们要数据,要有效的数据。没有数据的场景,抱歉请用传统方法。要记住,模型泛化,没那么重要,当然模型也没有那么强的泛化能力。它之所以能够识别,那是因为它见过。将模型理解成一个存储器,而不是泛化器。之前的你,需要建立数据库来存储数据用以测试时的比对,现在的你,模型就是你的数据库。
数据标注就会涉及标准的定义,很多时候很难拿到清晰的标准。或者说无法量化为清晰的标准。往往会存在灰色地带,这就要提前有一个清晰的认识。对于灰色地带的处理,或者说客户的容忍,要提前想好策略。这里比较困难的是,灰色地带可能很难量化出来,我们只是知道这个样本是灰色地带,到底有多灰,have no idea。
另外,比较重要的是尽快建立稳定的、有代表性的数据集合,尤其是测试集,这点非常重要。这是你数据的baseline,可以帮助非常敏捷进行后续的benchmark实验。如果你不知道你对什么样的最终结果负责,那么你将永无止境的做下去。
算法设计阶段
包括任务定义、任务拆分、模型选择。尤其是任务拆分,你不肯定把所有的大象都装到一个冰箱里面,你也不可能把所有的鸡蛋放到一个篮子里面。
杜绝唯模型论 & SOTA 论。我们需要的是在特定场景下解决特定的问题。这里涉及学院派思维转变,学院派的高手为imageNet和COCO等数据集负责,而我为我自己的场景和数据集负责。SOTA看中的是模型的上限,而实际的场景,看中的是模型的下限。
杜绝唯AI论。不管传统方法还是AI方法,能work的就是好算法。如果传统方法没有明显的缺陷,那么请选择传统方案。或者你可以这么认为,当前看似高大上的AI并不是真正的AI,或许30年后一天,你会说:先用传统方法YOLO V28 来试一下吧!
训练评估阶段
包括模型调参、模型训练、指标评估。所谓的“炼丹”。前几步做好了,一般不会有太大问题,如果有,请向前追溯。还是那句话,建立好baseline,逐步提升。这里要说一句,“提前优化是万恶之源“。在保证精度的时候,再去考虑速度,再去做优化。当然你靠58个模型联合起来获取的精度不在该讨论范围。
部署阶段
这个阶段坑比较多,基本上都是技术方面。也是所谓的“脏活”。包括模型优化、跨平台前向推理、模型加密。终于到部署阶段了,也看到了落地的曙光。关于深度学习人工智能落地,已经有有很多的解决方案,不论是电脑端、手机端还是嵌入式端,将已经训练好的神经网络权重在各个平台跑起来,应用起来才是最实在的。不过依然存在这么多工作需要做:
跨平台:可跑目标硬件上,包括各类cpu/gpu/npu/fpga等等。
高效能:速度快、占用内存少等。
精度没有丢失:经过一通量化、剪枝、蒸馏、图优化等操作后,终于满足时间要求了,却
然发现部署测试精度掉了一半,WTF。
加密需求:你一定不希望自己辛辛苦苦搞出来的成果被别人白嫖吧!
闭环生态:当然你不能一劳永逸,怎么在应用中收集样本,更新系统。你需要作成实用、好用的闭环工具链。
运维阶段
包括运行监控、模型更新等。你以为可以松一口气了,然而并没有。能不能经受海量产能和时间的考验,请瑟瑟发抖地注视着吧!运维的核心就是保证业务安全稳定运行。上面提到,AI泛化能力还是比较欠缺的,所以很可能会在实际运行的过程中遇到不work的情况。当然最最直接的办法就是持续不断扩充数据。当然要保证你的模型有足够的capacity,如果没有,那么就是算法设计环节没有做好。收集数据利用上面部署阶段所说的闭环生态工具链来持续完成这个事情。