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

谈到智能制造、智慧工厂,愿景是美好的,借助计算机视觉技术和 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.mzph.cn/news/209639.shtml

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

相关文章

锁的策略及synchronized详解

加锁过程中,处理冲突的过程中,涉及到的一些不同的处理方式。锁的策略决定了线程如何获取和释放锁以及在何种情况下阻塞和唤醒线程。 1. 常见的锁策略 1.1 乐观锁和悲观锁 乐观锁:在加锁之前,预估当前出现锁冲突的概率不大&am…

Docker三 | 数据卷

目录 Docker数据卷简介 添加数据卷的命令 容器数据卷的继承 Docker数据卷简介 Docker容器产生的数据,如果不备份,当容器实例删除后,容器中的数据也会消失,为了保存数据可以在Docker中使用数据卷。Docker数据卷是宿主机的一个可以…

vue3中子组件调用父组件的方法

<script lang"ts" setup>前提 父组件&#xff1a; 子组件&#xff1a; const emit defineEmits([closeson]) 在子组件的方法中使用&#xff1a; emit(closeson)

EP15:动态内存管理概述(c语言)malloc,calloc,realloc函数的介绍使用及柔性数组的介绍

如果学习方向是c方向那么c语言有三个板块的知识是非常重要的. 1:指针 2:结构体 3;动态内存管理. 序言:在c语言中,什么是动态内存 C语言中的动态内存是指在程序运行时&#xff0c;根据需要动态地分配内存空间的一种内存管理方式。与静态内存相比&#xff0c;动态内存的大小和生…

12.ROS导航模块:gmapping、AMCL、map_server、move_base案例

目录 1 导航概述 2 导航简介 2.1 导航模块简介 1.全局地图 2.自身定位 3.路径规划 4.运动控制 5.环境感知 2.2 导航坐标系odom、map 1.简介 2.特点 3.坐标系变换 2.3 导航条件说明 1.硬件 2.软件 3 导航实现 3.1 创建本篇博客的功能包 3.2 建图--gmapping 3.…

JavaScript基础知识整理(最全知识点, 精简版,0基础版)

文章目录 一、输入和输出内容 1.1 输出 1.1.1 在浏览器的控制台输出打印 1.1.2 直接在浏览器的页面上输出内容 1.1.3 页面弹出警告对话框 1.2 输入 二、变量 2.1 变量是什么 2.2 变量的声明和赋值 2.3 变量的命名规范和规范 三、变量扩展&#xff08;数组&#xff09; 3.1 数组…

Cypress:前端自动化测试的终极利器

引言&#xff1a; 在现代软件开发中&#xff0c;前端自动化测试已经成为了一个不可或缺的环节。它不仅可以提高开发效率&#xff0c;减少手动测试的工作量&#xff0c;还可以保证软件的稳定性和质量。而在众多的前端自动化测试工具中&#xff0c;Cypress无疑是其中的佼佼者。本…

openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断

文章目录 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断144.1 背景信息144.2 前提条件 openGauss学习笔记-144 openGauss 数据库运维-例行维护-慢sql诊断 144.1 背景信息 在SQL语句执行性能不符合预期时&#xff0c;可以查看SQL语句执行信息&#xff0c;便…

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑垃圾处理与调峰需求的可持续化城市多能源系统规划》

这个标题涵盖了城市多能源系统规划中的两个重要方面&#xff1a;垃圾处理和调峰需求&#xff0c;并强调了规划的可持续性。 考虑垃圾处理&#xff1a; 含义&#xff1a; 垃圾处理指的是城市废弃物的管理和处置。这可能涉及到废物分类、回收利用、焚烧或填埋等方法。重要性&…

GIS入门,Leaflet介绍,Leaflet可以做什么,网页中如何使用Leaflet地图,vue中如何使用Leaflet地图

VueLeafLet教程推荐&#xff1a;《VueLeaflet入门》 Leaflet介绍 Leaflet是一个开源的JavaScript库&#xff0c;用于创建交互式的地图和地图应用。Leaflet框架具有轻量级、灵活性强、易于使用和扩展等特点&#xff0c;支持各种地图服务商&#xff08;如OpenStreetMap、Google…

前端知识笔记(三十八)———HTTPS:保护网络通信安全的关键

当谈到网络通信和数据传输时&#xff0c;安全性是一个至关重要的问题。在互联网上&#xff0c;有许多敏感信息需要通过网络进行传输&#xff0c;例如个人身份信息、银行账户信息和商业机密等。为了保护这些信息不被未经授权的人访问和篡改&#xff0c;HTTPS&#xff08;超文本传…

【开源】基于Vue+SpringBoot的河南软件客服系统

文末获取源码&#xff0c;项目编号&#xff1a; S 067 。 \color{red}{文末获取源码&#xff0c;项目编号&#xff1a;S067。} 文末获取源码&#xff0c;项目编号&#xff1a;S067。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统管理人员2.2 业务操作人员 三、…

搞懂内存函数

引言 本文介绍memcpy的使用和模拟实现、memmove的使用和模拟实现、memcmp使用、memset使用 ✨ 猪巴戒&#xff1a;个人主页✨ 所属专栏&#xff1a;《C语言进阶》 &#x1f388;跟着猪巴戒&#xff0c;一起学习C语言&#x1f388; 目录 引言 memcpy memcpy的使用 memcpy的…

JS加密/解密之HOOK实战2

上一篇文章介绍了HOOK常规的应用场景&#xff0c;这篇我们讲一下HOOK其他原生函数。又是一个新的其他思路 很多时候&#xff0c;当我们想要某些网站的请求参数的时候&#xff0c;因为某些加密导致了获取起来很复杂。 这时候hook就十分方便了 源代码 var _JSON_Parse JSON.…

scp 指令详细介绍

目录 1. 基本语法 2. 例子 从本地到远程 从远程到本地 从远程到远程 使用端口和指定私钥 递归复制目录 3. 注意事项 如何拷贝文件的软链接 SCP&#xff08;Secure Copy Protocol&#xff09;是一种用于在计算机之间安全地传输文件的协议。它通过加密的方式在网络上安全…

Vue:Vue的开发者工具不显示Vue实例中的data数据

一、情况描述 代码&#xff1a; 页面&#xff1a; 可以看到&#xff0c;input获取到了data数据&#xff0c;但是&#xff0c;vue-devtool没有获取到data数据 二、解决办法 解决办法1&#xff1a; data.name的值不能全是中文&#xff0c;比如改成aa尚硅谷 解决办法2&…

C语言 编程题

C语言学习&#xff01; 1.小明上课需要走n阶台阶&#xff0c;他每次可以选择走一阶或者走两阶&#xff0c;他一共有多少种走法&#xff1f; 输入描述&#xff1a;输入包含一个整数n&#xff08;1 ≤ n ≤30&#xff09; 输出描述&#xff1a;输出一个整数&#xff0c;即小明可…

LeetCode 1457. 二叉树中的伪回文路径||位运算 DFS

1457. 二叉树中的伪回文路径 给你一棵二叉树&#xff0c;每个节点的值为 1 到 9 。我们称二叉树中的一条路径是 「伪回文」的&#xff0c;当它满足&#xff1a;路径经过的所有节点值的排列中&#xff0c;存在一个回文序列。 请你返回从根到叶子节点的所有路径中 伪回文 路径的…

Golang优雅实现按比例切分流量

我们在进行灰度发布时&#xff0c;往往需要转发一部分流量到新上线的服务上&#xff0c;进行小规模的验证&#xff0c;随着功能的不断完善&#xff0c;我们也会逐渐增加转发的流量&#xff0c;这就需要按比例去切分流量&#xff0c;那么如何实现流量切分呢&#xff1f; 我们很容…

力扣(LeetCode)-1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回…