1. 程式人生 > >ubutnu16.04+caffe+cuda8.0+NVIDIA TX2環境下,Faster RCNN 訓練中的一些問題及解決辦法

ubutnu16.04+caffe+cuda8.0+NVIDIA TX2環境下,Faster RCNN 訓練中的一些問題及解決辦法

之前實驗室購買了NVIDIA-jetson-TX2系類的嵌入式開發板,就迫不及待的在上面配好了caffe 和py-faster rcnn。當時沒配散熱器,無法在上面訓練測試,只是跑了demo,demo跑起來還是很順暢的,基本沒修改程式碼,也沒有所謂的numpy版本問題。不知道具體在嵌入式環境下的準確率效果怎樣。今天買的散熱器到了,裝好後來訓練。

好,廢話不多說,先貼一張在nvidia jetson tx2上的demo效果圖和檢測時間:


檢測時間(使用的是作者提供的ZF模型):

**************************************我是萌萌噠的分割線************************************

今天使用Faster RCNN訓練自己的資料的時候,出現了一些因為boost或者是numpy版本不相容導致的問題,經過各種查資料和求助大神,總算是順利把網路跑起來了。下面內容都是今天親測出現的問題並與其對應的解決方案,和大家一起分享,也便於我以後檢視。

訓練方法:在配置好Faster RCNN之後,準備好自己的資料,修改網路的配置檔案和相應的訓練指令碼滿,使用end to end 的訓練方法,在$py-faster-rcnn的根目錄下執行:./experiments/scripts/faster_rcnn_end2end.sh 0 ZF pascal_voc 。以下都是執行該指令碼後出現的問題。

 特別提醒:這裡推薦解決完一個問題後立馬執行測試,或許你沒有接下來的問題,不用修改程式碼。

下面的錯誤是在用自己的資料集的話容易出的錯誤,我用VOC2007訓練時候只出現了問題2,其他問題都沒有出現。

問題1

TypeError: slice indices must be integers or None or have an __index__ method

這裡還是因為numpy版本的原因,最好的解決辦法還是換numpy版本(我換numpy版本還是包這些錯,無效。使用如下方法)
修改 /home/lzx/py-faster-rcnn/lib/rpn/proposal_target_layer.py,轉到123行:

for ind in inds:
        cls = clss[ind]
        start = 4 * cls
        end = start + 4
        bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
        bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
    return bbox_targets, bbox_inside_weights

這裡的ind,start,end都是 numpy.int 型別,這種型別的資料不能作為索引,所以必須對其進行強制型別轉換,轉換成為int型別,轉化結果如下:

for ind in inds:
        ind = int(ind)
        cls = clss[ind]
        start = int(4 * cls)end = int(start + 4)bbox_targets[ind, start:end] = bbox_target_data[ind, 1:]
        bbox_inside_weights[ind, start:end] = cfg.TRAIN.BBOX_INSIDE_WEIGHTS
    return bbox_targets, bbox_inside_weights

以上內容是我剛剛在訓練自己的datasets時候出現的一些問題,參考了一些其他部落格的解決方法。

在這裡需要提醒的是,我重灌numpy,升級或者降級都無法解決問題,可以先按部落格修改,修改好了沒問題就不用改變numpy的版本。大部分還是因為Faster RCNN 釋出的時候使用的一些庫現在都升級了,所以需要對程式碼中一些細節進行修改。


問題2

AttributeError: 'module' object has no attributetext_format'

解決方法:在/home/xxx/py-faster-rcnn/lib/fast_rcnn/train.py的標頭檔案匯入部分加上 :import google.protobuf.text_format

問題3

TypeError: 'numpy.float64' object cannot be interpreted as an index 


修改的位置如下(xxx為你的使用者名稱):這裡我的是nvidia

1) /home/nvidia/py-faster-rcnn/lib/roi_data_layer/minibatch.py

檢視第26行:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
改為:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)

2) /home/nvidia/py-faster-rcnn/lib/datasets/ds_utils.py

檢視第12行:hashes = np.round(boxes * scale).dot(v)
改為:hashes = np.round(boxes * scale).dot(v).astype(np.int)

3) /home/nvidia/py-faster-rcnn/lib/fast_rcnn/test.py

檢視第129行: hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v)
改為: hashes = np.round(blobs['rois'] * cfg.DEDUP_BOXES).dot(v).astype(np.int)

4) /home/nvidia/py-faster-rcnn/lib/rpn/proposal_target_layer.py

檢視第60行:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image)
改為:fg_rois_per_image = np.round(cfg.TRAIN.FG_FRACTION * rois_per_image).astype(np.int)

最後再貼一張訓練時候的情況:

當然,速度很慢,實際訓練我也不是在這個上面訓練,實際用實驗室的伺服器進行訓練,在這裡只是來測試下網路的map等結果。

總結:很多部落格都說這裡是因為numpy版本不相容導致的問題,最好的解決辦法是解除安裝你的numpy,安裝numpy1.11.0。但是我實際使用發現,不管是pip升級/降級numpy還是先解除安裝完全後,再重新安裝,都會出現上面的問題。demo也跑不起來,而且報ImportError: No module named numpy.core.multiarray的錯誤,但實際上直接import的時候是通過的!!!!很坑爹,最後還是妥協了,不改變原來numpy的版本,而是改變程式碼中的內容。

如果想修改numpy的版本的話,可以執行:sudo pip install -U numpy==1.11.0,更換numpy的版本