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()即可

 

 

 

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