FlowNet tensorflow版本的代码运行记录

首先,代码地址链接:https://github.com/sampepose/flownet2-tf

然后,按照要求安装环境:1. 系统ubuntu16.04;  2. tensorflow-gpu版本最好是1.2.1版本的,其他版本会不会出错不知道;

            3. conda create -n tensorflow-gpu1.2.1 python=2.7 这句代码作用是新建一个虚拟环境,python版本是             2.7;4. 建立好虚拟环境就可以在环境下安装tensorfloe-gpu 1.2.1了,可以去网上下载它的.whl文件,然            后pip install *****.whl,装好环境以后,按照代码链接中readme要求安装必要的包,注意:其中scikit-             image也许由于scipy版本必须大于等于0.17而安装不成功,可以单独安装,首先pip install scipy,然后            pip install scikit-image即可;5. 然后运行代码,看看能否成功

最后,代码安装成功以后,有几个问题需要我们取解决:

1、能否一次处理一个文件夹中所有视频帧序列;

2、怎么样将得到的光流图转化为.flo文件;

3、代码要求的分辨率必须是384*512,怎么样改代码使得满足自己数据集的分辨率呢

以上几个问题只有第三问我没整明白,其他的解决办法如下:

1、在src/flownet2/test.py中的def main():中修改为以下代码即可自动对一个文件夹中的图像进行光流计算。但是一个文件夹包括很多子文件夹,并对子文件夹中图像进行处理我还没有代码修改:

   net = FlowNet2(mode=Mode.TEST)

    inputs = [os.path.join(FLAGS.test_dir, f) for f in os.listdir(FLAGS.test_dir)]
    inputs.sort()
    fname1 = inputs[0]
    for f in inputs[1: ]:
        fname0 = fname1
        fname1 = f
        print(fname0)
        print(fname1)
        # Train on the data
        net.test(
            checkpoint='./checkpoints/FlowNet2/flownet-2.ckpt-0',
            input_a_path=fname0,
            input_b_path=fname1,
            out_path=FLAGS.out,
        )

if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    parser.add_argument(
        '--test_dir',
        type=str,
        required=True,
        help='Path to image'
    )
    parser.add_argument(
        '--out',
        type=str,
        required=True,
        help='Path to output flow result'
    )
    FLAGS = parser.parse_args()
    if not os.path.isdir(FLAGS.out):
        raise ValueError('out directory must exist')
    
    main()

那么命令行中的命令就改为

python -m src.flownet2.test --test_dir /home/zyn/Documents/flownet2-tf-master/data/samples/blackswan/ --out ./bear_flowimage

其中./bear_flowimage是光流图片的输出位置,这个文件夹需要提前建立好,如果没有新建需要修改test.py中的代码。

那么,另外的问题是保存的光流图的名称问题,我们想让光流图的名称由两帧的名称组合起来,需要修改src/net.py中的def test(.....)函数的代码: #unique_name = 'flow-' + str(uuid.uuid4())这个是原本的命名
            end1='0'
            end2='.'
            unique_name1 = 'flow_'+str(input_a_path[input_a_path.rfind(end1):-4] )+'_'+str(input_b_path[input_b_path.rfind(end1):-4] )这个是新的命名,比如光流图flow_0_01.png我们就可以知道这个光流图是由第0帧和第一帧计算而来的。

2、将光流图转化为.flo文件,这个格式的文件中含有很多字段,包括文件编码格式、具有的二通道宽高等,具体的不明白,至于读取方式可以应用python,我没有试过,现阶段只是把代码跑通并得到结果,结果如何处理和使用暂不研究。

在src/flowlib.py中有个函数write_flow()可以将光流图转化为.flo文件,这个函数有两个参数:光流图和要保存的.flo的路径。具体运行这个函数的方式:

在虚拟环境下,进入src目录,然后输入python,接着import flowlib  然后输入flowlib.write_flow('1.png','./11.flo')即可,这样就将输入的光流图1.png转化为了保存在当前路径中的11.flo

错误解决:

如果第一个问题中出现以下错误:

说明你的数据集的分辨率没有和代码中保持一致,代码默认的是384*512

如果出现以下错误:

则修改ValueError下面第一个File中variables.py中的代码,代码大概在217行,将reuse=*****.reuse改为reuse=*****.reuse_variables()即可

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章