前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >frustum-pointnet代码调试bug集锦与解决方法总结

frustum-pointnet代码调试bug集锦与解决方法总结

作者头像
点云乐课堂
发布2020-05-18 15:38:26
9570
发布2020-05-18 15:38:26
举报
文章被收录于专栏:3D点云深度学习3D点云深度学习

大家好。

众所周知,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

欢迎转发分享,让更多有需要的同学看到这篇文章!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-06-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 3D点云深度学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档