首页 > 解决方案 > 如何组合图像 id 图像并使用 pytorch 转换为张量

问题描述

我是 PyTorch 的新手,我正在使用 PyTorch 进行图像分类。我有一个单独的图像文件夹,并使用图像 ID 和标签训练和测试 csv 文件。我对如何组合这些图像和 ide 并转换为张量一无所知。我试过了,但它不起作用,请帮助如何为 CNN 模型准备数据。

这里我的数据:

train.head()

image_names emergency_or_not
0   1503.jpg    0
1   1420.jpg    0
2   1764.jpg    0
3   1356.jpg    0
4   1117.jpg    0

这是我的数据文件夹

!ls train_SOaYf6m/
images  test_vc2kHdQ.csv  train.csv

这是我的代码:

批量大小 = 128

validation_split = .3
shuffle_dataset = True
random_seed= 42

dataset_size = len(train)
indices = list(range(dataset_size))
split = int(np.floor(validation_split * dataset_size))
if shuffle_dataset :
    np.random.seed(random_seed)
    np.random.shuffle(indices)
train_indices, val_indices = indices[split:], indices[:split]

class clf_Dataset(Dataset):
  def __init__(self, img_data,img_path,transfrom=None):
    self.img_path=img_path
    self.transfrom=transform
    self.img_data=img_data

  def __len__(self):
    return len(self.img_data)

  def __getitem__(self, index):
    img_name = os.path.join(self.img_path,self.img_data.loc[index, 'labels'],
                                self.img_data.loc[index, 'Images'])
    image = Image.open(img_name)
        #image = image.convert('RGB')
    image = image.resize((300,300))
    label = torch.tensor(self.img_data.loc[index, 'encoded_labels'])
    if self.transform is not None:
          image = self.transform(image)
    return image, label

dataset = clf_Dataset(train,Base_Path,transform)

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-33-e7543361b139> in <module>()
----> 1 dataset = clf_Dataset(train,Base_Path,transform)

NameError: name 'Base_Path' is not defined

标签: deep-learningcomputer-visionpytorch

解决方案


首先,我强烈推荐这个youtube系列来了解 PyTorch 以及与之相关的所有内容

然后你可以这样做,首先你需要将图像分类到这样的文件夹中:

  • 火车文件夹
    • classe_1_folder
    • classe_2_folder
    • ...
  • 测试文件夹
    • classe_1_folder
    • classe_2_folder
    • ...

然后你可以使用下面的函数来加载你的训练集并对你的测试文件夹做同样的事情

train_data = torchvision.datasets.ImageFolder(root= (absolute_path + "train_folder")) 

之后,您可以像这样传递train_data给加载器:

train_loader = torch.utils.data.DataLoader(train_data , ...)

然后用一个简单的 for 循环训练你的模型:

for batch in train_loader:
    ***
    train_your_model()
    ***

编辑:如果你真的需要创建一个类,你可以这样做:

df = pd.read_csv("path_to_fic.csv")

df['label'] = df['label'].astype('category')
encode_map = {
    'label_0': 0
    'label_1': 1,
    ...
}

df['label'].replace(encode_map, inplace=True)

class TrainData(Dataset):

    def __init__(self, images, labels):
        # Add a transform here if you need
        # load your images here if you prefer
        images = ...
        self.images = images
        self.labels = labels

    def __getitem__(self, index):
        return self.images[index], self.labels[index]

    def __len__ (self):
        return len(self.images)

# images = Im.open() # probably need a for loop to load all your images
# images = df[path_to_csv]
images = ... # you can load here or in the class
# depends if you want to pass the dataframe containing the location or the images themselves
labels = df['label']

train_data = TrainData(torch.FloatTensor(images),
                       torch.FloatTensor(labels))

train_loader = DataLoader(dataset=train_data, batch_size=BATCH_SIZE, shuffle=True)

推荐阅读