Faster RCNN 爬坑記錄


訓練

在博客http://blog.csdn.net/Suii_v5/article/details/73776299中介紹了基本的錯誤類型。我只是做一些自己問題的補充

在error6中,調整numpy的版本,在ubuntu系統中,如果安裝了anaconda的話,其實會有兩個安裝python包的位置,其中一個為系統位置/usr/lib/python2.7/dist-packages, 另一個是anaconda的位置:/home/anaconda2/lib/python2.7/site-packages.

而已經將anaconda2的路徑設置進入了環境變量,所以使用單純pip install 並不能更改anaconda2中的numpy的版本,需要用anaconda2里面的pip進行更新.

anaconda2中pip的路徑位於:/home/anaconda2/bin, 輸入命令sudo cp pip /usr/bin/pip2.7.13(注意,這里復制的文件一定要取別的名字,不能是pip等一些已經存在的默認命令。)而后進行版本更新即可。

在這里,常見問題就不再一一列出,遇到問題百度就可以了,我舉例子說明幾個不常見的問題。

Problem1 .在訓練stage1 rpn時,出現'numpy.float64' object cannot be interpreted as an index 的提示錯誤,幾乎所有的博客中都指出,需要更換numpy 的版本,照做之后,出現ImportError: numpy.core.multiarray failed to import,這個問題又是numpy不匹配造成的,這樣就形成了惡性循環,所以,可以考慮從根源上解決'numpy.float64' object cannot be interpreted as an index

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

1) /home/xxx/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/xxx/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/xxx/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/xxx/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)

Problem 2 解決完上一個問題后,又出現 TypeError: slice indices must be integers or None or have an __index__ method的問題,如果沒有改變numpy的版本,
修改 /home/XXX/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 類型,這種類型的數據不能作為索引,所以必須對其進行強制類型轉換,轉化結果如下:

for ind in inds:
        ind = int(ind)
        cls = clss[ind]
        start = int(4 * cos)
        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_weight


如果沒有問題,建議可以先把迭代次數放很小(例如將py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py中的迭代次數改變為被注釋的max_iters = [100, 100, 100, 100]),先讓試着訓練一次。如果一切順利,那就可以直接放大的迭代次數就可以了,這樣會比較節省時間一點。

測試
按照如下步驟才做就可以了
1 確定模型測試對應網絡的prototxt文件
例如:models/pascal_voc/VGG16/faster_rcnn_alt_opt/faster_rcnn_test.pt

2 確定被測試模型文件
例如:output/faster_rcnn_alt_opt/voc_2007_trainval/VGG16_faster_rcnn_final.caffemodel

3 確定配置文件
例如:experiments/cfgs/faster_rcnn_alt_opt.yml

4 確定測試集
例如:voc_2007_test

只要確定了這幾個問題,一般測試都不會有問題

筆者不才,目前只做以下記錄,如果大家有其他發現的問題,求明示。

下面列出兩個討論更深層次的博客,在創新上可以借鑒
http://blog.csdn.net/z5337209/article/details/72838049
http://blog.csdn.net/qq_34335194/article/details/52778724

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM