PJLab-ADG / neuralsim

neuralsim: 3D surface reconstruction and simulation based on 3D neural rendering.
MIT License
582 stars 31 forks source link

streetSurf dataset #17

Open npcdna opened 11 months ago

npcdna commented 11 months ago

你好,我想把这个代码用在我自己的自动驾驶数据集上 我目前的数据是一个前后目相机,一个40线的车顶斜装激光lidar,在城区道路的数据; 目前我用waymo数据接口跑前视相机,用monosdf生成的深度和normal图像模式跑通了streetbuf的流程,但是效果不行, 我目前的问题有: 1.streetbuf的dataset能用哪些接口,是不是只能用waymo的数据接口; 2.我相机坐标系和opencv相同,这样的话如果我调用waymo接口是不是要改变waymo相机坐标系和opencv相机坐标系之间的转换; 3.目前我用monosdf生成深度和normal图看着还行,但是生成mask天空区域包含部分道路区域,尤其是后视图像mask基本分类错误,这种情况下是不是用lidar好些; 4.lidar数据转化:我目前拿到的数据是每帧激光点在当前激光坐标系下的x,y,z,intensity;所以我处理时是将每帧图像附近0.1秒内的激光点转化为一帧数据, 保存rays_o,rays_d, ranges; rays_o 的值为:世界坐标系下当前激光传感器位置 (Tw_li).translation() = (Tw_biTbl).translation() ; rays_d的值为: 世界坐标系下当前激光点方向 (Rw_li[x,y,z]^T).normal() ranges的值为: sqrt(xx+yy+z*z) 我这样转化的lidar数据有没有什么问题; 5.有没有能够根据给定的pose和传感器数据生成对应渲染图像和lidar模拟结果的接口?

npcdna commented 11 months ago

我使用lidar数据的时候出现如下错误,这是不是lidar数据转换不对:

2023-09-04 19:15:08,784-rk0-train.py#959:=> Start loading data, for experiment: logs/streetsurf/owndata_1 2023-09-04 19:15:08,784-rk0-base.py#88:=> Caching data to device=cpu... 2023-09-04 19:15:08,784-rk0-base.py#95:=> Caching camera data... Caching cameras...: 100%|█████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1/1 [00:01<00:00, 1.72s/it] 2023-09-04 19:15:10,509-rk0-base.py#187:=> Caching lidar data... Caching merged LiDAR frames...: 100%|███████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 35/35 [00:00<00:00, 58.45it/s] 2023-09-04 19:15:11,108-rk0-base.py#219:=> Done caching data. 2023-09-04 19:15:11,108-rk0-train.py#962:=> Done loading data. 2023-09-04 19:15:11,110-rk0-checkpoint.py#74:=> Found ckpts: [] 2023-09-04 19:15:11,122-rk0-train.py#182:=> Start initialize prepcess... => Pretraining SDF...: 100%|██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 1000/1000 [00:48<00:00, 20.53it/s, loss=1.75e-5] 2023-09-04 19:15:59,844-rk0-train.py#204:=> Done initialize prepcess. 2023-09-04 19:15:59,844-rk0-checkpoint.py#41:=> Saving ckpt to logs/streetsurf/owndata_1/ckpts/0.pt 2023-09-04 19:16:00,032-rk0-checkpoint.py#46:Done. 2023-09-04 19:16:00,032-rk0-train.py#1057:=> Start [train], it=0, lr=1e-05, in logs/streetsurf/owndata_1 0%| | 0/15000 [00:00<?, ?it/s/home/tjh/.install/anaconda3/envs/nr3d/lib/python3.8/site-packages/torch/optim/lr_scheduler.py:156: UserWarning: The epoch parameter in scheduler.step() was not necessary and is being deprecated where possible. Please use scheduler.step() to step the scheduler. During the deprecation, if epoch is different from None, the closed form is used instead of the new chainable form, where available. Please open an issue if you are unable to replicate your use case: https://github.com/pytorch/pytorch/issues/new/choose. warnings.warn(EPOCH_DEPRECATION_WARNING, UserWarning) 0%| | 2/15000 [00:04<8:00:25, 1.92s/it, loss_total=0.336, lr=1e-5]/home/tjh/Workspace/github/neuralsim/dataio/dataloader/lidar_loader.py:150: RuntimeWarning: invalid value encountered in divide weight = weight / weight.sum() /home/tjh/Workspace/github/neuralsim/dataio/dataloader/lidar_loader.py:151: RuntimeWarning: invalid value encountered in cast num_rays_each_lidar = np.array(num_rays * weight, dtype=int).tolist() Error occurred in: logs/streetsurf/owndata_1 0%| | 2/15000 [00:04<9:47:08, 2.35s/it, loss_total=0.336, lr=1e-5] Traceback (most recent call last): File "code_single/tools/train.py", line 1303, in main_function(bc.parse(print_config=is_master())) File "code_single/tools/train.py", line 1286, in main_function raise e File "code_single/tools/train.py", line 1278, in main_function train_step() File "code_single/tools/train.py", line 1155, in train_step sample, ground_truth = next(lidar_dataloader_cyc) File "code_single/tools/train.py", line 969, in cycle for (s,g) in dataloader: File "/home/tjh/.install/anaconda3/envs/nr3d/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 530, in next data = self._next_data() File "/home/tjh/.install/anaconda3/envs/nr3d/lib/python3.8/site-packages/torch/utils/data/dataloader.py", line 570, in _next_data data = self._dataset_fetcher.fetch(index) # may raise StopIteration File "/home/tjh/.install/anaconda3/envs/nr3d/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 49, in fetch data = [self.dataset[idx] for idx in possibly_batched_index] File "/home/tjh/.install/anaconda3/envs/nr3d/lib/python3.8/site-packages/torch/utils/data/_utils/fetch.py", line 49, in data = [self.dataset[idx] for idx in possibly_batched_index] File "/home/tjh/Workspace/github/neuralsim/dataio/dataloader/lidar_loader.py", line 185, in getitem ret = self.sample_merged(scene_id, frame_id) File "/home/tjh/Workspace/github/neuralsim/dataio/dataloader/lidar_loader.py", line 153, in sample_merged inds = torch.cat([torch.randint(cumu_cnt[i], cumu_cnt[i+1], [num,], device=self.device, dtype=torch.long) for i,num in enumerate(num_rays_each_lidar) if num > 0]) NotImplementedError: There were no tensor arguments to this function (e.g., you passed an empty list of Tensors), but no fallback function is registered for schema aten::_cat. This usually means that this function requires a non-empty list of Tensors, or that you (the operator writer) forgot to register a fallback function. Available functions are [CPU, CUDA, QuantizedCPU, BackendSelect, Python, Named, Conjugate, Negative, ZeroTensor, ADInplaceOrView, AutogradOther, AutogradCPU, AutogradCUDA, AutogradXLA, AutogradLazy, AutogradXPU, AutogradMLC, AutogradHPU, AutogradNestedTensor, AutogradPrivateUse1, AutogradPrivateUse2, AutogradPrivateUse3, Tracer, AutocastCPU, Autocast, Batched, VmapMode, Functionalize]

