1. 程式人生 > >王權富貴:faster_rcnn在Linux伺服器上(無介面)編譯

王權富貴: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

 

最後插一張人模狗樣的效果圖和一張漂亮小姐姐: