复现longcw/faster_rcnn_pytorch问题汇总

本文详细记录了复现longcw/faster_rcnn_pytorch代码的过程,遇到的问题包括:Pytorch版本必须为0.4.0,GPU型号对应make文件修改,Python3的迭代器和语法差异等。通过一步步解决,最终成功运行并给出训练和测试建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复现代码的坑!!!
最近在复现大神的代码,代码链接:https://github.com/longcw/faster_rcnn_pytorch
当然不可能一帆风顺,一路上出现各种问题,差点崩溃~

Pytorch版本必须是0.4.0,Pytorch版本必须是0.4.0,Pytorch版本必须是0.4.0!!!重要的事说三遍!!!

如果你是小白,那么你很幸运读到这篇博客,因为这篇博客就是小白式的复现,哈哈

克隆代码

git clone https://github.com/longcw/faster_rcnn_pytorch

在这里插入图片描述
放心,这里没有坑~

修改make文件

按照git仓库中的步骤,下一步我们要运行make.sh文件了,但是,此处有坑!!!看官别急,让我们先看看make.sh文件:
在这里插入图片描述
文件内容:
在这里插入图片描述
坑就在红框内,这个arch是要根据自己的GPU类型决定的,源码中是sm_52,但是博主的是Tesla P100 型号的GPU,因此需要改为sm_60。这个一定要对应好!!!
其他的型号对应如下:
在这里插入图片描述
如若上方没有对应的,可以参考:https://blog.youkuaiyun.com/kkk584520/article/details/53814067 查找下,如果还是没有,一定要自己查资料找到对应的,千万不要尝试!!!很坑!!!博主的是Tesla P100 型号的GPU,对应的是sm_60。

运行make.sh

./make.sh

这里有个小坑:
在这里插入图片描述
这个是由于版本问题导致的,博主用的是python3.6,不支持iteritems了
只需要将iteritems改为items即可。

 for k, v in cudaconfig.items():
 	if not os.path.exists(v):
    raise EnvironmentError('The CUDA %s path could not be located in %s' % (k, v))

在运行make.sh就可以成功了~ 最后大概是这样的:(前面有一堆内容,只要没有报错就行)在这里插入图片描述

下载训练好的模型

按照git中的介绍,下一步要下载训练好的模型到models目录,这个目录自己建,放在哪里都可以~
博主在工程的根目录下建的models,并将模型下载到目录下 (建议wget下载,因为ftp传输容易出现文件损坏)
在这里插入图片描述
由于这个是git中给的是谷歌的下载链接,服务器会出现连接不上的问题,因此下载到本地,然后使用pycharm中的upload,博主亲测可用,ftp传输会出现文件不完整。

运行demo.py

接下来就可以尝试了,用训练好的模型试试效果:

python demo.py

注意前方多处坑!!!莫急!!!一点点来
在这里插入图片描述
自己写的模块导入失败,可是明明就在啊,谷歌后找到解决方案:
在utils文件夹下的__init__.py中添加如下内容,本博主将原有的内容删除了**(不删除是否会出错,博主没试)**:

   import os
   import sys
   print("--------- %s" % __file__)
   currentUtilsLibPath = os.path.split(os.path.realpath(__file__))[0]
   print("currentCrifanLibPath=%s" % currentUtilsLibPath)
   sys.path.append(currentUtilsLibPath)

然后在faste_rcnn下的__init__.py中添加如下:

import os
import sys
print("--------- %s" % __file__)
currentFasterrcnnPath = os.path.split(os.path.realpath(__file__))[0]
print("currentUtilPath=%s" % currentFasterrcnnPath)
sys.path.append(currentFasterrcnnPath)

之后运行demo.py,出现如下:
在这里插入图片描述
这个很简单,就是print没有加括号,只要凡是print,都加括号就好了,后续还有很多这样的,都改过来就行了~大概有20处左右吧,,,
修改后,运行,发现新的错误:
在这里插入图片描述
原来是加载模型的路径没修改成自己的路径,博主的是在根目录下的models下,因此修改为:
在这里插入图片描述
这次总可以了吧,事情好像并不那么顺利:
在这里插入图片描述
可以看到模型加载成功了,但是呢,接下来有错,这个错误就是因为python3中没有xrange,只有range,把xrange改为range就可以了,陆续还有这样的错误,都修改就行了~
再次运行:
在这里插入图片描述
其实现在已经成功了,但是最后的这个 cannot connect to X server是什么呢,这是因为代码中有cv2.imshow('demo', im2show),这个函数在windows下可以直接调出窗口显示图片,在命令行下使用Linux就没法显示了,因此注释掉就可以了~
再次运行:

大功告成~

测试demo结果

测试的图片效果:
在这里插入图片描述

用Pascal VOC 2007自己训练

下载预训练模型,按照git中的介绍:
在这里插入图片描述
创建文件夹data以及在data下创建pretrained_model:

cd faster_rcnn_pytorch
mkdir data
cd data
mkdir pretrained_model

博主之前下载过VOC数据集,因此直接在data下进行软链接创建:

cd data
ln -s $VOCdevkit VOCdevkit2007

如果需要下载VOC数据集,可以参考:https://github.com/CharlesShang/TFFRCNN 里面有数据集下载教程

