基于 UNet 的农业图像的分割| 学习笔记

简介: 快速学习基于 UNet 的农业图像的分割。

开发者学堂课程【高校精品课-复旦大学-机器学习与深度学习 :基于 UNet 的农业图像的分割】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/891/detail/14265


基于 UNet 的农业图像的分割

 

语义分割的这个技术,语义分割和这个目标检测就是前面介绍的一些算法的有一定的差别,那么它的功能是在这个图上面,在像素级做一个分类,语义分割是一个分类的工作。

分类就是一张图上面才有24乘24那么多像素。那么每个像素到底是属于这个物体的,还是属于另外一个物体的。

image.png

比如说一个图里面有一个这个女生,那么我们来看一下哪些像素属于一个女生,哪些像素属于环境的。那我们要用不同的颜色把这个像素标出来,这个实际上就是一个分类。那么同样的如果在一个图里面,我们不一定只有一个物体。

这个图里面我们可能会有更多的物体,那么如果有更多的问题,那我们如何做语义分割?

就是把不同的物体用不同的颜色标出来,也就是说对于每个像素,为了能够把不同的物体能够分别开来的,可以用不同颜色来着色,这就是目标检测,目标检测里面的就是相对语义分割来讲,把语义分割看成目标检测的其中一块工作。

因为你要想做语义分割,你首先要把那个物体识别,但是物体我们不是简单的像一般的目标检测画一个框。要把这个物体它对应的每个像素导出来,所以这个语义分割就转换成一个什么样的一个任务。就你能设计一个算法,把这个图里面每个像素做一个分类就,这就是它的本质。那么实例分割和一般的分割差别就是,如果在一个图里面,比如说有三头牛。不是把这个牛和这个环境分开就行了,要把每头牛所占的这个像素能够区分。

image.png

下面我们来看一下这个语义分割用到的这个技术,先复习一下上采样,也叫 Unpooling。A我们一般的卷积特征图会有大变小,就是越来越丰富。但是你如果做上采样的时候,你会发现这个特征图会逐步的放大。

直至和它的原图一样大。这个例子大家可以看到比如说我们左边这个特征图经过一个最大值化,但是有交叠的,让我变成了一个比较小的特征图,这个小的特征图我们再经过一个这个 Onpooling,有点像上采样,或者说反卷积,我们找到了特征图比原来大了。也就是磁化才知道就是一个大的可以变成小的特征图,就是把压缩。那么 Unpooling 就是相当 Pooling 反的操作。

有一个小的特征图变成一个大特征图。那就相当于一个小的变大的,当然我们除了 Unpooling,我们还有其他的组,一会我们举的例子就是一个反卷积的例子。

有一个小的特征图变成一个大特征图。也就是我们平时说的上采样,这个 after somebody 还有很多的做法。

image.png

那么下面我们来看一下这个怎么完成语义分割的工作。我们介绍一种比较经典的算法叫 UNet,这个右下角来看,就是这个网络的结构。因为他的 top 结构像一个大写的 U。这个网络给大家做一个简单的剖析,它为什么能够做一分割。

那么这种结构怎么保证他作为一个语音分割?那么下面我们来看一下,左下角是一个例子,比如说你用 UNet 总能在一个 CT 的扫描的图片,比如说是肺部。

比如说一个人得了这个肺病。怎么去把它这个病灶的位置和正常的组织把它分开?

这里面大家看就是一个非常典型的医疗上的语义分割,把病变的这个区域和正常的这个区域分开,以便于指导的将来这个手术的机器人,指导这个医生控制这个机器人的去做避免位置的这个切割工作,看结构,这个网络结构的可以看一下,它是分左右两部分。左边大家可以看它就是一个卷积网络,这个网络会不会独立的,我们要和右边拼成一个整体材料UNet。这个左边把它看成一个卷积网络,这个卷积网络是按卷机组堆叠的,这个卷积组是四组,卷积主要是把头里面的特征提取出来。

我们从这个图我们可以看到,就是每一个卷积层的大小还有通道处。这个大家可以算一算,比如说我给你一个卷积层它的和。他是不是有判定,然后他上一层特征图的大小。那么给你还有这一层这个卷积和大小,还有它的步长。那我们是不是很容易算出来下一层的大小?

