用双目解决遇到的坑

1.跑PSMNet遇到的坑

a.https://github.com/JiaRenChang/PSMNet

   finetune.py是拿来跑kitti的,main是拿来跑Scene Flow的,--no-cuda参数要设置成false,这样就可以在gpu上跑

   原始的代码batch_size是12,太大了,在TrainImgLoader中调小,之前一直在main里面调小发现没效果,应该在finetune里面调

 

  1.with torch.no_grad()的no_grad()有问题,现在只能选择先注销掉,不进行test

  2.model.load_state_dict(state_dict['state_dict'])也出现报错,我直接注销掉也能正常跑

b.test出来的结果很糟糕,按照github上作者的回答,将imsave从uint16换成uint8,但结果依旧有错,后来又按照其他答主的回答将torchvision从 0.2.1换成了 0.2.0

   conda的方式可以指定安装的版本,pip也是可以的。先pip uninstall  torchvision,然后pip install torchvision==0.2.0就可以了,我装的是0.3的pytorch,默认的 torchvision是0.2.1的

   torchvision为0.2.0时,如果还是弄成uint8,出来的结果还是不太对,弄成uint16就是对的。

c.

用双目解决遇到的坑_第1张图片 

没有用虚拟环境跑就报这个错误

 

 

2.跑stixel-world遇到的坑

a.kitti train_data中的occ和noc:'noc' refers to non-occluded regions, ie, regions for which the matching
  correspondence is inside the image domain. 'occ' refers to all image
  regions for which ground truth could be measured (including regions which map
  to points outside the image domain in the other view)

b.stixel-world的main.cpp中

   ssgbm->compute(I1, I2, disparity);
   disparity.convertTo(disparity, CV_32F, 1. / cv::StereoSGBM::DISP_SCALE);

   用ssgbm得到视差后,还需要转换格式

 注意新版本下的BM和SGBM方法计算出的视差都是CV_16S格式的(也就是16位有符号int型),使用32位float格式可以得到真实的视差值,所以我们需要除以16,需要加上下面一行代码:

 https://www.cnblogs.com/grandyang/p/5805261.html

 

c.stixel-world中要求图片必须是8位无符号的,所以必须转换成灰度图,然后读的时候只读一个通道

  这个还要继续总结一些东西

 

kitti数据集中train和test中的11和10是前后两帧,我感觉,这两个是在一秒内抽取的两帧

10好像还会拿来做test,这是在用PSMnet中的dataloader代码看出来的

 

如果你左右视图换成同一张图片也会报segment fault的错误,在freespace那部分就不能计算了,在const int vhor = cvRound(-line.b / line.a)这行就会出现一个特别小的数,原因是之前的calcRoadModelVD中

if (points.empty())
                return Line(0, 0);造成line.b和line.a都为0,其实也可以理解,左右视图一样,那disparity就为0,disparity(u, v) >= minDisparity这句就不会成立,points这个vector就为空

把数据集换成kitti就出现了问题,testing数据分为image_2和image_3,image_2文件夹是left_image,image_3文件夹是right_image,也就是说,image_2下的000199_10.png和image_3下的000199_10.png才是同一帧的左右视图,000199_10.png和000199_11.png是前后两帧。image_2和image_3下同一帧的左右视图的图像颜色看起来有差异感觉就不像是同一帧了,但实际上他们才是对应的左右视图,至于原因,可能是考虑到其他的一些功能,把image_3的颜色变成的那样,或者本身摄像头就不一样。

自己在做的时候,把ssgbm->compute(I1, I2, disparity)下的I1弄成了右视图,I2弄成了左视图,这样会造成segmente fault,必须I1、I2分别对应左右视图。I1、I2如果是前后帧的输入也会造成segmente fault的错误。

转载于:https://www.cnblogs.com/ymjyqsx/p/8968144.html

你可能感兴趣的:(人工智能,python)