Caffe配置:Ubuntu_16.04+CUDA_9.0+CUDNN_7+Anaconda_3+OpenCV_3
配置
配置Caffe绕来绕去也走了好多的路,这里分享自己的一些经验。
主要流程参照这篇博客https://blog.csdn.net/weixin_40824648/article/details/80265943。博主已经写的很详细了。我的配置流程基本仿照这篇博客来。CUDA、CUDNN、Anaconda安装都不会遇到什么太大的问题,OpenCV直接编译源码遇到了一些问题,所以我这里是直接通过Anaconda安装的OpenCV,而不是直接编译源文件。
安装流程的主要问题还是在编译Caffe上面,具体会遇到许多的奇怪的错误。在这里,分享我的一个经验,当遇到错误时,要保持冷静,首先得看懂报错是什么意思,在哪一个流程出现错误,再进行分析可能是哪里错误了,这样不管是自己解决还是网上搜索都有条理有思路,而不是一股脑复制粘贴错误去Google,这样往往会很盲目。
这里分享一下Makefile.config和Makefile两个文件修改内容。如果有需要文件,可以向我联系。在配置路径时,以你具体安装的Anaconda的路径为准。配置后,当import caffe后,会出现no module name caffe的错误,这个错误的解决通过增加系统变量;在.py文件下增加caffe相关路径即可解决(可参照下面的例子)。
1.Makefile.config
(1)取消以下注释
USE_CUDNN := 1
OPENCV_VERSION := 3
WITH_PYTHON_LAYER := 1
(2)修改CUDA结构设置
(3)Python有关目录修改为
(4)最后修改INCLUDE_DIRS,LIBRARY_DIRS
2.Makefile
(1)搜索NVGGFLAGS,修改如下
(2)继续搜索NVGGFLAGS
将NVCCFLAGS +=-ccbin=$(CXX) -Xcompiler-fPIC $(COMMON_FLAGS)
替换为:
NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
(3)在第181行修改LIBRARIES为
LIBRARIES += glog gflags protobuf boost_system boost_filesystem m hdf5_hl hdf5 opencv_core opencv_imgproc opencv_imgcodecs opencv_highgui
一个例子
虽然照着步骤一步一步来,但是仍然会遇到许多的错误,这时就需要开动你的小脑瓜了。安装Caffe后,当然要试验一下,这里用官网提供的第一个例子,作为试验。这里分享一下代码。
-
import numpy as np
-
import matplotlib.pyplot as plt
-
import matplotlib.image as mpimg
-
#append the caffe path,you can append your path
-
import sys
-
sys.path.append("/home/oliver/caffe/python")
-
import caffe
-
caffe_root = "/home/oliver/caffe/"
-
#choose cpu mode
-
caffe.set_mode_cpu()
-
model_def = caffe_root + "models/bvlc_reference_caffenet/deploy.prototxt"
-
model_weights = caffe_root + "models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel"
-
net = caffe.Net(model_def,model_weights,caffe.TEST)
-
mu = np.load(caffe_root + "python/caffe/imagenet/ilsvrc_2012_mean.npy")
-
mu = mu.mean(1).mean(1)
-
#print("mean-subtracted values:",zip("BGR",mu))
-
transformer = caffe.io.Transformer({"data" : net.blobs["data"].data.shape})
-
transformer.set_transpose("data",(2,0,1))
-
transformer.set_mean("data", mu)
-
transformer.set_raw_scale("data", 255)
-
transformer.set_channel_swap("data", (2,1,0))
-
#net.blobs["data"].reshape(50,3,227,227)
-
#This cat's name is flower,hahaha
-
image = caffe.io.load_image(caffe_root + "examples/images/flower.jpg")
-
transformed_image = transformer.preprocess("data", image)
-
net.blobs["data"].data[...] = transformed_image
-
output = net.forward()
-
output_prob = output["prob"][0]
-
print("Predicted class is :",output_prob.argmax())
-
labels_file = caffe_root + "data/ilsvrc12/synset_words.txt"
-
labels = np.loadtxt(labels_file,str,delimiter="\t")
-
print("Output label:",labels[output_prob.argmax()])
-
top_inds = output_prob.argsort()[::-1][:5]
-
#print("probabilities and labels:",zip(output_prob[top_inds],labels[top_inds]))
-
for each in zip(output_prob[top_inds],labels[top_inds]):
-
print(each)
-
plt.imshow(image)
-
plt.show()
看看结果是怎么样。
感觉分类还凑合吧。
至此,Caffe已经成功编译安装了。