AI 赋能 | 智能制造的 AI 算法开发和工程实现

news2024/11/17 8:15:27

谈到智能制造、智慧工厂,愿景是美好的,借助计算机视觉技术和 AI 算法,为自动化生产线赋予环境感知的能力,从而改善工艺流程,提高生产效率。但是,随着柔性化生产的需求增长,产线的布局调整和功能扩展在所难免,这就要求设备供应商或使用者能够对 AI 算法进行持续性的维护、优化或移植,而现实是维护成本高、团队能力缺乏。

MATLAB 就像一位全能的搭档,提供了完备的文档和友好的交互式应用程序,即使是没有数据科学背景的领域工程师,也可以在一步步引导,快速完成“数据准备-AI 算法开发-系统部署”整个工作流程。

图片

纸上得来终觉浅,让我们来具体看看,以上工作流在一个典型的工业应用场景——零件表面缺陷检测——中是如何实现的。

图片

    ◆  

数据准备

摄像头采集的原始图像数据中,往往含有大量冗余信息。前处理的第一步,通常是将被检测的目标对象和背景(其他无关物体)分离开来,即提取感兴趣区域(Region Of Interest, ROI)。在这里,可以运用一个小技巧:选择一个与目标颜色对比差异足够大的背景,采用简单的图像处理方法,例如颜色空间变换、二值化处理等,就可以快速提取出目标,而不需要使用计算更复杂的 YOLO 等目标检测深度神经网络。

具体步骤如下:

1.将采集的单帧彩色 RGB 图像转换为更有利于进行图像分割的 HSV 颜色模型;

img1 = snapshot(webcam);

hsv1 = rgb2hsv(img1);

2.通过大津算法确定阈值,对图像进行二值化分割;

th = otsuthresh(imhist(hsv1(:,:,2)));

bw = hsv1(:,:,2) > th;

bw = bwareaopen(~bw,50);

3.分析区域特性,可确定边界框,再对原图进行相应的裁剪;

stats = regionprops('table',bw,'BoundingBox');

bbox = int16(stats.BoundingBox);

img2 = imcrop(img1,bbox);

4.最后进行灰度化处理。

img3 = rgb2gray(img2);

图片

经过以上步骤,单帧图像的数据量从 207x174x3 降低至 110x100,数据维度的降低,可减轻后续分类算法的需要完成的计算量,从而提高推断速度。

如果您的实际应用场景较为复杂,可考虑加强对外部环境的控制,例如光照条件、摄像头角度等,此外,在前处理的过程中,结合更多图像处理和计算机视觉技术,例如相机校准、图像增强和降噪等方法,以获得更高质量的样本数据。

采集足够多的样本后,通过对带有真值标注的数据进行监督式机器学习,是常用的构建预测模型进行分类的方法。使用 MATLAB 中的数据存储对象 imageDatastore,可以方便快速地对硬盘中的数据进行索引,并定义数据标签来源:

categ = {'good', 'defective'};

imds =imageDatastore(fullfile(pwd, 'images', categ), ...

    'IncludeSubfolders',1,'LabelSource', 'foldernames')

我们准备了一个样本大小为 784 的数据集,标签为缺陷检测结果,其中 509 个“有缺陷”(Defective)样本,273 个“无缺陷”(Good)样本,随机选取 90% 样本作为训练集,剩余 10% 作为验证集:

[trainingSet,validationSet] = splitEachLabel(imds, 0.9, 'randomize');

在数据不够多、类别不均衡的情况下,借助数据增强的方法,对图像进行不同程度的平移、旋转和缩放等,可一定程度上提高机器学习模型的泛化能力。

augmenter =imageDataAugmenter('RandXReflection',true, ...

    'RandYReflection',true,'RandRotation', [-180180]);

trainingSet =augmentedImageSource([227 227],trainingSet, ...

    'DataAugmentation',augmenter);

    ◆  

AI 算法开发

AI 应用领域目前主流的方法有两大分支:一是基于统计的传统机器学习方法,例如支持向量机、随机森林等,其中需要人为定义数据的特征作为输入;二是基于人工神经网络的深度学习方法,可以直接从数据中学习特征后进行推断。接下来,我们将探讨两种方式各自的可行性和优缺点:1. 基于特征工程和支持向量机的缺陷检测;2. 基于深度神经网络的缺陷检测。

方案 1. 基于特征工程和支持向量机的缺陷检测

特征工程,是机器学习中一个非常重要的环节,对模型推断的准确度影响很大。我们尝试使用 Bag of Features 方法,从图像数据中提取特征,并转换为机器学习算法可以处理的形式——特征向量。

bag =bagOfFeatures(trainingSet);

在 Bag of Features 中,将对每张图片,先用 SURF(加速稳健特征)算法提取局部特征,再通过 K-均值聚类将相似特征合并,聚类中心构成大小为 500 的视觉词汇字典。

每张图片可以对应表示为各个视觉词汇的组合,即特征向量,用于描述各个视觉词汇出现的频率。如以下直方图所示,不同样本的特征向量有所差别。

图片

您可以通过 encode 函数,将每张图片对应转换为对应的特征向量后,作为机器学习模型的输入进行训练:

featureVector =encode(bag, img);

也可以通过 trainImageCategoryClassifier 函数,直接接收训练集和 bag 对象,快速训练一个支持向量机(SVM)分类器:

categoryClassifier= trainImageCategoryClassifier(trainingSet,bag);

分类器对训练集的预测准确度为 82%,测试集为 75%,通常进行超参数调优,可在一定程度上提高推断准确度,然而受限于人为的特征选择,传统机器学习方法的优化空间比较有限。如何能够降低难度并进一步提高分类准确度呢?我们来看下一个方案。

方案 2. 基于深度神经网络的缺陷检测

相较于方案1,深度神经网络训练和推断对计算资源的要求更高,但是往往准确度也更高。卷积神经网络(CNN)是一种适用于视觉任务的深度神经网络架构,如下图所示,从左到右,依次是输入层、特征学习相关层(卷积层,ReLU 激活层和池化层)和分类输出层。

图片

MATLAB 深度学习工具箱提供了基础网络层库,您可以使用交互式应用程序 Deep Network Designer 从零起步创建网络,并进行图像分类网络的训练。目前有大量优秀的预训练网络,可供开发者直接使用,您只需要按照实际的任务对网络的输出进行微调后再训练,就能以较低的数据和计算成本,得到一个功能强大的深度学习模型,这种方法称为“迁移学习”。

我们选用 SqueezeNet 进行迁移学习,保留其中特征学习的部分,加入输出大小为 2 的全连接层,并替换最后的 Softmax 和分类层,使其适用于当前的二分类缺陷检测任务。

图片

接下来,选择数据源为之前设定的训练集 trainingSet 和验证集 validationSet,可加入数据增强方法,然后,设置学习率、优化器等训练参数:

图片

启动训练,并查看以下图窗中的曲线了解训练进度和效果:

图片

训练完成后,可以看到验证准确度达到 97.44%,效果相对于方案1大幅提升,您可以在此基础上,尝试继续迭代优化,或直接导出至工作空间用于推断。以上操作流程可直接导出为 MATLAB 代码,当需要扩展数据集或更换数据时,用于自动化训练过程和模型更新。

后处理与神经网络验证

深度神经网络是一个黑盒模型,使用训练好的模型对新图像进行分类,可直接输出对应的标签,但是怎样解释预测结果,神经网络的推断是否有合理依据,却难以评估,此外,简单分类也无法反映缺陷的位置和形状。为了解答这些疑问,我们可以使用类激活映射(Class Activation Mapping, CAM)的方法,提供一些用于评估网络的可视化依据。

之前提到,卷积核会对特定的特征产生不同程度的激活,下图中,每一个黑白相间的像素组代表一个卷积核对输入图像产生的激活,白色像素表示强正激活,黑色表示负激活。预测结果(类别)和最后一个卷积层的激活程度,存在一定的映射关系,全连接层的权重值 [w1 w2 … w1000]T 代表各个激活对预测结果的贡献大小,加权计算以后得到的值称为类激活映射,将其以热图(heatmap)的形式,叠加在原图像上,如下:

图片

上图中,高亮处代表神经网络将样本判定为“有缺陷“类别的主要特征,这与实际的缺陷位置基本吻合,我们可以判断神经网络预测依据合理。

    ◆  

系统部署 

算法开发完成后,最终需要部署到生产环境才能发挥作用。MATLAB 提供了完整的工具链,支持一次开发,多平台部署,您可以将深度神经网络,连同前后处理函数和其他应用逻辑,自动生成产品级代码,运行在嵌入式设备中,或者作为应用程序,运行在桌面、网页或者云端。

在代码生成方面,MATLAB Coder 支持基于 MKL-DNN 和 ARM Compute Library 的神经网络 C/C++ 代码生成,而 GPU Coder 则支持基于 NVIDIA GPU 的 CUDA 代码生成。

接下来,让我们来看看如何在真实场景下测试以上算法。

借助硬件支持包 GPU Coder Support Package for NVIDIA GPUs,可以快速将方案 2 部署在 Jetson Nano 的开发板中,步骤如下:

1. 连接硬件:

hwobj = jetson('hostname','username','password');

2. 设置代码生成相关参数,例如生成可执行文件,使用 cuDNN 库等:

cfg =coder.gpuConfig('exe');

cfg.DeepLearningConfig= coder.DeepLearningConfig('cudnn');

cfg.DeepLearningConfig.DataType= 'fp32';

cfg.Hardware =coder.hardware('NVIDIA Jetson');

cfg.Hardware.BuildDir= '~/';

3. 自动生成代码:

codegen -config cfg targetFunction -args {ones(240, 320, 3,'uint8'), coder.Constant(Weights),coder.Constant(true)} -report

下图为在 NVIDIA Jetson Nano 开发板上,调用 Webcam,对测试样本进行缺陷检测的效果示意,在使用 cuDNN 库,采用 32 位浮点计算的情况下,同时处理两个样本帧率大约为 4.3 FPS,单样本约为 8 FPS。

图片

在以上模型的基础上,通过生成基于 TensorRT 的 fp16 代码,或采用 Xavier 等处理能力更强的硬件,可进一步加快推断速度。此外,您也可考虑使用其他神经网络架构。在 MATLAB 附加功能资源管理器中搜索”Deep Learning for Defect Detection on Raspberry Pi”,可以获取基于树莓派的代码部署版本。

    ◆  

总结

概括来说,在 MATLAB 中,您可以:

  • 通过图像处理技术减少原始图像数据中的冗余信息

  • 利用深度学习直接学习特征,实现端到端的缺陷检测

  • 借助应用程序和自动代码生成工具提高 AI 算法开发和部署效率

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑源网荷效益的峰谷电价与峰谷时段双层优化模型》

这个标题涉及到电力定价和能源效益的优化模型。让我来分解一下: 峰谷电价:这是一种电力定价策略,即在一天内不同时间段设定不同的电价。通常,高峰时段(需求高)的电价相对较高,而低谷时段&#x…

Spring AOP面向切面编程

AOP将通用的、与业务无关的功能抽象封装为切面类。 切面可配置在目标方法的执行前、后运行,真正做到即插即用。实现了在不修改源码的情况下对程序行为进行扩展。 Spring AOP与AspectJ的关系: Eclipse AspectJ 是基于Java平台的面向切面编程的语言。 Sp…

DNSLog漏洞探测(二)之常用DNSLog平台

常用DNSLog平台 我们在上一篇文章中我们介绍了什么是DNSLog,如果我们自己要去搭建一个DNSLog的服务平台,还是比较复杂和麻烦的,所以我们可以直接去使用一些公开免费的DNSLog平台,DNSLog的平台非常的多,但是实际上大部…

Spring基于xml半注解开发

目录 Component的使用 依赖注解的使用 非自定义Bean的注解开发 Component的使用 基本Bean注解&#xff0c;主要是使用注解的方式替代原有的xml的<bean>标签及其标签属性的配置&#xff0c;使用Component注解替代<bean>标签中的id以及class属性&#xff0c;而对…

奥威亚教学视频应用云平台 VideoCover任意文件上传漏洞复现

0x01 产品简介 广州市奥威亚电子科技有限公司教学视频应用云平台是一个专门为教育机构和个人教师设计的在线学习平台。该平台提供丰富的教学资源和功能,旨在提升教学效果和学习体验。 0x02 漏洞概述 奥威亚教学视频应用云平台 VideoCover.aspx接口处存在任意文件上传漏洞,未…

2.postman环境变量及接口关联

一、环境变量以及全局变量 操作流程 1.点击environment 2.点击environment右侧号&#xff0c;新增环境变量 3.在变量中输入变量名以及变量值 4.回到collection页面&#xff0c;修改变量环境 5.在collection中通过{{变量名}}调用变量 变量定义 环境变量&#xff1a;环境变量…

Xilinx原语详解——IBUFDS OBUFDS

在使用FPGA时&#xff0c;往往会用到一些差分信号&#xff0c;比如HDMI接口&#xff0c;LVDS接口的ADC、显示器等等设备&#xff0c;而FPGA内部往往只会使用单端信号&#xff0c;就需要完成单端信号和差分信号的相互转换&#xff0c;xilinx提供了两个原语对所有IO信号实现差分和…

【基于ESP32无线蓝牙上传电脑Excel透传数据】

【基于ESP32无线蓝牙上传电脑透传数据】 1. 引言2. 环境搭建2.1 硬件准备:2.2 软件准备:2.3. 配置Excel端口接收功能3. 测试代码4. 连接电脑和 ESP324.1 烧录程序4.2 启动蓝牙服务4.3 测试数据透传5. 总结1. 引言 随着物联网技术的发展,越来越多的设备开始支持无线通信,其…

