как объединить изображения id изображений и преобразовать в тензоры с помощью pytorch - PullRequest
0 голосов
/ 17 июня 2020

Я новичок ie в PyTorch, я делаю классификацию изображений с помощью PyTorch. У меня есть отдельная папка с изображениями, а также обучающий и тестовый файл csv с идентификаторами изображений и метками. Я понятия не имею, как объединить эти изображения и идеи и преобразовать их в тензоры. Я пробовал, но это не работает, пожалуйста, помогите, как подготовить данные для модели 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

Вот мой код:

batch_size = 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

1 Ответ

0 голосов
/ 18 июня 2020

Во-первых, я настоятельно рекомендую эту серию youtube , чтобы понять PyTorch и все, что с ним связано.

Тогда вы можете сделать это так: сначала вам нужно отсортировать изображения по папкам, например это:

  • train_folder
    • classe_1_folder
    • classe_2_folder
    • ...
  • test_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 , ...)

А затем обучить свою модель простым для l oop :

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...