微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 全卷积网络FCN进行图像分割

全卷积网络FCN进行图像分割

时间:02-17 来源:网络整理 点击:

片,其特征也越明显,就像图像中颜色所示,当然啦,最后一层的图片不再是一个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的缺点:
1、是得到的结果还是不够精细。进行8倍上采样虽然比32倍的效果好了很多,但是上采样的结果还是比较模糊和平滑,对图像中的细节不敏感。

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

实践

输入的图片是:

现在可以直接来点代码吗?
# import package
import numpy as np
from PIL import Image
import 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 Caffe
im = Image.open(test_image)
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1] # change RGB image to BGR image
in_ -= 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 defaults

print out.shape
plt.imshow(out)

输出是:

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

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top