让M3D-RPN的3D目标检测网络初步跑起来!

让M3D-RPN的3D目标检测网络初步跑起来!

@写在前面碎碎念@

最近被安排研究一下M3D-RPN的目标检测网络,说是<研究>感觉贬低了<研究>这个词语,说成碰运气可能会更好,试试看看自己的环境和理解是不是恰好能让这个网络跑通。
(真的就是弱,连kitti检测数据集组织都不能顺利完成的我,真的是难啊!但好歹运气不错,花了一点时间研究之后,初步算是顺利跑起来了,就完全是当作黑盒子一样的跑起来,论文和代码都还没有理解,至于后期如何看懂代码结构,修改网络结构,那就是后后后后话了。然后我就想,把这过程记下来,如果有和我一样小白白白白的童鞋,不至于那么懵。)

1. M3D-RPN
论文地址:M3D-RPN:Monocular 3D Region Proposal Network for Object Detection
Github地址: https://github.com/garrickbrazil/M3D-RPN
项目官方地址:http://cvlab.cse.msu.edu/ project-m3d-rpn.html
优秀的论文翻译:【论文翻译】M3D-RPN:Monocular 3D Region Proposal Network for Object Detection

(就是我在挣扎的过程中,看到的一个论文翻译,仅供参考)

2. 如何把代码跑起来?
1)clone代码

想必大家一定有很多种clone代码的方式。

git clone https://github.com/garrickbrazil/M3D-RPN.git 
2)读完README

读完readme,发现readme中详细的讲解了如何从无到有,构建一个可以跑通这个网络的一个python的环境,详细的构建过程在如下图所示的installation guide中。由于我本来就有一个差不多的自己用的pytorch环境,我就没有从头搭建这个环境,我只是pip install package[API的名字]了在运行代码过程中没有的API,所以这部分就我也不知道具体过程是什么。那现在就假设你已经有了一个差不多的环境,这个差不多指你可能只是还缺几个包。
让M3D-RPN的3D目标检测网络初步跑起来!_第1张图片

3)构建数据集

这部分我起初以为直接下载某个KITTI的3d检测数据集就可以了,但是不知道是这几年KITTI的数据集目录发生了一些变化,还是怎么了,就是找不到人家用的数据集是什么。在经历了多次寻找和尝试之后,我发现了这样一个文件。在data/kiiti_split1/devkit/readme.txt中,我发现了一个这样的片段。其实我也不知道这是个啥,但是就是看了这个,我才有了碰对运气,构建好KITTI数据集的可能性。

让M3D-RPN的3D目标检测网络初步跑起来!_第2张图片
下面就说一下怎么构建KITTI数据集,其实就是下载了几个文件,然后把这几个文件放在一个文件夹,重命名文件。这个文件trianing中有7481个项目,testing中有7518个项目。

数据集地址:KITTI 3D检测数据集

让M3D-RPN的3D目标检测网络初步跑起来!_第3张图片
(下面这几个数据集都是官网的下载信息,你需要输入邮箱,它会把下载地址发到你邮箱,然后你就可以使用自己擅长的方式进行下载了。)


a)下载image数据集
# Download left color images of object data set (12 GB)
# 就是上面这个超链接下对应的数据集,image数据集的名字应该叫data_object_image_2.zip

b)下载calib相机标定数据集
# Download camera calibration matrices of object data set (16 MB)
# 就是上面这个超链接下对应的数据集,calib数据集的名字应该叫data_object_calib.zip

c)下载label标注数据集
# Download training labels of object data set (5 MB)
# 就是上面这个超链接下对应的数据集,label数据集的名字应该叫data_object_label_2.zip

d)对以上三个zip文件进行解压。

e)解压之后,将data_object_image_2文件重命名为‘kitti’,最好是小写。

f)接下来就是一系列复制了。

