GiantPandaCV | 视觉类表面缺陷检测项目相关技术总结

本文来源公众号“GiantPandaCV”,仅用于学术分享,侵权删,干货满满。

原文链接:视觉类表面缺陷检测项目相关技术总结

本文由海滨撰写,首发于GaintPandaCV。

零、前言

做这个方向的项目也有一段时间了,作为算法工程师,主导的大大小小的项目也有几个,有成功交付的,诚然也有烂尾的。回顾整个项目流程,尽管经历酸甜苦辣,但收获颇丰,估写下此文当成2023年终总结吧。

本文不仅仅涉及的是技术,也有一些对于项目管理,需求沟通的相关的内容,算是自己的一点点感悟。

表面缺陷检测项目,同事更多称之为“质检项目”,我总觉得这个范围太大了。尽管PPT里面写的看着我们什么都能做,但是当面对一些刁钻需求时,实事求是地讲我们还是做不了。

本文不会涉及太多技术细节相关的东西,主要是一些方法论

一、任务定义

表面缺陷检测任务是指通过对产品表面进行仔细的检查和评估,以发现和识别任何不符合质量标准或设计要求的表面缺陷。这项任务的目的是确保产品的外观质量和功能性满足预定的要求,从而提高产品的整体质量和客户满意度。

表面缺陷检测广泛应用于多个行业,以确保产品质量符合标准,提升产品竞争力。这其中包括:

  1. 制造业

    • 汽车制造业:检测车身、零部件等的表面缺陷。

    • 航空工业:检测飞机机身、零件等的表面缺陷。

    • 机械加工:检测机床床身、导轨等部件的表面缺陷。

    • 电子行业:检测电路板、手机壳体等产品的表面缺陷。

    • 家用电器:检测塑料外壳、金属部件等的表面缺陷。

  2. 材料加工业

    • 钢铁行业:检测钢材表面的裂纹、折叠等缺陷。

    • 有色金属行业:检测铝、铜等金属材料的表面缺陷。

    • 陶瓷和玻璃行业:检测陶瓷和玻璃产品的表面缺陷。

  3. 纺织品和服装行业

    • 检测纺织品的破损、污渍、颜色不均匀等表面缺陷。

    • 检查服装纽扣、拉链等附件的表面缺陷。

  4. 食品和包装行业

    • 检测食品包装袋、容器等的印刷质量、漏印等表面缺陷。

    • 检查包装材料的密封性、透明度等表面缺陷。

  5. 建筑行业

    • 检测混凝土结构表面的裂缝、蜂窝等缺陷。

    • 检查建筑材料如砖、石、木材等的表面缺陷。

  6. 能源行业

    • 检测风力发电机叶片、太阳能电池板等的表面缺陷。

    • 检查石油、天然气输送管道的防腐层、焊缝等表面缺陷。

这些行业的表面缺陷检测不仅关系到产品质量,还可能影响到产品安全、耐用性和市场竞争力。因此,通过严格的表面缺陷检测,可以确保产品在设计、生产和使用过程中的安全和可靠性。

跟一个行业大佬聊过AOI行业,个人感觉AOI聚焦于电子器件的检测:

AOI(Automated Optical Inspection,自动光学检测)是一种利用光学原理和自动化技术对印刷电路板(PCB)或其他电子组件进行表面缺陷检测、尺寸测量、焊点检查等的一种技术。AOI系统通常包括光源、光学镜头、图像采集设备、数据分析软件等组件。

二、需求沟通

由任务定义可知,这类项目是定制化的项目,且ToB为主。有些规则是行业里头的,有些规则是工厂自己定义的。

前期的需求沟通主要以缺陷种类、缺陷的重要性为主。后面需要更进一步讨论质量标准、检测标准和评估可行性。

明确好缺陷种类后,还需要评估对于算法的要求,包括实时性、精度、检测范围等。此外在项目的立项阶段,验收标准也需要确定好。

