2016-02-04 9 views
5

पर छवि टेंसर का आकार बदलें मैं टेंसरफ्लो के साथ छवि वर्गीकरण समस्या के लिए कुछ छवि इनपुट पढ़ने की कोशिश कर रहा हूं।TensorFlow गतिशील आकार

बेशक, मैं tf.image.decode_jpeg(...) के साथ ऐसा कर रहा हूं। मेरी छवियों में परिवर्तनीय आकार है और इसलिए मैं छवि टेंसर के लिए एक निश्चित आकार निर्दिष्ट करने में सक्षम नहीं हूं।

लेकिन मुझे छवियों को उनके वास्तविक आकार के आधार पर स्केल करने की आवश्यकता है। विशेष रूप से, मैं छोटी तरफ एक निश्चित मूल्य और लंबी तरफ स्केल अनुपात को संरक्षित करना चाहता हूं।

मैं shape = tf.shape(image) द्वारा एक निश्चित छवि का वास्तविक आकार प्राप्त कर सकता हूं। मैं भी अब है कि मैं tf.image.resize_images(...) को new_height और new_width पारित नहीं कर सकते क्योंकि उनमें से एक एक टेन्सर है और resize_images ऊंचाई और चौड़ाई इनपुट के रूप में पूर्णांकों की उम्मीद की तरह

shape = tf.shape(image) 
height = shape[0] 
width = shape[1] 
new_shorter_edge = 400 
if height <= width: 
    new_height = new_shorter_edge 
    new_width = ((width/height) * new_shorter_edge) 
else: 
    new_width = new_shorter_edge 
    new_height = ((height/width) * new_shorter_edge) 

मेरे समस्या नई नहीं रह बढ़त के लिए गणना करने के लिए कर रहा हूँ ।

क्या टेंसर के पूर्णांक को "बाहर खींचने" का कोई तरीका है या क्या TensorFlow के साथ मेरा कार्य करने का कोई अन्य तरीका है?

अग्रिम धन्यवाद।


संपादित

जब से मैं भी tf.image.resize_images साथ some other issues था, यहाँ कोड है कि मेरे लिए काम किया है:

shape = tf.shape(image) 
height = shape[0] 
width = shape[1] 
new_shorter_edge = tf.constant(400, dtype=tf.int32) 

height_smaller_than_width = tf.less_equal(height, width) 
new_height_and_width = tf.cond(
    height_smaller_than_width, 
    lambda: (new_shorter_edge, _compute_longer_edge(height, width, new_shorter_edge)), 
    lambda: (_compute_longer_edge(width, height, new_shorter_edge), new_shorter_edge) 
) 

image = tf.expand_dims(image, 0) 
image = tf.image.resize_bilinear(image, tf.pack(new_height_and_width)) 
image = tf.squeeze(image, [0]) 

उत्तर

4

इस (वर्तमान में प्रयोगात्मक उपयोग करने के लिए है करने के लिए जिस तरह से, लेकिन अगली रिलीज में उपलब्ध) tf.cond() * ऑपरेटर। यह ऑपरेटर रनटाइम पर गणना की गई मान का परीक्षण करने में सक्षम है, और उस मान के आधार पर दो शाखाओं में से एक को निष्पादित करता है।

shape = tf.shape(image) 
height = shape[0] 
width = shape[1] 
new_shorter_edge = 400 
height_smaller_than_width = tf.less_equal(height, width) 

new_shorter_edge = tf.constant(400) 
new_height, new_width = tf.cond(
    height_smaller_than_width, 
    lambda: new_shorter_edge, (width/height) * new_shorter_edge, 
    lambda: new_shorter_edge, (height/width) * new_shorter_edge) 

अब आप जो रनटाइम के दौरान उचित मूल्य ले जाएगा new_height और new_width के लिए Tensor मान हैं।


*   वर्तमान जारी किया संस्करण में ऑपरेटर का उपयोग करने के लिए, आप निम्नलिखित आयात करने के लिए की आवश्यकता होगी:

from tensorflow.python.ops import control_flow_ops 

... और फिर tf.cond() की control_flow_ops.cond() का उपयोग करने के बजाय।

+0

यह बहुत अच्छी, अच्छी सुविधा है। लेकिन मेरी समस्या अभी भी मौजूद है। 'tf.image.resize_images (...) 'दूसरे और तीसरे तर्क के रूप में' int32' लेता है। यही वह जगह है जहां 'new_height' और' new_width' के मान चलना चाहिए। टेंसरफ्लो की मेरी समझ में, 'eval()' के लिए एक कॉल काम नहीं करेगा क्योंकि यह केवल रनटाइम पर मूल्यांकन किया जाता है। क्या ग्राफ़ बिल्डिंग समय पर "टेंसर के पहले (और केवल) पूर्णांक को खींचने के लिए" टेंसरफ्लो "कहने का कोई आदेश है? – mackcmillion

+0

कॉलिंग 'tf.image.resize_images (छवि, new_height, new_width)' हमेशा फेंकता है 'टाइपरर: अपेक्षित int32, इसके बजाय' _Message 'प्रकार के टेंसर युक्त सूची मिली। – mackcmillion

+0

आह, यह मेरे लिए एक बग जैसा लगता है। मैंने दायर किया [एक मुद्दा] (https://github.com/tensorflow/tensorflow/issues/1001) और जल्द ही एक फिक्स आउट करने का प्रयास करेगा। – mrry