卷积运算(卷积运算和图像处理) 最近,我对图像核和卷积运算在图像处理中的应用产生了兴趣。诚然,这是因为它在社交媒体网站和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实现的起点! 卷积运算已经成为一种非常有用的工具,目前有许多不同的应用。您可以改变图像,简化图像来解决图像分类内的问题,并定制效果上传到任何社交媒体网站。