视觉类表面缺陷检测项目相关技术总结
本文由海滨撰写,首发于GaintPandaCV。
零、前言
做这个方向的项目也有一段时间了,作为算法工程师,主导的大大小小的项目也有几个,有成功交付的,诚然也有烂尾的。回顾整个项目流程,尽管经历酸甜苦辣,但收获颇丰,估写下此文当成2023年终总结吧。
本文不仅仅涉及的是技术,也有一些对于项目管理,需求沟通的相关的内容,算是自己的一点点感悟。
表面缺陷检测项目,同事更多称之为“质检项目”,我总觉得这个范围太大了。尽管PPT里面写的看着我们什么都能做,但是当面对一些刁钻需求时,实事求是地讲我们还是做不了。
本文不会涉及太多技术细节相关的东西,主要是一些方法论。
一、任务定义
表面缺陷检测任务是指通过对产品表面进行仔细的检查和评估,以发现和识别任何不符合质量标准或设计要求的表面缺陷。这项任务的目的是确保产品的外观质量和功能性满足预定的要求,从而提高产品的整体质量和客户满意度。
表面缺陷检测广泛应用于多个行业,以确保产品质量符合标准,提升产品竞争力。这其中包括
- 制造业:
- 汽车制造业:检测车身、零部件等的表面缺陷。
- 航空工业:检测飞机机身、零件等的表面缺陷。
- 机械加工:检测机床床身、导轨等部件的表面缺陷。
- 电子行业:检测电路板、手机壳体等产品的表面缺陷。
- 家用电器:检测塑料外壳、金属部件等的表面缺陷。
- 材料加工业:
- 钢铁行业:检测钢材表面的裂纹、折叠等缺陷。
- 有色金属行业:检测铝、铜等金属材料的表面缺陷。
- 陶瓷和玻璃行业:检测陶瓷和玻璃产品的表面缺陷。
- 纺织品和服装行业:
- 检测纺织品的破损、污渍、颜色不均匀等表面缺陷。
- 检查服装纽扣、拉链等附件的表面缺陷。
- 食品和包装行业:
- 检测食品包装袋、容器等的印刷质量、漏印等表面缺陷。
- 检查包装材料的密封性、透明度等表面缺陷。
- 建筑行业:
- 检测混凝土结构表面的裂缝、蜂窝等缺陷。
- 检查建筑材料如砖、石、木材等的表面缺陷。
- 能源行业:
- 检测风力发电机叶片、太阳能电池板等的表面缺陷。
- 检查石油、天然气输送管道的防腐层、焊缝等表面缺陷。
这些行业的表面缺陷检测不仅关系到产品质量,还可能影响到产品安全、耐用性和市场竞争力。因此,通过严格的表面缺陷检测,可以确保产品在设计、生产和使用过程中的安全和可靠性。
跟一个行业大佬聊过AOI行业,个人感觉AOI聚焦于电子器件的检测:
AOI(Automated Optical Inspection,自动光学检测)是一种利用光学原理和自动化技术对印刷电路板(PCB)或其他电子组件进行表面缺陷检测、尺寸测量、焊点检查等的一种技术。AOI系统通常包括光源、光学镜头、图像采集设备、数据分析软件等组件。
二、需求沟通
由任务定义可知,这类项目是定制化的项目,且ToB为主。有些规则是行业里头的,有些规则是工厂自己定义的。
前期的需求沟通主要以缺陷种类、缺陷的重要性为主。后面需要更进一步讨论质量标准、检测标准和评估可行性。
明确好缺陷种类后,还需要评估对于算法的要求,包括实时性、精度、检测范围等。此外在项目的立项阶段,验收标准也需要确定好。
缺陷样例的收集也是重中之重的工作,如果某类客户要求必须做的缺陷比较难收集,需要评估是否可以人为造一些、通过算法造一些样本或者评估下具体的收集时间是否满足项目要求。比如实时性要求较高的时候,乙方就需要要求甲方购买计算能力较好的硬件,或者计算卡的数量多一些也可以。精度一般存在于验收标准中,指标的定义要明确清楚。
检测范围即检测缺陷的种类有哪些,哪些允许漏检,哪些至少检出一个等。最常见也是最头疼的是检测“异物”,如果客户定义是一个开放集合,就需要慎重考虑,因为常见的有监督目标检测深度学习的方法还做不到。如果客户定义是一个闭集,那就需要统计一下每个"异物"种类缺陷的可收集样本数量,重新按照新的缺陷类别进行评定。
需要注意的是,这类项目再好的检测算法,那也局限于检测,不具有修复缺陷的功能,这在前期需求沟通时就需要对齐。
此外,发会议绩效也是家常便饭,邮件留底是对甲方乙方领导都有交代。
三、成像方案
成像方案的选取取决于多种因素,包括被检测物体的材质、表面特性、所需的检测精度、检测速度以及成本等。以下是一些常见的成像方案:
- 光学显微镜成像:
- 适用于小尺寸缺陷的高分辨率成像,比如一些电路板检测
- 光学检测成像系统(如CCD/CMOS相机):
- 可以配合不同类型的光学镜头和光源使用,适用于多种表面缺陷检测,常见的有钢铁表面缺陷检测、布匹表面缺陷检测。
- 红外成像:
- 紫外成像:
- 某些表面缺陷在紫外光下更为显著,适用于特定材料的表面缺陷检测。
- 激光扫描成像:
- 通过激光扫描器逐点扫描物体表面,再通过传感器收集数据,适用于大型物体的高精度检测。
- 超声波成像:
- 通过超声波在材料中的传播特性来检测内部和表面的缺陷。
从算法工程师角度,我们往往关注于整个系统的节拍和成像的耗时(工控机最终得到单个完整图片的时间),以及最后的图像是单通道的还是多通道的,是2D检测还是三维检测。
成像还需要注意两点:
- 一定要求验证环节,确保每一类缺陷都可以拍的到,且比较好区分,不受正常区域影响。后续改成像成本很大,牵一发而动全身。
- 成像方案要确保可迁移性,即在验证阶段搭的实验条件下的成像效果,在正式投入使用时依然可以保证原来极为接近的成像效果。
四、缺陷收集和对齐
缺陷图片的收集是一个体力活,主要分为两种方式:
- 人工收集:依赖于甲方客户工人师傅收集样本,然后乙方或者甲方派人人工进行照片取样。
- 半人工收集加自动采集:这种收集方式常见于钢板和布匹纺织品缺陷检测领域,这类任务有一个重要的特点是摄像头拍摄的每张图像在空间上对齐的,即每一处位置在图片上的语义不会变。这种特征保证了可以采用一些半监督或者无监督的异常检测方法来从收集的大量正常样本中获取到异常样本。后续还需要收集固定类别的样本,比如划伤、裂纹等,这个时候就需要人工训练一个CNN分类模型来对缺陷样本进行细粒度的分类。
缺陷对齐环节在需求沟通阶段已经有纲要了,在缺陷对齐环节更多的是对齐细节,这个时候就要确定缺陷的标注问题了,是标框还是标像素点,框是外接矩形框还是旋转矩形框,这需要根据客户需求、缺陷描述准确性、算法实现难易程度综合考虑。
五、整体推理服务框架
表面缺陷检测算法常常以目标检测算法来实现,它有着输入图片较大、实时性要求高的特点。
表面缺陷检测算法的框架个人总结如下:
- 大图预处理:对于大图的预处理包括去除非检测区域以及特定异常的分类,这些一般可以手写一些特征来处理(比如去黑边),有时也需要训练一些模型来处理(比如对于大图特定缺陷的分类),还有是需要提取一些检测区域(ROI区域,Region of Interesting)
- 大图上的缺陷检测:有些缺陷在大图上容易定位特征比较明显,可以放在大图中去检测。需要注意的是,在大图上做缺陷检测是耗费总体时长的,所以后续步骤如果需要在小图上做检测,那么从整体系统延迟角度考虑,大图的检测尽量还是放到小图上、
- 根据ROI区域切小图:有ROI区域就根据ROI区域坐标切,这里有两个超参数,即小图切多大和stride是多少,这些可以根据检测精度要求、系统延迟要求和小图目标检测器的输入图片大小来判定。
- 小图预处理:对于小图预处理的包括对于小图异常的分类判定,在一个正常的检测流程中,正常样本占大多数,这样一个耗时较小的分类器可以挡掉后续大图分正常小图的目标检测。
- 小图上的目标检测:小图的目标检测以识别小目标为主,即在大图上是在检索不到的,一般在7x7像素至30x30像素之间,小目标的检测是一个难题,但在工业界提升精度并保证推理速度最快的方式就是加数据和堆卡,至于模型的选型,自然是满足推理时延范围内选精度比较高且其他方面相对合适的。
- 检测结果合并:最后结果的输出需要合并小图和大图的检测结果,包括将小图检测坐标还原到大图位置,以及检测结果目标框的合并(切小图时候有overlap导致)
六、模型训练和调优迭代
模型的训练和调优主要包括以下几个过程:
- 数据预处理:这是模型训练的第一步,包括收集数据、清洗数据、处理缺失值、数据标准化或归一化、特征选择和特征工程等。目的是将原始数据转换成适合模型训练的形式。
- 选择模型:满足小数据就用小模型,大数据就用大模型。简单任务就用小模型,复杂任务考虑大模型或者小模型组合。比如ROI区域检测有一些小的检测模型足以,检测小目标的模型small量级能满足要求用就好,不需要动不动就transformer、大模型,尽管它很火。
- 训练模型:使用已标记的数据集对模型进行训练,调个几次参数足以,我个人一般将学习率设置为原来的0.1,然后加载预训练参数,其余保持一致。当然时间充裕的时候我也有过创新,下面章节会说到。
- 模型评估:使用验证集或测试集评估模型的性能。常见的评估指标有准确率、召回率、F1分数、mAP等。
- 调优模型:根据模型评估的结果,对数据进行调整。注意是数据,经过学术界验证的论文,一般不会对模型进行魔改,除非任务特殊。指标低一般就是数据的问题,找标注人力修数据就好。
在模型训练和过程中,我一般基于一些框架写一些适配的小工具,比如
- 获取每一个缺陷类别的检测指标
- 可视化数据集标注
- 可视化模型预测
- 模型预测转换为预标注,给一些数据打伪标签
- 获取bad base和原始标注,方便标注人员修复
- 最佳分类阈值搜索
常用的应该如上面所示,个人更习惯于打造工具的可复用性,所以一些简单的需求我还是会写一写脚本嵌套到模型检测训练框架当中工具化。
七、模型部署
模型部署是将训练好的模型转化为实际可用服务的过程。模型部署包括以下几个主要工作内容:
- 环境配置:为模型部署准备合适的环境,包括硬件资源(如CPU/GPU、内存、存储等)、操作系统、依赖库和框架等,一般这些都是供应商准备,算法工程师将所有服务打包到docker当中即可。
- 模型转换:将训练好的模型转换为适合部署的格式。这可能包括将模型转换为特定的格式(最常见的即ONNX),或者将模型的代码优化以提高推理速度。
- 服务构建:将模型集成到服务器或应用程序中,以便可以对其进行远程调用。这通常涉及到编写API接口代码,以及创建相应的服务架构,如微服务、RESTful API等。
- 性能优化:确保模型在部署后能够高效运行。这可能包括对模型进行压缩、量化,或者对服务架构进行优化,以降低延迟和提高吞吐量。
- 测试:在部署前后进行全面的测试,确保模型的功能和性能都符合预期。一般需要找测试的同事测试一下并给出测试报告。
- 监控:部署监控系统来跟踪模型的性能,包括准确率、响应时间、资源消耗等指标。对于部署系统的准确率和资源消耗压测是必不可少的环节,这涉及到服务的可用性。
- 日志记录和错误处理:配置日志记录系统,以便在模型出现问题时可以追踪和分析。同时,实现错误处理机制,以便在出现异常时能够给出适当的反馈或解决方案。
- 文档和培训:为使用模型的人员提供必要的文档和培训,确保他们了解如何正确地使用模型和服务。
- 安全性和合规性:确保模型的部署符合数据安全和隐私保护的法规要求,包括数据加密、模型加密、用户身份验证、访问控制等。
部署服务架构的优化体现在如下原则:
- 充分采用加速卡GPU/NPU硬件资源,比如对输入视频或者图片尽量采用硬解码的形式,采用硬解码后的输出显然是放在显存上,这样后续的预处理就不需要过CPU,对于输入数据的预处理也尽可能放到加速卡上去做。
- 模型并行策略:比如在切小图后,对多个小图放到不同的计算卡上去推理,充分利用多卡推理资源。这里就涉及到负载均衡技术,比如如何将计算负责合理地分发到不同的计算设备上,我的个人博客当中有《对单机多卡AI模型推理场景下计算资源分配问题的思考》这篇文章,欢迎大家去阅读。
- 服务并行策略:运行多个推理服务,采用nginx代理方式,对外提供一个接口,提升服务稳健性和并发度。
八、一些节省推理延迟的trick
- 图像输入大小
图像输入不一定非得是正方形,可以按照等比例压缩,比如原来图像的宽高比是4:1,那么在训练分类或者检测模型时,保持4:1宽高比即可,这样既可以满足性能要求也可以极大降低节省推理时间。
- 输入通道大小
灰度图的通道数为1,不需要为了满足模型要求输入,在channel维度上再复制两分,我们可以通过改模型的方式将模型输入通道数修改为1且不影响加载预训练,欢迎阅读我的博客中的其他文章《灰度图分类采用Imagenet预训练时卷积核压缩Trick》
- 模型量化
目前对于检测模型和分类模型的8bit量化方案已经很成熟,如果优化后依然不能满足系统延迟要求可以考虑量化模型。
九、后续运维
表面缺陷检测是制造业中的一项重要质量控制工作,在服务有效期内,有必要对软件服务进行运维。
后续运维工作主要包括以下几个方面:
- 数据管理与分析:收集和存储检测数据,进行定期分析,以优化检测流程和提高检测效率。这可能涉及到使用专业的数据分析软件,对检测结果进行统计和分析。
- 交付人员培训:对交付人员进行培训,包括模型的升级策略、bad case数据收集,模型服务的部署等内容。
- 故障应对与反馈:在检测过程中,如果发现检测服务存在问题,需要迅速应对,找出原因并进行修复。同时,将问题及解决方案记录下来,以便未来避免类似问题的发生。
总结
一直想写这篇文章,可是一直排不上时间,终于在23年农历腊月二十九到三十的晚上完成了此文。
我很享受做这些项目的过程,可以从客户的认可中获得满足感。
记得本科阶段,作为下位机软件开发人员参与流水线检测项目,总觉得设计视觉算法的人很牛,若干年后我也变换了角色,成为了一名算法工程师。命运总是很奇妙,不是么?
工作上暂时不再涉及此类项目,写下此文以作总结。