~/data_object_calib\testing\ 下的calib文件夹复制到~\kitti\testing\文件夹下
~/data_object_calib\training\ 下的calib文件夹复制到~\kitti\training\文件夹下
~/data_object_label_2\training\ 下的label_2文件夹复制到~\kitti\training\文件夹下
# 到此数据集构建完毕

构建完毕的数据集应该是一个叫kitti的文件夹下有testing和training两个文件夹,这两个文件夹中的目录分别如下图。

让M3D-RPN的3D目标检测网络初步跑起来!_第4张图片
让M3D-RPN的3D目标检测网络初步跑起来!_第5张图片
此时,你就可以把构建完的kitti数据集,复制到M3D-RPN/data目录下。(上图是我已经移动完的)

4. 数据集转换

在正式执行train命令之前,你还是得执行一系列脚本进行一些数据集相关的构建,不过这个时候,我们只需要傻瓜式执行通命令就可以了。

注意:所有的命令执行都在M3D-RPN的根目录下执行。
 
a)extract the data splits
# 执行以下两个命令
    python data/kitti_split1/setup_split.py
    python data/kitti_split2/setup_split.py

b)build the KITTI devkit eval for each split.
# 执行以下两个命令
	sh data/kitti_split1/devkit/cpp/build.sh
	sh data/kitti_split2/devkit/cpp/build.sh
  
c)build the nms modules
# 执行以下两个命令
	cd lib/nms
	make
	

上述的三个步骤中,b)似乎出现了一些问题,总是提示跳转不到data/kitti_split1/devkit/cpp这个文件夹。在网上找了找,有人说是build.sh文件权限的问题,改了半也不行。那不如粗暴一点,直接看build.sh里面到底是什么,结果是以下几行代码。

cd data/kitti_split1/devkit/cpp/
g++ -O3 -DNDEBUG -o evaluate_object evaluate_object.cpp
cd ../../../../

所以我就分步,直接把这几行代码在命令窗口里面执行了以下,竟然没有报错了就。好像是有一些警告,应该问题不大吧,最后运行的时候也没有什么问题。

5. Training

做了这么多附带的工作,终于到Training了,这部分就按照README里面的内容执行。


a)python -m visdom.server -port 8100 -readonly
# 启动可视化的工具visdom,代码里面默认端口是8100

b)训练分为两步,应该是要顺序执行,因为我在没有执行warm_up时候直接执行main,似乎有些文件找不到。

python scripts/train_rpn_3d.py --config=kitti_3d_multi_warmup
# First train the warmup (without depth-aware)

python scripts/train_rpn_3d.py --config=kitti_3d_multi_main
# Then train the main experiment (with depth-aware)

c)python scripts/train_rpn_3d.py --config=kitti_3d_multi_main --restore=10000
# 如果训练不小心中断,你还可以继续训练。

事情总是不会像想象的那么简单,就又报错了。

TypeError: can't convert CUDA tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

这个错误看起来好像很清楚,就是我们需要在numpy()之前先.cpu()才可以,github上有个人说可以这么解决。
error

但是不会debug的我解决起来好像不是那么容易,因为我半天也没有在错误指示的文件中找到那行含有numpy()的代码。

所以最后,我直接把它报错的位置,python的库torch/tensor.py里面的
return self.numpy()
改成了
return self.cpu().numpy()
# 貌似这个是if分支,还有一个else分支里的那个语句也这样,加上.cpu().

直接改库函数的方式确实有点危险,因为改了之后,就迫使我同样使用该环境的其他的网络停了。抱着侥幸心理重新跑起来,感觉目前好像还没什么问题。至于我有没有给自己挖坑,得之后慢慢发现。

6. 看看跑起来长什么样子吧

目前跑的是warm_up的网络。大概用了6653MiB的显卡,就是下面那个2号卡。
让M3D-RPN的3D目标检测网络初步跑起来!_第6张图片

训练界面如下:
让M3D-RPN的3D目标检测网络初步跑起来!_第7张图片

你可能感兴趣的:(pytorch,自动驾驶,深度学习)