2016-01-27 79 views
5

我已經創建了一個數據集並將其保存到TFRecord文件中。事情是圖片有不同的大小,所以我想要保存大小以及圖像。所以我用了TFRecordWriter和定義的功能,如:如何在TFRecord文件中讀取不同大小的圖像

example = tf.train.Example(features=tf.train.Features(feature={ 
    'rows': _int64_feature(image.shape[0]), 
    'cols': _int64_feature(image.shape[1]), 
    'image_raw': _bytes_feature(image_raw)})) 

我的預期,我可以閱讀和使用TFRecordReader解碼圖像,但事情是我無法從文件中獲取行和cols的值,因爲它們是張量。那麼,我該如何動態讀取尺寸並相應地重新塑造圖像。謝謝你們

回答

2

你可以撥打tf.reshape動態shape參數。

image_rows = tf.cast(features['rows'], tf.int32) 
image_cols = tf.cast(features['cols'], tf.int32) 
image_data = tf.decode_raw(features['image_raw'], tf.uint8) 
image = tf.reshape(image_data, tf.pack([image_rows, image_cols, 3])) 
+0

它引發錯誤「所有形狀必須完全定義:1」。從日誌看來,它似乎與函數「tf.train.shuffle_batch()」有關。那我該怎麼做? –

+0

批處理需要在圖形構建過程中知道形狀(以便知道需要爲隊列分配多少內存),也許在tf.batch之前使用tf.image.resize_images?如果您使用任何標準的細分網頁,則無論如何需要將圖像尺寸調整爲相同的尺寸 –

+0

+ Tong Shen,因爲您正在構建批量圖像,所以圖像必須具有相同的尺寸。如果你事先知道這個大小,也許你可以調用像'image.set_shape([32,32,3])'來完全定義形狀。 – bgshi

2

我建議像一個工作流程:

TARGET_HEIGHT = 500 
TARGET_WIDTH = 500 

image = tf.image.decode_jpeg(image_buffer, channels=3) 
image = tf.image.convert_image_dtype(image, dtype=tf.float32) 

# Choose your bbox here. 
bbox_begin = ... (should be (h_start, w_start, 0)) 
bbox_size = tf.constant((TARGET_HEIGHT, TARGET_WIDTH, 3), dtype=tf.int32) 

cropped_image = tf.slice(image, bbox_begin, bbox_size) 

cropped_image具有恆定的張量大小,然後被扔進一個洗牌批次。

您可以使用tf.shape(image)動態訪問解碼圖像的大小。您可以對生成的子元素進行計算,然後使用類似bbox_begin = tf.pack([bbox_h_start, bbox_y_start, 0])的東西將它們縫合在一起。只需要在那裏插入自己的邏輯來確定裁剪的起點,以及如果圖像的起點小於您想要的管線的長度,您想要做什麼。

如果您只想擴大如果圖片小於您的目標尺寸,則需要使用tf.control_flow_ops.cond或同等效果。但你可能使用最小和最大操作來設置裁剪窗口的大小,以便您返回完整的圖像,如果它小於請求的尺寸,然後無條件地調整大小到500x500。裁剪的圖像已經在500x500,所以調整大小應該成爲一個有效的禁用。

+0

這個工作流程將與FIFO文件隊列一起工作嗎?現在的事情是我想用500 * 500隨機剪裁圖片,你的方式似乎是一個固定的區域。現在我已經預先調整了圖像的大小,所以最小尺寸等於或大於500.我唯一面臨的是如何從原始字符串解碼圖像並將其重新設置爲原始大小。由於圖像中的重量和高度不同,我們無法使用固定尺寸。 –

+0

對,你需要隨機選擇500x500 bbox的開始。通過將bbox_size設置爲[500,500,3](3代表通道數),您將獲得500x500的裁剪。您必須設置隨機裁剪的起點,具體取決於您的首選隨機裁剪算法。假設你調整了大小,你可以簡單地執行'imageshape = tf.shape(image)',然後設置開始和結束點,如:'h_start = tf.random_uniform([],minval = 0,maxval = imageshape [0 ] -500,dtype = tf.int32)'和w_start類似。 – dga

相關問題