Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TF 2 support #13

Closed
saeedizadi opened this issue Jan 14, 2022 · 1 comment
Closed

Add TF 2 support #13

saeedizadi opened this issue Jan 14, 2022 · 1 comment

Comments

@saeedizadi
Copy link

Hello,

Thank you so much for the great plugin. I think if you advertise it correctly, it will be helping many developers!

I wonder if you could add support for TF2 tensor arrays too. Currently, I have to manually convert tf tensors to numpy tensors with .numpy() to be able to visualize them.

Many thanks

@john-guo
Copy link
Owner

Hi,
Thank you for your suggestion.

Due to I do not have any experience in TF2, I just made a little changes in the python eval expression:

(${vn}.numpy() * 255.0 if (hasattr(${vn}, 'dtype')) and (${vn}.dtype == np.float64 or ${vn}.dtype == np.float32) else ${vn}.numpy()) if callable(getattr(${vn}, 'numpy', None)) else (${vn} * 255.0 if (isinstance(${vn}, (np.ndarray)) and (${vn}.dtype == np.float64 or ${vn}.dtype == np.float32)) else ${vn})

As you noticed that I used "callable(getattr(${vn}, 'numpy', None))" to test if the variable is a tensor. So you must ensure Eager Execution is enabled in TF2 to use this extension. Then I found it's very lucky that tf.dtype is same as np.dtype, so I can directly use np.float32 instead of tf.float32 to test the type avoiding forced "import tensorflow".

Now this change bring a tiny trick to customize if your object cannot be a numpy array directly, just add a "numpy()" method and an additional "dtype" property supporting the normalized image to your object, even you can make a metaclass or decorator something else to take effect for convenience.

for example:

class DebugViewImageWrapper:

    def __init__(self, a):
        self.a = a
    
    def numpy(self):
        return self.a
  
    @property
    def dtype(self):
        return self.a.dtype

img = cv2.imread("test.jpg")
normalized_img = img.astype(np.float32) / 255.
wrapped_img = DebugViewImageWrapper(img)
wrapped_img = DebugViewImageWrapper(normalized_img)

This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants