MemSeg:一种差异和共性来检测图像表面缺陷的半监督方法

news2024/9/22 7:23:16

目录

1、摘要

 2、Method

2.1 模拟异常样本

 2.2 Memory Module

 2.3 空间注意模块

2.4 多尺度特征融合模块

2.5 损失函数设置

2.6 Decoder模块


1、摘要

本文认为人为创建类内差异和保持类内共性可以帮助模型实现更好的缺陷检测能力,从而更好地区分非正常图像。如图一所示。

差异(differences):

MemSeg引入人工模拟的异常图像在训练阶段使模型能够区分正常和异常的图像,减轻了半监督学习只能用正常样本进行训练的不足,然后在推理阶段可以直接输入图像无需做任何后处理。

共性(commonalities):

MemSeg引入了一个记忆池来记录正常样本的通用模式,在训练和推理阶段,比较输入图像和记忆池中的样本之间的差异,为异常区域的定位提供有用的信息。同时为了更好地协调来自记忆池和输入图像的信息,还引入了多尺度特征融合模块和空间注意模块。

论文主要贡献:

  1. 设计了一种异常模拟策略来进行模型的自监督学习,该方法整合了目标前景异常、纹理异常和结构异常。
  2. 提出了一种具有更有效的特征匹配算法的记忆模块,并在U-net结构中引入正常模式的记忆信息来辅助模型学习。
  3. 结合上述两点,并结合多尺度特征融合模块和空间注意模块,将半监督异常检测简化为端到端语义分割任务,使半监督图像表面缺陷检测更加灵活。
  4. 通过实验验证,MemSeg在表面缺陷检测和定位任务中具有较高的精度,同时可以更好地满足工业场景的实时需求。

 2、Method

      MemSeg采用U-Net作为框架,在训练阶段利用模拟的异常图片和记忆信息来完成语义分割任务,如上图所示采用预训练的ResNet18作为编码器,从左到右依次为:模拟异常样本->记忆模块->多尺度特征融合模块->空间注意模块->采用双损失函数进行端到端训练。

2.1 模拟异常样本

实际场景下数据集不可能覆盖所有的异常,同时在半监督框架中仅使用正常样本进行训练而不与异常样本进行比较不足以让模型了解什么是正常模式,本文提出的方法主要有三个步骤:

step1:

生成一个二维的Perlin噪声P,然后通过阈值T进行二值化得到掩码Mp,perlin噪声中有多个随机峰值,由它得到的Mp可以提取图像中连续的区域块,同时考虑到采集图像中某些工业成分主体的比例比较小,如果不进行处理直接进行数据增强,容易在图像的背景部分产生噪声,增加模拟异常样本与真实样本在数据分布上的差异,不利于模型学习有效的鉴别信息,因此对这类图像采用前景增强策略,使用开操作和闭操作去除在二值化处理中产生的噪声,即输入图像对应的Mi,然后通过对获得的两个掩码进行元素级乘积得到最终的掩码图像M。

 注意:

(1)Perlin噪声是一种用于计算机图形学中的随机噪声函数,它是一种连续可微的梯度噪声函数,由Ken Perlin于1983年发明。Perlin噪声可以用于生成自然界中的各种纹理,例如云彩、火焰、树木等。它在游戏开发中也得到了广泛应用。

Perlin噪声的原理是将坐标系划分成一块一块的晶格,之后在晶格的顶点处生成一个随机的梯度,通过与晶格顶点到晶格内点的向量进行点乘加权计算后得到噪声 。

(2)在图像处理中,开操作和闭操作是形态学图像处理中的两种基本操作。开操作可以平滑物体轮廓、断开较窄的狭颈并消除细的突出物,而闭操作则可以弥合较窄的间断和细长的沟壑,消除小的孔洞,填补轮廓线中的断裂。

在Python中,我们可以使用OpenCV库来实现形态学图像处理中的开操作和闭操作。下面是一个示例代码,演示如何使用OpenCV实现这两种操作:

import cv2
import numpy as np

# 读取图像
img = cv2.imread('image.jpg', 0)

# 定义结构元素
kernel = np.ones((5,5),np.uint8)

# 进行开操作
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)

# 进行闭操作
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)

# 显示结果
cv2.imshow('Original Image', img)
cv2.imshow('Opening', opening)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,我们首先读取了一张灰度图像,然后定义了一个5x5的结构元素。接下来,我们使用`cv2.morphologyEx()`函数分别对原始图像进行了开操作和闭操作,并将结果显示出来。

需要注意的是,在进行形态学操作之前,我们需要将图像转换为灰度图像,并确保图像的大小和结构元素的大小相同。此外,我们还可以使用不同的结构元素来获得不同程度的平滑效果。

元素级别乘积:

指对两个数组中每个位置上的元素进行乘法运算。 这意味着两个数组必须具有相同的形状,否则就会出现形状不匹配的错误。 例如,我们可以通过以下代码创建两个2×2的NumPy数组:

import numpy as np

a = np.array([[1, 2], [3, 4]])

b = np.array([[5, 6], [7, 8]])

现在,我们将使用元素级别乘法将这两个数组相乘:

c = np.multiply(a, b)

print(c)

这将输出: array([[ 5, 12], [21, 32]])

我们可以看到,在每个位置上,一个数组中的元素与另一个数组中的相应元素进行了乘法运算,并将结果存储在输出数组中。

step2:

第一步得到的掩码图像M和噪声图像In执行元素级乘积得到由M定义的In中的感兴趣区域。与DREAM方法保持一致,在这个过程中引入了一个透明度因子来平衡原始图像和有噪声图像的融合,从而模拟异常模式更接近真实异常。

I_{n}^{'}=\sigma (M\odot I_{n} )+(1-\sigma )(M\odot I)

其中sigma代表透明度因子,采用上述公式可以得到有噪声的前景图像,对于噪声图像I_{n},希望其最大透明度,以增加模型学习的能力,其中sigma的取值范围为[0.15,1]。

step3:

掩码图像M转换成\bar{M},然后在\bar{M}和原始图像I上执行元素级乘积,得到图像I^{'},根据下述公式:

I_{A}=\bar{M}\odot I+I_{n}^{'}

得到数据增强图像I_{A},即模拟异常图像,它采用原始输入图像I作为背景,以掩码图像M提取的噪声图像I_{n}中的ROI作为前景。

 2.2 Memory Module

人类的异常区域是通过比较测试图像和记忆中的正常图像来获得的,本文采用少量正常的样本作为记忆样本,并使用预训练ResNet18提取记忆样本的高级特征作为记忆信息,以协助MemSeg学习。

具体方法:从训练集中随机选择N张正常图像作为记忆样本,然后通过ResNet18得到三个不同维度的特征:N×64×64×64、N×128×32×32和N×256×16×16(分别表示block1、block2、block3),然后将三个block一起组成记忆信息MI,为了确保记忆信息和输入图像的高级特征的统一,于是冻结ResNet18在block1、block2、block3中的模型参数,但是模型其他部分是可训练的。

然后计算所有记忆样本与输入图像之间的L2距离,从而得到输入图像与记忆样本之间的N差分信息DI。

DI=\bigcup_{i=1}^{N}\left \| MI_{i} - II \right \|_{2}

L2距离是指两点之间的欧几里得距离,也称为直线距离。 该距离是在n维空间中两个点之间的最短距离,其中n可以是任何正整数。

L2距离的计算方式是两个向量中每个元素相减后平方,再求和,最后取平方根。 例如,对于两个n维向量X=(x1,x2,...,xn)和Y=(y1,y2,...,yn),L2距离的计算公式为:D(X,Y)=\sqrt{\sum_{i=1}^n{(x_i-y_i)^2}}其中$\sum_{i=1}^n{(x_i-y_i)^2}$是X和Y中每个元素差的平方和。

其中N是记忆样本数,对于N个差分信息,以每个DI中所有元素的最小和为标准,得到II和MI之间的最佳差分信息,也就是

DI^{*}=argmin_{DI_{i}\epsilon DI}\sum_{x\epsilon DI_{i}}x

其中i取值范围[1,N],最佳差分信息DI^{*}包含输入样本与其最相似的记忆样本之间的差,一个位置的差值越大,输入图像与该位置对于的区域异常的概率就越高。

和标准进行比较,与标准差别越大就表示其很大概率是异常图像!

为什么采用ResNet18的高级特征?(其他网络应该也可以吧TODO)

因为预训练模型在大量数据上进行了训练,学习到了通用的特征表示,这些特征可以很好地推广到新的任务上。 通过迁移学习,我们可以利用预训练模型学到的特征表示,来加速我们自己的模型训练过程,同时提高模型的性能。

高级特征?

是指从深度学习模型中提取出来的更加抽象、更加具有语义信息的特征,这些特征往往是在深层网络中提取出来的。 与低级特征相比,高级特征更加抽象,更加难以描述,但是它们能够更好地表达数据之间的复杂关系,从而提高模型的性能。

随后,将获得的最佳差分信息DI^{*}和输入图像II提取的高级特征执行串联操作,得到对应的串联信息CI_{1}CI_{2}CI_{3}。最后拼接后的信息通过多尺度特征融合模块进行特征融合,融合后的特征通过U-Net的跳连接传到解码器。

 2.3 空间注意模块

为了充分利用差分信息,利用DI^{*}提取了三张空间注意图,用于加强对异常区域的最佳差分信息的猜测,对于DI^{*}中三个不同维度的特征,在通道维度计算平均值,分别得到大小为16×16、32×32和64×64的三个特征图。

16×16特征图直接用作空间注意图:M3,使用32×32特征图和上采样后的M3进行元素级乘积操作获得M2;再使用64×64特征图和上采样后的M2执行元素级乘积操作获得M1。

 如上图所示,空间注意图M1,M2,M3分别和经过多尺度特征融合处理后获得的信息进行加权,求解过程如上述公式所示。其中C3表示DI_{3}^{*}的通道数量,DI_{3i}^{*}表示通道i的特征图像,M_{2}^{U}表示上采样后的特征图。

特征图上采样?

是指将特征图的大小扩大,通常是通过复制边缘像素或者插值的方式来实现。 上采样可以增加模型的感受野,从而提高模型的性能。 常见的上采样方法有最近邻插值、双线性插值、双三次插值等。

通道维度?

指图像中的颜色通道,例如RGB图像有三个颜色通道。在卷积神经网络中,通道维度通常用于表示输入图像的通道数。例如,对于32×32×3大小的输入图像,其通道数为3。 

2.4 多尺度特征融合模块

通过记忆模块,得到输入图像信息II和最佳的差分信息DI^{*}组成的串联信息CI,直接使用这个串联信息存在特征冗余的问题,同时会降低推理速度。利用通道注意力机制和多尺度特征融合策略充分融合视觉信息和语义信息。

 对于串联信息CI_{n}(n=1,2,3),最开始经过一个3×3的卷积操作?

不采用2×2卷积,如果使用偶数大小的卷积核,网络在进行卷积操作时很难找到卷积的中心点,也就是偶数卷积核不对称这个问题也导致了导致在填充的(padding)的时候像素特征不断偏移。然后随着层次的加深,这个偏移现象就越来越明显。这种偏移问题,在一些任务,比如语义分割,等一些需要知道特征具体像素位置的任务中就产生了很大的影响。

相比之下,3×3卷积可以保留更多的空间信息,因为它可以通过重叠存储来捕获更大的区域。这使得3×3卷积在图像处理中更加灵活和可靠。

同时考虑到CI_{n}(n=1,2,3)  是通道维度中两种信息的简单连接,使用坐标注意(CA)来捕获CI_{n}(n=1,2,3)信道之间的信息关系。

然后,对于不同维度的特征加权坐标注意力,继续执行多尺度信息融合:不同维度的特征图首先采用上采样法进行分辨率对齐,然后利用卷积对通道数进行对齐,最后执行元素级加法操作,实现多尺度特征融合。融合后的特征与空间注意图M_{n}(n=1,2,3)进行加权。然后输入给最终的解码器。

2.5 损失函数设置

采用L1损失和focal损失来保证图像空间中所有像素的相似性。focal损失减轻了图像中正常区域和异常区域之间的面积不平衡问题,使模型更加关注困难样本的分割,以提高异常分割的精度

L1损失相对L2损失来说能够保持更多的边缘信息。

 L1损失函数和L2损失函数?

都是机器学习中的常用损失函数,它们的区别在于对于异常值的敏感程度不同。L1损失函数对异常值更加鲁棒,因为它会把权重向量中小于某个阈值的元素都变为0,而L2损失函数则对异常值很敏感。但是,L1损失函数的导数是不连续的,从而让它无法有效地求解;而L2损失函数的导数是连续的,因此可以有效地求解 。

Focal Loss损失函数?

是何恺明大神在RetinaNet网络中提出的,主要目的是为了解决one-stage目标检测中正负样本极不平衡的问题。它是基于二分类交叉熵CE的,是一个动态缩放的交叉熵损失,通过一个动态缩放因子,可以动态降低训练过程中易区分样本的权重,使得模型更加关注难以分类的样本  。

Focal Loss的计算公式如下:FL(p_t)=-(1-p_t)^\gamma \log(p_t)其中,p_t=\left\{\begin{array}{l}p, if y=1\\ 1-p, otherwise\end{array}\right.\gamma为常数,当其为0时,FL就和交叉熵损失函数一样。当$gamma>0$时,$FL$会使得难分类样本的损失变小,而易分类样本的损失不变  。

2.6 Decoder模块

对于解码器部分,如图2所示,上采样层包含一个双线性插值层和一个基本的由卷积层、批归一化和一个ReLU激活函数组成的卷积块。Conv层包含两个堆叠的基本卷积块;只有最后一个Conv层包含一个基本卷积块和一个2通道卷积层。

双线性插值是一种用于重新采样图像和纹理的算法,它通过在两个方向上进行一次线性插值,然后在另一个方向上进行一次线性插值,得到一个加权平均值。   

MemSeg的训练过程经过2700次迭代,输入图像的大小设置为256×256,批量大小设置为8,其中包含4个正常样本和4个模拟异常样本。在进行异常模拟时,大多数类别使用纹理异常模拟和结构异常模拟的概率相等。

使用网格搜索来设置超参数:使用的学习率设置为0.04;focal损失中的Gamma设置为4;目标函数中的\lambda _{l1}\lambda _{f}分别设置为0.6和0.4。

网格搜索(Grid Search)是一种穷举搜索方法,它通过遍历超参数的所有可能组合来寻找最优超参数。网格搜索首先为每个超参数设定一组候选值,然后生成这些候选值的笛卡尔积,形成超参数的组合网格。对于每一种组合,都会训练模型并计算验证集上的误差。最后,选择误差最小的超参数组合作为最终的超参数组合 。

以下是一个使用网格搜索的例子,用于调整支持向量机(SVM)的超参数:

from sklearn.model_selection import GridSearchCV
from sklearn.svm import SVC

# 定义超参数组合
param_grid = {
    'C': [0.1, 1, 10, 100],
    'gamma': [1, 0.1, 0.01, 0.001],
    'kernel': ['rbf', 'poly', 'sigmoid'],
}

# 创建SVM分类器对象
svm = SVC()

# 创建网格搜索对象,传入超参数组合和分类器对象
grid_search = GridSearchCV(svm, param_grid=param_grid)

# 训练模型并输出最佳超参数组合和对应的准确率
grid_search.fit(X_train, y_train)
print("Best parameters:", grid_search.best_params_)
print("Best accuracy:", grid_search.best_score_)

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

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

相关文章

蓝蓝设计UI设计公司-界面设计与开发案例

天津航天中为项目 中国南方电网十二个软件交互优化和界面设计 图标设计 | 交互设计 | 界面设计 天津航天中为数据系统科技有限公司是航天503所控股的专业化公司,坐落于天津滨海新区航天技术产业园,是航天五院家入住天津未来科技城的军民融合型企业&…

el-tree组件图标的自定义

饿了么树形组件的图标自定义 默认样式: 可以看到el-tree组件左侧自带展开与收起图标,咱们可以把它隐藏:: .groupList {::v-deep .el-tree-node { .el-icon-caret-right {display: none;} } } 我的全部代码 <div class"groupList"><el…

韩顺平java集合

遍历集合方式: public static void main(String[] args) {List<Object> arrayList new ArrayList<>();arrayList.add(1);arrayList.add(3);arrayList.add(111);Iterator<Object> iterator arrayList.iterator();while (iterator.hasNext()){System.out.pri…

SpringBoot整合MongoDB(从安装到使用系统化展示)

SpringBoot整合MongoDB&#xff08;从安装到使用系统化展示&#xff09; MongoDB介绍 基础介绍 MongoDB是一种开源、面向文档的非关系型数据库管理系统&#xff08;NoSQL DBMS&#xff09;&#xff0c;它以其灵活性、可扩展性和强大的查询能力而闻名。MongoDB的设计理念是为了…

Linux journalctl命令详解(journalctl指令)

文章目录 Linux Journalctl命令详解1. Journalctl简介2. Journalctl基础使用3. 过滤日志条目4. 时间戳和日志轮转5. 高级应用6. journalctl --help指令文档英文中文 注意事项journal日志不会将程序输出的空行显示&#xff0c;日志会被压缩得满满当当。journal日志不会自动持久化…

Claude 2 国内镜像站

Claudeai是什么&#xff1f; Claude 2被称为ChatGPT最强劲的竞争对手&#xff0c;支持100K上下文对话&#xff0c;并且可以同时和5个文档进行对话&#xff0c;不过国内目前无法正常实用的&#xff0c;而claudeai是一个Claude 2 国内镜像站&#xff0c;并且免翻可用&#xff0…

当图像宽高为奇数时,如何计算 I420 格式的uv分量大小

背景 I420 中 yuv 数据存放在3个 planes 中。 网上一般说 I420 数据大小为 widthheight1.5 但是当 width 和 height 是奇数时&#xff0c;这个计算公式会有问题。 I420 中 u 和 v 的宽高分别为 y 的一半。 但是当不能整除时&#xff0c;是如何取整呢&#xff1f;向上还是向下&…

【C++】iota函数 + sort函数实现基于一个数组的多数组对应下标绑定排序

目录 一、iota函数 1. 函数解析 ​① 迭代器类型(补充) ② 头文件 ③ 参数 2. 函数用途与实例 二、sort函数 1、 函数解读 2、实现倒序排列 2.1 greater 与 less 模板参数 2.2 lambda表达式 三、下标绑定排序&#xff08;zip&#xff09; --- 833.字符串中的查找与替换 一、…

innodb事务实现

事务的特性 ACID 事务的类别 事务实现 redo redoLog buffer 的格式 undo 更新主键 purge group commit 因为上层的binlog和底层的redolog要保持一致&#xff0c;所以 事务控制语句 事务隔离级别 分布式事务 事务习惯

安装Ubuntu服务器、配置网络、并安装ssh进行连接

安装Ubuntu服务器、配置网络、并安装ssh进行连接 1、配置启动U盘2、配置网络3、安装ssh4、修改ssh配置文件5、重启电脑6、在远程使用ssh连接7、其他报错情况 1、配置启动U盘 详见: U盘安装Ubuntu系统详细教程 2、配置网络 详见&#xff1a;https://blog.csdn.net/davidhzq/a…

运放和三极管构成的恒流源电路

这是一个由运放和三极管构成的恒流源电路&#xff0c;RL为负载电阻&#xff0c;R1为采样电阻。 流过三极管集电极的电流 下面分析下这个电路的工作原理。首先我们可以看到这个运放引入了负反馈&#xff0c;所以它工作在线性区的&#xff0c;就有VINVPVN。 所以流过采样电阻R1的…

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析

ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks使用分析 1 ATF的下载链接2 ATF BL1/BL2 ufs_read_blocks/ufs_write_blocks处理流程2.1 ATF BL1/BL2 ufs_read_blocks2.2 ATF BL1/BL2 ufs_write_blocks 3 UFS System Model4 ufs_read_blocks/ufs_write_blocks详细分析4.1 ufs_re…

layui框架学习(37:学习laytpl基本语法)

layui中的模板引擎模块laytpl属于轻量的 JavaScript 模板引擎&#xff0c;支持在页面中将指定的数据按指定的模板进行展示或处理&#xff0c;此处的模板是指一段包含html和脚本的文本&#xff08;感觉类似asp.net core中的razor标记语言&#xff0c;在网页中嵌入基于服务器的代…

深入理解CyclicBarrier

CyclicBarrier翻译过来是回环栅栏&#xff0c;它可以实现让一组线程等待至某个状态之后再全部同步执行&#xff0c;这个状态叫屏障点。当所有等待线程都被释放后&#xff0c;CyclicBarrier可以重置再次使用。 CyclicBarrier的功能是由ReentrantLock和Condition共同实现的&…

java: 无法访问org.springframework.boot.SpringApplication 错误的类文件

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; java: 无法访问org.springframework.boot.SpringApplication 错误的类文件: /D:/Software/env-java/apache-maven-3.6.1/repository/org/springframework/boot/spring-boot/3.1.2/spring-boot-3.1.2.ja…

Docker基础操作入门

1 初识 Docker 1.1 简介 我们写的代码会接触到好几个环境&#xff1a;开发环境、测试环境以及生产环境 Docker概念 Docker 是一个开源的应用容器引擎&#xff0c;诞生于 2013 年初&#xff0c;基于 Go 语言实现&#xff0c; dotCloud 公司出品&#xff08;后改名为Docker In…

钝感力:项目经理的隐形盾牌

钝感力的定义 钝感力的起源和意义 钝感力&#xff0c;或者说对外部刺激的不敏感性&#xff0c;起源于我们的生存本能。在古代&#xff0c;人们面对各种危险和挑战&#xff0c;需要有一定的抗压能力&#xff0c;才能在恶劣环境中生存下来。这种能力使得我们的祖先能够在面对猛兽…

R package org.Hs.eg.db to convert gene id

文章目录 install使用org.Hs.egENSEMBL将Ensembl id convert to gene idorg.Hs.egGENENAME 将Ensembl id convert to gene nameorg.Hs.egSYMBOL 将 gene symbol convert to gene id我现在有一些ensembl id 如何转为 gene name注意你会遇到一些record不全的情况&#xff0c;gtf文…

Certify The Web (IIS)

一、简介 Certify The Web 适用于 Windows的SSL 证书管理器用户界面&#xff0c;与所有 ACME v2 CA 兼容&#xff0c;为您的 IIS/Windows 服务器轻松地安装和自动更新来自 Letencrypt.org 和其他 ACME 证书授权机构的免费 SSL/TLS 证书&#xff0c;设置 https 从未如此简单。 …

T599聚合物电容器:在汽车应用中提供更长的使用寿命的解决方案

自从电子技术被引入汽车工业以来&#xff0c;汽车的技术含量一直在提升。诸多技术被应用在汽车上&#xff0c;使汽车的形象更接近于轮子上的超级计算机。更多传感器、更强大的计算能力和电力被装载到汽车上&#xff0c;汽车应用中的电子产品数量正在迅速增长。随着电动汽车和自…