2017-01-10 8 views
0

Tensorflow에서 동적으로 결정된 이미지 자르기 방법을 파악하려고합니다. 아래는 내가 성취하려고 시도하는 것의 예입니다. 그러나 나는 그것을 작동시키는 것처럼 보이지 않습니다. 본질적으로, 나는 그래프 안에 그 이미지에 대한 이미지들과 자르기 값을 공급하고, 그 자른 조각들에 대한 다른 계산들을 계속하고 싶다. 나의 현재 시도 :Tensorflow의 동적 이미지 자르기

import tensorflow as tf 
from matplotlib import pyplot as plt 
import numpy as np 

sess = tf.InteractiveSession() 

img1 = np.random.random([400, 600, 3]) 
img2 = np.random.random([400, 600, 3]) 
img3 = np.random.random([400, 600, 3]) 

images = [img1, img2, img3] 

img1_crop = [100, 100, 100, 100] 
img2_crop = [200, 150, 100, 100] 
img3_crop = [150, 200, 100, 100] 

crop_values = [img1_crop, img2_crop, img3_crop] 

def crop_image(img, crop): 
    tf.image.crop_to_bounding_box(img, 
            crop[0], 
            crop[1], 
            crop[2], 
            crop[3]) 


image_placeholder = tf.placeholder("float", [None, 400, 600, 3]) 
crop_placeholder = tf.placeholder(dtype=tf.int32) 
sess.run(tf.global_variables_initializer()) 

cropped_image = tf.map_fn(lambda img, crop: crop_image(img, crop), elems=[image_placeholder, crop_placeholder]) 
result = sess.run(cropped_image, feed_dict={image_placeholder: images, crop_placeholder:crop_values}) 

plt.imshow(result) 
plt.show() 
 
/Users/p111/anaconda/bin/python /Users/p111/PycharmProjects/analysis_code/testing.py 
Traceback (most recent call last): 
    File "/Users/p111/PycharmProjects/analysis_code/testing.py", line 31, in 
    cropped_image = tf.map_fn(lambda img, crop: crop_image(img, crop), elems=[image_placeholder, crop_placeholder]) 
    File "/Users/p111/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/functional_ops.py", line 390, in map_fn 
    swap_memory=swap_memory) 
    File "/Users/p111/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2636, in while_loop 
    result = context.BuildLoop(cond, body, loop_vars, shape_invariants) 
    File "/Users/p111/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2469, in BuildLoop 
    pred, body, original_loop_vars, loop_vars, shape_invariants) 
    File "/Users/p111/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/control_flow_ops.py", line 2419, in _BuildLoop 
    body_result = body(*packed_vars_for_body) 
    File "/Users/p111/anaconda/lib/python3.5/site-packages/tensorflow/python/ops/functional_ops.py", line 380, in compute 
    packed_fn_values = fn(packed_values) 
TypeError:() missing 1 required positional argument: 'crop' 

편집 : elems는 하나의 텐서을 받아 들일 것으로 보인다. 즉, 어떻게 든 두 개의 텐서를 하나로 결합한 다음 값을 얻기 위해 함수에서 압축을 풀어야한다는 의미입니다. 나는 그런 종류의 텐서 조작을 어떻게 수행 할 지 모르겠습니다. 나는 엿볼 방법을 이미 발견했으나 효과가있다. 그러나이 특정 방법으로 동일하게 처리 할 수 ​​있는지 궁금하다. 주로, 나는이 방법으로 사용할 수 있도록 한 쌍의 텐서를 어떻게 조합하고 나눌 지 궁금합니다.

+0

? 역 추적이 있다면, 전체를 게시하십시오! 미안해, – mrry

+0

. 추가 스택 추적. 나는 그 문제가 명백해질 수있는 아주 간단한 문제인 것 같아서 방금 생각했다. 나는 이것에 대해 어떻게 든 최선의 방법으로 가고 있다고 확신하지 못합니다. – Beaker

답변

1

이 코드는 here에서 확인했습니다.

elems = (np.array([1, 2, 3]), np.array([-1, 1, -1])) 
alternate = map_fn(lambda x: x[0] * x[1], elems, dtype=tf.int64) 
# alternate == [-1, 2, -3] 

튜플 또는 목록을 사용하여 여러 요소를 하나로 묶을 수 있습니다.

import tensorflow as tf 
from matplotlib import pyplot as plt 
import numpy as np 

sess = tf.InteractiveSession() 

img1 = np.random.random([400, 600, 3]) 
img2 = np.random.random([400, 600, 3]) 
img3 = np.random.random([400, 600, 3]) 
images = np.array([img1, img2, img3]) 
# images = tf.convert_to_tensor(images) # it can be uncommented. 

img1_crop = [100, 100, 100, 100] 
img2_crop = [200, 150, 100, 100] 
img3_crop = [150, 200, 100, 100] 
crop_values = np.array([img1_crop, img2_crop, img3_crop]) 
# crop_values = tf.convert_to_tensor(crop_values) # it can be uncommented. 

def crop_image(img, crop): 
    return tf.image.crop_to_bounding_box(img, 
             crop[0], 
             crop[1], 
             crop[2], 
             crop[3]) 

fn = lambda x: crop_image(x[0], x[1]) 
elems = (images, crop_values) 

cropped_image = tf.map_fn(fn, elems=elems, dtype=tf.float64) 
result = sess.run(cropped_image) 

print result.shape 

plt.imshow(result[0]) 
plt.show() 

이 컴퓨터는 tf 버전 0.11 및 python2로 작동합니다. 희망이 당신을 도울 수 있습니다. 사물의

+0

나는 왜 내가 이걸 알아 내지 못했는지 모르겠다. 당신은 그렇게 간단하게 보이게합니다! 감사! – Beaker

0

tf.map_fn (f, l)은리스트 l의 모든 텐서에 대해 함수 f를 실행합니다. 귀하의 경우, 귀하의 함수는 2 개의 인수를 기대하지만, 평면 목록을 제공하기 때문에 map_fn()은 하나씩 차례로 그것을 보냅니다. 문서에 따르면, map_fn()는 변수 인수에 대응을 지원합니다, 그래서 당신이해야 할 것은이

 
tf.map_fn(lambda img, crop: crop_image(img, crop), 
      elems=([image_placeholder, crop_placeholder],)) 

같은 그래서 당신은 map_fn에 전달 목록이 인수의 쌍을 포함한다.

+0

TypeError : () 누락 1 필수 위치 인수 : 'crop' – Beaker

+0

예제가 필요하지 않고 실행됩니다. 따라서 위의 코드를 사용하여 메서드를 시험해 볼 수 있습니다. – Beaker

+0

이것이 파이썬 3에서 차이가 나는 경우이 파이썬 3입니다. – Beaker

1

커플 :

  • 당신은 crop_image 기능에 return 문이 없습니다.
  • map_fn은 단일 인수를 허용합니다.
  • 그래프 정의와 세션 ​​사용을 분리하는 것이 좋습니다.

- 현재의 시도와 함께 잘못 무엇

# Graph def 
def crop_image(img, crop): 
    return tf.image.crop_to_bounding_box(img, 
            crop[0], 
            crop[1], 
            crop[2], 
            crop[3]) 

image_placeholder = tf.placeholder(tf.float32, [None, 400, 600, 3]) 
crop_placeholder = tf.placeholder(dtype=tf.int32) 
cropped_image = tf.map_fn(lambda inputs: crop_image(*inputs), elems=[image_placeholder, crop_placeholder], dtype=tf.float32) 


# Session 
sess = tf.InteractiveSession() 

img1 = np.random.random([400, 600, 3]) 
img2 = np.random.random([400, 600, 3]) 
img3 = np.random.random([400, 600, 3]) 

images = [img1, img2, img3] 

img1_crop = [100, 100, 100, 100] 
img2_crop = [200, 150, 100, 100] 
img3_crop = [150, 200, 100, 100] 

crop_values = [img1_crop, img2_crop, img3_crop] 

sess.run(tf.global_variables_initializer()) 

result = sess.run(cropped_image, feed_dict={image_placeholder: images, crop_placeholder:crop_values}) 

plt.imshow(result[0]) 
plt.show()