caffe随记(九)---利用FCN和已有的model进行图像语义分割

1、下载caffemodel

本例中我们使用的是pascalcontext-fcn32的模型,这个下载链接在它的文件夹里有,就是url那个文件

下载  pascalcontext-fcn32s-heavy.caffemodel 这个文件

2、增加python的路径

本次我使用的方法是 vim ~/.bashrc

在最后一行添加python路径,如下图,请根据自己的路径修改路径

3、创建deploy.prototxt

因为32s文件夹中是没有这个deploy.prototxt文件的。而我们一会儿要用到,所以我们可以根据train或者val来稍加修改即可。

比如把train.prototxt的data layer进行修改

我把我的变形金刚输入法一不小心截图截上了…………

直接 cp ./train.prototxt  ./deploy.prototxt

然后 vim deploy.prototxt进行修改,如下所示:

更改之后的数据层如我上面的截图所示

4、修改infer.py

其实我们主要就是用这个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 于当前目录下

5、进行分割

直接在当前目录下 输入命令: 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

6、把图片copy到我的电脑上:

scp  Teeyo@192.168.0.106:~/caffe/models/fcn.berkeleyvision.org/pascalcontext-fcn32s/test.png  ./博文

再输个服务器密码就copy过来了,详细用法请百度linux语言 scp

结果如图所示,虽然我还没有想通该怎么涂上彩色,但是好歹FCN进行语义分割咱们是走了一趟了

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏生信宝典

Linux学习-文件列太多,很难识别想要的信息在哪列;别焦急,看这里。

经常会碰到列数特别多的文件,而屏幕又不足以放下这么多列;即便能放下,也不容易清晰的辨别出想提取的信息在第几列。 根据我们前面的学习,可以用一行命令或简单的写一...

19210
来自专栏中国白客联盟

识别验证码继续爆破后台(三)

有的时候,并不是说所有验证码用api或者tesseract都可以正确识别出来的,还是需要经过相关训练,让tesseract知道你想让它识别出来的验证码。

924
来自专栏TensorFlow从0到N

TensorFlow从0到1 - 1 - Hello, TensorFlow!

在学习任何新的编程语言时,我们都会在第一时间完成Hello World,以宣告自己开发环境的完美搭建。TensorFlow也不例外。TensorFlow充分考...

3173
来自专栏量子位

刷paper利器!不想打开PDF,这个插件自动帮你转到介绍页

你们刷paper的时候,是愿意直接打开PDF,还是想先打开介绍页看看摘要呢? 量子位更喜欢介绍页,一是因为这个页面经常包含更多有用的信息,比如开源代码地址、投了...

2594
来自专栏实战docker

根据java代码生成UML图

这里介绍一个简单易用的eclipse插件ModelGoon,用来对已有代码生成UML图,下面以之前文章中的spring mvc工程为例如何安装和使用这个插件; ...

2966
来自专栏人工智能LeadAI

配置深度学习主机与环境(TensorFlow+1080Ti) | 第四章 基于Anaconda的TensorFlow安装

配置深度学习主机与环境(TensorFlow+1080Ti): 01 概念介绍 Anaconda Anaconda(https://www.continuu...

3665
来自专栏计算机视觉life

OpenCV学习入门(二):Image Watch神器

Image Watch是在visual studio 2012及以上版本上使用的一款OpenCV工具,能够在调试过程中实时显示内存中矩阵Mat(存放图像,数组等...

1815
来自专栏软件开发 -- 分享 互助 成长

网络号和主机号的计算

因为想要学习网络号和主机号的计算需要先知道其IP地址和子网掩码,所以这篇博客的学习是以上一篇IP地址分类及私网IP为基础的。 具体为: 网络号=IP地址&子网掩...

1656
来自专栏DeveWork

WordPress 中强制设置 特色图像 才能发表文章

在开发WordPress 主题的时候,为了丰富网页,常常使用到特色图像功能;这就要求主题使用者为每篇文章都要设置个特色图像,但总有一些用户不会乖乖按要求做;如此...

1856
来自专栏Small Code

使用 tree 命令格式化输出目录结构

今天在写一个 Markdown 文件的时候需要将一个目录的结构表示出来,于是找了找有没有相关命令,找到一个叫做 tree 的命令,Windows 和 Linux...

2338

扫码关注云+社区