Alican Akca commited on
Commit
b0c5c57
1 Parent(s): 8a23f94

For Version 2

Browse files
app.py CHANGED
@@ -1,69 +1,65 @@
1
  import cv2
 
2
  import numpy as np
3
  import gradio as gr
4
- from PIL import Image
5
  import paddlehub as hub
 
6
  from methods.img2pixl import pixL
7
  from examples.pixelArt.combine import combine
8
- from examples.pixelArt.white_box_cartoonizer.cartoonize import WB_Cartoonize
9
  model = hub.Module(name='U2Net')
10
- pixl = pixL()
11
- combine = combine()
 
12
 
13
  def GIF(fname,pixel_size):
14
- print(fname)
15
  gif = Image.open(fname)
16
- frames = []
17
- for i in range(gif.n_frames):
18
  gif.seek(i)
19
  frame = Image.new('RGB', gif.size)
20
  frame.paste(gif)
21
  frame = np.array(frame)
22
  frames.append(frame)
23
- print(len(frames))
24
-
25
- result = pixl.toThePixL(frames, pixel_size)
26
- print(len(result), result[0].shape)
27
  frames = []
28
- for frame in result:
29
-
30
- frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
31
- frame = Image.fromarray(frame)
32
- frames.append(frame)
33
- print(type(frames), len(frames), type(frames[0]), frames[0].size)
34
- frames[0].save('new.gif', append_images=frames, save_all=True, loop=1)
35
- return Image.open('cache.gif')
36
 
37
- def func_tab1(image,pixel_size, checkbox1):
38
- if image.name.endswith('.gif'):
39
- GIF(image.name,pixel_size)
40
- else:
41
- image = cv2.imread(image.name)
42
- image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
43
- image = WB_Cartoonize().infer(image)
44
- image = np.array(image)
45
- image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
46
- if checkbox1:
47
- result = model.Segmentation(
48
- images=[image],
49
- paths=None,
50
- batch_size=1,
51
- input_size=320,
52
- output_dir='output',
53
- visualization=True)
54
- result = combine.combiner(images = pixl.toThePixL([result[0]['front'][:,:,::-1], result[0]['mask']],
55
  pixel_size),
56
  background_image = image)
57
- else:
58
- result = pixl.toThePixL([image], pixel_size)
59
- return result
60
 
61
- inputs_tab1 = [gr.inputs.Image(type='file', label="Image"),
62
  gr.Slider(4, 100, value=12, step = 2, label="Pixel Size"),
63
  gr.Checkbox(label="Object-Oriented Inference", value=False)]
64
- outputs_tab1 = [gr.Image(type="file",label="Front")]
65
-
66
- gr.Interface(fn = func_tab1,
67
- inputs = inputs_tab1,
68
- outputs = outputs_tab1).launch()
69
 
 
 
 
 
1
  import cv2
2
+ import torch
3
  import numpy as np
4
  import gradio as gr
 
5
  import paddlehub as hub
6
+ from PIL import Image
7
  from methods.img2pixl import pixL
8
  from examples.pixelArt.combine import combine
9
+
10
  model = hub.Module(name='U2Net')
11
+ device = "cuda" if torch.cuda.is_available() else "cpu"
12
+ face2paint = torch.hub.load("bryandlee/animegan2-pytorch:main", "face2paint", device=device, size=512)
13
+ model = torch.hub.load("bryandlee/animegan2-pytorch", "generator", device=device).eval()
14
 
15
  def GIF(fname,pixel_size):
 
16
  gif = Image.open(fname)
17
+ frames = []
18
+ for i in range(gif.n_frames): #First Step: Splitting the GIF into frames
19
  gif.seek(i)
20
  frame = Image.new('RGB', gif.size)
21
  frame.paste(gif)
22
  frame = np.array(frame)
23
  frames.append(frame)
24
+ result = pixL().toThePixL(frames, pixel_size)
25
+ for frame in result: #Second Step: Adding Cartoon Effect to each frame
26
+ frame = Image.fromarray(frame)
27
+ frame = cv2.cvtColor(np.asarray(face2paint(model, frame)), cv2.COLOR_BGR2RGB)
28
  frames = []
29
+ for frame in result: #Third Step: Combining the frames into a GIF
30
+ frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
31
+ frame = Image.fromarray(frame)
32
+ frames.append(frame)
33
+ frames[0].save('cache.gif', append_images=frames, save_all=True, loop=1)
34
+ cache = Image.open('cache.gif')
35
+ return cache
 
36
 