ventusff commented 11 months ago

你好,

1.2. streetsurf 内部唯一定死接口的只有相机坐标系,我们会要求所有不同数据集的相机坐标系统一转到 opencv 格式,目前已经开放的版本中,像 waymo 的、colmap 的、megaNeRF 的、dtu / neus 的,这些不同的数据集的接口都是支持读取的。这些数据集的接口都会 将 c2w 统一转换成 opencv 的 c2w,包括 waymo 也是先转换到 openCV 的 c2w / c2v 来读取的。如果你的相机已经是 opencv 的,那不需要转换直接读取即可。在还在开发尚未开放的版本中,我们已经差不多实现了像 PandarSet、ZoD、KITTI 等数据集的加载器,稍后几天我可以把这些 dataloader(接口) 放出来供你参考。

  1. 不管使用深度图还是 lidar,如果 mask 错误比较大,在使用 mask 的训练配置中都会有些问题。这里一方面我觉得可以先试试 nomask 的配置(目前开放的是 nomask_withlidar,你需要 nomask_nolidar吗?这个设定的结果可能比较一般),另一方面我的建议可以试试别的分割模型,segFormer 已经有些老了,可以试试 ViT-adapter,这里我可以开放一个 neuralsim 下的 ViT-adapter 来提 mask 的脚本,你也可以自己试试 ViT-adapter

  2. lidar 这样处理起来看上去没有问题,可以使用在 #9 中提到的 debug_vis_anim 工具试试看。你可以先更新下 repo,这里我修了一个小BUG。

  3. 这个接口有,不过比较我们目前写的还有些问题所以还没公开,文档也还没齐备,我可以催下同事

  4. 关于 lidar 读取的这个 bug,抱歉这里我没有抓这个错误给出明确的提示,这里大概率是因为在 使用 相机视野过滤 lidar 光束 (filter_in_cams) 时,所有 lidar 光束都被滤掉了所以采样时候得到的是空矩阵。这可能和 1.2. 提到的 相机读取不正确有关,你同样可以用 #9 中提到的工具看下相机视锥的位置和朝向对不对。

关于 custom 数据集的处理和训练,抱歉我们这里人手不足文档写的不是很齐备,后面陆续可以安排制作一些 tutorial 放出来

