王權富貴:faster_rcnn在Linux伺服器上(無介面)編譯
環境:
CPU: I7
GPU: GTX1070 計算能力: 6.1 裝置ID: 0
參考:
https://blog.csdn.net/hitzijiyingcai/article/details/81914200
特別謝謝這篇作者大大。謝謝
程式碼的話還是推薦下載這個版本的,不是論文上的那個,論文的可能太老了。
https://github.com/saizhang12/Faster-RCNN_TF
一、執行demo
1.下載程式碼
這裡的程式碼是Python2.7,TensorFlow1.8.1的才能跑
git clone --recursive https://github.com/smallcorgi/Faster-RCNN_TF.git
這裡的程式碼是Python2.7,TensorFlow1.10.1的實測能跑(我就是用這個程式碼)
git clone --recursive https://github.com/saizhang12/Faster-RCNN_TF
電腦手動下載,上傳到伺服器-----具體教程:https://blog.csdn.net/a1103688841/article/details/84113046
我使用的是WinSCP進行上傳:
結果:
2.進入根目錄建立兩個資料夾放檔案
cd Faster-RCNN_TF-master/
在下載了整個資料夾之後,要自己手動新建幾個資料夾,否則後面會報錯,一個是在根目錄下新建一個output資料夾,另一個是在experiments資料夾下新建一個logs資料夾。
mkdir output
cd experiments/
mkdir logs
cd ..
3.建立cyphon模組
在下載的Faster RCNN的lib目錄下make
1.先檢視當前根路徑
pwd
結果如下圖:
2.接下來進行在lib目錄下的make
FRCN_ROOT=/root/faster_rcnn/Faster-RCNN_TF-master/ cd $FRCN_ROOT/lib make
4.下載預訓練模型
在這裡提供一個百度雲下載地址: 連結:https://pan.baidu.com/s/1zNWzMxBwQ6qVoXXvN89Peg 密碼:0rtb
下載完成之後,在tools資料夾下新建一個名稱為model的資料夾,把下載好的模型放進去
cd $FRCN_ROOT/tools/
mkdir model
使用的是WinSCP上傳 VGGnet_fast_rcnn_iter_70000.ckpt 檔案
cd $FRCN_ROOT/
5.執行demo
這邊有幾個錯誤必須先改否者會報錯。
1、g++: error: roi_pooling_op.cu.o: No such file or directory 需要(1)(2)小點
5.make.sh: line 14: nvcc: command not found 只需要(1)小點
解決:Setting the following should make it work (it worked at least for me)
(1) export PATH=$PATH:/usr/local/cuda-8.0/bin/ (or your corresponding cuda path) for your terminal
這裡有一個小坑就是我的cuda的版本是9.0所以使cuda-9.0
所以應該寫:export PATH=$PATH:/usr/local/cuda-9.0/bin/
(2) In make.sh file inside lib directory, do CXXFLAGS='-D_MWAITXINTRIN_H_INCLUDED' (改lib下的make.sh)
3、ensorflow.python.framework.errors.NotFoundError: /home/Projects/Faster-RCNN_TF/tools/../lib/roi_pooling_layer/roi_pooling.so: undefined symbol: _ZN10tensorflow7strings6StrCatB5cxx11ERKNS0_8AlphaNumE
解決: revise the CUDA_PATH and add -D_GLIBCXX_USE_CXX11_ABI=0 in /lib/make.sh
update as:
g++ -std=c++11 -shared -o roi_pooling.so roi_pooling_op.cc -D_GLIBCXX_USE_CXX11_ABI=0 \
roi_pooling_op.cu.o -I $TF_INC -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS \
-lcudart -L $CUDA_PATH/lib64
2.這裡還會報錯no display name and no $DISPLAY environment variable
參考:https://blog.csdn.net/a1103688841/article/details/84113062
4.TensorFlow的版本錯誤。這時候要返回第一步看一下是不是下載錯誤了
錯誤參考
https://github.com/smallcorgi/Faster-RCNN_TF/issues/316
I have encountered the Nontype error when I run demo and train. I do exactly the same thing in Readme. Can anybody help me solve this problem?
Tensor("data:0", shape=(?, ?, ?, 3), dtype=float32)
Tensor("conv5_3/Relu:0", shape=(?, ?, ?, 512), dtype=float32)
Tensor("rpn_conv/3x3/Relu:0", shape=(?, ?, ?, 512), dtype=float32)
Tensor("rpn_conv/3x3/Relu:0", shape=(?, ?, ?, 512), dtype=float32)
Tensor("rpn_cls_score/BiasAdd:0", shape=(?, ?, ?, 18), dtype=float32)
Tensor("gt_boxes:0", shape=(?, 5), dtype=float32)
Tensor("gt_ishard:0", shape=(?,), dtype=int32)
Tensor("dontcare_areas:0", shape=(?, 4), dtype=float32)
Tensor("im_info:0", shape=(?, 3), dtype=float32)
Tensor("rpn_cls_score/BiasAdd:0", shape=(?, ?, ?, 18), dtype=float32)
Tensor("rpn_cls_prob:0", shape=(?, ?, ?, ?), dtype=float32)
Tensor("Reshape_2:0", shape=(?, ?, ?, 18), dtype=float32)
Tensor("rpn_bbox_pred/BiasAdd:0", shape=(?, ?, ?, 36), dtype=float32)
Tensor("im_info:0", shape=(?, 3), dtype=float32)
Tensor("rpn_rois:0", shape=(?, 5), dtype=float32)
Tensor("gt_boxes:0", shape=(?, 5), dtype=float32)
Tensor("gt_ishard:0", shape=(?,), dtype=int32)
Tensor("dontcare_areas:0", shape=(?, 4), dtype=float32)
Tensor("conv5_3/Relu:0", shape=(?, ?, ?, 512), dtype=float32)
Tensor("roi-data/rois:0", shape=(?, 5), dtype=float32)
[<tf.Tensor 'conv5_3/Relu:0' shape=(?, ?, ?, 512) dtype=float32>, <tf.Tensor 'roi-data/rois:0' shape=(?, 5) dtype=float32>]
Traceback (most recent call last):
File "./faster_rcnn/train_net.py", line 101, in
network = get_network(args.network_name)
File "./faster_rcnn/../lib/networks/factory.py", line 29, in get_network
return VGGnet_train()
File "./faster_rcnn/../lib/networks/VGGnet_train.py", line 17, in init
self.setup()
File "./faster_rcnn/../lib/networks/VGGnet_train.py", line 85, in setup
.fc(4096, name='fc6')
File "./faster_rcnn/../lib/networks/network.py", line 36, in layer_decorated
layer_output = op(self, layer_input, *args, **kwargs)
File "./faster_rcnn/../lib/networks/network.py", line 377, in fc
feed_in, dim = (input, int(input_shape[-1]))
TypeError: int returned non-int (type NoneType)
這邊有一個巨坑.......就是在生產神經網路的的fc層的前一個roi poo
ling層出錯,原因是TensorFlow的版本問題,聽說別人用1.8.1的版本成功了,我的是1.10.1的版本失敗了。
6.還有什麼錯誤??不記得了,可以留言補充看我還記得不.
最後在Faster RCNN根目錄下執行:
python ./tools/demo.py --model $FRCN_ROOT/tools/model/VGGnet_fast_rcnn_iter_70000.ckpt
=======================================================================================
二、下載資料並預訓練
下面大部分參考:https://blog.csdn.net/hitzijiyingcai/article/details/81914200 特別感謝博主,經常回我,指點迷津
1、下載 VOCdevkit的訓練驗證和測試集
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtrainval_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCtest_06-Nov-2007.tar
wget http://host.robots.ox.ac.uk/pascal/VOC/voc2007/VOCdevkit_08-Jun-2007.tar
2、解壓上面下載的三個壓縮包
tar xvf VOCtrainval_06-Nov-2007.tar
tar xvf VOCtest_06-Nov-2007.tar
tar xvf VOCdevkit_08-Jun-2007.tar
嚴格按照命令解壓,這樣解壓後的檔案巢狀形式不會變。
三個壓縮檔案解壓後文件儲存在一個資料夾VOCdekit下,這個資料夾下包含VOCcode和VOC2007等資料夾,結構如下:
$VOCdevkit/ # development kit
$VOCdevkit/VOCcode/ # VOC utility code
$VOCdevkit/VOC2007 # image sets, annotations, etc.
# ... and several other directories ...
3、重新命名
將下載的資料集資料夾VOCdevkit修改名字為VOCdevkit2007放入faster rcnn目錄下的Data資料夾裡。
cd $FRCN_ROOT/data
mv VOCdevkit VOCdevkit2007
也可以通過以下程式碼實現,改名字是因為程式碼中是VOCdevkit2007
cd $FRCN_ROOT/data
ln -s $VOCdevkit VOCdevkit2007
4、下載預訓練模型
此處下載的目的是將其引數作為我們訓練模型的初始化引數:
下載地址:https://download.csdn.net/download/a1103688841/10798076
此處為下載VGG_imagenet.npy,下載完成之後在faster rcnn目錄下的data資料夾下新建資料夾pretrain_model,將下載好的預訓練模型VGG_imagenet.npy放進去。
5、訓練模型
在根目錄下:
./experiments/scripts/faster_rcnn_end2end.sh gpu 0 VGG16 pascal_voc
在這裡要注意,原始碼中的迭代次數為70000次,為了節約時間完成對原始碼的執行測試,可將experiments/scripts/faster_rcnn_end2end.sh檔案、lib/fast_rcnn/config.py檔案中的迭代次數此改為小一點數(具體格式可參看後文)。本人將其修改為了200。(200是重點,下面生成的權重名的結尾就是200)
NB:訓練和測試模型中遇到的錯誤:
(1)訓練完模型後會出現如下錯誤
這是因為tensorflow問題並沒有在/output/faster_rcnn_end2end/voc_2007_trainval 中生成VGGnet_fast_rcnn_iter_70000.ckpt檔案。
解決方法:
在FASTER-RCNN_TF/lib/fast_rcnn/train.py 檔案中:
將saver = tf.train.Saver(max_to_keep=100)改為:
saver = tf.train.Saver(max_to_keep=100,write_version=saver_pb2.SaverDef.V1)
同時,在檔案開頭加上:from tensorflow.core.protobuf import saver_pb2
在這裡要注意,上述修改後,再次訓練時,會出現如下提示:
這是在儲存迭代檔案時提示V1版本過低建議使用V2,此時千萬不要改為V2,否則在修改完之後會持續提示:
Waiting for ../output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_200.ckpt to exist...
這是沒法生成ckpt檔案,即使在output資料夾下可以看到生成了一些結果檔案,但是沒法生成ckpt檔案,因此上述不要改成V2。
6、測試模型
在修改完上述錯誤之後,執行如下程式碼進行測試:
python ./tools/test_net.py --device gpu --device_id 0 --weights output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_200.ckpt --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test
測試結果:
可以看到在測試結果中出現了負值,這是完全不對的,這是由於迭代次太少的原因,因此又將迭代次數進行了修改,改為了2000,得到了如下結果:
可以看出,AP仍然非常小,但是作為測試執行程式碼來說,是正確的結果就可以了。
三、用自己的資料集進行訓練、測試
1、製作資料集
這邊新開一個帖子將我自己的製作
2.修改程式碼
(1)lib/datatsets/pascal_voc.py
修改為自己的類別。
(2)lib/datasets/imdb.py
這裡將num_classes改為自己的類別數+1,本人定義了1類,因此是2。
(3)lib/networks/VGGnet_train.py
將類別數改為2。同理,VGGnet_test.py修改同上
(4)tools/demo.py
為了測試demo.py的方便,所以也把tools/demo.py中的類別改成自己的類別。
(5)修改迭代次數等引數
首先在experiments/scripts/faster_rcnn_end2end.sh檔案中修改迭代次數:
(在ITERS中修改成自己想要的引數)
然後,我們進入lib/fast_rcnn/config.py,對config.py進行修改:
其中,第一項,就是學習率。
關於模型儲存問題:
第一個引數是訓練時,每迭代多少次儲存一次模型;
第二個引數是儲存時模型的名字。
將rpn檢測目標設定為True:
3、訓練資料
進入你的Faster-rcnn資料夾根目錄,然後直接輸入:
./experiments/scripts/faster_rcnn_end2end.sh gpu 0 VGG16 pascal_voc
這邊訓練的時候會報一個警告:RuntimeWarning: invalid value encountered in log
參考:https://www.jianshu.com/p/1168fe20cc23
這是你資料集的邊界問題 ,計算的時候出現的負數,新增這些語句來改錯誤。
def _get_height(self):
return [PIL.Image.open(self.image_path_at(i)).size[1]
for i in xrange(self.num_images)]
...........................................................
assert (boxes[:,0]!=65535).all()
assert (boxes[:,1]!=65535).all()
assert (boxes[:,2]!=65535).all()
assert (boxes[:,3]!=65535).all()
assert (boxes[:,1]>=0).all()
assert (boxes[:,3]<heights[i]).all()
assert (boxes[:,3]>=boxes[:,1]).all()
assert (oldx1>=0).all()
assert (oldx2<widths[i]).all()
assert (boxes[:, 2] >= boxes[:, 0]).all()
4、測試資料
這邊測試我沒做
5.執行
最後,可以執行demo看看實際框出的效果圖:
python ./tools/demo.py --model output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fas
最後插一張人模狗樣的效果圖和一張漂亮小姐姐: