浅谈图像处理和深度学习

没有复杂的理论,只为让你明白深度学习也就这么回事!

传统的图像处理

        高斯模糊是图像处理中比较经典的操作,我们以它为例,开始介绍传统图像处理和深度学习。

图1

        这是一张RGB原图(图1),我们通过高斯模糊核(这里,我们不探讨高斯模糊复杂的公式和原理)进行处理:

假设:高斯模糊核为3×3,如

\frac{1}{16}\begin{bmatrix} 1 & 2&1 \\ 2& 4 &2 \\ 1& 2 & 1 \end{bmatrix},计算过程是该模糊核沿着这个图像移动(计算机过程如图2),

 图2

        每一个像素点都会计算出一个结果,如图2所示。

 图3

        我们可以看到,高斯模糊像是把图像平滑了,高斯模糊核越大,平滑的效果越强,图像越模糊,我们在看一下高斯模糊核为5的情况,如图3所示。

图4

        我们可以发现,图像越来越模糊了。

代码如下:

''''
高斯模糊
'''''

import cv2
import numpy as np
img = cv2.imread('cat.jpg')
img = cv2.resize(img, (320,320))
# dst = cv2.GaussianBlur(img,ksize=(5,5),sigmaX=0,sigmaY=0)
# 创建毛玻璃特效
# 参数2:高斯核的宽和高(建议是奇数)
# 参数3:x和y轴的标准差
dst1 = cv2.GaussianBlur(img, (5, 5), 0.5)
dst2 = cv2.GaussianBlur(img, (5, 5), 1.5)
dst3 = cv2.GaussianBlur(img, (9, 9), 1.5)
# cv2.imshow('dst1', dst1)
# cv2.imshow('dst2', dst2)
# cv2.imshow('dst3', dst3)
path1 = r'F:\pythonProject\blog\Imge_porcess\out\dst1.jpg'
path2= r'F:\pythonProject\blog\Imge_porcess\out\dst2.jpg'
path3 = r'F:\pythonProject\blog\Imge_porcess\out\dst3.jpg'
path4 = r'F:\pythonProject\blog\Imge_porcess\out\img.jpg'
cv2.imwrite(path1,dst1)
cv2.imwrite(path2,dst2)
cv2.imwrite(path3,dst3)
cv2.imwrite(path4,img)
cv2.waitKey()

深度学习与图像处理

        我们假设现在有一个需求:我们需要对图像进行模糊处理,类似于“毛玻璃”的图片效果,我们第一个想到的是直接用上面介绍的高斯模糊核进行处理。如果采用高斯模糊核处理,那我们事先就要设计好高斯模糊核里面的参数,如果我需要模糊效果好一点,那我要设计大一点的模糊核,设计好以后,我们就可以进行运算了。

        但是这里有一个非常致命的问题:需要自己设计模糊核的参数。这就像一个数独游戏一样,你需要在3×3(有可能更大一点的9×9)的矩阵中填入数字,是的你的卷积核满足你的需求。并且,如果换一种任务,我想做一个锐化的效果,那你又要重新设计卷积核,这个计算量是非常大的,这也是传统机器学习的弊端:人工提取特征。

        深度学习的出现可以很好地解决这个问题。

        做法如下:我需要一定的数据:原始图片数据+“毛玻璃图片数据”,然后,我堆叠几个卷积核,让他自己学习“从原始图片->毛玻璃”的过程,学习完成后,这几个堆叠的卷积核就充当了高斯模糊核,如图5所示。值得说明的是:深度学习是以大数据为驱动的,如果数据足够大,那训练出来的参数基本更人工设计出来的参数差不多,而且效果可能更优于人工,最主要的是,你不需要自己设计卷积核,节约了时间成本,如果卷积核层设计的合理,训练也是非常快的。

图5

        输入图片经过卷积层,得到一个输出,该输出结果和目标模糊图片进行损失计算(就是看一下:卷积输出的结果和目标结果还有多少差距),这个损失结果会“指导”卷积层的参数更新,随着迭代的次数越来越多,卷积核的参数会越来越接近高斯卷积核       

深度学习是一个“盲盒”

       我们再来看一个任务:我们数据集:原始数据(通过插值后的低分辨率图像)+目标数据( 高分辨率图像),我们的目标是设计一个模型,实现低分辨率到高分辨率图像的转换,我们如何设计这个模型?

        如果按照上面普通的做法:我们自己设计一个“特征提取核”,这个核可以实现高分辨率到低分辨率的转换,那我们要自己去计算这个“数独”,非常耗时,而且效果肯定不好。

        第二种就是用深度学习,让它自己学习高分辨率到低分辨率的转换。

        在我们刚接触深度学习的时候,我们经常听到深度学习是一个盲盒,我们并不知道里面在做什么,就像一个盲人在搭积木,我不知道要用多少块积木(多少个卷积核)可以搭建一个房子。

        OK,深度学习是一个“盲盒”,我们先用3层卷积层来搭建网络,我们也不知道3层效果好不好,我们先试试看,结构如图6所示。

