commit 5ae501074abcfdcaeaaf6cd75769640bfffd46cb Author: BKHMSI Date: Sun Apr 9 01:43:24 2017 +0200 added keras code diff --git a/PencilSketch/__pycache__/filters.cpython-36.pyc b/PencilSketch/__pycache__/filters.cpython-36.pyc new file mode 100755 index 0000000..547da77 Binary files /dev/null and b/PencilSketch/__pycache__/filters.cpython-36.pyc differ diff --git a/PencilSketch/dancing.jpg b/PencilSketch/dancing.jpg new file mode 100755 index 0000000..8cbb851 Binary files /dev/null and b/PencilSketch/dancing.jpg differ diff --git a/PencilSketch/filters.py b/PencilSketch/filters.py new file mode 100755 index 0000000..76c6ba5 --- /dev/null +++ b/PencilSketch/filters.py @@ -0,0 +1,54 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +""" A module containing a number of interesting image filter effects, + such as: + * Black-and-white pencil sketch + * Warming/cooling filters + * Cartoonizer +""" + +import numpy as np +import cv2 + +from scipy.interpolate import UnivariateSpline + +__author__ = "Michael Beyeler" +__license__ = "GNU GPL 3.0 or later" + + +class PencilSketch: + """Pencil sketch effect + A class that applies a pencil sketch effect to an image. + The processed image is overlayed over a background image for visual + effect. + """ + + def __init__(self, width, height, bg_gray='pencilsketch_bg.jpg'): + """Initialize parameters + :param (width, height): Image size. + :param bg_gray: Optional background image to improve the illusion + that the pencil sketch was drawn on a canvas. + """ + self.width = width + self.height = height + + # try to open background canvas (if it exists) + self.canvas = cv2.imread(bg_gray, cv2.CV_8UC1) + if self.canvas is not None: + self.canvas = cv2.resize(self.canvas, (self.width, self.height)) + + def render(self, img_rgb): + """Applies pencil sketch effect to an RGB image + :param img_rgb: RGB image to be processed + :returns: Processed RGB image + """ + img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY) + img_blur = cv2.GaussianBlur(img_gray, (21, 21), 0, 0) + img_blend = cv2.divide(img_gray, img_blur, scale=256) + + # if available, blend with background canvas + if self.canvas is not None: + img_blend = cv2.multiply(img_blend, self.canvas, scale=1./256) + + return cv2.cvtColor(img_blend, cv2.COLOR_GRAY2RGB) \ No newline at end of file diff --git a/PencilSketch/sketch.jpg b/PencilSketch/sketch.jpg new file mode 100755 index 0000000..ac111c2 Binary files /dev/null and b/PencilSketch/sketch.jpg differ diff --git a/PencilSketch/sketch.py b/PencilSketch/sketch.py new file mode 100755 index 0000000..eb6e952 --- /dev/null +++ b/PencilSketch/sketch.py @@ -0,0 +1,19 @@ +import cv2 as cv +import numpy as np +import os +from filters import PencilSketch + + +for file in os.listdir('ZuBuD'): + file_path = os.path.join('ZuBuD', file) + img = cv.imread(file_path) + img = cv.cvtColor(img, cv.COLOR_BGR2RGB) + print (img.shape) + height, width, channels = img.shape + if (height, width, channels) == (240,320,3): + img = np.resize(img, (480, 640, 3)) + pencil = PencilSketch(width, height) + sketch = pencil.render(img) + write_path = os.path.join('ZuBuD_Sketch', file) + cv.imwrite(write_path, sketch) + \ No newline at end of file diff --git a/Project_1.ipynb b/Project_1.ipynb new file mode 100755 index 0000000..258d6b3 --- /dev/null +++ b/Project_1.ipynb @@ -0,0 +1,218 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import numpy as np\n", + "import pandas as pd \n", + "import cv2 as cv\n", + "import os\n", + "\n", + "from sklearn.preprocessing import StandardScaler\n", + "from keras.models import Sequential, Model\n", + "from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D\n", + "from keras.layers.core import Activation, Dropout, Flatten\n", + "from keras.optimizers import SGD\n", + "from keras.utils import np_utils\n", + "from keras.callbacks import TensorBoard\n", + "\n", + "np.random.seed(1337) # for reproducibility" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "((1005, 480, 640, 3), (1005, 480, 640, 3))\n" + ] + } + ], + "source": [ + "num_images = (1005, 480, 640, 3)\n", + "X_train = np.zeros(num_images)\n", + "Y_train = np.zeros(num_images)\n", + "\n", + "for i, file in enumerate(os.listdir('ZuBuD_Sketch')):\n", + " file_path = os.path.join('ZuBuD_Sketch', file)\n", + " img = cv.imread(file_path)\n", + " img = cv.cvtColor(img, cv.COLOR_BGR2RGB)\n", + " X_train[i] = img\n", + " \n", + "for i, file in enumerate(os.listdir('ZuBuD')):\n", + " file_path = os.path.join('ZuBuD', file)\n", + " img = cv.imread(file_path)\n", + " img = cv.cvtColor(img, cv.COLOR_BGR2RGB) \n", + " if img.shape == (240,320,3):\n", + " img = np.resize(img, (480, 640, 3))\n", + " Y_train[i] = img\n", + " \n", + "print (X_train.shape, Y_train.shape) " + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "X_val = X_train[:100]\n", + "Y_val = Y_train[:100]\n", + "X_train = X_train[100:]\n", + "Y_train = Y_train[100:]" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_4 (InputLayer) (None, 480, 640, 3) 0 \n", + "_________________________________________________________________\n", + "conv2d_22 (Conv2D) (None, 480, 640, 128) 3584 \n", + "_________________________________________________________________\n", + "max_pooling2d_10 (MaxPooling (None, 240, 320, 128) 0 \n", + "_________________________________________________________________\n", + "conv2d_23 (Conv2D) (None, 240, 320, 64) 73792 \n", + "_________________________________________________________________\n", + "max_pooling2d_11 (MaxPooling (None, 120, 160, 64) 0 \n", + "_________________________________________________________________\n", + "conv2d_24 (Conv2D) (None, 120, 160, 64) 36928 \n", + "_________________________________________________________________\n", + "max_pooling2d_12 (MaxPooling (None, 60, 80, 64) 0 \n", + "_________________________________________________________________\n", + "conv2d_25 (Conv2D) (None, 60, 80, 64) 36928 \n", + "_________________________________________________________________\n", + "up_sampling2d_10 (UpSampling (None, 120, 160, 64) 0 \n", + "_________________________________________________________________\n", + "conv2d_26 (Conv2D) (None, 120, 160, 64) 36928 \n", + "_________________________________________________________________\n", + "up_sampling2d_11 (UpSampling (None, 240, 320, 64) 0 \n", + "_________________________________________________________________\n", + "conv2d_27 (Conv2D) (None, 240, 320, 128) 73856 \n", + "_________________________________________________________________\n", + "up_sampling2d_12 (UpSampling (None, 480, 640, 128) 0 \n", + "_________________________________________________________________\n", + "conv2d_28 (Conv2D) (None, 480, 640, 3) 3459 \n", + "=================================================================\n", + "Total params: 265,475.0\n", + "Trainable params: 265,475.0\n", + "Non-trainable params: 0.0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "input_img = Input(shape=(480, 640, 3)) \n", + "\n", + "x = Conv2D(128, (3, 3), activation='relu', padding='same')(input_img)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)\n", + "x = MaxPooling2D((2, 2), padding='same')(x)\n", + "x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)\n", + "encoded = MaxPooling2D((2, 2), padding='same')(x)\n", + "\n", + "# at this point the representation is (4, 4, 8) i.e. 128-dimensional\n", + "\n", + "x = Conv2D(64, (3, 3), activation='relu', padding='same')(encoded)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(64, (3, 3), activation='relu', padding='same')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "x = Conv2D(128, (3, 3), activation='relu', padding='same')(x)\n", + "x = UpSampling2D((2, 2))(x)\n", + "decoded = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)\n", + "\n", + "autoencoder = Model(input_img, decoded)\n", + "autoencoder.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Train on 905 samples, validate on 100 samples\n", + "Epoch 1/50\n" + ] + } + ], + "source": [ + "autoencoder.compile(optimizer='adam', loss='mean_squared_error')\n", + "autoencoder.fit(X_train, Y_train,\n", + " epochs=50,\n", + " batch_size=64,\n", + " shuffle=True,\n", + " validation_data=(X_val, Y_val))" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "Y_test = autoencoder.predict(X_val)\n", + "\n", + "fig = plt.figure()\n", + "a = fig.add_subplot(1,2,1)\n", + "imgplot = plt.imshow(Y_test[0])\n", + "a.set_title('Prediction')\n", + "a = fig.add_subplot(1,2,2)\n", + "imgplot = plt.imshow(X_val[0])\n", + "a.set_title('Ground Truth')\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..50cf1b3 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# architecture_sketch_inversion