全卷积网络FCN进行图像分割
片,其特征也越明显,就像图像中颜色所示,当然啦,最后一层的图片不再是一个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了。
- 如何使用FPGA加速机器学习算法?(04-26)
- Z1上搭建二值神经网络(BNN)(03-06)
- LT3751如何使高压电容器充电变得简单(08-12)
- 三路输出LED驱动器可驱动共阳极LED串(08-17)
- 浪涌抑制器IC简化了危险环境中电子设备的本质安全势垒设计(08-19)
- 严酷的汽车环境要求高性能电源转换(08-17)