2017-03-19 67 views
4

我正在嘗試使用在圖像上使用一些openCV函數的函數。但是我得到的數據是張量,我無法將它轉換成圖像。如何在Keras Lambda Layer中使用openCV函數?

def image_func(img): 
    img=cv2.cvtColor(img,cv2.COLOR_BGR2YUV) 
    img=cv2.resize(img,(200,66)) 
    return img 

model=Sequential() 
model.add(Lambda(get_ideal_img,input_shape=(r,c,ch),output_shape=(r,c,ch))) 

這是我的代碼中的代碼片段。當我運行它時,會在cvtColor函數中引發錯誤,說img不是一個numpy數組。我打印出img,它似乎是張量。我不知道如何將張量改爲圖像,然後返回張量。我希望模型具有這一層。

如果不是與lambda層我該如何實現這一目標?

+0

哪個後端使用Theano或Tensorflow?請注意,默認情況下,tensorflow是後端。所以如果你沒有改變任何東西,tensorflow就是你正在使用的東西。 – putonspectacles

+0

我正在使用張量流 –

回答

0

我將假設image_func函數做你想要的(調整大小)和圖像。請注意,圖像是由一個numpy數組表示的。由於您正在使用張量後端,因此您在張量器上運行(您知道這一點)。

現在的工作是將Tensor轉換爲numpy數組。要做到這一點,我們需要 評估張量使用其評估張量。但爲了做到這一點,我們需要一個抓取張量流會話。

使用keras後端模塊的get_session()方法來抓取當前張量流會話。

這裏是文檔字符串爲get_session()

def get_session(): 
    """Returns the TF session to be used by the backend. 
    If a default TensorFlow session is available, we will return it. 
    Else, we will return the global Keras session. 
    If no global Keras session exists at this point: 
    we will create a new global session. 
    Note that you can manually set the global session 
    via `K.set_session(sess)`. 
    # Returns 
     A TensorFlow session. 
    """ 

所以嘗試:

def image_func(img) 

    from keras import backend as K 

    sess = K.get_session() 
    img = sess.run(img) # now img is a proper numpy array 

    img=cv2.cvtColor(img,cv2.COLOR_BGR2YUV) 
    img=cv2.resize(img,(200,66)) 
    return img 

注意,我一直沒能測試這個

編輯:剛剛測試這一點,它不會工作(正如你注意到的)。 lambda函數需要返回 張量。計算流程會拋出一個張量,所以它也需要在分化的意義上保持平滑。

我看到基本上拉姆達正在改變顏色並調整圖像大小,爲什麼不在預處理步驟中這樣做?

+0

我測試了一下。但是lambda層需要張量對象。具體說它應該是佔位符。但是你正在返回一張圖片。應該如何改變? –