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