37
+ def initilize(image,pixel_size,checkbox1):
38
+ if image.name.endswith('.gif'):
39
+ GIF(image.name,pixel_size)
40
+ else:
41
+ image = Image.open(image.name).convert("RGB")
42
+ image = cv2.cvtColor(np.asarray(face2paint(model, image)), cv2.COLOR_BGR2RGB)
43
+ if checkbox1:
44
+ result = model.Segmentation(
45
+ images=[image],
46
+ paths=None,
47
+ batch_size=1,
48
+ input_size=320,
49
+ output_dir='output',
50
+ visualization=True)
51
+ result = combine.combiner(images = pixL().toThePixL([result[0]['front'][:,:,::-1], result[0]['mask']],
 
 
 
52
  pixel_size),
53
  background_image = image)
54
+ else:
55
+ result = pixL().toThePixL([image], pixel_size)
56
+ return Image.fromarray(result)
57
 
58
+ inputs = ["file",
59
  gr.Slider(4, 100, value=12, step = 2, label="Pixel Size"),
60
  gr.Checkbox(label="Object-Oriented Inference", value=False)]
61
+ outputs = [gr.Image(type="pil",label="Front")]
 
 
 
 
62
 
63
+ gr.Interface(fn = initilize,
64
+ inputs = inputs,
65
+ outputs = outputs).launch()
examples/pixelArt/white_box_cartoonizer/__pycache__/cartoonize.cpython-37.pyc DELETED
Binary file (4.2 kB)
 
examples/pixelArt/white_box_cartoonizer/__pycache__/cartoonize.cpython-38.pyc DELETED
Binary file (3.18 kB)
 
examples/pixelArt/white_box_cartoonizer/__pycache__/guided_filter.cpython-37.pyc DELETED
Binary file (2.52 kB)
 
examples/pixelArt/white_box_cartoonizer/__pycache__/network.cpython-37.pyc DELETED
Binary file (1.9 kB)
 
