2016-08-12 5 views
13

TensorFlow에는 교육 과정에서 입력 이미지 왜곡에 사용되는 이미지 작업이 많이 있습니다. tf.image.random_flip_left_right(image, seed=None)tf.image.random_brightness(image, max_delta, seed=None) 등 여러 가지가 있습니다.TensorFlow 배치 작업을위한 이미지 작업

이러한 기능은 단일 이미지 (즉, [높이, 너비, 색상 채널] 모양의 3 차원 텐서)에 대해 수행됩니다. 이미지 묶음 (예 : 모양 [배치, 높이, 너비, 색상 채널]이있는 4 차원 텐서)에서 작동하게하려면 어떻게해야합니까?

실용 예제는 대단히 감사하겠습니다!

답변

22

하나의 가능성은 각 요소의 배치에 단일 이미지 연산자를 적용하는 최근 tf.map_fn() 첨가를 사용하는 것이다.

result = tf.map_fn(lambda img: tf.image.random_flip_left_right(img), images) 

이 효과적으로 keveman suggests 건물과 같은 그래프를 생성하지만 루프에 대한 TensorFlow의 지원을 사용하여 큰 일괄 처리 크기보다 효율적으로 할 수있다.

+1

고마워요! tf.image의 함수에이 내장 함수가없는 이유가 있습니까? tf.map_fn()에서 호출 된 단일 함수 전처리()에서 모든 이미지 왜곡을 만들었습니다. map_fn()은 새로운 임의의 값으로 preprocess()를 반복적으로 호출하기 때문에 이것이 임의의 왜곡을 모든 이미지에 대해 다른 것으로 만듭니다. 귀하의 답변과 제안 된 다른 답변 사이의 차이점, 그리고 왜 map_fn()이 더 나은 해결책인지 자세히 설명해주십시오. 나는 런타임에 이미지 위에 tf.map_fn()이 반복되는 것을 추측하고 있으므로 일괄 처리의 각 이미지에 대한 그래프에 연산을 추가하지 않습니까? – questiondude

+0

감사. 나는 이것을했고, 효과가 있었다. 그러나 이제는 교육이 변환없이 5 배 더 느려지므로 효율성이 떨어집니다 .-( –

3

이미지 작업을 루프로 호출하고 결과를 연결할 수 있습니다. 예를 들어

transformed_images = [] 
for i in range(batch_size): 
    transformed_images.append(
    tf.expand_dims(tf.image.random_flip_left_right(image[i, :, :, :]), 0)) 
retsult = tf.concat(0, transformed_images) 
+0

빠른 답변에 감사드립니다. 나는 이런 식으로 생각했지만, 배치의 각 이미지에 대해 TensorFlow 그래프에 연산을 추가 할 것이므로 배치 크기가 다양하기 때문에 작동하지 않을 것이라고 생각합니다.나는 내가 필요로하는 각각의 배치 크기에 대한 그래프를 만들 수 있다고 생각하지만, 다소 난잡 해 보인다. 다른 대답은 올바른 방법으로 생각됩니다. 다시 한번 고마워. – questiondude

2

TLDR : 대기열을 생성하고 대기열의 단일 요소에 대한 데이터 읽기 및 처리를 정의하고 일괄 처리를 만드는 것 -이 모든 것을 TF 방법으로 수행 할 수 있습니다.

어떻게 작동하는지 잘 모르겠지만 대기열을 사용하고 일괄 처리를 만들고 tensorflow 메소드로 이미지를 읽으면 단일 이미지와 같이 배치로 작업 할 수 있습니다.

큰 데이터 세트에서는 아직 테스트하지 않았고 속도, 메모리 사용량 등을 잘 모릅니다. 지금 당장은 스스로 배치를 만드는 것이 좋습니다.

나는 이것을 cifar10 예제에서 보았습니다. 여기에서 볼 수 있습니다. https://github.com/tensorflow/tensorflow/tree/r0.10/tensorflow/models/image/cifar10

  1. 먼저 큐는 tf.train.string_input_producer으로 만듭니다. https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L222 다른 유형의 대기열을 사용할 수 있습니다. 예를 들어 여러 이미지에 tf.train.slice_input_producer을 사용하려고합니다. 당신은 그것에 대해 읽을 수 있습니다 여기 Tensorflow read images with labels
  2. 그럼 그들은 하나의 이미지로 모든 필요한 작업을합니다. 독서 만하면됩니다. 독서 일뿐입니다. 가공을 원한다면 이미지를 자르고 다른 일을하십시오. 독서는 read_cifar10에 설명되어 있습니다. distorted_inputs에서의 처리, 그것은 그들이 파라미터에 따라 tf.train.batch 또는 tf.train.shuffle_batch 2의 결과를 전달하고 inputs()distorted_inputs() 함수로부터 반환 여기 https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_input.py#L138
  3. 이다.
  4. 그들은 images, labels = cifar10.distorted_inputs()처럼 읽고 다음과 같은 일을합니다. 그것은 당신이 모양 [배치, 높이, 폭, 채널] 4 차원 텐서에 tf.image.random_flip_left_right 및 tf.image.random_flip_up_down을 시뮬레이션 tf.reverse를 사용할 수 있습니다 여기 https://github.com/tensorflow/tensorflow/blob/r0.10/tensorflow/models/image/cifar10/cifar10_train.py#L66
관련 문제