缺陷样例的收集也是重中之重的工作,如果某类客户要求必须做的缺陷比较难收集,需要评估是否可以人为造一些、通过算法造一些样本或者评估下具体的收集时间是否满足项目要求。比如实时性要求较高的时候,乙方就需要要求甲方购买计算能力较好的硬件,或者计算卡的数量多一些也可以。精度一般存在于验收标准中,指标的定义要明确清楚。

检测范围即检测缺陷的种类有哪些,哪些允许漏检,哪些至少检出一个等。最常见也是最头疼的是检测“异物”,如果客户定义是一个开放集合,就需要慎重考虑,因为常见的有监督目标检测深度学习的方法还做不到。如果客户定义是一个闭集,那就需要统计一下每个"异物"种类缺陷的可收集样本数量,重新按照新的缺陷类别进行评定。

需要注意的是,这类项目再好的检测算法,那也局限于检测,不具有修复缺陷的功能,这在前期需求沟通时就需要对齐。

此外,发会议绩效也是家常便饭,邮件留底是对甲方乙方领导都有交代。

三、成像方案

成像方案的选取取决于多种因素,包括被检测物体的材质、表面特性、所需的检测精度、检测速度以及成本等。以下是一些常见的成像方案:

  1. 光学显微镜成像

    • 适用于小尺寸缺陷的高分辨率成像,比如一些电路板检测

  2. 光学检测成像系统(如CCD/CMOS相机)

    • 可以配合不同类型的光学镜头和光源使用,适用于多种表面缺陷检测,常见的有钢铁表面缺陷检测、布匹表面缺陷检测。

  3. 红外成像

    • 对热特性的变化敏感,适用于检测某些材料的热缺陷。

  4. 紫外成像

    • 某些表面缺陷在紫外光下更为显著,适用于特定材料的表面缺陷检测。

  5. 激光扫描成像

    • 通过激光扫描器逐点扫描物体表面,再通过传感器收集数据,适用于大型物体的高精度检测。

  6. 超声波成像

    • 通过超声波在材料中的传播特性来检测内部和表面的缺陷。

从算法工程师角度,我们往往关注于整个系统的节拍和成像的耗时(工控机最终得到单个完整图片的时间),以及最后的图像是单通道的还是多通道的,是2D检测还是三维检测

成像还需要注意两点:

  1. 一定要求验证环节,确保每一类缺陷都可以拍的到,且比较好区分,不受正常区域影响。后续改成像成本很大,牵一发而动全身。

  2. 成像方案要确保可迁移性,即在验证阶段搭的实验条件下的成像效果,在正式投入使用时依然可以保证原来极为接近的成像效果。

四、缺陷收集和对齐

缺陷图片的收集是一个体力活,主要分为两种方式:

  1. 人工收集:依赖于甲方客户工人师傅收集样本,然后乙方或者甲方派人人工进行照片取样。

  2. 半人工收集加自动采集:这种收集方式常见于钢板和布匹纺织品缺陷检测领域,这类任务有一个重要的特点是摄像头拍摄的每张图像在空间上对齐的,即每一处位置在图片上的语义不会变。这种特征保证了可以采用一些半监督或者无监督的异常检测方法来从收集的大量正常样本中获取到异常样本。后续还需要收集固定类别的样本,比如划伤、裂纹等,这个时候就需要人工训练一个CNN分类模型来对缺陷样本进行细粒度的分类。

缺陷对齐环节在需求沟通阶段已经有纲要了,在缺陷对齐环节更多的是对齐细节,这个时候就要确定缺陷的标注问题了,是标框还是标像素点,框是外接矩形框还是旋转矩形框,这需要根据客户需求、缺陷描述准确性、算法实现难易程度综合考虑。

五、整体推理服务框架

表面缺陷检测算法常常以目标检测算法来实现,它有着输入图片较大、实时性要求高的特点。