然后每一层都有它对应的这个通道。那么左边这一部分相对来说比较简单。那我们主要获得他的步长,很容易算出来扒下一层的大小,然后每一层都有它对应的这个通道。那么左边这一部分相对来说比较简单。

要获得特征,但是特征它是有多尺度的,可以看到它有那么四条线,四条线实际上是对应我们左边这个卷积神经网络的四个尺度,也就是说四个尺度的特征,可以看到这个线和右边都是对应的。结构不对称,但对应。右边这一部分做就是上采样。

你看我们到这个地方,这个特征图就已经很小了。他从头里面浓缩了就是你这幅图它里面的一些重要特征,但是我们会发现,我们通过右边的四次上采样。也就四次反卷积,比如说类似这个卷积网络,你把这个特征相当于加引号的,把它还原成你原来图的大小。把还原出来的这个特征图,每一个像素要能够做一个分类,对每个像素它到底属于哪个物体的。也就是说她这个网络能完成什么工作呢?

这个网络实际上它的要求不比目标检测的要求低,目标检测只要把那个框导出来,告诉我这个框里面是什么。而语义分割,不但要大致找到那个物体,而且把那个物体在这个图里面对应的像素还要找出来。这个要求实际上它是更高的。

所以这个网络我们来看一下它的道理。他为什么能够做到这个程度。那么这与它的这个结构是有关的。左边刚才讲过了。我们就是卷积网络,这个卷积网络把特征都获得了,这一个图里面知道有物体的,还有没有物体的特征,这就是所谓的这个卷积的一个重要功能。右半部分就把你左边你先分一张图,可以大致的知道在一个图里面这个不同的这个区域,如果有物体的特征,还有没有物体的特征。然后我们在右边拥有一个反卷积,这个特征就是你刚才浓缩的特征。就是那个特征图比较小的,就是在中间的位置,把这个特征逐步的稀释出来。经过四个卷积组才压缩成比较小的一个丰富语义的特征向量,再经过四个反卷积,还原成原图的大小,每一次反卷积的时候,我们还要把做卷积的时候,对应的尺度特征图,还要加上补偿线,因为做了那么多卷积,把抽象的特征逐渐稀释到具体特征的时候,中间也是有特征损失的,那么这种损失呢在左边相应的这个卷积层,就是你要把这个小的特征图反卷积到比较大的特征图,原来做了四组卷积,得到一个比较抽象特征,我也要经过四组反卷积。把它还原成你原来图大小。那么大家看这个结构在形式上有点像对称的。

那所以我们从左边引出四种不同的尺度。这个尺度是对应在右边,就是我反卷积的时候要相当于要膨胀到一样的这个尺度。那么这个尺度为什么用做一个补偿?就是因为刚才我说了你卷积,然后还有一个反卷积都会显示特征,那显示怎么办?我在同一个尺度。但我刚才已经做过卷积操作了。等你损失,我给你补偿。补偿的话,这就相当于把我们图里面的特征。把它更完备的。而且你看经过四次的返反卷积,这个特征图越来越大。每次这个反卷积都把这个卷积层得到的特征作为一个UNet,,这样的话选择信息我给你做补偿。那他为什么能够在最后反卷积后找到这个物体?

他怎么知道这个像素属于哪个物体的?这个是我们训练出来的。在训练要标注给你一个图,有不同的实例,把不同的实例,用他的像素。用不同颜色标出来,就是标来不同的类别。

训练网络的时候就交给这个网络。分类通过左半部分,把这个图里面的不同物体的特征抽出来。然后在右边再把这个特征稀释。因为有在一个图里面,有物体的和没有物体的,它的特征是不一样的。稀释就相当于把这个特征逐步的还原成它原来的物体。在还原的过程,要给这个算法一个信号,因为你这个网络这个权重偏执,包括这个核函数里面的值,我们类似于权重这样的词。

谁去负责赋值。他用预训练那种比较左边的这种类似微结构,用预训练的模型。那么这里面知道他实际上都是有取值的。希望能够训练用梯度下降法,去训练这些参数,使得网络输出的时候,每一个像素去做分类。分对就是我将来我放到一个选择函数里面的函数是什么东西,就是在我这个图里面每个像素它的类别。那你是和实际对比的分子式一样的,如果不一样的话,那你选择函数就可能比较大,然后想办法调整这整个网的所有的可以训练的这个参数。

这个网络能够拟合这个信号,也就标注好的语义分割以后这样的数据。那么这是训练出来的,与做目标检测一样的,一张图为什么这个网络能够比较准确地在图里面把这物体标出来,而且还告诉我们的物体是什么?因为他以前学过。以前学过在这个区域里面这种特征的,它应该是一个小汽车,这个小汽车包括它的轮廓的大小、位置,以前学过的。将检验的时候,这个网络它的泛化能力要求跟原来的图一样,位置一样,但是根据特征。但实际上这个算法就自动能够做一个判定,UNet网络也是大致的一个原理。

就在于属于哪一个物体,比如你有信号。用不同的物体,刚才你用特征获得它的特征是不一样的,当你的特征稀释到对应的物体,比如说你已经用左边的网络,这个图里面比如说有牛羊马。有好几个动物,你左边实际上已经把牛、羊、马的特征已经获得了,它的特征是不一样的。那我们画这个特征图,加引号的稀释到同样大小的这个中途的时候。那实际上你属于牛的特征,所以马的特征知道它分布在这个图里面不同的位置。就训练的网络,因为有信号,它就可以通过调整这些参数帮我们找到。

在特征稀释的过程,帮我们确定每一个像素大概是属于哪个动物或者物体的,这个叫UNet。

大家看这代码可能更能深刻的理解这个网络它的结构,可以看这个代码,有一个分界线。这个分界线前面这个代码都属于于这个左半部分。然后会发现它有这个右半部分都是反卷积,反卷积里面,这地方有四个可能开替代的。

我们可以看到这个cannot,就是对应我们左边的这个,相当于最下边的这个特征图,作为一个补偿的,还要和刚才我们这地方做了一个所谓的上采样,就反卷积这两个特征要做一个融合,因为你在反卷积恢复到这个大小的时候,这个大小和左边的这个卷积网络,它的特征图大小是一样的。因为这种信息损失,就会膨胀,那你慢慢的恢复成原图大小的时候,因为前面已经做剪辑了,或者还有上采样已经选择特征,那干脆再补偿一些,补偿一些下来我们更容易把这个物体特征逐步的恢复成它的原来的这个图的样子。对于UNet,要搞懂什么是反卷积,这个图大小的特征图怎么去做一个UNet的。怎么去做特征融合,然后把特征恢复成图的大小,就是这样恢复成它原来的每一个像素的大概的这个位置。所以我们这个网络再回到前面,等我们再看看这个这个选择函数。

在前面的网络这个输出端什么东西?大家可以看到最后一层发现大小是388乘以388,接近原来的大小,然后我们会发现这个输出两个神经元,就是每个像素它的对应的是两个神经元,这个像素是做一个二分的问题。这里就是这张图里面你的物体到底是属于背景还是属于物体,我们做一个二分类的问题,当然如果你是做实例分割的话。那么你这个二要改成你这个类元素或者说这个图里面有几个物体,比如说这个图里面有六个物体,那你这个大概在输入层的每一个像素对应六个神经元表示将来这个像素是六类里面的哪一个,可用多少编码?

这里只是做二分类,不是做实例分割的,只是做一个一般的语义分割,就是告诉我们这个像素到底是属于背景还是属于物体。如果是都是牛的话,那就把牛像素全倒出来了,但是分不清楚哪个牛,就没有多少实例分割,网络的输出的像素一共是388乘以388。但是每个像素对应两个神经元输出。最主要确定这个像素到底是属于物体还是背景。

image.png

大家知道这个网络的输入成本,如果你把它拉成向量还是蛮可观的。下面我们再看一下这个网络的选择函数,有关这个 UNet,大家知道像这种语义分割的网络。如果把它做一个分类问题,那我们这个最直接的就是用这个 softmax 作为激活函数,然后他的选择还是加上交叉熵损失函数,当然这个函数的效果可能不理想,就用他的变种加权的二元的加权交叉熵损失函数,就是在这个熵有两部分,还给他加一个权重。当然,你还可以比形成更多的所谓的交叉熵选择函数的变动,比如说刚才 UNet 就做二分类。

每个神经元都有两个输出,就是每个像素对应两个神经元。一共是388x38个像素规模这么大。

就刚才那张图,大家可能容易理解一些,388乘以388,和你原始的图大小已经很接近的,当然你还可以把恢复成和原来一样的。那我们再来看一下,它这个是相当于像素定义两个输出,两个输出带上交叉熵,这个分类里面经常用的公式。

因为我们是用多少编码,那么这个像素到底是物体还是背景,我们导致信号里面已经标好了。关键是网络输出的这个像素。他到底是取值0还是1,或者说他这到底是接近0还是接近1,比如说一表示背景,零表示物体,那么你这个网络在这个像素。你对应的这两个程序员,你输出的到底是什么?那和我的这个导致的信号差别带到公式里面,要把所有像素算法输出的类别。

那么对着它前面求和求出来,求出来这个就是整个网络对于每一个像素到底对了没有,这个数还是蛮大的,那个机器算好了,因为后边的计算都是比较简单的,要继续算了以后我们会有一个交叉熵,就是总体上的一个选择函数值,那么选择值能够下降去调整刚才这个 UNet 这个 u 型网络每一层的这个参数,这个参数包括卷积,调完以后训练网络,改造大量样本,各种情况的这个背景、物体,如果这个网络训练比较成熟,将来给你一张新图,就很容易把这种效果做出来,像这种图很容易就把这个地面位置给圈出,圈的准确的程度取决于训练水平。

image.png

现实中也可以做车道线检测。UNet 就用预训练的模型,这个算法里面直接调用 UNet,因为在框架里面已经包含了一些预训练的模型,包括像点击率训练模型,像目标检测 UNet 都是经典算法,直接调用方法好了,如果没有特殊的要求,不用另外再去训练,直接用于预训练模型。然后你说一张图片,然后就可以得到这个图作语义分割的结果。

下面就是用一个详细的例子来介绍这个 Unet 网络的应用,这个网络应用的背景主要是智慧的农业,也就是说通过卫星的这个云图,拍摄一个高清的图片,然后来看一看在下面这个田地里面到底种什么样的庄稼,从而把这个地面上,也就是这个农田每一个区域通过语义分割做一个划分,这样就可以知道什么地方种什么庄稼,从而就可以安排做一些这个灌溉,或者说做一些其他的一些工作。那么这个是项目的一个背景。

image.png

下面根据这个机器学习的流程,比如说这个问题流确定,然后采集数据预处理,建模评估,然后再经过优化部署,通过这样的几个阶段的构成的流程,分别来阐述这个UNet网络的应用,刚才已经大致的介绍了这个网络应用的背景,主要是对农田的进行分割,根据庄稼的类型分割,从而可以做一些相应的这个管理的工作,这是案例的一个问题,

image.png

下面就来看一看怎么去做这个模型,做之前首先还要做一些这个数据的预测率,因为这个卫星上拍的这个图非常大,将近一个 G 的文件,这是一个非常大的高清的一个图片,去做这个样品的时候,不需要那么大的图,所以在预处理的时候,首先要把这个大图把它切割成块的小图,然后人工的做标注,这个是数据准备的一个阶段,可以看到这个样本的这个几个样例,这个图大家可以看一下,通过切分。大图以后变成好多小图,小图要做人工的标注,将来才能拿过来去用,用它来训练这个 UNet 网络,可以看一下有一些图实际上里面是没有农田的,因为不是人工厂里面挑,他是按照这个条款,那么有一些这个条款里面它是没有这个农田的,所以我们要把它撤掉,所以这个第一步大家可以看到啊,我们就是做的是基础的准备工作,然后做好以后还要做一些其他的处理,比如说这个标注不需要所有工作的人工去做,但我们这个工具尽量减少这个工作量,这里可以到主要是标记,就是给你一幅图,就像刚才的这个图一样的,要能够标注出来哪个是道路,哪个农田,如果农田的话,大概哪一个区域,要做这样的一个标注,也就是准备一个信号,还要对这个标签进行一个遍历,实际上来看一看,每一种这个作物的像素是比较正常,然后还要把这个标签的不正常的样本把它删掉,然后把标记的结果把它写到库里面去,做一些准备工作,

那么在右边的代码可以看一下。可以把比如说这个这个作物分成若干类,每一类给一个这个 index 的索引,每一类相当于给它一个标签,然后把标注的结果要分别的写到这个文件夹里面去,写了以后就是去训练这个模型的时候,就将来你在网络的输出层就可以给他一个导出信号,经过特征获取以后,经过一个反卷积,在输出端每一个像素输出的值和这个标注是否吻合,你的标注如果是作物A,让你识别成作物B,在这个将来写字函数项这个交叉商比较大了。

image.png

这里面这个代码可以看一下,主要的是做预处理,辅助我们去做一些标注工作,这里面的 index 就是对应这个 level,就每个区域的图可能有多种错误,这个作物的种类总数可能是确定的,在这个图里面可能有若干种这个所谓的农作物,要把农作物的这个 level 标出来,那么这里面就是要做一些预处理,除了这个预处理以外,来看一下这个预处理后的结果要把它变成一个训练样本集,然后还要需要一个校验样品作检验的,然后就把预处理后的数据根据机器学习的做法不能把它全部都用于学习训练,要把它至少拆分成两个数据集,可以把它当成一个测试样本,这两个样本是放在不同的文件夹里面,而且这个样本比如说可以按照一定的比例把它分出来,比如说二八比例、三七比例都可以,把除了训练集训练集分开以外,还要把它的标签和前面的图要把它分清楚,因为在标注的软件一般输出的是这个标注,那么这个图本身他知道他有自己的编码,要在训练集和校验集里面要把相应的这两块数据分开,然后预处理以后,也准备好了这个训练样本和校验样本,所以我们这个例子重点的是怎么用这个 UNet。前面有关的预处理,比如说一个图他要降噪,它实际上是有噪的。另外有些图并不是符合这个语义分割的要求,比如说这个图里面根本就没有什么农作物,或者农作物相对面积小,像这种都要清除出去。

image.png

下面把重点的放在这个 UNet 的业务上面,有关 UNet 的原理,它的输入是一张图,输出是每个像素对应的这个类别到底是什么,如果农作物,到底是哪种农作物,那我们这个例子可以识别若干种农作物,他一个标签 ABCD,用这个网络的目的就是训练它,这里要做一个迁移学习,因为在预训练模型里面,UNet 实际上没有多少样本是关于农业的,所以你直接用于预训练模型会发现这个质量预测的质量是不能让人满意的。

所以下面就介绍怎么迁移学习对这个网络靠近输出层的若干层要追加新的样本,去训练它,就是刚才那个最佳样本就是从卫星云图进行这个切块。切块以后,生成了一些样本,这个样本的获得成本是比较高的,包括这个标注,所以我们这里面准备样本数量并不是很多,但迁移学习实际上并不需要太多的样本。

image.png

下面重点来看一看怎么用迁移学习的方法对预训练的 UNet 网络,在这里面都有预训练好的模型,包括结构和参数。就是训练好的这个参数可以把独立来初始化这个网络。那么这个网络关键是他不能满足我们的要求,所以用预模型不行。

所以下面就是重点介绍一下怎么把这个模型搭建好了以后做迁移学习。

可以看一下这几行代码主要是做曹参,就这个网络在训练过程有一些曹操,大家可以看一下,比如说你图的大小是512x512的三个通道彩色图,然后学习率,就是我要做语义分割的,就是这里面这个物体的类别一共四类,当然你也可以把这个类别呢根据实际情况把它调的大一些。另外还有就是要训练的轮次大概没有,因为我这个模型我们是用了预训练的模型,而且制作迁移学习,迁移学习这地方我们做一个小小的改进,比如说训练50次,epoch=50,这50轮里面一半的轮次不做迁移学习,也就是说不做所有的这个权重。在后边的这一部分的这个轮次里面再去做这个靠近输出层的若干层的权重的更新,也就是前面不一定是25,这个是曹参可以改的,前面的若干个轮次还可以其他做法,比如说前面的轮次可以把所有的参数改一下,然后最后剩下25轮的,重点去修改靠近输出层的若干层,这实际上也是迁移学习,但是到前面已经给大家讲过的。

