построение структуры данных для генерации отображения векторов one_hot на изображения различных классов, перечисленных в каталоге файлов изображений - PullRequest
0 голосов
/ 12 июня 2018

Обращение за помощью !!

Привет всем, кто работает над моей первой не MNIST BS!проект по компьютерному зрению с глубоким изучением и с трудностями, связанными с конвейером входных данных.

моя проблема заключается в следующем:

я использую инфраструктуру tenorflow / python

у меня естьнабор данных файлов изображений, структурированный следующим образом: - каждая папка с ярлыком содержится в корневом каталоге с именем 'images'; - каждое изображение содержится в соответствующей подпапке с ярлыками

    e.g images/tomatoes/1.jpg

всего шесть классов (яблоки), авокадо, бананы, манго, маракуйя, помидоры)

я хочу создать векторы one_hot для каждой метки, и каждый вектор должен быть связан с файлами соответствующего класса (метки)

, учитывая, чтоя работаю с tenorflow, я хочу преобразовать свой набор данных в формат tfrecord, чтобы использовать API tf.Dataset, я изо всех сил пытаюсь создать структуру данных, которая сопоставит каждый из 6 векторов one_hot со всеми изображениями в наборе данных с учетом их соответствующихклассы.

Я видел несколько примеров кода на GitHub, но ония дал только половину решения, это то, что я пробовал до сих пор:

я написал подпрограммы для обработки шагов загрузки и предварительной обработки изображения, и я также нашел на github один для преобразования набора данных (train, test, validation) в tfrecord, но я спотыкаюсь, когда загружаю файлы и сопоставляю их с векторами one_hot с помощью модуля glob

, это то, что я пробовал до сих пор

#generate one_hot vectors given a directory name
#found it on github and added some tweaks
#this is returning a list of one_hot vectors given the number of classes

    import numpy as np

    def one_hot(directory,num_classes=6):

        labels = os.listdir(directory)
        label_scalars = [x for x in range(len(labels))]
        label_scalars = np.asarray(label_scalars)
        num_labels = label_scalars.shape[0]
        index_offset = np.arange(num_labels) * num_classes
        labels_one_hot = np.zeros((num_labels,num_classes))
        labels_one_hot.flat[index_offset + label_scalars.ravel()] = 1
        return labels_one_hot


    #create a tfrecord given images addresses and their labels
    #found it on github

def createDataRecord(out_filename, addrs, labels):
    # open the TFRecord file
    writer = tf.python_io.TFRecordWriter(out_filename)
    for i in range(len(addrs)):
        #print how many images are saved every 100 images
        if not i% 100:
            print('Train data : {}/{}'.format(i,len(addrs)))
            sys.stdout.flush()

        #load the image
        img = load_image(addrs[i])

        label = labels[i]

        if img is None:
            continue

        #create a feature dict
        feature = {
            'image_raw': _bytes_feature(img.tostring()),
            'label': _int64_feature(label)
        }
        #create an example protocol buffer
        example = tf.train.Example(features=tf.train.Features(feature=feature))

        #serialize to string and writer on the file
        writer.write(example.SerializeToString())

    writer.close()
    sys.stdout.flush()



#load the images

addresses = glob.glob('images/*/*.jpg')

# 'images' is the root directory for the files
labels = one_hot('images')


# now the stumbling point, 
#create the datastructure to shuffle the data

from random import shuffle

c = list(zip(addresses,labels))
shuffle(c)
addresses,labels = zip(*c)

---> эта структура данных возвращает только шесть отображений из первого подкаталога, не работая так, как я ожидал.как вы можете видеть здесь:

In [116]: labels = one_hot('images')


labels = labels.tolist()

In [121]: labels
Out[121]: 
[[1.0, 0.0, 0.0, 0.0, 0.0, 0.0],
 [0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
 [0.0, 0.0, 1.0, 0.0, 0.0, 0.0],
 [0.0, 0.0, 0.0, 1.0, 0.0, 0.0],
 [0.0, 0.0, 0.0, 0.0, 1.0, 0.0],
 [0.0, 0.0, 0.0, 0.0, 0.0, 1.0]]


In [117]: addrs = glob.glob('images\*\*.jpg')

In [122]: c = list(zip(labels,addrs))

In [123]: c
Out[123]: 
[([1.0, 0.0, 0.0, 0.0, 0.0, 0.0], 'images\\apples\\0.jpg'),
 ([0.0, 1.0, 0.0, 0.0, 0.0, 0.0], 'images\\apples\\1.jpg'),
 ([0.0, 0.0, 1.0, 0.0, 0.0, 0.0], 'images\\apples\\10.jpg'),
 ([0.0, 0.0, 0.0, 1.0, 0.0, 0.0], 'images\\apples\\11.jpg'),
 ([0.0, 0.0, 0.0, 0.0, 1.0, 0.0], 'images\\apples\\12.jpg'),
 ([0.0, 0.0, 0.0, 0.0, 0.0, 1.0], 'images\\apples\\13.jpg')]

Можете ли вы руководить мной или показать мне подход, который используется в промышленности для решения этой задачи?Ваш вклад будет приветствоваться, Арно Ванет ....

...