表面缺陷检测算法的框架个人总结如下:

  1. 大图预处理:对于大图的预处理包括去除非检测区域以及特定异常的分类,这些一般可以手写一些特征来处理(比如去黑边),有时也需要训练一些模型来处理(比如对于大图特定缺陷的分类),还有是需要提取一些检测区域(ROI区域,Region of Interesting)

  2. 大图上的缺陷检测:有些缺陷在大图上容易定位特征比较明显,可以放在大图中去检测。需要注意的是,在大图上做缺陷检测是耗费总体时长的,所以后续步骤如果需要在小图上做检测,那么从整体系统延迟角度考虑,大图的检测尽量还是放到小图上、

  3. 根据ROI区域切小图:有ROI区域就根据ROI区域坐标切,这里有两个超参数,即小图切多大和stride是多少,这些可以根据检测精度要求、系统延迟要求和小图目标检测器的输入图片大小来判定。

  4. 小图预处理:对于小图预处理的包括对于小图异常的分类判定,在一个正常的检测流程中,正常样本占大多数,这样一个耗时较小的分类器可以挡掉后续大图分正常小图的目标检测。

  5. 小图上的目标检测:小图的目标检测以识别小目标为主,即在大图上是在检索不到的,一般在7x7像素至30x30像素之间,小目标的检测是一个难题,但在工业界提升精度并保证推理速度最快的方式就是加数据和堆卡,至于模型的选型,自然是满足推理时延范围内选精度比较高且其他方面相对合适的。

  6. 检测结果合并:最后结果的输出需要合并小图和大图的检测结果,包括将小图检测坐标还原到大图位置,以及检测结果目标框的合并(切小图时候有overlap导致)

六、模型训练和调优迭代

模型的训练和调优主要包括以下几个过程:

  1. 数据预处理:这是模型训练的第一步,包括收集数据、清洗数据、处理缺失值、数据标准化或归一化、特征选择和特征工程等。目的是将原始数据转换成适合模型训练的形式。

  2. 选择模型:满足小数据就用小模型,大数据就用大模型。简单任务就用小模型,复杂任务考虑大模型或者小模型组合。比如ROI区域检测有一些小的检测模型足以,检测小目标的模型small量级能满足要求用就好,不需要动不动就transformer、大模型,尽管它很火。

  3. 训练模型:使用已标记的数据集对模型进行训练,调个几次参数足以,我个人一般将学习率设置为原来的0.1,然后加载预训练参数,其余保持一致。当然时间充裕的时候我也有过创新,下面章节会说到。

  4. 模型评估:使用验证集或测试集评估模型的性能。常见的评估指标有准确率、召回率、F1分数、mAP等。

  5. 调优模型:根据模型评估的结果,对数据进行调整。注意是数据,经过学术界验证的论文,一般不会对模型进行魔改,除非任务特殊。指标低一般就是数据的问题,找标注人力修数据就好。

在模型训练和过程中,我一般基于一些框架写一些适配的小工具,比如

  1. 获取每一个缺陷类别的检测指标

  2. 可视化数据集标注

  3. 可视化模型预测

  4. 模型预测转换为预标注,给一些数据打伪标签

  5. 获取bad base和原始标注,方便标注人员修复

  6. 最佳分类阈值搜索

常用的应该如上面所示,个人更习惯于打造工具的可复用性,所以一些简单的需求我还是会写一写脚本嵌套到模型检测训练框架当中工具化。

七、模型部署

模型部署是将训练好的模型转化为实际可用服务的过程。模型部署包括以下几个主要工作内容:

  1. 环境配置:为模型部署准备合适的环境,包括硬件资源(如CPU/GPU、内存、存储等)、操作系统、依赖库和框架等,一般这些都是供应商准备,算法工程师将所有服务打包到docker当中即可。

  2. 模型转换:将训练好的模型转换为适合部署的格式。这可能包括将模型转换为特定的格式(最常见的即ONNX),或者将模型的代码优化以提高推理速度。

  3. 服务构建:将模型集成到服务器或应用程序中,以便可以对其进行远程调用。这通常涉及到编写API接口代码,以及创建相应的服务架构,如微服务、RESTful API等。

  4. 性能优化:确保模型在部署后能够高效运行。这可能包括对模型进行压缩、量化,或者对服务架构进行优化,以降低延迟和提高吞吐量。

  5. 测试:在部署前后进行全面的测试,确保模型的功能和性能都符合预期。一般需要找测试的同事测试一下并给出测试报告。

  6. 监控:部署监控系统来跟踪模型的性能,包括准确率、响应时间、资源消耗等指标。对于部署系统的准确率和资源消耗压测是必不可少的环节,这涉及到服务的可用性。

  7. 日志记录和错误处理:配置日志记录系统,以便在模型出现问题时可以追踪和分析。同时,实现错误处理机制,以便在出现异常时能够给出适当的反馈或解决方案。

  8. 文档和培训:为使用模型的人员提供必要的文档和培训,确保他们了解如何正确地使用模型和服务。

  9. 安全性和合规性:确保模型的部署符合数据安全和隐私保护的法规要求,包括数据加密、模型加密、用户身份验证、访问控制等。

部署服务架构的优化体现在如下原则:

  1. 充分采用加速卡GPU/NPU硬件资源,比如对输入视频或者图片尽量采用硬解码的形式,采用硬解码后的输出显然是放在显存上,这样后续的预处理就不需要过CPU,对于输入数据的预处理也尽可能放到加速卡上去做。

  2. 模型并行策略:比如在切小图后,对多个小图放到不同的计算卡上去推理,充分利用多卡推理资源。这里就涉及到负载均衡技术,比如如何将计算负责合理地分发到不同的计算设备上,我的个人博客当中有《对单机多卡AI模型推理场景下计算资源分配问题的思考》这篇文章,欢迎大家去阅读。

  3. 服务并行策略:运行多个推理服务,采用nginx代理方式,对外提供一个接口,提升服务稳健性和并发度。

八、一些节省推理延迟的trick

  1. 图像输入大小
    图像输入不一定非得是正方形,可以按照等比例压缩,比如原来图像的宽高比是4:1,那么在训练分类或者检测模型时,保持4:1宽高比即可,这样既可以满足性能要求也可以极大降低节省推理时间。

  2. 输入通道大小
    灰度图的通道数为1,不需要为了满足模型要求输入,在channel维度上再复制两分,我们可以通过改模型的方式将模型输入通道数修改为1且不影响加载预训练,欢迎阅读我的博客中的其他文章《灰度图分类采用Imagenet预训练时卷积核压缩Trick》

  3. 模型量化
    目前对于检测模型和分类模型的8bit量化方案已经很成熟,如果优化后依然不能满足系统延迟要求可以考虑量化模型。

九、后续运维

表面缺陷检测是制造业中的一项重要质量控制工作,在服务有效期内,有必要对软件服务进行运维。

后续运维工作主要包括以下几个方面:

  1. 数据管理与分析:收集和存储检测数据,进行定期分析,以优化检测流程和提高检测效率。这可能涉及到使用专业的数据分析软件,对检测结果进行统计和分析。

  2. 交付人员培训:对交付人员进行培训,包括模型的升级策略、bad case数据收集,模型服务的部署等内容。

  3. 故障应对与反馈:在检测过程中,如果发现检测服务存在问题,需要迅速应对,找出原因并进行修复。同时,将问题及解决方案记录下来,以便未来避免类似问题的发生。

十、总结

一直想写这篇文章,可是一直排不上时间,终于在23年农历腊月二十九到三十的晚上完成了此文。

我很享受做这些项目的过程,可以从客户的认可中获得满足感。

