首页 > 编程知识 正文

结合光流和卷积神经网络的运动分割,图卷积神经网络

时间:2023-05-05 08:39:27 阅读:13594 作者:1168

背景CNN可以对图像进行分类,但如何识别图像中特定部分的物体,到2015年为止一直是世界性的课题。 神经网络大神Jonathan Long宣布《Fully Convolutional Networks for Semantic Segmentation》用图像语义分割挖了一个洞,无数人冲进了洞内。

3358 www.Sina.com/http://www.Sina.com /通常,CNN网络在卷积层之后连接几个全连接层,将卷积层生成的特征图(feature map )固定长度的特征向量以AlexNet为代表的经典CNN结构适用于图像级分类和回归任务。 最终,这是因为AlexNet的ImageNet模型希望输出1000维向量,以表示输入图像属于各级的概率(softmax规范化)。

板栗:下图中的猫,输入AlexNet可以得到长1000的输出向量。 这表示输入图像属于各级的概率,其中“tabby cat”这样的统计概率最高。

FCN通过在像素级别对图像进行分类,解决了语义级别的图像分割问题。 相对于经典CNN在卷积层之后使用在全连通层中获得的固定长度特征向量进行分类(全连通层softmax输出),FCN可以接受任意大小的输入图像,并且在反卷积层中上采样最后卷积层的特征映射

最后,为每个像素计算softmax分类的损耗对应于将训练样本与每个像素相关联。 下图是Longjon用于语义划分的全卷积网络(FCN )的结构示意图。

简而言之,FCN和CNN区域将CNN最后的全部连接层变为辊压层叠,已经输出了水平较好的照片。

其实,CNN的强大之处在于多层结构可以自动学习特征,学习多个层次的特征。 浅卷积层感知域小,学习一些局部区域的特征。 深卷积层具有较大的感知域,可以学习更抽象的特征。 这些抽象特征对物体的大小、位置、方向等的敏感性更低,有助于提高识别性能。 下图中的CNN分类网络示意图:

这些抽象特征有助于分类,可以很好地判断一幅图像中包含什么类型的物体,但由于物体细节的丢失,无法很好地显示物体的具体轮廓,也无法指出各像素具体属于哪个物体,从而进行准确的分割

33558www.Sina.com/:1:为了对一个像素进行分类,将该像素周围的一个图像块作为CNN的输入用于训练和预测。 这种方法有几个缺点。 一是存储开销很大。 例如,由于将每个像素所使用的图像块的大小设定为15x15,一个接一个地滑动窗口,按照滑动窗口判别和分类CNN,所以所需的存储区域随着窗口被滑动的次数和大小而急剧上升。 二是计算效率低。 相邻的像素块基本上是重叠的,并且计算用于每个像素块的卷积的计算也显着重叠。 第三,感知区域的大小受像素块大小的限制。 通常,像素块的大小明显小于整个图像的大小,并且只能提取局部特征,这限制了分类的性能。

另一方面,全卷积网络(FCN )从抽象的特征中恢复每个像素所属的类别。 也就是说,从图像级分类进一步扩展到像素级分类。

全卷积网络 Fully Convolutional Networks全连通层和卷积层之间的唯一区别在于,卷积层中的神经元仅连接到输入数据中的一个局部区域,而卷积列中的神经元共享参数。 但是,在这两种层中,神经元都计算点积,所以函数的形状是一样的。 因此,能够将这两者相互转换:

对于任何卷积层,都存在能够实现与其同样的前向传播函数的所有连接层。 权重矩阵是一个巨大的矩阵,除特定块外,其馀部分为零。 在大多数块中,元素是相同的。

相反,所有连接层可以转换为卷积层。 例如,在K=4096的整个连接层中,整个输入数据的大小为77512,该整个连接层可以等价于F=7、P=0、S=1和K=4096的卷积层。 即,使滤波器的尺寸与输入数据主体的尺寸一致。 输出为114096,因为只有一个独立深度的列覆盖输入数据体并滑动。 此结果与使用第一个全连接层相同。

33558www.Sina.com/:2:在两个变换中,将所有连接层变换为卷积层在实际应用中更有用。 假设卷积神经网络的输入是224x224x3图像,卷积层和下采样层将图像数据转换为7x7x512大小的激活数据介质。 AlexNet使用两个大小为4096的所有连接层,最后一个具有1000个神经元的所有连接层用于计算分类分数。 可以将这三个全连接层之一转换为卷积层。

