使用深度学习实现自动视觉检测

如果您接触过质量控制或缺陷检测所用的视觉检查系统,便多少了解检查过程中的重重困难。 举个简单的例子:假设有一个传送六角螺母的工厂传送带,以及一个用于拍摄零件图像的检查相机。

Visual Inspection System Manufacturing Belt

假设相机拍摄了四张图像,此时操作人员可目测找出存在缺陷的螺母。

Camera Capture Defective Nut

但对于下面这种情况,该怎么办呢?

Camera Capture Defective Nut More Captures

如果拍摄了成千上万张图像,就需要使用自动系统将缺陷螺母挑选出来,与合格产品相区分。

本电子书说明如何使用 MATLAB® 开发深度学习网络,以对各种类型的异常进行检测和分类。

第 1 章 什么是自动光学检查?

自动检查与缺陷检测系统使用 AI 来检查零部件的故障和缺陷。该方法在各行各业得到广泛应用,可用于检测金属轨道、半导体晶圆和隐形眼镜等各类成品表面的缺陷。以下是一些企业应用自动检查系统的实例:

  • 空中客车:检测多个飞机部件中的缺陷
  • 武藏精密工业:检查用于汽车部件的圆锥齿轮
  • 韩国铁道研究院:检测铁道设施元件(如钢轨、枕木和紧固件)中的表面缺陷、缺失部件以及裂缝
  • 关西电力:评估钢管焊缝的蠕变损伤

借助 MATLAB 进行自动光学检查

本电子书说明如何使用 MATLAB® 开发深度学习网络,以对各种类型的异常进行检测和分类。缺陷检测工作流分为三个主要阶段:

  1. 准备数据,包括去噪、配准以及标注
  2. 构建并训练深度学习网络
  3. 在多个硬件平台(如 CPU 与 GPU)上部署网络

这是一种迭代工作流:

Defect Detection- Workflow All Arrows

完成系统部署后,您将得到更多数据。您可以使用这些数据优化和调整模型,然后重新部署模型,获得更准确的结果。


第 2 章 准备数据

您要处理的数据具有异构性。这些数据具有多个来源(传感器、数据库、音频文件等)、采用多种格式、涉及不同领域,且具有不同的时间间隔。同时,数据还含有噪声。

如何有效准备所有这些数据十分关键。如果想在 AI 系统中使用这些数据,则必须对其进行滤波、清理以及标注。

这项工作说起来简单,做起来却费时费力。例如:

大型数据集可能表现为两种形式:无法放入可用内存的过大文件,或者需要较长时间才能完成处理的文件。大型数据集也可能是大量小文件的集合。

MATLAB 提供了处理大型数据集所需的工具。具体包括:

数据存储。您可以按需随时加载数据,而不必将所有数据一并加载至内存中。数据存储相当于指向数据的指针。

tall 数组。tall 数组支持您处理以数组方式存储的、行数过多以至无法加载至内存中的数值数据。

bigImagebigimage 对象能够将大图像表示为可独立加载和处理的较小分块。

理想情况下,所有图像都应该清晰、锐利,以原始画质呈现,不需要进行任何预处理。不过,视觉检查系统所用的数据基本上不可能是原始画质。光照条件可能不够理想,导致一些主要特征不鲜明。另一方面,图像中可能充斥着网络不需要的特征:例如,半导体数据包含过多形状和图像,使得异常检测极为困难。

数据预处理能让您事半功倍。清晰整洁的图像能极大地改善算法预测准确度。例如,下方的绘图对比了预处理前后的网络结果。

Defect Detection Using Alexnet

对于每个输入图像,网络会根据目标存在缺陷的可能性打分。对数据进行预处理后,如右侧绘图所示,所有缺陷单位均集中在左侧。显然,对图像进行预处理后,网络可以更好地分辨零部件是否存在缺陷。

根据数据情况与分类目标,您可以选用以下方法对图像进行预处理:

  • 配准错位图像。如果各图像均以相同的方式对齐,则可更轻松地对其进行分类。
  • 调整图像强度。增强图像,使其在背景中突出显示。
  • 分割或阈值分割。使用聚类等方法将图像从复杂背景、金属碎屑或其他视觉干扰中分离出来。
  • 执行区域分析。根据形状、尺寸、颜色等特征定义缺陷。
Preprocessing Data Apps

深度学习离不开大量标注数据。标注越是充分、准确,网络的性能也就越好。

数据标注定义了您想在网络中进行识别和分类的数据特征。不过,数据标注极为耗时且极易出错:想象一下,在数千张图像中手动绘制边界框,或者手动定义这么多图像中每个像素的类,会是多大的工作量!

MATLAB 提供各种交互式工具,帮助您自动执行这一极为耗时的步骤。例如:

图像标注器与视频标注器可对图像区域进行分类,并自动在视频中的每一帧上应用分类。

信号标注器与音频标注器,它们与图像标注器类似,内置了多项自动化功能,可提高信号数据的标注速度。

大图像标注器支持以交互方式标注大图像。您不必为提取补片、标注补片、重构图像之类的步骤费神。借助该工具,您可以直接在图像中移动并对各部分进行标注。

如果需要实现更高的准确度,或要将模型应用于更广泛的信号类型或使用场景,则可能需要额外数据。您可能需要另一个(可能更复杂的)模型,该模型需要更多数据和标签。

除了生成新数据,一种常见的策略是通过数据增强根据原始数据集生成额外数据。数据增强一般可使用简单的几何变换方法实现。

MATLAB 中的数据变换命令会对数据集应用随机变换,例如裁剪、旋转、调整大小、平移以及翻转。您还可执行颜色变换操作,比如色调和对比度抖动,从而扩展数据集。

您可以将这些文件作为新图像输出并添加至数据集中。


第 3 章 构建并训练深度学习网络

回到关于六角螺母检查的例子,我们要训练一个卷积神经网络 (CNN)。

CNN 是一种“深度”神经网络,可直接用于处理结构化数据,比如图像。该网络由一个输入层、多个隐藏层和一个输出层组成。各层通过节点(即神经元)相互连接。

下面是一种简单的 CNN 架构。

Cnn Deep Learning Network

通过控制电压提高转速

在数据通过网络的过程中,部分层(卷积层、reLu 层以及池化层)会从图像中学习特征,而 softmax 层则会提供分类。

两种训练网络的方式

您可从头开始训练深度学习网络,或对预训练的网络进行微调。

从头开始训练

这种方法能够给出最准确的结果,同时也最具挑战性。它适合新的应用或输出类别数量较多的应用。不过,从头训练需要大量的数据与深度学习专业知识,因此大部分人会选择尝试第二种方法。

微调预训练的网络

这一方法会使用迁移学习。其主要思路是利用已有网络(如 AlexNet 或 GoogLeNet),向其馈入包含此前未知的类的新数据。在完成网络的调整后,您就可以执行新任务了。

与从头训练相比,迁移学习的速度更快,难度也更低。它的另一个优势是数据需求量小得多:只需数千张图像,而不是上百万张。

试验管理器

试验管理器可用于创建深度学习试验,在各种初始条件下训练网络并对结果进行比较。例如,深度学习试验可用于:

  • 扫描一系列超参数值
  • 使用不同数据集训练同一个网络,并比较结果
  • 重用同一组数据集训练多个网络,以测试多种架构

试验管理器提供了训练图和混淆矩阵等可视化工具,以及用于细化试验结果的筛选器。


第 4 章 故障检测分类器迁移学习

要构建六角螺母分类器,可选择 MobileNet-v2 网络,因为与众多其他网络相比,该网络的速度更快、准确度更高且内存占用量更小。我们将重用特征提取层并替换分类层。

我们可使用深度网络设计器完成整个流程:

  1. 通过拖放添加新层并新建连接。
  2. 查看和编辑层属性。
  3. 分析网络以确保架构定义正确。
  4. 导入图像数据并选择增强选项。
  5. 对训练进度进行可视化与监控。
  6. 生成绘图以评估网络准确度。

评估网络性能

在模型将图像分类为合格和次品后,要确认分类是否准确,一种方式是生成混淆矩阵。

混淆矩阵可逐类显示模型的分类结果,从中可看出各类之间是否存在混淆。

在这里我们可以看到,对于所有 40 个测试样本(20 个合格,20 个次品),真实类与预测类都一致。当存在误分类以及有两类以上的目标时,混淆矩阵往往能提供更深入的信息。

混淆矩阵能解答一部分有关网络性能的问题,但并非全部。我们如何确定模型是在对正确的特征进行分类?以及……网络的工作原理又是什么?

深度学习网络往往被视为一个“黑盒”,我们很难获知它做出某种预测的原因。

类激活映射 (CAM) 和梯度类激活映射 (Grad-CAM) 等可解释 AI 方法能够为 CNN 的预测提供可视化解释。

类激活映射

类激活映射 (CAM) 会生成一张热图,其中突出显示输入图像中被网络用于分类的部分。您可借助这些结果来强化正确的预测,或查看网络中出现“混淆”的原因。

以下面的两个 CAM 可视化为例。

Class Actvatoin Mapping Network Predictions

在左侧图中,鼠标的存在可帮助模型确定这是一张键盘的照片。这种分类方法可能是(也可能不是)有效的。

在右侧图中,网络将一张咖啡杯的照片分类为带扣。网络检测并重点关注手表腕带,而不是咖啡杯。那么,究竟什么才是正确的:模型还是真实值?

您可能认为模型出错了,但实际上模型工作正常,只是根据错误的特征做出了预测。您可以纠正训练集中的偏差,方法是收集更具代表性的数据,以反映您希望网络重点关注的场景。

下面对我们的六角螺母分类模型使用 CAM。左侧为拍摄的图像,右侧为分类与 CAM。

如果网络将某个螺母分类为次品,则会重点关注缺陷部分。因此,我们不仅能看到图像得到正确的分类,还能看到模型做出这一决策的原因。


第 5 章 部署模型

成功开发和训练深度学习模型之后,接下来就要将其整合到更大的系统中以投入使用。

MATLAB 可帮助您将深度学习网络从单一源部署至各类嵌入式硬件平台,如 NVIDIA® GPU、Intel® 与 Arm® CPU、FPGA 或 SoC 设备,还可部署至云或边缘设备,且无需重写原始模型代码。

显然,您需要选择最符合您的功耗与内存占用量要求的部署选项,在此过程中需要有所取舍。举个例子,一个需要考虑的重要因素是延迟。如果光学系统使用高速相机,您可能会要求低延迟,尤其是在强调安全性的情形下。

Confusion Matrix

部署选项对比

设备 优点 缺点
FPGA 低延迟,低功耗 编程困难
CPU 编程简单灵活 吞吐量最低
GPU 吞吐量最高 高功耗

确定部署选项后,您可在 MATLAB 中进行试用,了解其实际性能。如果想在 FPGA 上进行部署,您可以适当更改网络以满足性能要求,然后重新运行,而且这些操作都可以在 MATLAB 中完成。比如在六角螺母的例子中,由于其中涉及的图像较为简单,您可移除一些卷积层以简化网络。或者,您也可以实施定点量化,这可以提升性能并降低延迟,但可能会牺牲一些准确度。