簡體   English   中英

使用圖像作為特征和 .csv 文件作為標簽構建 tf.data.Dataset 對象

[英]Building a tf.data.Dataset object with images as features and .csv files as labels

我正在研究一個深度學習項目,試圖自動檢測給定圖像的人的關節,但我一直在嘗試以正確的格式將數據提供給我的神經網絡。 我的特征 (x) 是非常大的圖像 (2000x900),我的標簽 (y) 是 .csv 文件,有四列,每列 15 行:第一列包含字符串(關節名稱),其他三列包含整數(每行每列一個整數)。 .csv 文件如下所示:

Left_knee, vis, x, y

Right_knee, vis, x, y

...(這里的 x 和 y 代表圖像坐標,而不是特征和標簽!vis 為 0 或 1,表示關節是否可見)

每個 .csv 文件對應一個特定的圖像,.csv 文件和對應的圖像名稱相同但路徑不同。 現在,我想創建一個 tf.data.Dataset 對象,其中特征是圖像,標簽是從 .csv 文件構建的 Python 詞典。 因此,例如,對應於圖像 x(i) 的單個標簽 y(i) 需要如下所示: {'Left_knee': [vis, x, y], 'Right_knee': [vis, x, y] , ...}。

我構建這樣一個數據集的策略是將圖像和標簽加載到單獨的 tf.data.Dataset 對象中,然后將它們融合在一起。 為了加載圖像,我寫了這個非常准系統(可能效率低下/錯誤?)的代碼:

imgs_path = pathlib.Path('path/to/images')
list_imgs = tf.data.Dataset.list_files(str(imgs_path/'*'))

def imgs_to_dataset(file_path):
    return tf.io.read_file(file_path)

imgs_dataset = list_imgs.map(imgs_to_dataset)

老實說,我對 TensorFlow(以及一般的編程!)太陌生了,無法以任何方式測試它以發現潛在問題,但它至少不會給我任何錯誤。

現在,我的問題是如何將 .csv 文件加載到 tf.data.Dataset 對象中,然后將其與 imgs_dataset 融合,以便為每個圖像添加正確的標簽。 我知道我必須使用類似 tf.data.experimental.make_csv_dataset 的東西,但我不太確定如何設置它以便我的 y 是我想要的格式。 有沒有辦法做到這一點,還是我走錯了路? 我應該澄清一下,我對使用 tf.data.Dataset 對象的想法沒有任何依戀,但據我所知,這似乎是一種非常方便(如果您可以設置!)將數據提供給 tf 的方法.keras 模型通過 .fit()。 此外,我希望以這種特定方式(即作為字典)構建標簽,因為我的網絡損失將需要訪問標簽的不同字段(例如,如果對於給定的圖像和給定的關節,關節的 vis 參數為 0)。 但也許有更有效的方法來構建我的標簽來實現這個目標?

任何幫助和建議將不勝感激! 提前致謝。

我認為tf.data.Dataset是一個很好的方法。 您不需要創建兩個數據集並將它們融合在一起,您可以首先使用例如加載您的數據集。 from_tensor_slceslist_filesfrom_generator ,然后繼續應用地圖函數,如果需要,這些函數from_generator你的圖像進行后處理,並加載你的標簽的后處理,即將它們從 pd.DataFrame 轉換為 dict。 然后,您的 map 函數會將圖像元組作為張量返回,並將它們的標簽作為 dicts。 映射后,您也可以應用改組和批處理。

文檔中的示例:

dataset = Dataset.range(5)
# `map_func` takes a single argument of type `tf.Tensor` with the same
# shape and dtype.
result = dataset.map(lambda x: x + 1) 

map結構方式在很大程度上取決於文件的結構和命名。 您可能想用自己的自定義函數替換 lambda 函數,

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM