Как работать с Multi Label DataSet из каталога для подписи изображений в PyTorch - PullRequest
0 голосов
/ 23 ноября 2018

Мне нужна помощь в PyTorch, относительно Dataloader и набора данных. Может ли кто-нибудь помочь мне / направить меня

Вот мой запрос: я пытаюсь использовать для субтитров изображения с помощью https://github.com/yunjey/pytorch-tutorial/tree/master/tutorials/03-advanced/image_captioning.

Вот онииспользовали стандартный набор данных COCO.

У меня есть набор данных как images / и заголовки / directory.

Пример

Структура каталогов:

images/T001.jpg 
images/T002.jpg 
...
...
captions/T001.txt
captions/T002.txt
....
....

Вышеэто отношение.Файл с заголовками содержит n подписей в каждой отдельной строке.

Я могу создать собственный класс набора данных, в котором возвращается полное содержимое файла заголовка.Но я хочу, чтобы был возвращен только один газ.

Любое руководство / предложение о том, как этого добиться.

++++++++++++++++++++++++++++++++++++++++++++++++ Вот класс, который я разработал:

from __future__ import print_function
import torch
from torchvision import datasets, models, transforms
from torchvision import transforms
from torch.autograd import Variable
from torch.nn.utils.rnn import pack_padded_sequence
import torch.optim as optim
import torch.nn as nn
#from torch import np
import numpy as np
import utils_c
from data_loader_c import get_cust_data_loader 
from models import CNN, RNN
from vocab_custom import Vocabulary, load_vocab
import os

class ImageCaptionDataSet(data.Dataset):
    def __init__(self, path, json, vocab=None, transform=None):
        self.vocab = vocab 
        self.transform = transform
        self.img_dir_path = path  
        self.cap_dir_path = json 
        self.all_imgs_path = glob.glob(os.path.join(self.img_dir_path,'*.jpg'))
        self.all_caps_path = glob.glob(os.path.join(self.cap_dir_path,'*.txt'))
        pass

    def __getitem__(self,index):
        vocab = self.vocab

        img_path = self.all_imgs_path[index]
        img_base_name = os.path.basename(img_path) 
        cap_base_name = img_base_name.replace(".jpg",".txt")
        cap_path  = os.path.join(self.cap_dir_path,cap_base_name)

        caption_all_for_a_image = open(cap_path).read().split("\n")

        image = Image.open(img_path)
        image = image.convert('RGB')

        if self.transform != None:
            # apply image preprocessing
            image = self.transform(image)

        #captions_combined = []
        #max_len = 0  
        #for caption in caption_all_for_a_image:
        #    caption_str = str(caption).lower()
        #    tokens = nltk.tokenize.word_tokenize(caption_str)
        #    m = len(tokens) + 2 
        #    if m>max_len:
        #        max_len = m 
        #    caption = torch.Tensor([vocab(vocab.start_token())] +
        #                           [vocab(token) for token in tokens] +
        #                           [vocab(vocab.end_token())])
        #    captions_combined.append(caption) 
        #    #yield image, caption
        #return image,torch.Tensor(captions_combined)

        caption_str = str(caption_all_for_a_image).lower()
        tokens = nltk.tokenize.word_tokenize(caption_str)
        caption = torch.Tensor([vocab(vocab.start_token())] +
                                   [vocab(token) for token in tokens] +
                                   [vocab(vocab.end_token())])

        return image,caption

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

+++++++++++++++++++++++++++++++++

1 Ответ

0 голосов
/ 23 ноября 2018

Во-первых, использование str() для преобразования списка заголовков в одну строку (caption_str = str(caption_all_for_a_image)) - это плохая идея:

cap = ['a sentence', 'bla bla bla']
str(cap)

Возвращает sting :

"['a sentence', 'bla bla bla']"

Обратите внимание, что [' и ', ' являются частью полученной строки!

Вы можетевыберите один из заголовков случайным образом:

import random
...
cap_idx = random.randi(0, len(caption_all_for_a_image)-1)  # pick one at random
caption_str = caption_all_for_a_image[cap_idx].lower()  # actual selection
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...