将下载好的预训练模型vgg16,复制到data/pretrained_model下:
在这里插入图片描述

之后就可以在train.py文件以及.yml中修改下超参数以及训练参数,当然你也可以不修改,在此博主就只修改了相关的。
预训练模型的路径修改为自己的,博主在此使用的就是源码中的,不做修改

然后开始运行train.py
果不其然,报错:
在这里插入图片描述
解决:到faster_rcnn/roi_data_layer目录下的__init__.py,将import roidb注释掉
再次运行,报错:
在这里插入图片描述
这个错误和之前一样,需要把这个roidb文件中的print全部修改,适应python3的括号形式的,其中还有xrange改为range。
陆续很多文件都有这个问题,建议在报错的文件中全局搜索print xrange,进行全部修改。
其他的错误:
在这里插入图片描述
这是因为python3中cPickle模块已经更名为_pickle,所以在python3中导入时可以使用:

import _pickle as cPickle

新坑:
在这里插入图片描述
修改:(不是很懂!!!)参见:https://blog.youkuaiyun.com/lanqiu5ge/article/details/25136909
在这里插入图片描述
新的错误:
在这里插入图片描述
解决:这是由于文件是空的,是之前没运行成功的代码生成了空的文件导致的,去data/cache下,删除这个缓存文件就可以了:
在这里插入图片描述

导入同级文件失败:
在这里插入图片描述
在导入之前加上以下语句:

import sys
current_dir = os.path.abspath(os.path.dirname(__file__))
sys.path.append(current_dir)
sys.path.append("..")

在这里插入图片描述
导入包出错:
在这里插入图片描述
这种错误只需要将..或者. 去掉就可以了~ 这种情况也不少~慢慢填坑吧

接下来这个坑,弄了2个小时,,,,后来果断重新make.sh 了,貌似跳过去了,,具体原因还不清楚,谷歌说是递归太深,一通解决也没解决,后来就重新运行了make.sh,之后就是新的错误,可能是这个错误已经过去了,,,暂时留个坑吧~
在这里插入图片描述
新的坑:
在这里插入图片描述
python3版本不支持这样的,将lambda后的括号去掉即可:

在这里插入图片描述
新坑:
在这里插入图片描述
python版本问题导致:
修改为:
在这里插入图片描述

新的错误:在这里插入图片描述
谷歌发现是numpy的版本问题:
卸载numpy,下载1.16.1版本的:

sudo pip uninstall numpy
sudo pip install numpy==1.16.2

继续运行,还是有错误:
在这里插入图片描述
在红框的文件中,修改代码为:
在这里插入图片描述
参考:https://stackoverflow.com/questions/11305790/pickle-incompatibility-of-numpy-arrays-between-python-2-and-3

新错误:
在这里插入图片描述
这个问题还没有正式解决,因为对于CrayonClient不会使用,因此暂时先注释掉:

在这里插入图片描述
这个留着后续研究吧~留坑!!!

新的错误:
在这里插入图片描述
解决:强制类型转换:
在这里插入图片描述
新坑:
在这里插入图片描述
这个坑研究了好久,后来发现是数据类型问题,把bg_cnt也转换为float就可以了:

在这里插入图片描述

新坑:
在这里插入图片描述
这个和上一个一样的问题,也要把相应的转为float:
在这里插入图片描述
新坑:
在这里插入图片描述
这个问题经过谷歌一番,得到解决办法:去掉[0]就可以:
在这里插入图片描述
刚跑一个就出错:
在这里插入图片描述
这个是由于之前注释掉了tensorboard的代码,然后这些就没有定义到,把这段也注释掉就可以了:
在这里插入图片描述
跑起来了几个之后又出现错误了:(心累)
在这里插入图片描述
既然False不行,那就True试试吧,强行改为True:
在这里插入图片描述
跑起来了,但是,,,,不一会又出错了(胜利的曙光啊,都照到我了,,,)
在这里插入图片描述
看问题是除数是0,那就加一个判断避免下吧:
在这里插入图片描述
新的问题:啊啊啊,心好累!
在这里插入图片描述
这个变量在这个函数中这个变量没有赋值就引用了,,,那就先赋值吧
在这里插入图片描述
或者先赋值None? 这个没试,暂时先这样吧~
新的问题:
在这里插入图片描述
按照提示修改:
在这里插入图片描述
好想许愿,不要再出错了~
啊,内存溢出了:
在这里插入图片描述
可能运行次数太多了,看看生成了好多临时文件:一个字:删!
在这里插入图片描述
然后,这次运行跑的多了,但是还是溢出!!!用两块GPU,并改小batch_size,各种尝试吧,不过还是有点问题,,,
最后,因为使用多块GPU会报错,因此放弃了这个想法,最后的最后终于可以了

建议

不要在终端直接运行,会出现很多奇怪的错误,最好在Pycharm下的Terminal下运行,因为博主最后发现这样就很奇怪地解决了溢出问题,不知道为啥,,,,,

补充

针对tensorboard部分,可以不注释掉代码,把use_tensorboard设置为False也可以,至于这个部分,希望后续有时间研究,待更新~
如有其他问题,可以参考下:
https://blog.youkuaiyun.com/nodototao/article/details/87967443
https://blog.youkuaiyun.com/nodototao/article/details/87967443

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值