百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

卷积运算和图像处理

toyiye 2024-06-06 22:12 11 浏览 0 评论

图1.使用在线提供的默认图像过滤器

最近,我对图像核和卷积运算在图像处理中的应用产生了兴趣。诚然,这是因为它在社交媒体网站和Snapchat和Instagram等应用程序上很受欢迎。在一些应用程序上的许多照片都使用了特效,这些特效是通过改变图片像素的值和操作来实现对图像的修改。

图像处理有许多不同的应用,包括AR、文本分类、目标检测等。图像处理应用的数量激增的原因与深度学习领域的研究人员最近的发展有关。神经网络能够处理各种各样的输入,并在一系列计算的基础上提出预测。

什么是卷积运算?

图2.卷积运算的一个例子

在讨论卷积运算之前,必须提到仿射变换,因为它们为卷积运算提供了基础(Dumoulin, 2018)。仿射变换用于通过一个称为核的矩阵来改变向量的值,核的值集可以是预先确定的,也可以是导出的。当改变向量的方向或位置时,这些转换是有用的。然而,仿射变换的局限性在于它们没有利用输入中的核可用的某些属性,如颜色或方向通道。通过利用前面提到的特性,操作可以减少必要的处理量,从而帮助更有效地解决任务。

这就是卷积运算发挥作用的地方。卷积运算采用仿射变换,允许它们有效地应用于具有高度维数或大量可变性(如图像、视频和声音字节)的输入。如图2所示,为了简化大数据集,使用卷积运算通过一系列的运算(一系列的乘法和加法)压缩输入。与仿射变换一样,卷积运算使用核函数来改变输入。这是通过将输入值与核值相乘来实现的。总数是通过在操作的第一步中添加一系列乘法的值获得的。在一系列的过程中,这些计算结果是一组小的值,这些值都在一个压缩的集合中保存了输入值。

卷积神经网络(CNN)和卷积运算是否相关?

图3.Fjor Van Veen的卷积神经网络

在讨论卷积运算时,不得不提CNN。CNN在90年代早期被用于识别手写字符。一组研究人员通过最初分离然后标记它们来训练神经网络来识别手写字符(Le Cun,1995)。当CNN用于在比赛中击败ImageNet分类系统时,神经网络的潜力急剧扩大(Krizhevzky,2014)。CNN之所以成为机器学习实践者最希望利用的网络之一,是因为它的压缩作用是通过一系列卷积运算来完成的。这允许模型基于压缩的输入进行预测。由于输入已经被简化或压缩,因此在训练模型上花费的时间更少。

图3显示了CNN背后的典型设计。首先,可以使用具有多个维度的图像或音频文件作为输入(黄色圆圈)。然后将执行一系列卷积运算,以便在多个层(粉色圆圈)上简化或“卷积”输入,并将一系列卷积运算的输出馈送到神经网络中。根据Van Veen(绿色圆圈),分析卷积输出的神经网络通常是前馈神经网络。

你如何评估CNN的表现?

神经网络模型建立后,利用大量的数据集进行正向和反向传播,改变网络各节点之间的连接,以达到尽可能高的精度。如何评估模型准确预测是通过一种名为混淆矩阵的方法。

混淆矩阵的四个部分:

混淆矩阵是一个2×2矩阵,用来计算模型的预测精度。矩阵的四个部分是真阳性、假阳性和真阴性、假阴性。从这四个值; 可以返回准确性,精确度以及正面和负面情况的覆盖范围。通过从矩阵中获取值并使用公式获得这些值。

如何训练模型:

输入数据分为两组,即测试组和训练组。可以使用任何比率来训练模型,但使用80%的数据集作为训练集是最流行的方法。这可以使用Python的sklearn库中的train_test_split()API调用来执行。通过拆分数据集,这允许网络使用先前未见过的数据来提高其预测的准确性并防止过度拟合。过度拟合是由具有相同数据的神经网络内的训练节点引起的问题,一旦出现不熟悉的问题,将导致精度损失。

如何进一步提高网络的准确性:

这可以通过交叉验证来完成,交叉验证是一种拆分数据集的方法,以便在整个集合中进行训练和测试。该方法允许将所有数据用作训练集和测试集,这将提高模型对未知或未见数据的预测的准确性。交叉验证的两种方法是leave p-labels out和k-fold测试。

Leave p-labels out:

为了实现更高的精度,测试可以用来忘记p为了测试,以“训练过度”偏爱的标签中的标签的数量。在测试期间,“遗漏”的标签被带回并使用。

k-fold测试:

这是最常用的交叉验证类型。这包括获取测试集并在整个数据集中“移动”该区域以确保所有数据都已用于测试。

关于Kernel

图4.此图像核保存模糊值

上面显示的图像是3 x 3矩阵,核也可以是任何大小。核的大小由输入大小决定。考虑到这一点,核大小应足够大,以便在其计算中包含足够的数据,但也应该足够小,可以防止处理的信息重叠。此外,核保存常量,然后在一系列卷积运算中使用这些常量。有许多不同类型的自定义效果可以通过操纵核中保存的值来实现。例如,恒等核通过将nxn核的中心设置为1,将周围的单元格设置为0来保持图像的原样。这将保留想要的像素,同时在卷积运算的乘法运算中“忘记”其他不需要的值。通过这种方法,很容易假设以0作为核中的值的网格将被“遗忘”,或者在卷积操作中不会被计算,而1将保持像素不变。通过增加输入的大小(核值大于1),可以执行模糊操作,通过缩小大小可以执行完全相反的效果(锐化)。

图像处理还有其他部分吗?

图像核不是图像处理的唯一关键部分。如果我们参考图2,核似乎会在输入中移动。移动的程度称为步幅,可以自定义,以增加核跳过的像素数量。步幅的增加确保了图像核所研究的区域不重叠。

当核开始沿输入边缘移动时,Padding是图像处理的另一个重要部分。根据输入和核的大小,可以定制n个层。图4显示了一个卷积操作。

不同类型的Padding

图5.The zeroes around the input helps the kernel process the image more accurately

虽然上面的图中显示的值是0,但是使用的值可以是任何数字。还可以使用其他类型的填充,例如reflective padding,但是为了简单起见,图4中所示的零填充将是讨论的重点。

No padding:

这需要核处理没有零层的输入的每个像素。这会导致输入的边缘不被整个核完全处理,如图1所示。

Half padding:

Half padding用于保持输入的大小。当在网络中涉及多层padding时,这可能是期望的。卷积运算减小了输入的大小,如图4所示。Half padding的名称来自用于执行它的公式。将内核大小分成两半,然后将划分的下部加倍,然后添加一个小于核大小的值。

Full padding:

这允许输入的大小增加,这可能对具有大量卷积的神经网络有用。这可以恢复被卷积操作删除的层。

卷积运算有哪些种类?

处理输入时可以使用两种主要的卷积运算。通过更改前面提到的属性,可以根据自己的喜好自定义操作的详细信息,以增加每个卷积操作中表示的信息量。通过更改padding,您可以使核能够处理输入的边缘并保留或增加大小。

不同类型的卷积运算

No zero padding with non-unit strides:

这将产生一个输出,它等于步数加1,包括核的初始位置,这是由核所采取的。Non-unit strides可以用来限制分析区域的重叠量。

Zero padding with non-unit strides:

通过对输入进行padding并将核设置为non-unit strides,可以完成另一个卷积操作来处理输入,并能够包含输入的边缘情况。

转置卷积运算

转置卷积运算意味着切换卷积的方向。这意味着当核用于更改值并处理输入时,将交换forward 和 back swapping。步幅和padding用于实现类似的目标,即允许更好地处理数据。然而,由于前面提到的操作现在在相反的方向上工作,所以步幅和padding的结果与在标准卷积操作期间如何使用它们不完全相同。

图5所示是转置卷积运算。通过向输入添加padding,可以考虑每个感兴趣的区域,并且与只允许核研究四个阴影区域相比,输出可以包含更完整的数据。转置卷积运算通常用于提高图像分辨率。这方面的应用是无止境的,包括改善从商业中获取的颗粒状CCTV镜头或完成可能模糊或覆盖的面部或镜头。

图6.使用单位步幅和零padding的转置卷积

自定义图像效果

如前所述,当使用图像核对图像(如模糊,旋转和裁剪)执行某些效果时,我们可以使用许多不同的设置进行自定义。因此,通过使用http://setosa.io/ev/image-kernels/上提供的图像自 定义程序,可以创建自定义核(如图7所示),我们可以将核应用于图像。

图7.这是我们将用于应用模糊的核。

(上)图8.应用转换前的图像(下)图9.应用了自定义核模糊后的图像

自定义Filters的实现

自定义Filters的实现可以在GitHub和GitLab等网站上在线找到,Python是最受欢迎的语言之一。我并不是说Python将为您的任务提供最好的性能,但是该语言中有许多库可以用于此目的,以及可供参考的文档。

更早些时候,在2004年,Apple提供了这部分代码,可用于自定义图像效果。可以改变向量和浮点数的值以实现所需的任何效果。

图10. Apple的自定义核实现

以上代码可以作为Java、Python、c++ /C甚至Matlab实现的起点!

卷积运算已经成为一种非常有用的工具,目前有许多不同的应用。您可以改变图像,简化图像来解决图像分类内的问题,并定制效果上传到任何社交媒体网站。

相关推荐

幸运角色过去了,谈一谈DNF起源的元素

总的来说伤害比上个版本强太多了,打卢克每日和团本明显能感觉的到。目前打团B套+圣耀稍微打造下应该都能随便二拖了。组队基本上都是秒秒秒(以前得强力辅助,现在随便带个毒奶都行)。单刷除了王座和顶能源阿斯兰...

DNF元素超大凉打桩测试(把括号的伤害加起来好像比较正常)

最近修练场的二觉老是很奇怪,发现以前都是习惯性先减抗然后丢二觉,结果伤害。。。直接丢二觉就正常了下面是其他技能伤害,没达到BUG线,估计问题不大。装备打造方面:全身红字加起来353(41*5+74*2...

ANSYS接触和出图技巧(ansys rough接触)

1.ANSYS后处理时如何按灰度输出云图?1)你可以到utilitymenu-plotctrls-style-colors-windowcolors试试2)直接utilitymenu-plotctr...

ANSYS有限元使用经验总结-后处理(4)

28.求塑性极限荷载时,结构的变形应该较大,建议把大变形打开。...

CFopen21.1、CFopen21.2都来了(cfile open)

[呲牙][赞][加油]

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

取消回复欢迎 发表评论:

请填写验证码