1. 程式人生 > >Caffe編譯安裝:Ubuntu_16.04+CUDA_9.0+CUDNN_7+Anaconda_3+OpenCV_3

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已經成功編譯安裝了。