Fork me on GitHub

FasterR-CNN的坑

#环境配置:

  • Ubuntu 16.04
  • python 3.5
  • CUDA 9.0
  • cudnn 7.0

#坑一:需要修改make.sh文件,因为原来代码不兼容python3。
make.sh修改如下:

nvcc -std=c++11 -c -o roi_pooling_op.cu.o roi_pooling_op_gpu.cu.cc \
    -I $TF_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC $CXXFLAGS \
    -lcudart -L$CUDA_PATH/lib64 -L$TF_LIB -ltensorflow_framework -I$TF_INC/external/nsync/public \
    -arch=sm_61

g++ -std=c++11 -shared -D_GLIBCXX_USE_CXX11_ABI=0 -o roi_pooling.so roi_pooling_op.cc \
    roi_pooling_op.cu.o -I $TF_INC -L $TF_LIB -ltensorflow_framework -D GOOGLE_CUDA=1 -fPIC $CXXFLAGS \
    -lcudart -L$CUDA_PATH/lib64 -I$TF_INC/external/nsync/public \

#坑二:从py2转换为py3编码格式
调用2to3脚本:

2to3 example.py

#坑三 使用bash训练脚本

如果直接

python3 ./tools/train_net.py --device gpu --device_id 1 --solver VGG_CNN_M_1024 --weight ./data/pre-model/ 
VGG_imagenet.npy --imdb voc_2007_train --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_train

训练是没有问题的。但是如果想调用

bash ./experiments/scripts/faster_rcnn_end2end.sh gpu 0  vgg_16 pascal_voc

进行训练需要将python改为python3


#坑四:运行\experiments\scripts\faster_rcnn_end2end.sh ,如果出现You may need to pass the encoding= option to numpy.load
由于在Py2中的默认编码为ASCII,但是在py3中的默认编码为UTF-8,所以需要将np.load(yourfilepath)改为np.load(yourfilepath,encoding="latin1"),可以配合grep -r np.load来配合查找\experiments\scripts\faster_rcnn_end2end.sh


#坑五:\lib\fast_rcnn\train.py输出print格式报错
在line189中的

print(('iter: %d / %d, total loss: %.4f, rpn_loss_cls: %.4f.. max_iters, rpn_loss_cls_val+rpn_loss_box_value+ loss_cls_value + loss_box_value ,rpn_loss_cls_value,rpn_loss_box_value,loss_cls_value, loss_box_value, lr.eval()))

格式错误。

改为format形式即可,原因可能是’\’换行的影响

print('iter: {:d} / {:d} total loss: {:.4f}, rpn_loss_cls: {:.4f}, rpn_loss_box: {:.4f}, loss_cls: {:.4f}, loss_box: {:.4f}, lr: {:.4f}'.format(iter+1, max_iters, rpn_loss_cls_value + rpn_loss_box_value + loss_cls_value+loss_box_value, rpn_loss_cls_value, rpn_loss_box_value, loss_cls_value, loss_box_value, lr.eval()))

#坑六 \lib\rpn_msr\proposal_target_layer_tf npr.choice的size=bg_rois_per_this_image错误
在line135
bg_rois_per_this_image = rois_per_image - fg_rois_per_this_image

改为int型即可:bg_rois_per_this_image = int(rois_per_image - fg_rois_per_this_image)


#坑七 test_net.py的Pickle: TypeError: a bytes-like object is required, not ‘str’
首先测试代码如下:

python3 ./tools/test_net.py --device gpu --device_id 0 --weights output/faster_rcnn_end2end/voc_2007_trainval/VGGnet_fast_rcnn_iter_100000.ckpt --imdb voc_2007_test --cfg experiments/cfgs/faster_rcnn_end2end.yml --network VGGnet_test

这是因为的Pickle.load函数存在py2和py3版本问题。只需要将open(filename, 'w')、open(filename, 'r')改为open(filename, 'wb')和open(filename, 'rb')即可,


#坑八 关于顺利运行测试test_net.py后显示annots.pkl为空
在测试前,删除data/VOCdevkit2007/annotations_cache/annots.pkldata/cache/voc_2007_trainval_gt_roidb.pkl即可


剩下的就是看所谓的效果了~

在这里插入图片描述

-------------Nothing in the dark-------------