1. 程式人生 > >Two_stream convolutional networks 程式碼復現過程中遇到的問題及解決辦法

Two_stream convolutional networks 程式碼復現過程中遇到的問題及解決辦法

主要對2014年那篇基礎論文:Two-stream convolutional networks for aciton recognition 進行程式碼復現,在這過程中遇到了不少的問題,在此記錄一下,也希望能給別人提供一些幫助。

1.InvalidArgumentError (see above for traceback): indices[100] = [100,101] is out of bounds: need 0 <= index < [101,101]

用法:使用稀疏編碼將UCF101資料集中的視訊的標籤轉換為one_hot標籤。
報錯語句:onehot_labels = tf.sparse_to_dense(concated, tf.stack([batch_size, 101]), 1.0, 0.0)
報錯原因:尚不清楚
解決辦法:concated中表示的是將索引和標籤表示的向量按行進行拼接,而ucf101中給出的類別標籤是從1開始,將labels中標籤的起止位置從1-101,轉換為從0-100。

  1. out of memory

用法:使用cv2對視訊逐幀進行光流的計算,使用pycharm開發,在計算大約230個視訊後報記憶體溢位的錯誤。
報錯語句:cv2.calcOpticalFlow()
報錯原因:記憶體溢位,對視訊進行計算時產生了一些區域性變數儲存在記憶體中沒有釋放而導致記憶體溢位。
解決辦法:將ucf101中的13320個視訊進行分組,使用巢狀的for迴圈,外層迴圈進行組數的迭代,內層迴圈對每組的視訊進行迭代,每計算完一組視訊的光流,將影象儲存後使用gc.collect()清除快取,並使用try,catch語句,一旦光流計算部分出錯,捕獲錯誤並進行gc.collect()

3.光流計算的程式碼沒有報錯,但計算後的結果的影象顯示為全黑色。

用法:使用cv2模組中的calcOpticalFlow計算光流
報錯原因:無報錯
解決辦法:在獲得計算結果並將其分成x和y兩個方向進行儲存時,指定flow的編碼格式,dtype=np.uint8(詳細內容看下面問題5)

4.TypeError: a bytes-like object is required, not ‘str’

用法:使用csv模組建立一個csv檔案,用於儲存ucf101中的類別數字,類別名和onehot後的類別標籤,第一行想將表頭內容寫進去。
報錯原因:傳入的是一個字串而不是二進位制型別。
解決辦法:將表頭字串轉換為二進位制型別,並且,在python3.x中,寫入csv資料的檔案開啟方式要寫為‘w’,而python2.x中寫為‘wb’。具體內容請參考

這裡

  1. 計算後的光流矩陣轉換為影象進行儲存,在程式執行時可以看到影象的內容,但將影象儲存到資料夾後儲存的僅為全黑的影象,並且儲存的全部光流值為0。

用法:使用cv2模組中的calcOpticalFlow計算光流,將返回的每一個點的位移值的矩陣儲存為影象。
報錯原因:無報錯,但imshow()的是正常的影象,而儲存的是全黑的影象,也就是說位移值儲存為0.
解決辦法:根據前面的問題3,猜測可能是指定的儲存的矩陣的資料型別超出精度,列印測試後發現畫素點位移的最小值的精度在1e-10,而問題三中的解決方式將影象轉化為了二值影象,所以在解決問題時對矩陣進行歸一化,採用的歸一化方法較為簡單,即歸一化方法,將矩陣中的每一個畫素值縮放到[0,1)之間,再乘上255,將其轉換為[0,255)之間,進行影象的儲存,這時儲存的即為灰度影象。

未完。。。