大家好。
众所周知,frustum-pointnet是斯坦福大学PointNet作者Chales大神的成果,将pointnet用到了目标检测中,测试数据集是KITTI。该网络测试了车辆、行人、自行车三项检测任务,分别排名第三、第一、第一,效果相当不错了。
关于论文和代码的讲解会单独写文来讲解。今天先来说一说代码调试的那些事。
由于源代码是用python2写的,所以如果你用的是python2的话,几乎不怎么需要调试。但如果你跟我一样,用的是python3的话,就要花点功夫了。
这篇文章把调试过程中遇到的问题和解决方法做了总结,如果你遇到同样的问题,可以参考,现在我的代码已经调通了。
1
数据集准备:数据集可以从KITTI官网下载,比较大。更好的办法是去下载作者准备好的pickle格式数据,只有900多M,而且免去了我们自己进行数据格式转换的麻烦。文章末尾有链接,访问外国网站
2
依赖包安装:
主要是mayavi,如果用python2的话,根据作者提供的mayavi_install.sh脚本进行安装即可,路径在文件夹mayavi下,非常方便。如果用的是python3的话,就得自己想办法安装了。笔者查阅了大量的博客教程,发现这些博客都是你抄我、我抄你,千篇一律很不走心,都在讲需要先安装VTK,还要使用cmake进行编译,耗时长,而且操作复杂;笔者在走了不少弯路之后发现,现在的mayavi版本其实已经做得很完备了,可以直接使用pip3安装,语句就很简单了:
pip3 install mayavi。
注意一定要用pip3,不是pip,因为后者会把mayavi安装到python2.7下。
安装完之后,用代码test_drawline.py进行测试。python3用户会出现报错:
NameError: name 'raw_input' is not defined
——改成input(),就能出图了,证明mayavi安装好了。
3
训练train.py代码调试
运行代码会出现下面的问题,我们一个一个来说。
01
运行到第19行:调用provider.py输入数据。有两个问题指向这个代码。分别是:
1)
Traceback (most recent call last):
File"provider.py", line 8, in <module>
import cPickle as pickle
ModuleNotFoundError: No module named'cPickle'
——解决办法:将cPickle改为pickle即可。
2)编码问题。
File"/media/red/办公1/frustum-pointnets-master/train/provider.py",line 366, in <module>
rotate_to_center=True, random_flip=True, random_shift=True)
File"/media/red/办公1/frustum-pointnets-master/train/provider2.py",line 145, in __init__
self.box2d_list = pickle.load(fp)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcd in position 0: ordinal not inrange(128)
——这个问题非常棘手,笔者看了大量博客,尝试了很多方法,比如:https://www.cnblogs.com/sundahua/p/7248214.html,但是都不奏效。一直在纠结是不是编码的问题,最后找到原因,原来是pickle造成的。
先简单说一下pickle这个包,用来把各种图片、表格等数据转换成专门的pickle格式,供代码使用。最常用的两个命令是:pickle.dump()和pickle.load(),前者把数据转换成pickle,后者从pickle中提取原数据。
作者提供的KITTI数据库pickle文件,是用python2转换得到的,带的编码是ascii,我们在python3下进行调用pickle.load()的话,默认的编码方式是UTF-8,所以会出现编码问题的报错。改正方法就很简单了,
——pickle.load(fp)改为pickle.load(fp,encoding='latin1')
在所有pickle.load()语句下进行类似操作,亲测有效。这样,provider.py终于改完了。
继续train.py往下走。。。
2
File"/media/red/办公1/frustum-pointnets-master/train/train.py",line 230, in train_one_epoch
for batch_idx in range(num_batches):
TypeError: 'float' object cannot beinterpreted as an integer
追溯到219行,295行:num_batches = len(TRAIN_DATASET)/BATCH_SIZE,两个数字相处得到的num_batches是小数,但是num_batches用在循环中必须是整数,所以把/改为//即可。
附:pickle格式KITTI数据集链接——https://shapenet.cs.stanford.edu/media/frustum_data.zip
欢迎转发分享,让更多有需要的同学看到这篇文章!