就是当预训练模型不能满足我要求的时候,要针对着这个问题的需求去增加一些样本,那你自己去采集样本,然后标注,标注好以后,用新样本去训练这个预训练的模型,在预训练模型里面,可以紧紧的关注,比如说后面的M头,把梯度下降法去训练这些M层的时候,前面这些层次靠近收入层是不动的,这个就是常规的迁移学习,当前迁移学习还有一些变动,总共做50轮,前面25轮是把所有都是冻结的,就直接用好了。

就直接用好了。这个冻结 freeze_ epoch,就是前面的轮次,要做什么事情?

比如前面的25轮只修正后面的若干层,就是靠近输入层的若干层,然后后面的若干轮把所有的权重都做一个梯度下降的修正,反过来也可以,也可以前面若干轮就把所有的这个权重和所有的参数都用梯度下降法修正一下,用新的样本,那么等到最后落到一些轮次的时候,重点的去训练靠近输出层的若干层就行了,这样都可以,哪个效果更好的,如果有兴趣可以做些实验。

通过检验的结果,来确定哪种结果最好。这地方用的是权重方案,下面看一看这个迁移学习是怎么做的,就是这个模型怎么去用这个迁移学习,这个对应的是模型的搭建。因为我们用来学习的,所以我们在调用这个模型的时候,就和刚才用的例子不太一样了。就是如果你直接用新的训练模型,直接调用这个 UNet 封装起来,看了一个黑箱,你只要看看他的数大小多少,只要按照它的大小把这个图片预处理成要求的大小,那么你去输给这个牛奶的网络,就不需要带着训练用的网络,就会把分割的结果,但是这个例子他是不能满足要求的,所以用刚才的迁移学习的思想,那用他的思想来知道,就要把这个代码,这个整个的网络重新做一个构造。

比如说呢在第二个阶段要把前面这些层次固定住,这里面的参数是不做梯度下降的修正,比如说一层指定到哪一层前面的层次是不再用速度下降了修正,这个时候没有源代码,直接调用别人的训练的代码,我们是没办法做这个工作,所以这地方用 UNet 代码,可以把 UNet 算法源代码打开,打开以后我们去改这个代码,要进行修改,包括预处理都要自己去写这个代码,这个网络搭建的时候总体上的结构是不动的,但是为了实施刚才我们讲过的这个迁移学习思想,比如说一共训练五十轮,前25轮的所有层的这个参数都要修正,等到第25轮的时候,只修正后边的这个N层。

对这个代码做一定的这个修正,那么怎么去完成这个工作?那下面我们来看一下那个网络首先要搭建搭建,也可以在传统的 UNet 基础上面对他的结构做一定的调整。那包括是网络里面的这个特征图的大小都可以做一定的调整,这主要根据你的图片大小做一定的调整。关键是重点来看一下,这个模型搭建好了以后。怎么去做迁移学习,可以看一下UNet 主干网络就是左边那一块,使用的是 VGG16,右边还有四个反卷积,然后经过一个对称型的u型的结构,反卷积的时候还要用多尺度的,还要做一个 ImageNet。

这个代码就刚开始的时候,所有的这个所有的卷积层。就是这个 trainable 都把它改成 False,或者都改成 true,多种做法,也就是说刚开始的25轮,实际上是可以对你所有层次做修正的,可以把这 trainable 这样的一个逻辑变量在代码里面进行修改,然后可以看这个代码,这个 freeze number 就是提供这个冻结多少层,让他全都不要动。大家看看这个东西可以控制什么时候?那么这个如果你刚开始所有的 trainable 都设置为 False 的话。那就是全部冻结,全部冻结就相当于直接用这个模型的,直接用的模型发现它是有问题的,实际上可以把这个 False 改成 true。

大家可以这样做,就是然后下面就冻结了,下面去做迁移学习的时候,至于你这些其他的这些参数,那你就自己设计一下,比如说这个学习步长和度量,还有这个叫交叉熵的这个 loss 函数可以设置一下。

关键是下面要做什么事情,下面做模型训练的时候,这个 keras 框架用的 fit,可以看一下,就是这个 epochs 一共训练 freeze_epoch 次,就是这个网络前面一写这个轮次和后面的轮次,对这个权重更新的范围是不一样的。前面可以把这个训练的这个参数范围可以大一些,后期主要集中在靠近输出层。

