大型 .tif 图像数据集 - 如何使用带有单独 CSV 标签的 Tensorflow 将其转换为 CNN 的可用数据集?蟒蛇 3

时间:2021-04-16 04:03:15

标签: python numpy tensorflow pytorch conv-neural-network

几天以来,我一直试图找到一种方法将我的 270,000 张 .tif 图像及其相应的标签转换为可用的 Tensorflow 数据集,我决定在这里发帖寻求帮助。

我目前所做的只是获取图像的一个子集并将它们转换为 numpy 数组,然后将它们放入一个列表中。我也用标签做到了这一点。所以我现在有一个有两列的 Pandas 数据框; id(图像文件名)和标签(1 或 0)和 numpy 数组列表。以下是我用来执行此操作的代码。

from PIL import Image
import matplotlib.pyplot as plt
import glob
import tensorflow as tf
import pandas as pd
import re


path = "./training_images/*"

img_names = []
img_arr_list = []
for file in glob.glob(path):
    img = Image.open(file)
    img_arr = np.asarray(img).astype("float32")
    img_arr_list.append(img_arr)
    name = re.split(' |/|\\\\' , file)
    name = name[2][:-4]
    img_names.append(name)

labels = pd.read_csv("train_labels.csv")

# Convert list of file names to a pandas dataframe and change the 0 field to "id" to match the field
# name in labels
name_df = pd.DataFrame(img_names)
name_df = name_df.rename(columns={0:"id"})

# inner join to get only the images names and their labels that exist in the image subset
labels_df = pd.merge(name_df,labels,on='id',how='inner')

从这里开始,我尝试将我的 numpy 数组列表以及它的相应标签转换为 Tensorflow 数据集,然后我可以对其进行预处理,然后输入到我稍后将创建的 CNN 中。当我执行以下代码时......

train_dataset = tf.data.Dataset.from_tensor_slices((img_arr_list, labels_df))

.. 我收到这个错误..

ValueError: Failed to convert a NumPy array to a Tensor (Unsupported object type int).

我相信我这样做是错误的,需要做一些事情,我迭代我的 numpy 数组列表和我的 label_df 以在 for 循环中的每个循环期间创建一个张量,然后将它们附加到 Tensorflow 数据集。下面是我想到使用的一些伪代码。

for row in [0,len(img_arr_list)]:
    tensor = tf.data.Dataset.from_tensor_slices((img_arr_list[row], labels_df.iloc[row]))
    <append tensor to tensorflow dataset>

任何帮助将不胜感激。我也愿意使用基于 pytorch 的方法。

1 个答案:

答案 0 :(得分:0)

像这样加载数据article

def create_dataset(img_folder):
   
    img_data_array=[]
    class_name=[]
   
    for dir1 in os.listdir(img_folder):
        for file in os.listdir(os.path.join(img_folder, dir1)):
       
            image_path= os.path.join(img_folder, dir1,  file)
            image= cv2.imread( image_path, cv2.COLOR_BGR2RGB)
            image=cv2.resize(image, (IMG_HEIGHT, IMG_WIDTH),interpolation = cv2.INTER_AREA)
            image=np.array(image)
            image = image.astype('float32')
            image /= 255 
            img_data_array.append(image)
            class_name.append(dir1)
    return img_data_array, class_name
相关问题