Created
March 27, 2017 13:38
-
-
Save solaris33/63118b2719d9fbdc3c9ae8868c6b8629 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def tffunc(*argtypes): | |
'''Helper that transforms TF-graph generating function into a regular one. | |
See "resize" function below. | |
''' | |
placeholders = list(map(tf.placeholder, argtypes)) | |
def wrap(f): | |
out = f(*placeholders) | |
def wrapper(*args, **kw): | |
return out.eval(dict(zip(placeholders, args)), session=kw.get('session')) | |
return wrapper | |
return wrap | |
# Helper function that uses TF to resize an image | |
def resize(img, size): | |
img = tf.expand_dims(img, 0) | |
return tf.image.resize_bilinear(img, size)[0,:,:,:] | |
resize = tffunc(np.float32, np.int32)(resize) | |
def calc_grad_tiled(img, t_grad, tile_size=512): | |
'''Compute the value of tensor t_grad over the image in a tiled way. | |
Random shifts are applied to the image to blur tile boundaries over | |
multiple iterations.''' | |
sz = tile_size | |
h, w = img.shape[:2] | |
sx, sy = np.random.randint(sz, size=2) | |
img_shift = np.roll(np.roll(img, sx, 1), sy, 0) | |
grad = np.zeros_like(img) | |
for y in range(0, max(h-sz//2, sz),sz): | |
for x in range(0, max(w-sz//2, sz),sz): | |
sub = img_shift[y:y+sz,x:x+sz] | |
g = sess.run(t_grad, {t_input:sub}) | |
grad[y:y+sz,x:x+sz] = g | |
return np.roll(np.roll(grad, -sx, 1), -sy, 0) | |
def render_multiscale(t_obj, img0=img_noise, iter_n=10, step=1.0, octave_n=3, octave_scale=1.4): | |
t_score = tf.reduce_mean(t_obj) # defining the optimization objective | |
t_grad = tf.gradients(t_score, t_input)[0] # behold the power of automatic differentiation! | |
img = img0.copy() | |
for octave in range(octave_n): | |
if octave>0: | |
hw = np.float32(img.shape[:2])*octave_scale | |
img = resize(img, np.int32(hw)) | |
for i in range(iter_n): | |
g = calc_grad_tiled(img, t_grad) | |
# normalizing the gradient, so the same step size should work | |
g /= g.std()+1e-8 # for different layers and networks | |
img += g*step | |
print('.', end = ' ') | |
clear_output() | |
showarray(visstd(img)) | |
render_multiscale(T(layer)[:,:,:,channel]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment