python - 大型 .tif 图像数据集 - 如何使用带有单独 CSV 中标签的 Tensorflow 将其转换为 CNN 的可用数据集?蟒蛇 3
问题描述
几天来,我一直试图找到一种方法将我的 270,000 个 .tif 图像及其相应的标签转换为可用的 Tensorflow 数据集,我决定在这里发帖寻求帮助。
我目前所做的只是获取图像的一个子集并将它们转换为 numpy 数组,然后将它们放入一个列表中。我也用标签做到了这一点。所以我现在有一个有两列的熊猫数据框;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 数组列表和我的 labels_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 的方法。
解决方案
像本文一样加载数据:
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
推荐阅读
- reactjs - 打字稿和上下文 API
- arrays - 尝试向对象数组添加新元素,但在成功推送数组(用户)中的第一个对象之后。它再次重写它
- c# - 我如何激活另一个循环(如果 /else if)
- youtube - YouTube Data API:上传我的视频时选择目标 YT 频道
- terraform - 如何检测在 Terraform 之外所做的更改?
- python - Python/Flask 获取 HTML 输入并将它们存储在 SQL Server 数据库中
- php - 仅将多维数组与键数组进行比较
- iot - ModuleClient IoT Hub Edge 设备:如何从设备队列接收消息?
- c# - Word Automation 重置编号方案
- json - 处理应该是 json 的数据框列时出现 JSONDecodeError