本文目录
问题出现
最近在windows7上利用pycaffe的draw_net.py
进行.prototxt
网络结构配置文件的绘图,结果出现了如下错误:
InvocationException: GraphViz’s executables not found
经过各种google,总算找到了解决办法,原来,GraphViz是一个软件(好吧,请原来我的无知),可以下载安装,我这里之所以出现这个错误,可能是两个原因导致的
- 电脑没有安装GraphViz
- 电脑安装了GraphViz,但是,并没有将它的
bin
目录加入到环境变量PATH
中,所以,其他应用程序无法找到它
仔细想想,自己之前好像确实没有安装过它,所以,果断判断为是第一个原因,下面开始安装GraphViz
下面这段话引用Stackoverflow网站关于该问题的一个回答,本文的解决方案主要来自于它
安装Graphviz
下载Graphviz
下载地址:graphviz官网
进入下载页,找到Download
点击Download,在弹出的下载页中找到windows的下载链接,并点击
在弹出的windows版本下载界面中选择需要下载的版本,这里我选择了.zip文件
解压缩文件
- 文件下载完成后,将它解压到某一路径下,例如,我将它解压到了
D:\software\caffe-vs\graphviz-2.38
,下图展示了解压后的文件结构,可以看到,解压后的文件中只包含一个Release文件夹
添加环境变量
- 将刚刚解压缩得到的文件夹下的Release下的bin文件夹路径添加到系统的环境变量
PATH
中,这样,其他程序便可以找到graphviz了 - 例如,按照上面的解压缩路径,需要将路径:
D:\software\caffe-vs\graphviz-2.38\release\bin
添加到环境变量PATH
中
重启python IDE
完成上述所有操作后,重启python IDE,发现draw_net.py
终于可以使用了!
注:下面是’draw_net.py’的代码,来自于’caffe/python/draw_net.py’
使用方法:
- ‘draw_net.py’使用方法(在cmd中输入如下命令)
python /caffe_root/python/draw_net.py file.prototxt file.jpg
- ‘draw_net.py’代码
#!/usr/bin/env python
"""
Draw a graph of the net architecture.
"""
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
from google.protobuf import text_format
import caffe
import caffe.draw
from caffe.proto import caffe_pb2
def parse_args():
"""Parse input arguments
"""
parser = ArgumentParser(description=__doc__,
formatter_class=ArgumentDefaultsHelpFormatter)
parser.add_argument('input_net_proto_file',
help='Input network prototxt file')
parser.add_argument('output_image_file',
help='Output image file')
parser.add_argument('--rankdir',
help=('One of TB (top-bottom, i.e., vertical), '
'RL (right-left, i.e., horizontal), or another '
'valid dot option; see '
'http://www.graphviz.org/doc/info/'
'attrs.html#k:rankdir'),
default='LR')
args = parser.parse_args()
return args
def main():
args = parse_args()
net = caffe_pb2.NetParameter()
text_format.Merge(open(args.input_net_proto_file).read(), net)
print('Drawing net to %s' % args.output_image_file)
caffe.draw.draw_net_to_file(net, args.output_image_file, args.rankdir)
if __name__ == '__main__':
main()