zoukankan      html  css  js  c++  java
  • Tensorflow暑期实践——DeepDream以背景图片为起点

    浙江财经大学专业实践深度学习tensorflow——阳诚砖

    tensorflow_inception_graph.pb

    链接:https://pan.baidu.com/s/1IbgQFAuqnGNjRQJGKDDOiA

    提取码:2670

    1.生成更高质量的Deep Dream图像

    1.1 导入库与Inception模型

    from __future__ import print_function
    import os
    from io import BytesIO
    import numpy as np
    from functools import partial
    import PIL.Image
    import scipy.misc
    import tensorflow as tf
    # import tensorflow.compat.v1 as tf
    # tf.disable_v2_behavior()
    
    graph = tf.Graph()
    model_fn = 'tensorflow_inception_graph.pb'
    sess = tf.InteractiveSession(graph=graph)
    with tf.gfile.FastGFile(model_fn, 'rb') as f:
        graph_def = tf.GraphDef()
        graph_def.ParseFromString(f.read())
    t_input = tf.placeholder(np.float32, name='input')  
    imagenet_mean = 117.0
    t_preprocessed = tf.expand_dims(t_input - imagenet_mean, 0)
    tf.import_graph_def(graph_def, {'input': t_preprocessed})
    

    1.2 定义相关函数

    # 保存图像
    def savearray(img_array, img_name):
        scipy.misc.toimage(img_array).save(img_name)
        print('img saved: %s' % img_name)
    
    # 将图像放大ratio倍
    def resize_ratio(img, ratio):
        min = img.min()
        max = img.max()
        img = (img - min) / (max - min) * 255
        img = np.float32(scipy.misc.imresize(img, ratio))
        img = img / 255 * (max - min) + min
        return img
    
    # 调整图像尺寸
    def resize(img, hw):
        min = img.min()
        max = img.max()
        img = (img - min) / (max - min) * 255
        img = np.float32(scipy.misc.imresize(img, hw))
        img = img / 255 * (max - min) + min
        return img
    
    # 原始图像尺寸可能很大,从而导致内存耗尽问题 
    # 每次只对 tile_size * tile_size 大小的图像计算梯度,避免内存问题
    def calc_grad_tiled(img, t_grad, tile_size=512):
        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_deepdream(t_obj, img0,
                         iter_n=10, step=1.5, octave_n=4, octave_scale=1.4):
        t_score = tf.reduce_mean(t_obj)
        t_grad = tf.gradients(t_score, t_input)[0]
        img = img0.copy()
        
        # 将图像进行金字塔分解
        # 从而分为高频、低频部分
        octaves = []
        for i in range(octave_n - 1):
            hw = img.shape[:2]
            lo = resize(img, np.int32(np.float32(hw) / octave_scale))
            hi = img - resize(lo, hw)
            img = lo
            octaves.append(hi)
    
        # 首先生成低频的图像,再依次放大并加上高频
        for octave in range(octave_n):
            if octave > 0:
                hi = octaves[-octave]
                img = resize(img, hi.shape[:2]) + hi
            for i in range(iter_n):
                g = calc_grad_tiled(img, t_grad)
                img += g * (step / (np.abs(g).mean() + 1e-7))
               
        img = img.clip(0, 255)
        savearray(img, 'timg_deepdream.jpg')
        im = PIL.Image.open('timg_deepdream.jpg').show()
    

    1.3 生成以背景图像作为起点的DeepDream图像

    name = 'mixed4c'
    layer_output = graph.get_tensor_by_name("import/%s:0" % name)
    
    img0 = PIL.Image.open('myx.jpg')
    img0 = np.float32(img0)
    render_deepdream(tf.square(layer_output), img0)   
    

  • 相关阅读:
    面试话痨(四)常量在哪里呀,常量在哪里
    面试话痨(三)我会锁的四种配法,您配吗?
    面试话痨(二)C:JAVA String,别以为你穿个马甲我就不认识你了
    面试话痨(一)让我们来热切的讨论这个养猪场吧
    (JAVA)String类型的逻辑语句编译
    小白的REDIS学习(二)-链表
    小白的Redis学习(一)-SDS简单动态字符串
    mongo中的游标与数据一致性的取舍
    spring-data-mongodb与mongo shell的对应关系
    spring-data-mongodb 使用原生aggregate语句
  • 原文地址:https://www.cnblogs.com/caiyishuai/p/13298526.html
Copyright © 2011-2022 走看看