首先,代码地址链接: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()即可