#环境配置:
- 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错误
在line135bg_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.pkl
和data/cache/voc_2007_trainval_gt_roidb.pkl
即可