Spaces:
Runtime error
Runtime error
Jitesh Jain
commited on
Commit
·
a5c1cde
1
Parent(s):
659310d
Fix editor bug
Browse files- .DS_Store +0 -0
- app.py +28 -24
- fcf_gan.png +0 -0
- requirements.txt +4 -4
.DS_Store
CHANGED
|
Binary files a/.DS_Store and b/.DS_Store differ
|
|
|
app.py
CHANGED
|
@@ -48,9 +48,11 @@ def fcf_inpaint(G, org_img, erased_img, mask):
|
|
| 48 |
comp_img = mask.to(device) * pred_img + (1 - mask).to(device) * org_img.to(device)
|
| 49 |
return comp_img
|
| 50 |
|
| 51 |
-
def show_images(img):
|
| 52 |
""" Display a batch of images inline. """
|
| 53 |
-
|
|
|
|
|
|
|
| 54 |
|
| 55 |
def denorm(img):
|
| 56 |
img = np.asarray(img[0].cpu(), dtype=np.float32).transpose(1, 2, 0)
|
|
@@ -74,29 +76,30 @@ def inpaint(input_img, mask, option):
|
|
| 74 |
output_dir='output',
|
| 75 |
visualization=True)
|
| 76 |
mask = Image.fromarray(result[0]['mask'])
|
|
|
|
| 77 |
else:
|
| 78 |
mask = mask.resize((width,height))
|
| 79 |
-
mask = mask.convert('L')
|
| 80 |
|
| 81 |
if width != 512 or height != 512:
|
| 82 |
input_img = input_img.resize((512, 512))
|
| 83 |
mask = mask.resize((512, 512))
|
| 84 |
|
| 85 |
-
|
|
|
|
|
|
|
|
|
|
| 86 |
if option == 'Manual':
|
| 87 |
-
mask = (
|
| 88 |
-
mask = mask * 1.
|
| 89 |
-
kernel = np.ones((
|
| 90 |
mask = cv2.dilate(mask, kernel)
|
| 91 |
mask = mask * 255.
|
| 92 |
|
| 93 |
-
mask
|
| 94 |
mask_tensor = torch.from_numpy(mask).to(torch.float32)
|
| 95 |
mask_tensor = mask_tensor.unsqueeze(0)
|
| 96 |
mask_tensor = mask_tensor.unsqueeze(0).to(device)
|
| 97 |
|
| 98 |
-
rgb = input_img.convert('RGB')
|
| 99 |
-
rgb = np.array(rgb)
|
| 100 |
rgb = rgb.transpose(2,0,1)
|
| 101 |
rgb = torch.from_numpy(rgb.astype(np.float32)).unsqueeze(0)
|
| 102 |
rgb = (rgb.to(torch.float32) / 127.5 - 1).to(device)
|
|
@@ -109,10 +112,10 @@ def inpaint(input_img, mask, option):
|
|
| 109 |
rgb_erased = denorm(rgb_erased)
|
| 110 |
comp_img = denorm(comp_img)
|
| 111 |
|
| 112 |
-
return show_images(rgb_erased), show_images(comp_img)
|
| 113 |
|
| 114 |
gradio_inputs = [gr.inputs.Image(type='pil',
|
| 115 |
-
tool=
|
| 116 |
label="Image"),
|
| 117 |
# gr.inputs.Image(type='pil',source="canvas", label="Mask", invert_colors=True),
|
| 118 |
gr.inputs.Image(type='pil',
|
|
@@ -126,25 +129,27 @@ gradio_outputs = [gr.outputs.Image(label='Image with Hole'),
|
|
| 126 |
|
| 127 |
examples = [['test_512/person512.png', 'test_512/person512.png', 'Automatic'],
|
| 128 |
['test_512/a_org.png', 'test_512/a_overlay.png', 'Manual'],
|
| 129 |
-
['test_512/b_org.png', 'test_512/b_overlay.png', 'Manual'],
|
| 130 |
-
['test_512/c_org.png', 'test_512/c_overlay.png', 'Manual'],
|
| 131 |
-
['test_512/d_org.png', 'test_512/d_overlay.png', 'Manual'],
|
| 132 |
-
['test_512/e_org.png', 'test_512/e_overlay.png', 'Manual'],
|
| 133 |
['test_512/f_org.png', 'test_512/f_overlay.png', 'Manual'],
|
| 134 |
['test_512/g_org.png', 'test_512/g_overlay.png', 'Manual'],
|
| 135 |
['test_512/h_org.png', 'test_512/h_overlay.png', 'Manual'],
|
| 136 |
-
['test_512/i_org.png', 'test_512/i_overlay.png', 'Manual']
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
|
| 138 |
title = "FcF-Inpainting"
|
| 139 |
|
| 140 |
description = "<p style='color:royalblue; font-weight: w300;'> \
|
| 141 |
-
[Note: Queue time may take
|
| 142 |
-
(1) <span style='color:#E0B941;'>Upload
|
| 143 |
-
(2a) <span style='color:#E0B941;'>Manual Option:</span>
|
|
|
|
|
|
|
| 144 |
(2b) <span style='color:#E0B941;'>Automatic Option:</span> This option will generate a mask using a pretrained U2Net model. <br> \
|
| 145 |
-
(3) Click on Submit and witness the MAGIC! 🪄 ✨ ✨</p>"
|
| 146 |
|
| 147 |
-
article = "<p style='color: #E0B941; text-align: center'
|
| 148 |
|
| 149 |
css = ".image-preview {height: 32rem; width: auto;} .output-image {height: 32rem; width: auto;} .panel-buttons { display: flex; flex-direction: row;}"
|
| 150 |
|
|
@@ -158,5 +163,4 @@ iface = gr.Interface(fn=inpaint, inputs=gradio_inputs,
|
|
| 158 |
allow_flagging="never",
|
| 159 |
examples=examples, title=title,
|
| 160 |
description=description, article=article)
|
| 161 |
-
iface.launch(enable_queue=True
|
| 162 |
-
share=True, server_name="0.0.0.0")
|
|
|
|
| 48 |
comp_img = mask.to(device) * pred_img + (1 - mask).to(device) * org_img.to(device)
|
| 49 |
return comp_img
|
| 50 |
|
| 51 |
+
def show_images(img, width, height):
|
| 52 |
""" Display a batch of images inline. """
|
| 53 |
+
img = Image.fromarray(img)
|
| 54 |
+
img = img.resize((width, height))
|
| 55 |
+
return img
|
| 56 |
|
| 57 |
def denorm(img):
|
| 58 |
img = np.asarray(img[0].cpu(), dtype=np.float32).transpose(1, 2, 0)
|
|
|
|
| 76 |
output_dir='output',
|
| 77 |
visualization=True)
|
| 78 |
mask = Image.fromarray(result[0]['mask'])
|
| 79 |
+
mask = mask.convert('L')
|
| 80 |
else:
|
| 81 |
mask = mask.resize((width,height))
|
|
|
|
| 82 |
|
| 83 |
if width != 512 or height != 512:
|
| 84 |
input_img = input_img.resize((512, 512))
|
| 85 |
mask = mask.resize((512, 512))
|
| 86 |
|
| 87 |
+
rgb = input_img.convert('RGB')
|
| 88 |
+
rgb = np.array(rgb)
|
| 89 |
+
|
| 90 |
+
mask = np.array(mask)
|
| 91 |
if option == 'Manual':
|
| 92 |
+
mask = (mask[:, :, 0] == rgb[:, :, 0]) * (mask[:, :, 1] == rgb[:, :, 1]) * (mask[:, :, 2] == rgb[:, :, 2])
|
| 93 |
+
mask = 1. - mask.astype(np.float32) * 1.
|
| 94 |
+
kernel = np.ones((3, 3), np.uint8)
|
| 95 |
mask = cv2.dilate(mask, kernel)
|
| 96 |
mask = mask * 255.
|
| 97 |
|
| 98 |
+
mask /= 255.
|
| 99 |
mask_tensor = torch.from_numpy(mask).to(torch.float32)
|
| 100 |
mask_tensor = mask_tensor.unsqueeze(0)
|
| 101 |
mask_tensor = mask_tensor.unsqueeze(0).to(device)
|
| 102 |
|
|
|
|
|
|
|
| 103 |
rgb = rgb.transpose(2,0,1)
|
| 104 |
rgb = torch.from_numpy(rgb.astype(np.float32)).unsqueeze(0)
|
| 105 |
rgb = (rgb.to(torch.float32) / 127.5 - 1).to(device)
|
|
|
|
| 112 |
rgb_erased = denorm(rgb_erased)
|
| 113 |
comp_img = denorm(comp_img)
|
| 114 |
|
| 115 |
+
return show_images(rgb_erased, width, height), show_images(comp_img, width, height)
|
| 116 |
|
| 117 |
gradio_inputs = [gr.inputs.Image(type='pil',
|
| 118 |
+
tool="editor",
|
| 119 |
label="Image"),
|
| 120 |
# gr.inputs.Image(type='pil',source="canvas", label="Mask", invert_colors=True),
|
| 121 |
gr.inputs.Image(type='pil',
|
|
|
|
| 129 |
|
| 130 |
examples = [['test_512/person512.png', 'test_512/person512.png', 'Automatic'],
|
| 131 |
['test_512/a_org.png', 'test_512/a_overlay.png', 'Manual'],
|
|
|
|
|
|
|
|
|
|
|
|
|
| 132 |
['test_512/f_org.png', 'test_512/f_overlay.png', 'Manual'],
|
| 133 |
['test_512/g_org.png', 'test_512/g_overlay.png', 'Manual'],
|
| 134 |
['test_512/h_org.png', 'test_512/h_overlay.png', 'Manual'],
|
| 135 |
+
['test_512/i_org.png', 'test_512/i_overlay.png', 'Manual'],
|
| 136 |
+
['test_512/b_org.png', 'test_512/b_overlay.png', 'Manual'],
|
| 137 |
+
['test_512/c_org.png', 'test_512/c_overlay.png', 'Manual'],
|
| 138 |
+
['test_512/d_org.png', 'test_512/d_overlay.png', 'Manual'],
|
| 139 |
+
['test_512/e_org.png', 'test_512/e_overlay.png', 'Manual']]
|
| 140 |
|
| 141 |
title = "FcF-Inpainting"
|
| 142 |
|
| 143 |
description = "<p style='color:royalblue; font-weight: w300;'> \
|
| 144 |
+
[Note: Queue time may take up to 20 seconds! The image and mask are resized to 512x512 before inpainting.] To use FcF-Inpainting: <br> \
|
| 145 |
+
(1) <span style='color:#E0B941;'>Upload the Same Image to both</span> input boxes (Image and Mask) below. <br> \
|
| 146 |
+
(2a) <span style='color:#E0B941;'>Manual Option:</span> The TUI Image Editor used by gradio <a style='color: #E0B941;' href='https://github.com/gradio-app/gradio/issues/1810' target='_blank'>changes the image when saved</a>. We compute the mask after comparing the two inputs. Therefore, we need to save both inputs: <br> \
|
| 147 |
+
- <span style='color:#E0B941;'>Image:</span> Click on the edit button on the top-right and save without making any changes. <br> \
|
| 148 |
+
- <span style='color:#E0B941;'>Mask:</span> Draw a mask (hole) using the brush (click on the edit button in the top right of the Mask View and select the draw option). <br> \
|
| 149 |
(2b) <span style='color:#E0B941;'>Automatic Option:</span> This option will generate a mask using a pretrained U2Net model. <br> \
|
| 150 |
+
(3) Click on <span style='color:#E0B941;'>Submit</span> and witness the MAGIC! 🪄 ✨ ✨</p>"
|
| 151 |
|
| 152 |
+
article = "<p style='color: #E0B941; text-align: center'> <a style='color: #E0B941;' href='https://praeclarumjj3.github.io/fcf-inpainting/' target='_blank'>Project Page</a> | <a style='color: #E0B941;' href='https://github.com/SHI-Labs/FcF-Inpainting' target='_blank'> Keys to Better Image Inpainting: Structure and Texture Go Hand in Hand</a> | <a style='color: #E0B941;' href='https://github.com/SHI-Labs/FcF-Inpainting' target='_blank'>Github Repo</a></p>"
|
| 153 |
|
| 154 |
css = ".image-preview {height: 32rem; width: auto;} .output-image {height: 32rem; width: auto;} .panel-buttons { display: flex; flex-direction: row;}"
|
| 155 |
|
|
|
|
| 163 |
allow_flagging="never",
|
| 164 |
examples=examples, title=title,
|
| 165 |
description=description, article=article)
|
| 166 |
+
iface.launch(enable_queue=True)
|
|
|
fcf_gan.png
CHANGED
|
|
requirements.txt
CHANGED
|
@@ -1,8 +1,8 @@
|
|
| 1 |
-
icecream
|
| 2 |
opencv-python-headless
|
| 3 |
paddlepaddle
|
| 4 |
paddlehub
|
| 5 |
-
psutil
|
| 6 |
click
|
| 7 |
requests
|
| 8 |
matplotlib
|
|
@@ -22,6 +22,6 @@ pydrive2
|
|
| 22 |
pandas
|
| 23 |
easydict
|
| 24 |
kornia==0.5.0
|
| 25 |
-
gradio
|
| 26 |
ipython
|
| 27 |
-
Jinja2
|
|
|
|
| 1 |
+
icecream==2.1.0
|
| 2 |
opencv-python-headless
|
| 3 |
paddlepaddle
|
| 4 |
paddlehub
|
| 5 |
+
psutil==5.8.0
|
| 6 |
click
|
| 7 |
requests
|
| 8 |
matplotlib
|
|
|
|
| 22 |
pandas
|
| 23 |
easydict
|
| 24 |
kornia==0.5.0
|
| 25 |
+
gradio==2.9.4
|
| 26 |
ipython
|
| 27 |
+
Jinja2
|