1. 程式人生 > >用自己的資料集訓練faster-rcnn時出現的一些問題及總結(五)

用自己的資料集訓練faster-rcnn時出現的一些問題及總結(五)

關於faster-rcnn的原理訓練流程及其資料集的製備,已經都已完成。那麼問題來了,“自己製備的資料集,比如說自己為了增強資料集,進行圖片翻轉操作,然後記錄座標這樣的資料集,在訓練的過程中出現的問題”

一、在呼叫append_flipped_images函式時出現: assert (boxes[:, 2] >= boxes[:, 0]).all()

網上查資料說:出現這個問題主要是自己的資料集標註出錯。由於我們使用自己的資料集,可能出現x座標為0的情況,而pascal_voc資料標註都是從1開始計數的,所以faster rcnn程式碼裡會轉化成0-based形式,對Xmin,Xmax,Ymin,Ymax進行-1操作,從而會出現溢位,如果x=0,減1後溢位為65535。更有甚者,標記座標為負數或者超出影象範圍

。紅色標註的確實是可能出現的問題,因為我在影象增強的時候,在對圖片座標取值,確實沒有考慮到座標出現為0和標記座標超圖影象範圍。這兩種情況通過自己的資料集看確實出現了,但是自己的資料集量又太大,不可能進行一一查詢。解決方案如下:

  1. 修改lib/datasets/imdb.py,在boxes[:, 2] = widths[i] - oldx1 - 1後插入:
for b in range(len(boxes)):  
    if boxes[b][2]< boxes[b][0]:  
        boxes[b][0] = 0  

      2.修改lib/datasets/pascal_voc.py中_load_pascal_annotation函式,該函式是讀取pascal_voc格式標註檔案的,下面幾句中的-1全部去掉(pascal_voc標註是1-based,所以需要-1轉化成0-based,如果我們的資料標註是0-based,再-1就可能溢位,所以要去掉)。如果只是0-based的問題(而沒有標註為負數或超出影象邊界的座標),這裡就應該解決問題了.但是我的問題還沒有解決,顯然因為我的標記座標有超出影象的範圍了。

二、執行程式時出現:InternalError: Dst tensor is not initialized.

這個問題的主要原因是,我在jupyter notebook上跑的程式,查詢資料才發現出現這個錯誤一般是GPU記憶體耗盡,掛在後臺程序中的IPython核心會這樣做。

解決方案如下:

1.重啟 -------------最為簡單粗暴的做法

2.執行程式之前,先執行export CUDA_VISIBLE_DEVICES=1,僅顯示卡裝置1GPU可見,tensorflow 算是一個比較貪心的工具了就算用device_id指定gpu 也會佔用別的GPU的視訊記憶體資源 必須在執行程式前執行export CUDA_VISIBLE_DEVICES=n(n為可見的伺服器編號)再去執行 程式碼.py 才不會佔用別的GPU資源