Обращение за помощью !!
Привет всем, кто работает над моей первой не 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')]
Можете ли вы руководить мной или показать мне подход, который используется в промышленности для решения этой задачи?Ваш вклад будет приветствоваться, Арно Ванет ....