Flownet2-pytorch踩坑全程
源码
来自https://github.com/NVIDIA/flownet2-pytorch,这个版本基于pytorch,原作者的版本https://github.com/lmb-freiburg/flownet2.git是基于caffe的,我也下载过,由于caffe版本的问题,最后没有运行(死磕)成功,pytorch这个版本,死磕两两周终于成功,在此记录下全程,给有需要的人。
我最后成功的环境:cuda8.0+python3.6.2+torch1.0.0+gcc4.9,IDE是pycharm。
pretrained model
就是作者在readme里提及的需要去google drive下载的那些,如果不打算训练,直接用这个结果跑。准备晚点放到百度网盘。

死磕流程
- 编译报错:correlation_cuda_kernel.cu(130): error: identifier “__syncwarp” is undefined correlation_cuda_kernel.cu(19): error: identifier “__shfl_down_sync” is undefined。如果用cuda9以下的版本会出现,因为networks/correlation_package/correlation_cuda_kernel.cu这个文件里用两cuda9的新函数。解决办法:用gitk等工具查看这个文件,git reset到没有使用这两个函数之前的版本,编译通过,猜测不会影响结果。(这里一直有警告,先前没注意,如果你也有,请直接看第8条)
- 跑run_a_pair.py, 注意里面的模型和图片路径设置最好是绝对路径(如果你搞不清楚的话),注意图像长宽必须是64的倍数。注意文件里两个import要改成下面这样,原run_a_pair.py里的文件结构和现在的下载版本应该是不一样:

- 然后是跑着跑着爆出:anaconda3/lib/python3.6/site-packages/torch/lib/libtorch_python.so: undefined symbol: PySlice_Unpack于是新建conda环境py3.6.2,改python版本为3.6.2,torch版本1.0.0.然后是跑到net那里就卡死
- 看作者用 pytorch是0.4.1,以为是pytorch版本的问题,于是去python3.6.0的环境里改torch为0.4.1,发现与cuda一起编译有错误correlation_cuda.cc:4:10: fatal error: ATen/cuda/CUDAContext.h: No such file ordirectory,看博客发现是pytorch和cuda版本问题:
pytorch 0.4.1, cuda 8/9, python36 nopes
pytorch 1.0.0, cuda 10, python36 works
pytorch 1.0.1, cuda 10, python36 nopes
pytorch 1.1.0, cuda 10, python36 works
- 重新回环境py3.6.2,torch1.0.0里死磕,之前一直用flownet2,可能这个网络太大,改为flownet-s试试,还是不行。报错,报错’tuple’ object has no attribute ‘squeeze’,单步调试发现flownetS类里的training为true,去models.py Flownet类代码中,构造函数把training改为默认False,终于输出了.flo
- 期间还有问题attempted relative import with no known parent package,这时候把interpreter删光,新建,就会好(后面发现别的原因也会导致这个问题,看第10条). 至此flownetS已成功,下面继续死磕flownetC
- 尝试flownetC,这才发现S只用了torch的东西,编译出来的correlation的东西应该都没用吧?这才注意到编译时一直报Warning: your compiler g++ 4.8 may be ABI incompatible with pytorch
- 于是gcc升级到5.4.0,发现编译不过了,报fatal error: sys/cdefs.h: No such file or directory,于是怀疑升级过头了,联网,改为gcc4.9,怎么改参考https://www.zhihu.com/question/56272908第一个回答,注意改成你自己的路径
conda install -c serge-sans-paille gcc_49
ln -s /home/chenjoya/opt/anaconda3/envs/graph-retina-rcnn/bin/gcc-4.9 /home/chenjoya/opt/anaconda3/envs/graph-retina-rcnn/bin/gcc
ln -s /home/chenjoya/opt/anaconda3/envs/graph-retina-rcnn/bin/g++-4.9 /home/chenjoya/opt/anaconda3/envs/graph-retina-rcnn/bin/g++
编译通过,但代码跑不通了,报attempted relative import with no known parent package
- 尝试重新配置pycharm的deployment,不行,发现models.py里import networks走的是try–except的异常部分,注释掉except,运行报错/usr/lib/libstdc++.so.6: version `GLIBCXX_3.4.20’ not found
- 参考https://www.jianshu.com/p/528c387fb063和https://nulls.blog.csdn.net/article/details/79589091改了软连接,还不行,因为根本没装GLIBCXX_3.4.20。最后conda install libgcc==5.2.0,解决。补充:几个月之后又出现这个问题。又研究了一阵子,专门写一篇来说这个问题:请看https://blog.csdn.net/jillar/article/details/116494270。
- 同上,把FlowNet2和FlowNetC的self.training默认为false。终于出结果了。
- .flo文件转png,参考https://blog.csdn.net/sinat_33718563/article/details/79950310,用flow_code/color_flow *.flo *.png,下面研究下flow_code.研究半天,发现在run_a_pair.py中,.flo本来就是xy分量生成的,可以直接用xy分量画矢量图。
结束
感叹这些东西的版本兼容性真是太差了,真真差一个都不行啊。感谢前辈踩过的坑。

1万+

被折叠的 条评论
为什么被折叠?