正在快速兴起的云数据架构

云数据架构的日益流行表明了一个主题&#xff1a;在未来几年&#xff0c;越来越多的企业将把他们的数据中心业务完全迁移到云平台上&#xff0c;因为内部部署数据中心设施具有一些固有的优势。数字时代的企业生存已经成为向云迁移的代名词。 云数据架构的日益流行表明了一个主…

Java:字节流 文件输出与读入方法 并 实现文件拷贝

文章目录 字节 流FileOutputStream换行 与 续写FileInputstream实现 文件拷贝&#xff08;字节数组 读入方法&#xff09;字节流 编码 字节 流 FileOutputStream 创建对象&#xff0c;指定位置&#xff08;产生数据传输通道&#xff09; 参数可以是File对象&#xff0c;也可以…

Python time模块详解

time 模块主要包含各种提供日期、时间功能的类和函数。该模块既提供了把日期、时间格式化为字符串的功能&#xff0c;也提供了从字符串恢复日期、时间的功能。 在 Python 的交互式解释器中先导入 time 模块&#xff0c;然后输入 [e for e in dir(time) if not e.startswith(_)…

最简单的基于 FFmpeg 的音频解码器

最简单的基于 FFmpeg 的音频解码器 最简单的基于 FFmpeg 的音频解码器正文参考工程文件下载 参考雷霄骅博士的文章&#xff0c;链接&#xff1a;最简单的基于FFMPEGSDL的音频播放器&#xff1a;拆分-解码器和播放器 最简单的基于 FFmpeg 的音频解码器 正文 FFmpeg 音频解码器…

c++新经典模板与泛型编程:标准库容器中元素类型的萃取

通过容器(数组)类型萃取元素类型 用GetEleType类模板进行常规实现 #include <iostream>#include <vector> #include <list>// 泛化版本 template<typename T> struct GetEleType;// 特化版本 template<typename T> struct GetEleType<std::v…

Elasticsearch:向量数据库的真相

通过工作示例了解什么是向量数据库、它们如何实现 “相似性” 搜索以及它们可以在明显的 LLM 空间之外的哪些地方使用。除非你一直生活在岩石下&#xff0c;否则你可能听说过诸如生成式人工智能和大型语言模型&#xff08;LLM&#xff09;之类的术语。 除此之外&#xff0c;你很…

Rellax.js,一款超酷的 JavaScript 滚动效果库

嗨&#xff0c;大家好&#xff0c;欢迎来到猿镇&#xff0c;我是镇长&#xff0c;lee。 又到了和大家见面的时间&#xff0c;今天和大家分享一款轻松实现视差滚动效果的 JavaScript 库——Rellax.js。无需大量的配置&#xff0c;即可为你的网站增色不少。 什么是Rellax.js&am…

Flutter自定义下拉选择框dropDownMenu

利用PopupMenuButton和PopupMenuItem写了个下拉选择框&#xff0c;之所以不采用系统的&#xff0c;是因为自定义的更能适配项目需求&#xff0c;话不多说&#xff0c;直接看效果 下面直接贴出代码、代码中注释写的都很清楚&#xff0c;使用起来应该很方便&#xff0c;如果有任何…

【完整项目】双模式答题卡识别软件中YOLO模式的训练部分详解,包括训练填涂区域和手写准考证号,手把手详细教学,可延申拓展训练其他图像数据

目录 前言1. 数据准备2. 数据标注3. 先跑起来Windows下用本地的CPU或GPU训练本地Windows系统连接服务器训练前言 前文:【完整项目】基于Python+Tkinter+OpenCV+Yolo+手写OCR的双模式答题卡识别软件的设计与实现 如果你需要训练自己的答题卡模型,那么请先看上面的文章链接。…

uniapp自定义的日历(纯手写)

效果图&#xff1a; html&#xff1a; <!-- 年月 --><view class"box"><view class"box_time"><view class"time"><image click"lefts" :src"url/uploads/20231206/9d1fb520b12383960dca3c214d84fa0…

uniapp图片预览

用的是Uview组件库里面的 直接在页面写上&#xff1a; <u-album singleSize"100" :urls"[https://lxt.jingyi.icu/item.img]"></u-album> 这图片路径是我自己的 你们可以按照组件库里面的方法去实现

掌握JavaScript继承的精髓:原型继承、构造函数继承以及组合继承的实现技巧

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;JavaScript篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来JavaScript篇专栏内容:JavaScript-Javascript如何实现继承&#xff1f; 目录 一、是什么 二、实现方式 …