Начиная с примера Tensorflow CNN, я пытаюсь чтобы изменить модель, чтобы иметь несколько изображений в качестве входных данных (чтобы входные данные имели не только 3 входных канала, но и кратные 3 путем наложения изображений). Чтобы увеличить ввод, я пытаюсь использовать случайное изображение операции, такие как отражение, контрастность и яркость, предусмотренные в TensorFlow. Мое текущее решение применить одно и то же случайное искажение ко всем входным изображениям состоит в том, чтобы использовать фиксированное начальное значение для этих операций:
def distort_image(image):
flipped_image = tf.image.random_flip_left_right(image, seed=42)
contrast_image = tf.image.random_contrast(flipped_image, lower=0.2, upper=1.8, seed=43)
brightness_image = tf.image.random_brightness(contrast_image, max_delta=0.2, seed=44)
return brightness_image
Этот метод вызывается несколько раз для каждого изображения во время построения графика, поэтому я подумал, что для каждого изображения будет использоваться одна и та же последовательность случайных чисел, и, следовательно, это приведет к тому, что для моей входной последовательности изображений будут применены одни и те же операции с изображениями.
# ...
# distort images
distorted_prediction = distort_image(seq_record.prediction)
distorted_input = []
for i in xrange(INPUT_SEQ_LENGTH):
distorted_input.append(distort_image(seq_record.input[i,:,:,:]))
stacked_distorted_input = tf.concat(2, distorted_input)
# Ensure that the random shuffling has good mixing properties.
min_queue_examples = int(num_examples_per_epoch *
MIN_FRACTION_EXAMPLES_IN_QUEUE)
# Generate a batch of sequences and prediction by building up a queue of examples.
return generate_sequence_batch(stacked_distorted_input, distorted_prediction, min_queue_examples,
batch_size, shuffle=True)
В теории это работает нормально. И после нескольких тестовых прогонов это действительно решило мою проблему. Но через некоторое время я обнаружил, что у меня состояние гонки, потому что я использую входной конвейер кода примера CNN с несколькими потоками (это метод, предлагаемый в TensorFlow для улучшения производительность и уменьшить потребление памяти во время выполнения):
def generate_sequence_batch(sequence_in, prediction, min_queue_examples,
batch_size):
num_preprocess_threads = 8 # <-- !!!
sequence_batch, prediction_batch = tf.train.shuffle_batch(
[sequence_in, prediction],
batch_size=batch_size,
num_threads=num_preprocess_threads,
capacity=min_queue_examples + 3 * batch_size,
min_after_dequeue=min_queue_examples)
return sequence_batch, prediction_batch
Поскольку мои примеры создаются несколькими потоками, больше не гарантируется, что все операции с изображениями будут выполняться в правильном порядке (в смысле правильного порядка случайных операций).
Здесь я дошел до точки, где я полностью застрял. Кто-нибудь знает, как решить эту проблему, чтобы применить одно и то же искажение изображения к нескольким изображениям?
Некоторые мои мысли:
- Я думал о том, чтобы сделать некоторую синхронизацию вокруг этих методов искажения изображения, но я мог найти что-нибудь, предоставленное TensorFlow.
- Я попытался сгенерировать, чтобы сгенерировать случайное число, например. случайную дельту яркости с помощью tf.random_uniform() и использовать это значение для tf.image.adjust_contrast(). Но результатом генератора случайных чисел TensorFlow всегда является тензор, и я не нашел способа использовать этот тензор в качестве параметра для tf.image.adjust_contrast(), который ожидает простой float32 для его < em>contrast_factor.
- Решение, которое (частично) сработает, состоит в том, чтобы объединить все изображения в огромное изображение с помощью tf.concat(), применить случайные операции для изменения контраста и яркости, а затем разделить изображение. Но это не будет работать для случайного перелистывания, потому что это (по крайней мере, в моем случае) изменит порядок изображений, и нет никакого способа определить, выполнил ли tf.image.random_flip_left_right() флип или нет, что потребовалось бы для исправления неправильного порядка изображений в случае необходимости.