本例中我们使用的是pascalcontext-fcn32的模型,这个下载链接在它的文件夹里有,就是url那个文件
下载 pascalcontext-fcn32s-heavy.caffemodel 这个文件
本次我使用的方法是 vim ~/.bashrc
在最后一行添加python路径,如下图,请根据自己的路径修改路径
因为32s文件夹中是没有这个deploy.prototxt文件的。而我们一会儿要用到,所以我们可以根据train或者val来稍加修改即可。
比如把train.prototxt的data layer进行修改
我把我的变形金刚输入法一不小心截图截上了…………
直接 cp ./train.prototxt ./deploy.prototxt
然后 vim deploy.prototxt进行修改,如下所示:
更改之后的数据层如我上面的截图所示
其实我们主要就是用这个infer.py文件进行分割的,为了避免我把原始的infer.py改动,我就复制了一个到fcn32s这个文件夹中,这样无论我怎么改都不会破坏原始的文件 了
我们先来看看原始的文件的内容:
import numpy as np
from PIL import Image
import caffe
# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
im = Image.open('pascal/VOC2010/JPEGImages/2007_000129.jpg') //这个就是我们输入文件的路径,一会儿应该进行修改
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1]
in_ -= np.array((104.00698793,116.66876762,122.67891434))
in_ = in_.transpose((2,0,1))
# load net
net = caffe.Net('voc-fcn8s/deploy.prototxt', 'voc-fcn8s/fcn8s-heavy-pascal.caffemodel', caffe.TEST) //这里是我们需要用到的网络模型和caffemodel,也要改
# shape for input (data blob is N x C x H x W), set data
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_
# run net and take argmax for prediction
net.forward()
out = net.blobs['score'].data[0].argmax(axis=0)
要注意我是把infer.py复制了一个到fcn32s文件夹中的,所以你们的路径要根据自己的路径来设置合适。
而且我也把待分割图片放入了fcn32s文件夹中了。
修改之后如下所示:
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt //加了一行这个
import caffe
# load image, switch to BGR, subtract mean, and make dims C x H x W for Caffe
im = Image.open('71.jpg') //我已经把一个名为71.jpg的图像文件放进了我的当前fcn32s的目录下
in_ = np.array(im, dtype=np.float32)
in_ = in_[:,:,::-1]
in_ -= np.array((104.00698793,116.66876762,122.67891434))
in_ = in_.transpose((2,0,1))
# load net
net = caffe.Net('./deploy.prototxt', './pascalcontext-fcn32s-heavy.caffemodel', caffe.TEST) //然后也是把deploy和caffemodel准备好了
# shape for input (data blob is N x C x H x W), set data
net.blobs['data'].reshape(1, *in_.shape)
net.blobs['data'].data[...] = in_
# run net and take argmax for prediction
net.forward()
out = net.blobs['score'].data[0].argmax(axis=0)
plt.imshow(out,cmap='gray') //这三行都是我新加的,是处理分割后的图片
plt.axis('off') //
plt.savefig('test.png') //图片存为test.png 于当前目录下
直接在当前目录下 输入命令: python infer.py
然后发现报错了……错误如下所示:
QXcbConnection: Could not connect to display
然后搜了很久发现这个网页的办法成功解决了我们的问题:
https://www.douban.com/note/612063589/
也就是把最前面的几行做一下修改,结合我们的工程,我的修改如下:
import numpy as np
from PIL import Image
import matplotlib //就是增加了这两行
matplotlib.use('Agg') //就是增加了这两行
import matplotlib.pyplot as plt
import caffe
执行 python infer.py
最后得出一个 test.png
scp [email protected]:~/caffe/models/fcn.berkeleyvision.org/pascalcontext-fcn32s/test.png ./博文
再输个服务器密码就copy过来了,详细用法请百度linux语言 scp
结果如图所示,虽然我还没有想通该怎么涂上彩色,但是好歹FCN进行语义分割咱们是走了一趟了
有什么问题欢迎在评论区讨论~