pointpillars
参考:https://www.dazhuanlan.com/2019/12/26/5e043fad59593/
第3.3步生成pkl修改
按照官网文档改
python create_data.py create_kitti_info_file --data_path=KITTI_DATASET_ROOT
第4步,替换路径
2021-4-19,替换/root/data/kitti
cd second.pytorch/second/configs
sed -i "s:/root/data/kitti:${new_path}:" *.config
sed -i "s:/root/data/kitti:${new_path}:" ./pointpillars/car/*.proto
sed -i "s:/root/data/kitti:${new_path}:" ./pointpillars/ped_cycle/*.proto
sed -i "s:/data/sets/kitti_second:${new_path}:" ./pointpillars/car/*.proto
sed -i "s:/data/sets/kitti_second:${new_path}:" ./pointpillars/ped_cycle/*.proto
除了/root/data/kitti 还有 /data/sets/kitti_second需要替换
亲测成功,官网对文件目录和配置修改说的有点少
先修改配置文件,再运行第3.3步
其他问题
RuntimeError: result type Byte can’t be cast to the desired output type Bool 报错
将dir_labels.byte() 修改为 dir_labels.bool()
或者使用pytorch1.1
eval.py 的 function_base.py报错
报错:float64类型不能被安全地转换成整型。
报错原因:当前版本的numpy不支持使用浮点数作为步长,需要降低numpy版本。
TypeError: ‘numpy.float64‘ object cannot be interpreted as an integer
安装低版本如:1.17.0
但是总体感觉还是装pytorch1.1比较好,作者之前的代码应该是在1.1上运行的
测试成功!
数据增强,先按照z旋转精度73%
续训练按照y旋转精度60%
并不好,直接应该按照y旋转,不进行续训练,数据本身也是按照y旋转的
Net
- 二维栅格得到pillars(栅格柱子),可以理解为图像里的一个像素,并保留稠密的
- 每个pillar的大小:D=[x, y, z, r, x_c, y_c, z_c, x_p, y_p], 其中r代表intensity/reflection, [x_c, y_c, z_c] 代表Pillar中所有点的质心坐标, [ x_p, y_p] 代表质心和Pillar几何中心的偏移.
- 就得到stack pillars,其后接PointNet,BN,ReLU,此时维度为(C, P, N),然后max操作,维度为(C, P)。
- 反投影到伪图像上,也就是将P拆成xy,空白使用0填
- 使用FPN网络(特征金子塔)提取伪图像特征
Loss
Loss分为三部分, 定位Loss, 方向Loss 和分类Loss,Pointpillar 可以识别朝向,也就是会做是否旋转180°的处理。
L
=
1
N
p
o
s
(
β
l
o
c
L
l
o
c
+
β
c
l
s
L
c
l
s
+
β
d
i
r
L
d
i
r
)
L = \dfrac{ 1 }{ { N }_{ pos } } \left( { \beta }_{ loc } { L }_{ loc } + { \beta }_{ cls } { L }_{ cls } + { \beta }_{ dir } { L }_{ dir } \right)
L=Npos1(βlocLloc+βclsLcls+βdirLdir)
N
p
o
s
{ N }_{ pos }
Npos正例anchor数量,
β
l
o
c
=
2
{ \beta }_{ loc } =2
βloc=2,
β
c
l
s
=
1
{ \beta }_{ cls } =1
βcls=1,
β
d
i
r
=
0.2
{ \beta }_{ dir } =0.2
βdir=0.2