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 attribute ‘text_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的版本