图6

         我们发现,效果很不错,那接下来怎么办?如果你在2015年之前,想到了用三层卷积来实现低分辨率到高分辨率的转换,那就可以发顶会了。

        假设,我们做出了很不错的效果,发了论文,那后面的人又如何做得更好呢?我们知道,一般来说,网络层数越多,网络结构越复杂,可以学习到的东西(特征模式)也越多,学习的效果一般越好。(为什么说一般?后面讲)

        那我们再加一层网络,用四层网络是不是效果更好?机构如图7所示。

图7

        我们惊奇的发现,效果比三层更好了,OK,恭喜你,又可以发论文了。

        有人肯定会问:那我再加一层,或者我加很多层,他的效果是不是越来越好?遗憾的是,当加到第五层的时候,效果没有四层的网络好。

模型复杂程度+残差网络

        按道理来说:模型越复杂,模型学习的效果越好,但是,事实并非常如此,如图8所示(该部分借鉴李沐pytorch的视频整理)。

 图8

        我们先看图(2),我们的常识认为,两层的卷积结果一定包含第一层卷积的结果,三层卷积又包含前两层的结果,就像图(2)一样,那最优解(模型F1-F5到五角星的距离)就是F5(第五层卷积)所取得的。遗憾的是,我们一般的卷积都是图(1)的状态,F2不一定能包含F1的结果,F2可能会学习偏,所以,图(1)的最优解就是F4或者F3,反而,F5离最优解是最远的。

        这里我们就有一个想法:我们能不能把模型就按照图(2)这样生成?

        可以的,假设x->F1->F2->y,一般情况下,y = F2(F1(x)),而这种是图(1)的模式,,我们怎么转为图(2)的模式?我们重新设计:y = F1(x) + F2(F1(x)),y的结果起码不会比F1(x)差,如果F2这层卷积学习不到东西了,在反向传播的时候,F2拿不到什么梯度,F2的权重就不会更新,此时的F2(F1(x))基本为很小的一个数,甚至为0。如果你能想到这,那恭喜你,你又能发论文了。这其实就是著名的残差网络,如图9所示。

 图9

        至于残差网络为何能一定程度的规避梯度爆炸,可以参考我的前一篇博客:残差网络为何可以解决梯度消失_C_小米同学的博客-CSDN博客

深度学习不是一个“盲盒”

        前面开玩笑的说:直接搭建3、4层网络就可以发论文了。对于结果来说,我们确实实现了低分辨率到高分辨率转换的任务,而且是端到端的,但是,我们没有去解释每一层的作用,也就是说:我们纯粹的把卷积当成盲盒,纯粹的搭建了几层网络,发论文怎么可能不去解释卷积每一层卷积的作用呢?

        所以,前期学习深度学习,我认为它是一个“盲盒”,我们随意的搭建网络。但是,在有一定的基础之后,深度学习又不是一个“盲盒”,好像每一层卷积都是有道道理的。

        前面提到的搭建3层卷积、4层卷积就是图像超分辨率非常经典的网络,分别是SRCNN网络(如图10)、ARCNN网络(如图11)。

 图10

 图11

        我们可以看到:图10的作者是这样解释这三层网络的作用的,第一层:特层提取,第二层:把第一层提取的特征做非线性映射(可能是增加拟合能力),第三层:重建(把前一层提取的信息重建回原始图片大小格式)。

        图11的作者增加了一层特征增强(多一层网络,效果又变好了,那肯定是增强了特征呀)。

        我们可以看到,他们把每一层网络都编了一个“故事”,让我们觉得好像确实是有道理的。

        个人认为:他们也许一开始就是随便搭建的网络,看到效果很好以后,就开始去思考这几层网络的作用。他们查看了每一层网络的输出结果(每层的特征图),发现每一层的输出结果好像就是上面提到的作用。所以,这是一个:假设这一层能实现这个功能,然后再去验证(这也许并非是数学层面上的验证,有可能就是查看了每一层的特征图)。

深度学习仍是一个“盲盒”

        我们前面讲了从深度学习是一个“盲盒”到深度学习不是一个“盲盒”。

        深度学习学得出神入化后,我们发现:深度学习仍是一个“盲盒”。这个阶段对深度学习的感受和第一个阶段不同,这个阶段有种和深度学习达成了某种“契约”的感觉。

        深度学习仍是一个“盲盒”这句话有两层含义:

1.每一层的卷积我们很难做到都“全知”,尤其是当网络非常复杂的时候(比如100层),我们很难去解释其中的某一层到底做了什么,我们最多会有一个感觉:他应该是增强了xxx吧。

2.虽然仍是“盲盒”,然我们在做一个任务的时候,我们变得更有目的了,我们知道了图片超分可以分为四个步骤:特征提取,特征增强,非线性映射,重建。我们再说深入这个课题的时候,我们就可以有目的的,分别的去修改每一个模块,比如:特征提取网络我换成更复杂的网络可不可以。并且,我们可以把这个任务迁移到视频超分里面,视频超分大致也是这几个步骤。(最大的不同是,视频有时序信息,可能会做帧对齐)

后记

        “看山是山,看山不是山,看山还是山”,这是人生的三大境界,深度学习的学习也要经过这三个阶段。朋友,你在第几层?

物联沃分享整理
物联沃-IOTWORD物联网 » 浅谈图像处理和深度学习

发表评论