最近在研究caffe,前前後後差不多快一週了,論文看得比較少,直接上手來做的,期間遇到無數問題,大大小小的無數問題,不過通過上網,看別人的博客,幾乎踩了很多大坑,這裏給大家總結一下,希望後續同樣做深度學習的小夥伴能夠少踩點坑。在這裏,我就不做重複功了,具體的配置還有改動的地方我會引用別人的博客,然後補充說明這些博客介紹得並不全面的地方。
備註:以下內容會不定期更新,該篇博客主要對安裝caffe使用faster-rcnn中出現的問題進行分享,配置還有使用部分引用網上其它博客。
文件下載地址:鏈接:http://pan.baidu.com/s/1qYnjZCo 密碼:g7bo
實驗目的:實驗室最近要開始做深度學習,配置了一臺K80服務器,按現在的水平顯卡性能屬於中等偏上,不過做做實驗應該是夠了。最初打算先實現個最簡單的目標檢測,即人臉檢測,目的很簡單,就是輸入一張圖片,判斷有沒有人臉,並且把人臉部分用box給框出來。
實驗工具:caffe框架
faster-rcnn
主要語言:C++, Python
實驗步驟:
一、caffe框架的配置
這裏給出rbg大神在github上的地址:https://github.com/rbgirshick/py-faster-rcnn
這裏要注意,caffe的框架一定要使用rbg大神github上的版本,不建議使用伯克利大學維護的那一份caffe的代碼,具體的原因主要是,使用faster-rcnn方法的這個版本的caffe比較老,現在官方維護的那個版本改動了一些部分,而且rbg大神使用了Python layer來定義了caffe中的數據層(data layer),所以在編譯的時候需要將Python layer打開,這個之後會講到。按道理,config文件修改合理的話肯定不會出問題的,不過建議還是使用大神的版本,比較省事。
rbg大神的caffe配置參考這篇博客,http://www.cnblogs.com/louyihang-loves-baiyan/p/4885659.html#3573006
上面這是一篇fast-rcnn的配置博客,實在抱歉,前幾天我還找到一份faster-rcnn坑比較少的配置博客,今天怎麼翻都找不到了,這一篇雖然是fast-rcnn的配置博客,不過我剛剛仔細看了下,配置過程是同樣的,而且作者寫得很用心,可以避免不少彎路。
大概流程就是先到py-faster-rcnn-master文件下的caffe-fast-rcnn(可以再壞境變量中修改爲$FRCNN_CAFFE),修改config文件,將博客中提到的地方都取消註釋,然後到py-faster-rcnn-master文件夾(環境變量中命名爲$FRCNN_ROOT)中的lib文件夾中,執行
cd $FRCN_ROOT/lib
make
這裏需要注意下,確保你的Linux gcc的版本爲最新版,因爲版本比較老的話,編譯有個部分會出錯中斷。
接下來就是到$FRCNN_CAFFE中編譯caffe和pycaffe,執行命令
cd $FRCNN_CAFFE
make -j8 && make pycaffe
暫時想不到別的會出錯的地方,如果大家出現什麼問題,可以再下面留言告訴我,我能解決的一定儘快解決。
至此,caffe框架的配置算是完成了。
二、運行faster-rcnn的demo
完成了配置以後,爲了驗證是否正確安裝,可以到$FRCNN_ROOT的tools文件夾中,對demo.py文件進行執行:
./demo.py
這裏如果機器配置合適的話,就直接默認執行就好,因爲默認執行以後使用的是大型網絡vgg16,其他的參數主要爲:
def parse_args():
"""Parse input arguments."""
parser = argparse.ArgumentParser(description='Faster R-CNN demo')
parser.add_argument('--gpu', dest='gpu_id', help='GPU device id to use [0]',
default=0, type=int)
parser.add_argument('--cpu', dest='cpu_mode',
help='Use CPU mode (overrides --gpu)',
action='store_true')
parser.add_argument('--net', dest='demo_net', help='Network to use [vgg16]',
choices=NETS.keys(), default='vgg16')
args = parser.parse_args()
return args
這個函數大家可以看到,能夠傳入示例腳本的有--gpu 這裏選擇使用哪一塊gpu,默認是0,傳入的參數是數字,也就是說,不能使用-a來制定使用所有的gpu核來進行訓練;--net參數,選擇你要使用的是哪一個網絡,網絡的腳本dict如下:
NETS = {'vgg16': ('VGG16',
'VGG16_faster_rcnn_final.caffemodel'),
'zf': ('ZF',
'ZF_faster_rcnn_final.caffemodel')}
這裏提供一個格式,後面進行預測的時候可以去定製。
至此執行以後一般不會不會成功,應該說一定不會成功,還有faster-rcnn的caffemodel和prototxt文件還沒有下載,在$FRCNN_ROOT的data/script中有腳本,打開fetch_faster_rcnn_models.sh文件,按照上面引用博客裏面的方法,拿到鏈接地址以後使用下載工具去下載,這樣速度會快很多,prototxt文件在$FRCNN_ROOT的model中已經有文件存在了,到時候注意路徑選擇合適的文件就好了。(需要下載的文件已經放到網盤,大家可以下載)
至此,執行demo的示例步驟也結束了。
三、使用示例腳本對官方數據進行訓練
在$FRCNN_ROOT的experiments/script中有腳本可以使用,名字爲:faster_rcnn_end2end.sh,腳本里面需要下載的的數據集爲VOC2007,在上面提供的雲盤地址中有資源存在了,可供下載。將數據集可以下載到自己的硬盤裏面,然後把掛載的硬盤路徑通過軟鏈接鏈接到$FRCNN_ROOT的data/路徑中,這樣暫時在數據集上沒有問題了。
腳本中提供的路徑都不是正常的路徑,需要將全局變量添加進去,比如這一句:
LOG="experiments/logs/faster_rcnn_end2end_${NET}_${EXTRA_ARGS_SLUG}.txt.`date +'%Y-%m-%d_%H-%M-%S'`"
系統中是不存在這個地址路徑的,需要在前面加上$FRCNN_ROOT,即爲:
LOG="$FRCNN_ROOT/experiments/logs/faster_rcnn_end2end_${NET}_${EXTRA_ARGS_SLUG}.txt.`date +'%Y-%m-%d_%H-%M-%S'`"
其他地方也是類似,也可以在前面加上../../ 使用相對路徑來完成。
未完待續。。。。。