npcdna commented 11 months ago

thanks! 我使用了提到的debug工具检查,发现确实输入进去的相机pose和lidar pose存在问题

npcdna commented 11 months ago

是的,我看了下lidar的数据应该是要给到对应frame坐标系下,不是世界坐标系,我改了这点然后用waymo接口能跑了,另外可以更新下ViT-adapter的脚本吗,我试试新的mask效果

npcdna commented 11 months ago

同时问下,你们测试vit-adapter是直接用的预训练模型单独提取天空语义吗,还会单独训练吗

sonnefred commented 9 months ago

你好,我想把这个代码用在我自己的自动驾驶数据集上 我目前的数据是一个前后目相机,一个40线的车顶斜装激光lidar,在城区道路的数据; 目前我用waymo数据接口跑前视相机,用monosdf生成的深度和normal图像模式跑通了streetbuf的流程,但是效果不行, 我目前的问题有: 1.streetbuf的dataset能用哪些接口,是不是只能用waymo的数据接口; 2.我相机坐标系和opencv相同,这样的话如果我调用waymo接口是不是要改变waymo相机坐标系和opencv相机坐标系之间的转换; 3.目前我用monosdf生成深度和normal图看着还行,但是生成mask天空区域包含部分道路区域,尤其是后视图像mask基本分类错误,这种情况下是不是用lidar好些; 4.lidar数据转化:我目前拿到的数据是每帧激光点在当前激光坐标系下的x,y,z,intensity;所以我处理时是将每帧图像附近0.1秒内的激光点转化为一帧数据, 保存rays_o,rays_d, ranges; rays_o 的值为:世界坐标系下当前激光传感器位置 (Tw_li).translation() = (Tw_bi_Tbl).translation() ; rays_d的值为: 世界坐标系下当前激光点方向 (Rwli[x,y,z]^T).normal() ranges的值为: sqrt(x_x+y_y+z*z) 我这样转化的lidar数据有没有什么问题; 5.有没有能够根据给定的pose和传感器数据生成对应渲染图像和lidar模拟结果的接口?

Hi, I'm trying to convert my lidar data to the required format. Could you tell me what the dimension of the transformed npz data should be? Something like (N, 3) for rays_o and rays_d or any format else? Thanks.

ZJLi2013 commented 8 months ago

你好,

1.2. streetsurf 内部唯一定死接口的只有相机坐标系,我们会要求所有不同数据集的相机坐标系统一转到 opencv 格式,目前已经开放的版本中,像 waymo 的、colmap 的、megaNeRF 的、dtu / neus 的,这些不同的数据集的接口都是支持读取的。这些数据集的接口都会 将 c2w 统一转换成 opencv 的 c2w,包括 waymo 也是先转换到 openCV 的 c2w / c2v 来读取的。如果你的相机已经是 opencv 的,那不需要转换直接读取即可。在还在开发尚未开放的版本中,我们已经差不多实现了像 PandarSet、ZoD、KITTI 等数据集的加载器,稍后几天我可以把这些 dataloader(接口) 放出来供你参考。

3. 不管使用深度图还是 lidar,如果 mask 错误比较大,在使用 mask 的训练配置中都会有些问题。这里一方面我觉得可以先试试 nomask 的配置(目前开放的是 nomask_withlidar,你需要 nomask_nolidar吗?这个设定的结果可能比较一般),另一方面我的建议可以试试别的分割模型,segFormer 已经有些老了,可以试试 ViT-adapter,这里我可以开放一个 neuralsim 下的 ViT-adapter 来提 mask 的脚本,你也可以自己试试 ViT-adapter

4. lidar 这样处理起来看上去没有问题,可以使用在 [train by my own datasets #9](https://github.com/PJLab-ADG/neuralsim/issues/9) 中提到的 debug_vis_anim 工具试试看。你可以先更新下 repo,这里我修了一个小BUG。

5. 这个接口有,不过比较我们目前写的还有些问题所以还没公开,文档也还没齐备,我可以催下同事

关于 lidar 读取的这个 bug,抱歉这里我没有抓这个错误给出明确的提示,这里大概率是因为在 使用 相机视野过滤 lidar 光束 (filter_in_cams) 时,所有 lidar 光束都被滤掉了所以采样时候得到的是空矩阵。这可能和 1.2. 提到的 相机读取不正确有关,你同样可以用 #9 中提到的工具看下相机视锥的位置和朝向对不对。

关于 custom 数据集的处理和训练,抱歉我们这里人手不足文档写的不是很齐备,后面陆续可以安排制作一些 tutorial 放出来

hi, 您好,请问下kitti数据集 的 data loader 有开源出来了ma?