lidar 3d object detection

最近在网上偶然发现一个做三维物体检测的开发包OpenPCDet,加上一直准备学学python,就决定动手一把。网上已经有不少开发的文档,在编译的过程中也参考了不少网上的资料,现在写点自己的体会。

首先安装python,因为用的win7,所以一开始使用的python38,这已经是支持win7的最高版本了,然后下了pytorch,同时下载了其他项目依赖的模块,在安装spconv的时候遇到一些问题,我在网上查的是要使用spconv-cu102支持cuda,而且spconv和版本cumm的cuda号要一致,但是还是出现DLL找不到的问题,在网上也看到有人遇到类似的情况,但没有解决方案,最后我尝试更换到python37,问题才得到解决。

SharedArray也是项目依赖的一个包,但并没有相应的安装文件,最后在github上找了个SharedNumpyArray的项目替换。

编译需要至少vs2017的支持,虽然开发包并没有使用什么太高级的C++功能,但是因为使用的pytorch,对于编译器有要求,自己用的是vs2015,编译一直报错,在网上看到也是使用vs2015的编译器同样无法使用,最后因为电脑硬盘空间不够了,只能装个vsBuildTools,编译就ok了。

下面列举一些开发中遇到的问题。

1.pcdet\ops\iou3d_nms\src/iou3d_nms.cpp(163): error C2131: expression did not evaluate to a constant

pcdet\ops\iou3d_nms\src/iou3d_nms.cpp(213): error C2131: expression did not evaluate to a constant

const数组使用的问题,好像很多项目编译都有这个问题,应该是在linux下编译没问题,但是在windows下会出问题.解决方案是使用vector代替数组就可以了。

2.pcdet\ops\iou3d_nms\src\iou3d_nms_kernel.cu(77): error: identifier "EPS" is undefined in device code

用宏定义代替变量声明就可以了。

3.iou3d_nms_kernel.obj : error LNK2005: "int __cdecl check_rect_cross(struct Point const &,struct Point const &,struct Point const &,struct Point const &)" (?check_rect_cross@@YAHAEBUPoint@@000@Z) already defined in iou3d_cpu.obj

函数重名,改了就行了。

4.iou3d_nms.obj : error LNK2001: unresolved external symbol "public: long * __cdecl at::TensorBase::data_ptr (void)const " (??$data_ptr@J@TensorBase@at@@QEBAPEAJXZ)
这个bug比较神奇,在网上找得解决方案,增加#include cstdint,把long替换成int64_t,unsigned long long替换成uint64_t问题得到解决。
5.Searching for spconv-cu102
Reading https://pypi.org/simple/spconv-cu102/
Scanning index of all packages (this may take a while)
Reading https://pypi.org/simple/
这个是项目依赖,一开始用的cuda102的版本,后来换成了cuda113.
6.ImportError:cannot import name 'getgrouplist' from os
这个是使用了windows没有的函数,我看只是引用没有使用,把代码注释掉就ok了。

python demo.py --cfg_file .\pv_rcnn.yaml --data_path 000000.bin --ckpt .\weight/pv_rcnn_8369.pth

最后运行demo,整个测试用的dataset有十几G,下载太慢也太占地方,我从github上找的下载包,只有50M左右。

最后放上一张运行的效果图。