这个轮次刚开始就设置到 freeze_epoch,就是你前面多少人。而我的这个里面的参数是全线的去训练的。那他是这样做的。这个次数你可以去修改,它就很灵活了,训练好了以后。

下面还有一段代码做真正的迁移学习,这个学习做什么用?我们把这个 trainable 这个层次,可以局限在某些层,刚开始我们所有的人都可以训练一下,你看这里面就把刚才那个 false 改成 true 了,从第一个卷积层开始,把所有的卷积层参数训练,比如说训练50轮,前25轮,所有产品都做一个修正,但是最后再去训练的时候就集中在靠近输出层,可以看一下,比如说在模型改进的时候,这个 UNet 的操作就是就加了一些 Dropout 这个改动的,这个传统的这个改动防止过拟合,另外我还可以加他,除了这我还可以在某些层面加上 BAN,一般来讲它们的作用是相似的,这些是一些小的改动,因为在原来的 UNet 上不一定有这些操作。

下面把这个把注意力放在刚才迁移学习,可以看一下就是就是靠近输出层的若干层,我控制这个训练轮次,50轮里面,比如说前十轮所有都改的,后十轮只改后面的若干层,通过刚才的这个语句可以控制。然后就这样去训练这个网络,这个思想不是所有的都用迁移学习,因为这个样本和他预期的模型样本差别很大。如果特别小的话,只要直接去训练靠近输出层的少几层就行了,因为现在样本和他预训练的模型差别非常大。也不能把这个网络重新的去训练,样本相对来说比较少,而且对于算力的要求实际上也是比较高的,所以就采用折中的做法,先把这个模型整体训练一下,然后最后集中在靠近输出层的若干层,再做一个折中,然后看看这个网络的训练,训练就是用梯度下降法。在这个深度学习里面这是一个通常做法,然后就可以记录下来他的这个 blog 的曲线,当然还可以画出它的这个准确度的曲线。

比如这个分类问题,分类主要用度量它的准确性,相应反过来还可以把他的损失和误差,拟合出效果,从这个图可以看到这个训练还是比较正常的。然后就是 loss 训练过程,有训练集和测试集,这个 loss 的下面是训练集,上面是测试集,没有过拟合。最上面是它的准确度,准确度在中间略有波动。

在总体这就是一个大概一个训练的一个过程。

前面训练好了,可以找一张新的图片,要做相应的预处理,原来是用512x512的,要把新的图案也改成512x512的。如果不是的话,要 resize,因为这个正好是512x512的。因为测试的时候,训练集和测试集最好一起来做预处理。共同的来做一些预处理。

可以看到这里面就调用了这个 predict,把做好的模型可以输出语句 model.predict,输入是图,这个图是前面已经做好了训练集和检验集,当然还有一部分可以测试集,可以做预处理,然后把这个图编码给他,就可以得到预测,预测这个网络的输出是什么东西,输出是每个像素它所属的类别,刚才我们类别是取四,也就是四种农作物。每一个像素到底属于哪种动物?

再用for循环,把每个像素用不同的颜色进行着色,着色完以后,再把这个 UNet 最终输出的像素,然后就可以让他秀一下,秀一下的效果就是这个样子,这是实际的这个图,这个是做检测以后的图,当然这个还没有训练的很充分,那么有些地方识别出来了,有些地方还没有识别出来,所以这个还需要优化,需要更多的轮次。需要更多的样本。他需要对这个网络的结构可能还要做一些优化,这样才能够把这个模型拿过去部署。可以看到这样一个例子的思路还是比较明显的,这地方比较强调就是现实中而做这个目标检测,或者说你用这个像 UNet 这样网络做语义分割的时候,或者说在以前讲过的这个卷积神经网络做图像分类的时候,经常会碰到一些问题。

比如说现在这个遇到的领域和预训练的模型,往往的差别比较大,那么这个物体在以前预训练模型里面很少看到,或者说没有,像这样的情况下,直接用这个模型效果就很差的,所以在这个例子里面,其实做了一个改进,在预训练的基础上做迁移学习,又不想在所有轮次的所有的参数都做修正。

但是这个样本和原来预训练的模型差别很大,我们又不能直接调用原来传统的迁移学习的方法直接训练后面几层,所以这地方的做法就是把刚开始的一些少数的轮次的各层的参数在预训练基础上全部梯度下降法,刷一次,更新一次,然后最后一些轮次重点的去训练靠近输出层的这几层,综合了样本比较少,然后又能够利用少样本对这个后续的语义比较丰富的层的做语义学习,这样就可以让他的效果和计算量做一个折中。

image.png

这个就是 UNet 使用过程中的一个典型例子,通过这个例子可以就是琢磨一下实际的项目怎么去把它用好,这里面实际上有很多的问题需要我们解决,也就是说实际问题并不是把别人训练好的模型拿过直接用,需要做一些优化,这个优化除了刚才说的方面,实际上还可以做一些更多的这个创新。

相关文章
|
机器学习/深度学习 传感器 人工智能
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
本文对现有的全景分割方法进行了第一次全面的综述。因此,基于所采用的算法、应用场景和主要目标的性质,对现有全景技术进行了定义良好的分类。此外,还讨论了全景分割在通过伪标记标注新数据集中的应用。接下来,进行消融研究,以从不同角度了解全景方法。此外,还讨论了适用于全景分割的评估指标,并对现有解决方案的性能进行了比较,以了解最新技术并确定其局限性和优势。最后,阐述了当前主题技术面临的挑战以及近期吸引大量关注的未来趋势,这可以作为未来研究的起点。
首篇!最全的全景分割综述(RGB图像/医学图像/LiDAR)(下)
|
5月前
|
机器学习/深度学习 存储 编解码
什么是图像噪声?是如何产生的?图像去噪技术都有哪些?
图像噪声是在图像采集、传输和处理过程中产生的像素值异常现象,主要由光子计数统计、电子偏移和放大器噪声等因素引起。噪声影响图像质量,降低信噪比,使特征难以识别。图像去噪技术包括传统方法(如空间域滤波、频域滤波、图像压缩和超糅合)和基于深度学习的方法(如卷积神经网络、残差网络和生成对抗网络),旨在有效去除噪声,提高图像质量。
|
11月前
|
人工智能 机器人 测试技术
论文介绍:零样本6D物体姿态估计框架SAM-6D,向具身智能更进一步
【5月更文挑战第4天】SAM-6D框架是零样本6D物体姿态估计的突破,能检测并准确估计新物体姿态,推动具身智能发展。该框架结合实例分割和姿态估计模型,实现RGB-D图像中的物体分割与姿态估计。在BOP基准测试中,SAM-6D超越现有方法,展示出色泛化能力,但还需应对光照变化、遮挡等问题,以提升现实环境中的性能。[论文链接](https://arxiv.org/pdf/2311.15707.pdf)
230 13
|
11月前
|
存储 编解码 vr&ar
ICLR 2024:单张图像完成逼真的三维重建
【2月更文挑战第28天】ICLR 2024:单张图像完成逼真的三维重建
309 2
ICLR 2024:单张图像完成逼真的三维重建
|
算法 数据挖掘 计算机视觉
【目标检测】基于稀疏表示的高光谱图像(Matlab代码实现)
【目标检测】基于稀疏表示的高光谱图像(Matlab代码实现)
245 0
|
11月前
|
机器学习/深度学习 编解码 数据可视化
UNet 和 UNet++:医学影像经典分割网络对比
UNet 和 UNet++:医学影像经典分割网络对比
1077 0
|
机器学习/深度学习 传感器 算法
基于监督学习的多模态MRI脑肿瘤分割,使用来自超体素的纹理特征(Matlab代码实现)
基于监督学习的多模态MRI脑肿瘤分割,使用来自超体素的纹理特征(Matlab代码实现)
|
机器学习/深度学习 传感器 算法
【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)
【图像处理】使用各向异性滤波器和分割图像处理从MRI图像检测脑肿瘤(Matlab代码实现)
|
机器学习/深度学习 传感器 编解码
深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等
深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等
深度学习应用篇-计算机视觉-语义分割综述[5]:FCN、SegNet、Deeplab等分割算法、常用二维三维半立体数据集汇总、前景展望等
|
机器学习/深度学习 传感器 算法
【图像去噪】基于图像加噪去噪算法合集附matlab代码
【图像去噪】基于图像加噪去噪算法合集附matlab代码