examples/pixelArt/white_box_cartoonizer/cartoonize.py DELETED
@@ -1,83 +0,0 @@
1
- """
2
- Internal code snippets were obtained from https://github.com/SystemErrorWang/White-box-Cartoonization/
3
-
4
- For it to work tensorflow version 2.x changes were obtained from https://github.com/steubk/White-box-Cartoonization
5
- """
6
- import os
7
- import uuid
8
- import time
9
- import subprocess
10
- import sys
11
-
12
- import cv2
13
- import numpy as np
14
-
15
- try:
16
- import tensorflow.compat.v1 as tf
17
- except ImportError:
18
- import tensorflow as tf
19
-
20
- from methods.white_box_cartoonizer.components.guided_filter import gf
21
- from methods.white_box_cartoonizer.components.network import nk
22
-
23
- weights_dir = f'{os.getcwd()}/methods/white_box_cartoonizer/saved_models'
24
- gpu = len(sys.argv) < 2 or sys.argv[1] != '--cpu'
25
-
26
- class WB_Cartoonize:
27
- def __init__(self):
28
- if not os.path.exists(weights_dir):
29
- raise FileNotFoundError("Weights Directory not found, check path")
30
-
31
- def resize_crop(self, image):
32
- h, w, c = np.shape(image)
33
- if min(h, w) > 720:
34
- if h > w:
35
- h, w = int(720*h/w), 720
36
- else:
37
- h, w = 720, int(720*w/h)
38
- image = cv2.resize(image, (w, h),
39
- interpolation=cv2.INTER_AREA)
40
- h, w = (h//8)*8, (w//8)*8
41
- image = image[:h, :w, :]
42
- return image
43
-
44
- def load_model(self, weights_dir, gpu):
45
- try:
46
- tf.disable_eager_execution()
47
- except:
48
- None
49
-
50
- tf.reset_default_graph()
51
-
52
- self.input_photo = tf.placeholder(tf.float32, [1, None, None, 3], name='input_image')
53
- network_out = nk.unet_generator(self.input_photo)
54
- self.final_out = gf.guided_filter(self.input_photo, network_out, r=1, eps=5e-3)
55
-
56
- all_vars = tf.trainable_variables()
57
- gene_vars = [var for var in all_vars if 'generator' in var.name]
58
- saver = tf.train.Saver(var_list=gene_vars)
59
-
60
- if gpu:
61
- gpu_options = tf.GPUOptions(allow_growth=True)
62
- device_count = {'GPU':1}
63
- else:
64
- gpu_options = None
65
- device_count = {'GPU':0}
66
-
67
- config = tf.ConfigProto(gpu_options=gpu_options, device_count=device_count)
68
-
69
- self.sess = tf.Session(config=config)
70
-
71
- self.sess.run(tf.global_variables_initializer())
72
- saver.restore(self.sess, tf.train.latest_checkpoint(weights_dir))
73
-
74
- def infer(self, image):
75
- self.input_photo = image
76
- self.load_model(weights_dir, gpu)
77
- image = self.resize_crop(image)
78
- batch_image = image.astype(np.float32)/127.5 - 1
79
- batch_image = np.expand_dims(batch_image, axis=0)
80
- output = self.sess.run(self.final_out, feed_dict={self.input_photo: batch_image})
81
- output = (np.squeeze(output)+1)*127.5
82
- output = np.clip(output, 0, 255).astype(np.uint8)
83
- return output
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/pixelArt/white_box_cartoonizer/components/__pycache__/guided_filter.cpython-38.pyc DELETED
Binary file (2.18 kB)
 
examples/pixelArt/white_box_cartoonizer/components/__pycache__/network.cpython-38.pyc DELETED
Binary file (2.16 kB)
 
examples/pixelArt/white_box_cartoonizer/components/guided_filter.py DELETED
@@ -1,73 +0,0 @@
1
- """
2
- Code copyrights are with: https://github.com/SystemErrorWang/White-box-Cartoonization/
3
-
4
- To adapt the code with tensorflow v2 changes obtained from: https://github.com/steubk/White-box-Cartoonization
5
- """
6
- try:
7
- import tensorflow.compat.v1 as tf
8
- except ImportError:
9
- import tensorflow as tf
10
-
11
- import numpy as np
12
-
13
- class gf:
14
- def tf_box_filter(x, r):
15
- k_size = int(2*r+1)
16
- ch = x.get_shape().as_list()[-1]
17
- weight = 1/(k_size**2)
18
- box_kernel = weight*np.ones((k_size, k_size, ch, 1))
19
- box_kernel = np.array(box_kernel).astype(np.float32)
20
- output = tf.nn.depthwise_conv2d(x, box_kernel, [1, 1, 1, 1], 'SAME')
21
- return output
22
-
23
-
24
-
25
- def guided_filter(x, y, r, eps=1e-2):
26
-
27
- x_shape = tf.shape(x)
28
- #y_shape = tf.shape(y)
29
-
30
- N = gf.tf_box_filter(tf.ones((1, x_shape[1], x_shape[2], 1), dtype=x.dtype), r)
31
-
32
- mean_x = gf.tf_box_filter(x, r) / N
33
- mean_y = gf.tf_box_filter(y, r) / N
34
- cov_xy = gf.tf_box_filter(x * y, r) / N - mean_x * mean_y
35
- var_x = gf.tf_box_filter(x * x, r) / N - mean_x * mean_x
36
-
37
- A = cov_xy / (var_x + eps)
38
- b = mean_y - A * mean_x
39
-
40
- mean_A = gf.tf_box_filter(A, r) / N
41
- mean_b = gf.tf_box_filter(b, r) / N
42
-
43
- output = tf.add(mean_A * x, mean_b, name='final_add')
44
-
45
- return output
46
-
47
-
48
-
49
- def fast_guided_filter(lr_x, lr_y, hr_x, r=1, eps=1e-8):
50
-
51
- #assert lr_x.shape.ndims == 4 and lr_y.shape.ndims == 4 and hr_x.shape.ndims == 4
52
-
53
- lr_x_shape = tf.shape(lr_x)
54
- #lr_y_shape = tf.shape(lr_y)
55
- hr_x_shape = tf.shape(hr_x)
56
-
57
- N = gf.tf_box_filter(tf.ones((1, lr_x_shape[1], lr_x_shape[2], 1), dtype=lr_x.dtype), r)
58
-
59
- mean_x = gf.tf_box_filter(lr_x, r) / N
60
- mean_y = gf.tf_box_filter(lr_y, r) / N
61
- cov_xy = gf.tf_box_filter(lr_x * lr_y, r) / N - mean_x * mean_y
62
- var_x = gf.tf_box_filter(lr_x * lr_x, r) / N - mean_x * mean_x
63
-
64
- A = cov_xy / (var_x + eps)
65
- b = mean_y - A * mean_x
66
-
67
- mean_A = tf.image.resize_images(A, hr_x_shape[1: 3])
68
- mean_b = tf.image.resize_images(b, hr_x_shape[1: 3])
69
-
70
- output = mean_A * hr_x + mean_b
71
-
72
- return output
73
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/pixelArt/white_box_cartoonizer/components/network.py DELETED
@@ -1,72 +0,0 @@
1
- """
2
- Code copyrights are with: https://github.com/SystemErrorWang/White-box-Cartoonization/
3
-
4
- To adapt the code with tensorflow v2 changes obtained from: https://github.com/steubk/White-box-Cartoonization
5
- """
6
- try:
7
- import tensorflow.compat.v1 as tf
8
- import tf_slim as slim
9
- except ImportError:
10
- import tensorflow as tf
11
- import tensorflow.contrib.slim as slim
12
-
13
- import numpy as np
14
-
15
-
16
- class nk:
17
- def resblock(inputs, out_channel=32, name='resblock'):
18
-
19
- with tf.variable_scope(name):
20
-
21
- x = slim.convolution2d(inputs, out_channel, [3, 3],
22
- activation_fn=None, scope='conv1')
23
- x = tf.nn.leaky_relu(x)
24
- x = slim.convolution2d(x, out_channel, [3, 3],
25
- activation_fn=None, scope='conv2')
26
-
27
- return x + inputs
28
-
29
-
30
-
31
-
32
- def unet_generator(inputs, channel=32, num_blocks=4, name='generator', reuse=False):
33
- with tf.variable_scope(name, reuse=reuse):
34
-
35
- x0 = slim.convolution2d(inputs, channel, [7, 7], activation_fn=None)
36
- x0 = tf.nn.leaky_relu(x0)
37
-
38
- x1 = slim.convolution2d(x0, channel, [3, 3], stride=2, activation_fn=None)
39
- x1 = tf.nn.leaky_relu(x1)
40
- x1 = slim.convolution2d(x1, channel*2, [3, 3], activation_fn=None)
41
- x1 = tf.nn.leaky_relu(x1)
42
-
43
- x2 = slim.convolution2d(x1, channel*2, [3, 3], stride=2, activation_fn=None)
44
- x2 = tf.nn.leaky_relu(x2)
45
- x2 = slim.convolution2d(x2, channel*4, [3, 3], activation_fn=None)
46
- x2 = tf.nn.leaky_relu(x2)
47
-
48
- for idx in range(num_blocks):
49
- x2 = nk.resblock(x2, out_channel=channel*4, name='block_{}'.format(idx))
50
-
51
- x2 = slim.convolution2d(x2, channel*2, [3, 3], activation_fn=None)
52
- x2 = tf.nn.leaky_relu(x2)
53
-
54
- h1, w1 = tf.shape(x2)[1], tf.shape(x2)[2]
55
- x3 = tf.image.resize_bilinear(x2, (h1*2, w1*2))
56
- x3 = slim.convolution2d(x3+x1, channel*2, [3, 3], activation_fn=None)
57
- x3 = tf.nn.leaky_relu(x3)
58
- x3 = slim.convolution2d(x3, channel, [3, 3], activation_fn=None)
59
- x3 = tf.nn.leaky_relu(x3)
60
-
61
- h2, w2 = tf.shape(x3)[1], tf.shape(x3)[2]
62
- x4 = tf.image.resize_bilinear(x3, (h2*2, w2*2))
63
- x4 = slim.convolution2d(x4+x0, channel, [3, 3], activation_fn=None)
64
- x4 = tf.nn.leaky_relu(x4)
65
- x4 = slim.convolution2d(x4, 3, [7, 7], activation_fn=None)
66
-
67
- return x4
68
-
69
- if __name__ == '__main__':
70
-
71
-
72
- pass
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
examples/pixelArt/white_box_cartoonizer/saved_models/checkpoint DELETED
@@ -1,3 +0,0 @@
1
- model_checkpoint_path: "model-33999"
2
- all_model_checkpoint_paths: "model-33999"
3
- all_model_checkpoint_paths: "model-37499"
 
 
 
 
examples/pixelArt/white_box_cartoonizer/saved_models/model-33999.index DELETED
Binary file (1.56 kB)
 
examples/pixelArt/white_box_cartoonizer/test.jpg DELETED
Binary file (189 kB)
 
output/result_0.png DELETED
Binary file (168 kB)
 
output/result_mask_0.png DELETED
Binary file (25.6 kB)
 
requirements.txt CHANGED
@@ -1,4 +1,5 @@
1
  pip
 
2
  tensorflow
3
  Flask
4
  gunicorn
 
1
  pip
2
+ torch
3
  tensorflow
4
  Flask
5
  gunicorn