{"cells":[{"metadata":{},"cell_type":"markdown","source":"# TF Hub Arbitrary Image Stylization\n\n- https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2\n- https://github.com/tensorflow/hub/blob/master/examples/colab/tf2_arbitrary_image_stylization.ipynb"},{"metadata":{"execution":{"iopub.execute_input":"2020-10-02T12:20:36.573894Z","iopub.status.busy":"2020-10-02T12:20:36.573234Z","iopub.status.idle":"2020-10-02T12:20:44.396165Z","shell.execute_reply":"2020-10-02T12:20:44.395602Z"},"id":"v-KXRY5XBu2u","trusted":true},"cell_type":"code","source":"import functools\nimport os\nimport time\n\nfrom matplotlib import gridspec\nimport matplotlib.pylab as plt\nimport numpy as np\nimport tensorflow as tf\nimport tensorflow_hub as hub\nstart = time.time()\n\nprint(\"TF Version: \", tf.__version__)\nprint(\"TF-Hub version: \", hub.__version__)\nprint(\"Eager mode enabled: \", tf.executing_eagerly())\nprint(\"GPU available: \", tf.test.is_gpu_available())\n\n# Load TF-Hub module.\nhub_handle = 'https://tfhub.dev/google/magenta/arbitrary-image-stylization-v1-256/2'\nhub_module = hub.load(hub_handle)","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-10-02T12:20:44.408495Z","iopub.status.busy":"2020-10-02T12:20:44.407793Z","iopub.status.idle":"2020-10-02T12:20:44.409757Z","shell.execute_reply":"2020-10-02T12:20:44.410158Z"},"id":"tsoDv_9geoZn","trusted":true},"cell_type":"code","source":"# @title Define image loading and visualization functions  { display-mode: \"form\" }\ndef crop_center(image):\n    \"\"\"Returns a cropped square image.\"\"\"\n    shape = image.shape\n    new_shape = min(shape[1], shape[2])\n    offset_y = max(shape[1] - shape[2], 0) // 2\n    offset_x = max(shape[2] - shape[1], 0) // 2\n    image = tf.image.crop_to_bounding_box(\n        image, offset_y, offset_x, new_shape, new_shape)\n    return image\n\n\n@functools.lru_cache(maxsize=None)\ndef load_image(image_url, image_size=(256, 256), preserve_aspect_ratio=True):\n    \"\"\"Loads and preprocesses images.\"\"\"\n    # Cache image file locally.\n    image_path = tf.keras.utils.get_file(\n        os.path.basename(image_url)[-128:], image_url)\n    # Load and convert to float32 numpy array, add batch dimension, and normalize to range [0, 1].\n    img = plt.imread(image_path).astype(np.float32)[np.newaxis, ...]\n    if img.max() > 1.0:\n        img = img / 255.\n    if len(img.shape) == 3:\n        img = tf.stack([img, img, img], axis=-1)\n    img = crop_center(img)\n    img = tf.image.resize(img, image_size, preserve_aspect_ratio=True)\n    return img\n\n\ndef show_n(images, titles=('',)):\n    n = len(images)\n    image_sizes = [image.shape[1] for image in images]\n    w = (image_sizes[0] * 6) // 320\n    plt.figure(figsize=(w * n, w))\n    gs = gridspec.GridSpec(1, n, width_ratios=image_sizes)\n    for i in range(n):\n        plt.subplot(gs[i])\n        plt.imshow(images[i][0], aspect='equal')\n        plt.axis('off')\n        plt.title(titles[i] if len(titles) > i else '')\n    plt.show()\n","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-10-02T12:20:52.93398Z","iopub.status.busy":"2020-10-02T12:20:52.933231Z","iopub.status.idle":"2020-10-02T12:21:00.753727Z","shell.execute_reply":"2020-10-02T12:21:00.753161Z"},"id":"WSMaY0YBNfkK","_kg_hide-output":true,"trusted":true},"cell_type":"code","source":"content_urls = dict(\n    sea_turtle='https://upload.wikimedia.org/wikipedia/commons/d/d7/Green_Sea_Turtle_grazing_seagrass.jpg',\n    tuebingen='https://upload.wikimedia.org/wikipedia/commons/0/00/Tuebingen_Neckarfront.jpg',\n    grace_hopper='https://storage.googleapis.com/download.tensorflow.org/example_images/grace_hopper.jpg',\n    Bwonsamdi='https://i.pinimg.com/originals/0e/4a/f0/0e4af04d4391cdf938368439c23cc314.jpg',\n    jack='https://images.squarespace-cdn.com/content/v1/51b3dc8ee4b051b96ceb10de/1585177144011-COJ9O3IIV050PZW02ITO/ke17ZwdGBToddI8pDm48kNvT88LknE-K9M4pGNO0Iqd7gQa3H78H3Y0txjaiv_0fDoOvxcdMmMKkDsyUqMSsMWxHk725yiiHCCLfrh8O1z5QPOohDIaIeljMHgDF5CVlOqpeNLcJ80NK65_fV7S1USOFn4xF8vTWDNAUBm5ducQhX-V3oVjSmr829Rco4W2Uo49ZdOtO_QXox0_W7i2zEA/image-asset.jpeg?format=2500w',\n    cage='https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSIU678rfILZHoP1fzqvt55sPkDhxXnORshvQ&usqp=CAU',\n    wishyouwerehere='https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyzNUOkuBnsl8rEtzjFMsLoLcCYen3UteDcw&usqp=CAU',\n    eiffel='https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fcdn.lifestyleasia.com%2Fwp-content%2Fuploads%2F2019%2F10%2F21224220%2FWiner-Parisienne.jpg&f=1&nofb=1',\n    greatwall='https://external-content.duckduckgo.com/iu/?u=http%3A%2F%2Fi.huffpost.com%2Fgen%2F4716002%2Fimages%2Fo-GREAT-WALL-OF-CHINA-facebook.jpg&f=1&nofb=1',\n    pyramids='https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fcdn-image.travelandleisure.com%2Fsites%2Fdefault%2Ffiles%2Fstyles%2F1600x1000%2Fpublic%2F1477597558%2Fgiza-pyramid-EGYPTSECRETS1016.jpg%3Fitok%3D0nX0FAZD&f=1&nofb=1',\n    london1='https://external-content.duckduckgo.com/iu/?u=http%3A%2F%2Fwww.nyhabitat.com%2Fblog%2Fwp-content%2Fuploads%2F2014%2F09%2FTop-sunset-spots-London-tower-bridge.jpg&f=1&nofb=1',\n    nevermind='https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fcdn.mos.cms.futurecdn.net%2F7dnMMDGmY5uJyc2DajhB4T-1200-80.jpg&f=1&nofb=1')\nstyle_urls = dict(\n    mushroom='https://images-wixmp-ed30a86b8c4ca887773594c2.wixmp.com/f/77955473-bea2-4ce3-a179-cfcdb603f80f/d7fevxr-3f51a827-40dd-454a-925a-5589054d4ea8.jpg?token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ1cm46YXBwOjdlMGQxODg5ODIyNjQzNzNhNWYwZDQxNWVhMGQyNmUwIiwic3ViIjoidXJuOmFwcDo3ZTBkMTg4OTgyMjY0MzczYTVmMGQ0MTVlYTBkMjZlMCIsImF1ZCI6WyJ1cm46c2VydmljZTpmaWxlLmRvd25sb2FkIl0sIm9iaiI6W1t7InBhdGgiOiIvZi83Nzk1NTQ3My1iZWEyLTRjZTMtYTE3OS1jZmNkYjYwM2Y4MGYvZDdmZXZ4ci0zZjUxYTgyNy00MGRkLTQ1NGEtOTI1YS01NTg5MDU0ZDRlYTguanBnIn1dXX0.Wa3uOjOWmWJaNEiY49P4q5iX7h3jKVnLgjMTA7ymIHA',\n    hellboy1='https://images.fineartamerica.com/images/artworkimages/mediumlarge/3/hellboy-jonathan-grimm-art.jpg',\n    hellboy2='https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTXNpNdWV3pjoXxzMFGGxajPHFwu-8I-HPImQ&usqp=CAU',\n    bioshockrapture='https://i.pinimg.com/originals/9d/dd/31/9ddd31d6700e7e97c0d1330f05226f8a.jpg',\n    landscape1='https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcS1djfgflgck3oI-hUZqvTN7q8s8SDJy_pfIA&usqp=CAU',\n    matrix='https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQJLWBZ4PzD_jPI3dZuURTGMiv_iZckxX9CxA&usqp=CAU',\n    nightearth='https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQe8u-J_Cbp6panF-vagDrdsH_OUtytZy1GKQ&usqp=CAU',\n    old_one='https://i.pinimg.com/originals/63/7f/26/637f260e88322fb374b1370a256ebdcc.jpg',\n    eye='https://i.pinimg.com/originals/9f/c7/c2/9fc7c2a9b52132f31e81ffc69f21827c.jpg',\n    kanagawa_great_wave='https://upload.wikimedia.org/wikipedia/commons/0/0a/The_Great_Wave_off_Kanagawa.jpg',\n    kandinsky_composition_7='https://upload.wikimedia.org/wikipedia/commons/b/b4/Vassily_Kandinsky%2C_1913_-_Composition_7.jpg',\n    hubble_pillars_of_creation='https://upload.wikimedia.org/wikipedia/commons/6/68/Pillars_of_creation_2014_HST_WFC3-UVIS_full-res_denoised.jpg',\n    van_gogh_starry_night='https://upload.wikimedia.org/wikipedia/commons/thumb/e/ea/Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg/1024px-Van_Gogh_-_Starry_Night_-_Google_Art_Project.jpg',\n    turner_nantes='https://upload.wikimedia.org/wikipedia/commons/b/b7/JMW_Turner_-_Nantes_from_the_Ile_Feydeau.jpg',\n    munch_scream='https://upload.wikimedia.org/wikipedia/commons/c/c5/Edvard_Munch%2C_1893%2C_The_Scream%2C_oil%2C_tempera_and_pastel_on_cardboard%2C_91_x_73_cm%2C_National_Gallery_of_Norway.jpg',\n    picasso_demoiselles_avignon='https://upload.wikimedia.org/wikipedia/en/4/4c/Les_Demoiselles_d%27Avignon.jpg',\n    picasso_violin='https://upload.wikimedia.org/wikipedia/en/3/3c/Pablo_Picasso%2C_1911-12%2C_Violon_%28Violin%29%2C_oil_on_canvas%2C_Kr%C3%B6ller-M%C3%BCller_Museum%2C_Otterlo%2C_Netherlands.jpg',\n    picasso_bottle_of_rum='https://upload.wikimedia.org/wikipedia/en/7/7f/Pablo_Picasso%2C_1911%2C_Still_Life_with_a_Bottle_of_Rum%2C_oil_on_canvas%2C_61.3_x_50.5_cm%2C_Metropolitan_Museum_of_Art%2C_New_York.jpg',\n    fire='https://upload.wikimedia.org/wikipedia/commons/3/36/Large_bonfire.jpg',\n    derkovits_woman_head='https://upload.wikimedia.org/wikipedia/commons/0/0d/Derkovits_Gyula_Woman_head_1922.jpg',\n    amadeo_style_life='https://upload.wikimedia.org/wikipedia/commons/8/8e/Untitled_%28Still_life%29_%281913%29_-_Amadeo_Souza-Cardoso_%281887-1918%29_%2817385824283%29.jpg',\n    derkovtis_talig='https://upload.wikimedia.org/wikipedia/commons/3/37/Derkovits_Gyula_Talig%C3%A1s_1920.jpg',\n    amadeo_cardoso='https://upload.wikimedia.org/wikipedia/commons/7/7d/Amadeo_de_Souza-Cardoso%2C_1915_-_Landscape_with_black_figure.jpg',\n    redforest='https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fforum.unity.com%2Fattachments%2Fdreamscape_scene1_1980x1080_jpg-jpg.163899%2F&f=1&nofb=1',\n    mothership='https://external-content.duckduckgo.com/iu/?u=https%3A%2F%2Fd2jv9003bew7ag.cloudfront.net%2Fuploads%2FShephard-Fiery-for-Led-Zeppelin-via-pinterest-com-1-865x577.jpg&f=1&nofb=1'\n)\n\ncontent_image_size = 384\nstyle_image_size = 256\ncontent_images = {k: load_image(v, (content_image_size, content_image_size)) for k, v in content_urls.items()}\nstyle_images = {k: load_image(v, (style_image_size, style_image_size)) for k, v in style_urls.items()}\nstyle_images = {k: tf.nn.avg_pool(style_image, ksize=[3,3], strides=[1,1], padding='SAME') for k, style_image in style_images.items()}\n","execution_count":null,"outputs":[]},{"metadata":{"execution":{"iopub.execute_input":"2020-10-02T12:21:00.759444Z","iopub.status.busy":"2020-10-02T12:21:00.75874Z","iopub.status.idle":"2020-10-02T12:21:01.261045Z","shell.execute_reply":"2020-10-02T12:21:01.261431Z"},"id":"dqB6aNTLNVkK","trusted":true},"cell_type":"code","source":"for content_name in content_images:\n    for style_name in style_images:\n        stylized_image = hub_module(tf.constant(content_images[content_name]),\n                                    tf.constant(style_images[style_name]))[0]\n\n        show_n([content_images[content_name], style_images[style_name], stylized_image],\n               titles=['Original content image - {}'.format(content_name), 'Style image - {}'.format(style_name), 'Stylized image'])","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"print(\"Notebook Runtime: %0.2f Minutes\"%((time.time() - start)/60))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}