2017-03-22 8 views
5

मैं टेन्सफोर्लो में एक अर्थपूर्ण विभाजन नेटवर्क को लागू करने पर काम कर रहा हूं, और मैं यह जानने का प्रयास कर रहा हूं कि प्रशिक्षण के दौरान लेबल की सारांश छवियां कैसे लिखें। मैं पास्कल वीओसी डेटासेट में उपयोग की जाने वाली class segmentation annotations पर समान शैली में छवियों को एन्कोड करना चाहता हूं।टेन्सफोर्लो: पास्कल वीओसी शैली छवि कैसे बनाएं

उदाहरण के लिए, मान लें कि मेरे पास एक नेटवर्क है जो 4 वर्गों के साथ 1 के बैच आकार पर ट्रेन करता है।

[[[0, 1, 3], 
    [2, 0, 1], 
    [3, 1, 2]]] 

एनोटेट छवियों: नेटवर्क अंतिम भविष्यवाणियों को आकार [1, 3, 3, 4]

अनिवार्य रूप से मैं उत्पादन भविष्यवाणियों लेने के लिए और एक टेन्सर उत्पादन के प्रत्येक बिंदु पर सबसे अधिक संभावना क्लास वाली पाने के लिए argmin के माध्यम से इसे चलाने के लिए चाहते हैं लेबल को एन्कोड करने के लिए 255 रंगों के रंग पैलेट का उपयोग करें।

[[ 0, 0, 0], 
    [128, 0, 0], 
    [ 0, 128, 0], 
    [128, 128, 0], 
    [ 0, 0, 128], 
    ... 
    [224, 224, 192]] 

मैं आकार [1, 3, 3, 3] (एक 3x3 रंग छवि) के एक टेन्सर कैसे प्राप्त कर सकता है कि मूल्यों argmin से प्राप्त का उपयोग कर रंग पैलेट में अनुक्रमित: मैं एक टेन्सर सभी रंग ट्रिपल युक्त है?

[[palette[0], palette[1], palette[3]], 
[palette[2], palette[0], palette[1]], 
[palette[3], palette[1], palette[2]]] 

मैं आसानी से tf.py_func में कुछ numpy और जनहित याचिका कोड लपेट सकता है, लेकिन अगर कोई इस परिणाम प्राप्त करने का एक शुद्ध Tensorflow तरीका है मैं सोच रहा हूँ।

संपादित करें: उन उत्सुक लोगों के लिए, यह समाधान है जो मुझे केवल नमस्ते का उपयोग करके मिला है। यह काफी अच्छी तरह से काम करता है, लेकिन मैं अभी भी tf.py_func के उपयोग नापसंद:

import numpy as np 
import tensorflow as tf 


def voc_colormap(N=256): 
    bitget = lambda val, idx: ((val & (1 << idx)) != 0) 

    cmap = np.zeros((N, 3), dtype=np.uint8) 
    for i in range(N): 
     r = g = b = 0 
     c = i 
     for j in range(8): 
      r |= (bitget(c, 0) << 7 - j) 
      g |= (bitget(c, 1) << 7 - j) 
      b |= (bitget(c, 2) << 7 - j) 
      c >>= 3 

     cmap[i, :] = [r, g, b] 
    return cmap 


VOC_COLORMAP = voc_colormap() 


def grayscale_to_voc(input, name="grayscale_to_voc"): 
    return tf.py_func(grayscale_to_voc_impl, [input], tf.uint8, stateful=False, name=name) 


def grayscale_to_voc_impl(input): 
    return np.squeeze(VOC_COLORMAP[input]) 

उत्तर

1

आप tf.gather_nd() उपयोग कर सकते हैं, लेकिन आप उदाहरण के लिए, वांछित छवि प्राप्त करने के पैलेट और logits के आकार को संशोधित करने की आवश्यकता होगी:

import tensorflow as tf 
import numpy as np 
import PIL.Image as Image 

# We can load the palette from some random image in the PASCAL VOC dataset 
palette = Image.open('.../VOC2012/SegmentationClass/2007_000032.png').getpalette() 

# We build a random logits tensor of the requested size 
batch_size = 1 
height = width = 3 
num_classes = 4 
np.random.seed(1234) 
logits = np.random.random_sample((batch_size, height, width, num_classes)) 
logits_argmax = np.argmax(logits, axis=3) # shape = (1, 3, 3) 
# array([[[3, 3, 0], 
#   [1, 3, 1], 
#   [0, 2, 0]]]) 

sess = tf.InteractiveSession() 
image = tf.gather_nd(
    params=tf.reshape(palette, [-1, 3]), # reshaped from list to RGB 
    indices=tf.reshape(logits_argmax, [batch_size, -1, 1])) 
image = tf.cast(tf.reshape(image, [batch_size, height, width, 3]), tf.uint8) 
sess.run(image) 
# array([[[[128, 128, 0], 
#   [128, 128, 0], 
#   [ 0, 0, 0]], 
#   [[128, 0, 0], 
#   [128, 128, 0], 
#   [128, 0, 0]], 
#   [[ 0, 0, 0], 
#   [ 0, 128, 0], 
#   [ 0, 0, 0]]]], dtype=uint8) 

परिणामस्वरूप टेंसर को सीधे tf.summary.image() पर खिलाया जा सकता है, लेकिन आपके कार्यान्वयन के आधार पर आपको सारांश से पहले इसे अपमानित करना चाहिए।

संबंधित मुद्दे