记得本科阶段,作为下位机软件开发人员参与流水线检测项目,总觉得设计视觉算法的人很牛,若干年后我也变换了角色,成为了一名算法工程师。命运总是很奇妙,不是么?

工作上暂时不再涉及此类项目,写下此文以作总结。

THE END!

文章结束,感谢阅读。您的点赞,收藏,评论是我继续更新的动力。大家有推荐的公众号可以评论区留言,共同学习,一起进步。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/389803.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Postgresql 下安装QGIS

一.打开 Application Stack Builder 二.选择默认端口和安装目标 三.选择【Spatial Extensions】 四.选择安装位置 五.选择安装组件 六.选择数据库和输入对应账号密码 七.安装完成

【Linux】进程的初步认识

进程的初步认识 基本概念描述进程task_struct-PCB的一种task_stuct内容分类 查看进程通过系统调用获取进程标识符 基本概念 要了解进程,首先我们要知道两点 我们可以同时启动多个程序,也就意味着我们可以将多个.exe文件加载到内存操作系统如何去管理这些…

C# CAD SelectionFilter下TypedValue数组

SelectionFilter是用于过滤AutoCAD实体的类,在AutoCAD中,可以使用它来选择具有特定属性的实体。构造SelectionFilter对象时,需要传入一个TypedValue数组,它用于定义选择规则。 在TypedValue数组中,每个元素表示一个选…

如何将视频转换为音频?10 个最佳视频音频文件转换器!

生活中最令人愉快的乐趣之一就是拍摄、编辑和分享视频。由于有如此多的设备能够捕捉视频,并且有如此多的分享视频的方式,有时音频旁白可能比图片更重要、更有启发性。更糟糕的是,您选择的视频可能无法在您的设备上播放。 在这种情况下&#…

中科大计网学习记录笔记(十一):CDN

前言: 学习视频:中科大郑烇、杨坚全套《计算机网络(自顶向下方法 第7版,James F.Kurose,Keith W.Ross)》课程 该视频是B站非常著名的计网学习视频,但相信很多朋友和我一样在听完前面的部分发现信…

多线程 --- 线程互斥

目录 1. 线程互斥 1.1. 相关背景概念 1.2. 互斥锁 1.2.1. 初始化互斥量 1.2.2. 销毁互斥量 1.2.3. 互斥量加锁 && 解锁 1.3. 互斥量 (锁) 的原理 1.3.2. 相关问题和解释 1.3.2. 锁的实现原理 1.3.3. 可重入 && 线程安全问题 1.3.4. 常见的线程不安全…

【c++】vector的增删查改

1.先定义一个类对象vector 为了防止和库里面发生冲突&#xff0c;定义一个命名空间&#xff0c;将类对象放在命名空间 里面 #include<iostream> using namespace std; namespace zjw {class vector {public:private:}; }2.定义变量&#xff0c;需要一个迭代器&#xff…

【实战】二、Jest难点进阶(一) —— 前端要学的测试课 从Jest入门到TDD BDD双实战(五)

文章目录 一、Jest 前端自动化测试框架基础入门二、Jest难点进阶1.snapshot 快照测试 学习内容来源&#xff1a;Jest入门到TDD/BDD双实战_前端要学的测试课 相对原教程&#xff0c;我在学习开始时&#xff08;2023.08&#xff09;采用的是当前最新版本&#xff1a; 项版本babe…

optee UTA加载

流程 动态TA按照存储位置的不同分为REE filesystem TA&#xff1a;存放在REE侧文件系统里的TA&#xff1b; Early TA&#xff1a;被嵌入到optee os里的在supplicant启动之前就可用了。 这里我们讲的是常规的存放在REE侧文件系统里的TA。 通过GP标准调用的与TA通信的命令(opens…

【Git】.gitignore 的匹配规则

每行一个规则&#xff1a;每行只能包含一个规则&#xff0c;多个规则需要分别写在不同的行上。 示例&#xff1a; # 忽略日志文件 logs/ # 忽略临时文件 temp.txt种类匹配&#xff1a; 文件&#xff1a;在规则的开头指定文件名或路径&#xff0c;如 file.txt。 示例&#xff1a…

openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL

文章目录 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL220.1 操作步骤 openGauss学习笔记-220 openGauss性能调优-确定性能调优范围-查询最耗性能的SQL 系统中有些SQL语句运行了很长时间还没有结束&#xff0c;这些语句会消耗很多的系统性能&…

http“超级应用与理解”

本篇文章来介绍一下http协议和其应用 1.http协议是在OSI模型的哪一层 HTTP&#xff08;超文本传输协议&#xff09;是应用层协议&#xff0c;它是在 OSI 模型的最高层&#xff0c;即第七层——应用层。HTTP 通过互联网来传输数据和信息&#xff0c;主要用于 Web 浏览器和 Web …

CF1845 D. Rating System [思维题+数形结合]

传送门:CF [前题提要]:自己在做这道题的时候思路完全想错方向,导致怎么做都做不出来,看了题解之后感觉数形结合的思考方式挺好的(或者这种做法挺典的),故写篇题解记录一下 题目很简单,不再解释.先不考虑 k k k,想想是一种什么情况?很显然应该是跟下图一样是一个折线图的变化.…

计算机设计大赛 深度学习YOLO安检管制物品识别与检测 - python opencv

文章目录 0 前言1 课题背景2 实现效果3 卷积神经网络4 Yolov55 模型训练6 实现效果7 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习YOLO安检管制误判识别与检测 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&…

计算机组成原理(2)-----存储芯片与CPU的连接

目录 一.单块存储芯片与CPU的连接 二.多块存储芯片与CPU的连接 1.位扩展 2.字扩展 &#xff08;1&#xff09;线选法 &#xff08;2&#xff09;译码器片选法 3.字位同时扩展 三.译码器相关 一.单块存储芯片与CPU的连接 如图所示是8*8位的芯片&#xff0c;总共8个存储…

C++ 双向广度搜索,嚯嚯!不就是双指针理念吗

1. 前言 在线性数据结构中搜索时&#xff0c;常使用线性搜索算法&#xff0c;但其性能偏低下&#xff0c;其性能改善方案常有二分搜索和双指针或多指针搜索算法。在复杂的数据结构如树和图中&#xff0c;常规搜索算法是深度和广度搜索。在深度搜索算法过程中常借助剪枝或记忆化…

分布式文件系统 SpringBoot+FastDFS+Vue.js【二】

分布式文件系统 SpringBootFastDFSVue.js【二】 六、实现上传功能并展示数据6.1.创建数据库6.2.创建spring boot项目fastDFS-java6.3.引入依赖6.3.fastdfs-client配置文件6.4.跨域配置GlobalCrosConfig.java6.5.创建模型--实体类6.5.1.FastDfsFile.java6.5.2.FastDfsFileType.j…

Mac M2芯片配置PHP环境

Mac M2芯片配置PHP环境 1. XAMPP 1. XAMPP 官网地址 https://www.apachefriends.org/ 安装 安装完成 web server打开后&#xff0c;在打开localhost 成功&#xff01;

(三十九)大数据实战——Prometheus监控平台的部署搭建

前言 Prometheus监控&#xff08;Prometheus Monitoring&#xff09;是一种开源的系统监控和警报工具。它最初由SoundCloud开发并于2012年发布&#xff0c;并在2016年加入了云原生计算基金会&#xff08;CNCF&#xff09;。Prometheus监控旨在收集、存储和查询各种指标数据&am…

Android---DslTabLayout实现底部导航栏

1. 在 Android 项目中引用 JitPack 库 AGP 8. 根目录的 settings.gradle dependencyResolutionManagement {...repositories {...maven { url https://jitpack.io }} } AGP 8. 根目录如果是 settings.gradle.kts 文件 dependencyResolutionManagement {...repositories {...…