过滤第一个连接区域为[7x7x512]的所有连接层

波器尺寸为F=7,这样输出数据体就为[1x1x4096]了。针对第二个全连接层,令其滤波器尺寸为F=1,这样输出数据体为[1x1x4096]。对最后一个全连接层也做类似的,令其F=1,最终输出为[1x1x1000]

实际操作中,每次这样的变换都需要把全连接层的权重W重塑成卷积层的滤波器。那么这样的转化有什么作用呢?它在下面的情况下可以更高效:让卷积网络在一张更大的输入图片上滑动,得到多个输出,这样的转化可以让我们在单个向前传播的过程中完成上述的操作。

举个栗子:如果我们想让224×224尺寸的浮窗,以步长为32在384×384的图片上滑动,把每个经停的位置都带入卷积网络,最后得到6×6个位置的类别得分。上述的把全连接层转换成卷积层的做法会更简便。如果224×224的输入图片经过卷积层和下采样层之后得到了[7x7x512]的数组,那么,384×384的大图片直接经过同样的卷积层和下采样层之后会得到[12x12x512]的数组。然后再经过上面由3个全连接层转化得到的3个卷积层,最终得到[6x6x1000]的输出((12 – 7)/1 + 1 = 6)。这个结果正是浮窗在原图经停的6×6个位置的得分!

面对384×384的图像,让(含全连接层)的初始卷积神经网络以32像素的步长独立对图像中的224×224块进行多次评价,其效果和使用把全连接层变换为卷积层后的卷积神经网络进行一次前向传播是一样的。

Evaluating the original ConvNet (with FC layers) independently across 224x224 crops of the 384x384 image in strides of 32 pixels gives an identical result to forwarding the converted ConvNet one time.

如下图所示,FCN将传统CNN中的全连接层转化成卷积层,对应CNN网络FCN把最后三层全连接层转换成为三层卷积层。在传统的CNN结构中,前5层是卷积层,第6层和第7层分别是一个长度为4096的一维向量,第8层是长度为1000的一维向量,分别对应1000个不同类别的概率。FCN将这3层表示为卷积层,卷积核的大小 (通道数,宽,高) 分别为 (4096,1,1)、(4096,1,1)、(1000,1,1)。看上去数字上并没有什么差别,但是卷积跟全连接是不一样的概念和计算过程,使用的是之前CNN已经训练好的权值和偏置,但是不一样的在于权值和偏置是有自己的范围,属于自己的一个卷积核。因此FCN网络中所有的层都是卷积层,故称为全卷积网络。

下图是一个全卷积层,与上图不一样的是图像对应的大小下标,CNN中输入的图像大小是同意固定resize成 227x227 大小的图像,第一层pooling后为55x55,第二层pooling后图像大小为27x27,第五层pooling后的图像大小为13*13。而FCN输入的图像是H*W大小,第一层pooling后变为原图大小的1/4,第二层变为原图大小的1/8,第五层变为原图大小的1/16,第八层变为原图大小的1/32(勘误:其实真正代码当中第一层是1/2,以此类推)。

经过多次卷积和pooling以后,得到的图像越来越小,分辨率越来越低。其中图像到 H/32∗W/32 的时候图片是最小的一层时,所产生图叫做heatmap热图,热图就是我们最重要的高维特征图,得到高维特征的heatmap之后就是最重要的一步也是最后的一步对原图像进行upsampling,把图像进行放大、放大、放大,到原图像的大小。

最后的输出是1000张heatmap经过upsampling变为原图大小的图片,为了对每个像素进行分类预测label成最后已经进行语义分割的图像,这里有一个小trick,就是最后通过逐个像素地求其在1000张图像该像素位置的最大数值描述(概率)作为该像素的分类。因此产生了一张已经分类好的图片,如下图右侧有狗狗和猫猫的图。

upsampling

相较于使用被转化前的原始卷积神经网络对所有36个位置进行迭代计算,使用转化后的卷积神经网络进行一次前向传播计算要高效得多,因为36次计算都在共享计算资源。这一技巧在实践中经常使用,一次来获得更好的结果。比如,通常将一张图像尺寸变得更大,然后使用变换后的卷积神经网络来对空间上很多不同位置进行评价得到分类评分,然后在求这些分值的平均值。

最后,如果我们想用步长小于32的浮窗怎么办?用多次的向前传播就可以解决。比如我们想用步长为16的浮窗。那么先使用原图在转化后的卷积网络执行向前传播,然后分别沿宽度,沿高度,最后同时沿宽度和高度,把原始图片分别平移16个像素,然后把这些平移之后的图分别带入卷积网络。

如下图所示,当图片在网络中经过处理后变成越小的图片,其特征也越明显,就像图像中颜色所示,当然啦,最后一层的图片不再是一个1个像素的图片,而是原图像 H/32xW/32 大小的图,这里为了简化而画成一个像素而已。

如下图所示,对原图像进行卷积conv1、pool1后原图像缩小为1/2;之后对图像进行第二次conv2、pool2后图像缩小为1/4;接着继续对图像进行第三次卷积操作conv3、pool3缩小为原图像的1/8,此时保留pool3的featureMap;接着继续对图像进行第四次卷积操作conv4、pool4,缩小为原图像的1/16,保留pool4的featureMap;最后对图像进行第五次卷积操作conv5、pool5,缩小为原图像的1/32,然后把原来CNN操作中的全连接变成卷积操作conv6、conv7,图像的featureMap数量改变但是图像大小依然为原图的1/32,此时图像不再叫featureMap而是叫heatMap。

现在我们有1/32尺寸的heatMap,1/16尺寸的featureMap和1/8尺寸的featureMap,1/32尺寸的heatMap进行upsampling操作之后,因为这样的操作还原的图片仅仅是conv5中的卷积核中的特征,限于精度问题不能够很好地还原图像当中的特征,因此在这里向前迭代。把conv4中的卷积核对上一次upsampling之后的图进行反卷积补充细节(相当于一个差值过程),最后把conv3中的卷积核对刚才upsampling之后的图像进行再次反卷积补充细节,最后就完成了整个图像的还原。

缺点

在这里我们要注意的是FCN的缺点:

是得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。

是对各个像素进行分类,没有充分考虑像素与像素之间的关系。忽略了在通常的基于像素分类的分割方法中使用的空间规整(spatial regularization)步骤,缺乏空间一致性。

实践

输入的图片是:

现在可以直接来点代码吗?

# import packageimport numpy as npfrom PIL import Imageimport caffe# 初始化地址caffe_root = 'fcn.berkeleyvision.org-master/voc-fcn8s/'model_def = caffe_root + 'deploy.prototxt' # 模型文件model_weights = caffe_root + 'fcn8s-heavy-pascal.caffemodel' #模型权重值test_image = 'images/2007_000129.jpg' #测试图片# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffeim = Image.open(test_image)in_ = np.array(im, dtype=np.float32)in_ = in_[:,:,::-1] # change RGB image to BGR imagein_ -= np.array((104.00698793,116.66876762,122.67891434))in_ = in_.transpose((2,0,1)) # Reshape the image from (500, 334, 3) to (3, 500, 334)net = caffe.Net(model_def, model_weights, caffe.TEST) #导入模型net.blobs['data'].reshape(1, *in_.shape) net.blobs['data'].data[...] = in_ #读入图像net.forward() #图片进入前馈卷积神经网络out = net.blobs['score'].data[0].argmax(axis=0) #最后得到的图片print net.blobs['score'].data[0].shape #(21, 500, 334) print net.blobs['score'].data[0].argmax(axis=0)

好了,已经用fcn模型训练网一张图片了,接着就是要看看图片到底是怎么样的楽

import matplotlib.pyplot as plt# display plots in this notebook%matplotlib inline# set display defaultsprint out.shapeplt.imshow(out)

输出是:

现在做图片分割的都是基于FCN的升级版、FCN超级升级版,FCN改版、FCN超级改版。。。个人觉得最难的、也是个人正在学习的是从如何研究自己的样本,什么样的样本集才能提高最后结果的精度和召回率;有了样本然后怎么给CNN训练,训练后如何把CNN->FCN,然后到FCN能够对新的数据进行分割。整套流程能够自动化下来就更加perfect了。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。