Spaces:
Running
on
L4
Running
on
L4
fix queue jam.
Browse files
CodeFormer/facelib/detection/yolov5face/face_detector.py
CHANGED
|
@@ -17,7 +17,7 @@ from facelib.detection.yolov5face.utils.general import (
|
|
| 17 |
scale_coords_landmarks,
|
| 18 |
)
|
| 19 |
|
| 20 |
-
IS_HIGH_VERSION = tuple(map(int, torch.__version__.split('+')[0].split('.'))) >= (1, 9, 0)
|
| 21 |
|
| 22 |
|
| 23 |
def isListempty(inList):
|
|
|
|
| 17 |
scale_coords_landmarks,
|
| 18 |
)
|
| 19 |
|
| 20 |
+
IS_HIGH_VERSION = tuple(map(int, torch.__version__.split('+')[0].split('.')[:3])) >= (1, 9, 0)
|
| 21 |
|
| 22 |
|
| 23 |
def isListempty(inList):
|
CodeFormer/facelib/utils/face_restoration_helper.py
CHANGED
|
@@ -6,7 +6,7 @@ from torchvision.transforms.functional import normalize
|
|
| 6 |
|
| 7 |
from facelib.detection import init_detection_model
|
| 8 |
from facelib.parsing import init_parsing_model
|
| 9 |
-
from facelib.utils.misc import img2tensor, imwrite
|
| 10 |
|
| 11 |
|
| 12 |
def get_largest_face(det_faces, h, w):
|
|
@@ -125,6 +125,9 @@ class FaceRestoreHelper(object):
|
|
| 125 |
img = img[:, :, 0:3]
|
| 126 |
|
| 127 |
self.input_img = img
|
|
|
|
|
|
|
|
|
|
| 128 |
|
| 129 |
if min(self.input_img.shape[:2])<512:
|
| 130 |
f = 512.0/min(self.input_img.shape[:2])
|
|
@@ -296,6 +299,8 @@ class FaceRestoreHelper(object):
|
|
| 296 |
|
| 297 |
|
| 298 |
def add_restored_face(self, face):
|
|
|
|
|
|
|
| 299 |
self.restored_faces.append(face)
|
| 300 |
|
| 301 |
|
|
|
|
| 6 |
|
| 7 |
from facelib.detection import init_detection_model
|
| 8 |
from facelib.parsing import init_parsing_model
|
| 9 |
+
from facelib.utils.misc import img2tensor, imwrite, is_gray, bgr2gray
|
| 10 |
|
| 11 |
|
| 12 |
def get_largest_face(det_faces, h, w):
|
|
|
|
| 125 |
img = img[:, :, 0:3]
|
| 126 |
|
| 127 |
self.input_img = img
|
| 128 |
+
self.is_gray = is_gray(img, threshold=5)
|
| 129 |
+
if self.is_gray:
|
| 130 |
+
print('Grayscale input: True')
|
| 131 |
|
| 132 |
if min(self.input_img.shape[:2])<512:
|
| 133 |
f = 512.0/min(self.input_img.shape[:2])
|
|
|
|
| 299 |
|
| 300 |
|
| 301 |
def add_restored_face(self, face):
|
| 302 |
+
if self.is_gray:
|
| 303 |
+
face = bgr2gray(face) # convert img into grayscale
|
| 304 |
self.restored_faces.append(face)
|
| 305 |
|
| 306 |
|
CodeFormer/facelib/utils/misc.py
CHANGED
|
@@ -1,6 +1,8 @@
|
|
| 1 |
import cv2
|
| 2 |
import os
|
| 3 |
import os.path as osp
|
|
|
|
|
|
|
| 4 |
import torch
|
| 5 |
from torch.hub import download_url_to_file, get_dir
|
| 6 |
from urllib.parse import urlparse
|
|
@@ -139,3 +141,34 @@ def scandir(dir_path, suffix=None, recursive=False, full_path=False):
|
|
| 139 |
continue
|
| 140 |
|
| 141 |
return _scandir(dir_path, suffix=suffix, recursive=recursive)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
import cv2
|
| 2 |
import os
|
| 3 |
import os.path as osp
|
| 4 |
+
import numpy as np
|
| 5 |
+
from PIL import Image
|
| 6 |
import torch
|
| 7 |
from torch.hub import download_url_to_file, get_dir
|
| 8 |
from urllib.parse import urlparse
|
|
|
|
| 141 |
continue
|
| 142 |
|
| 143 |
return _scandir(dir_path, suffix=suffix, recursive=recursive)
|
| 144 |
+
|
| 145 |
+
|
| 146 |
+
def is_gray(img, threshold=10):
|
| 147 |
+
img = Image.fromarray(img)
|
| 148 |
+
if len(img.getbands()) == 1:
|
| 149 |
+
return True
|
| 150 |
+
img1 = np.asarray(img.getchannel(channel=0), dtype=np.int16)
|
| 151 |
+
img2 = np.asarray(img.getchannel(channel=1), dtype=np.int16)
|
| 152 |
+
img3 = np.asarray(img.getchannel(channel=2), dtype=np.int16)
|
| 153 |
+
diff1 = (img1 - img2).var()
|
| 154 |
+
diff2 = (img2 - img3).var()
|
| 155 |
+
diff3 = (img3 - img1).var()
|
| 156 |
+
diff_sum = (diff1 + diff2 + diff3) / 3.0
|
| 157 |
+
if diff_sum <= threshold:
|
| 158 |
+
return True
|
| 159 |
+
else:
|
| 160 |
+
return False
|
| 161 |
+
|
| 162 |
+
def rgb2gray(img, out_channel=3):
|
| 163 |
+
r, g, b = img[:,:,0], img[:,:,1], img[:,:,2]
|
| 164 |
+
gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
|
| 165 |
+
if out_channel == 3:
|
| 166 |
+
gray = gray[:,:,np.newaxis].repeat(3, axis=2)
|
| 167 |
+
return gray
|
| 168 |
+
|
| 169 |
+
def bgr2gray(img, out_channel=3):
|
| 170 |
+
b, g, r = img[:,:,0], img[:,:,1], img[:,:,2]
|
| 171 |
+
gray = 0.2989 * r + 0.5870 * g + 0.1140 * b
|
| 172 |
+
if out_channel == 3:
|
| 173 |
+
gray = gray[:,:,np.newaxis].repeat(3, axis=2)
|
| 174 |
+
return gray
|
app.py
CHANGED
|
@@ -16,6 +16,7 @@ from torchvision.transforms.functional import normalize
|
|
| 16 |
from basicsr.utils import imwrite, img2tensor, tensor2img
|
| 17 |
from basicsr.utils.download_util import load_file_from_url
|
| 18 |
from facelib.utils.face_restoration_helper import FaceRestoreHelper
|
|
|
|
| 19 |
from basicsr.archs.rrdbnet_arch import RRDBNet
|
| 20 |
from basicsr.utils.realesrgan_utils import RealESRGANer
|
| 21 |
|
|
@@ -108,6 +109,7 @@ def inference(image, background_enhance, face_upsample, upscale, codeformer_fide
|
|
| 108 |
draw_box = False
|
| 109 |
detection_model = "retinaface_resnet50"
|
| 110 |
|
|
|
|
| 111 |
face_helper = FaceRestoreHelper(
|
| 112 |
upscale,
|
| 113 |
face_size=512,
|
|
@@ -125,6 +127,9 @@ def inference(image, background_enhance, face_upsample, upscale, codeformer_fide
|
|
| 125 |
if has_aligned:
|
| 126 |
# the input faces are already cropped and aligned
|
| 127 |
img = cv2.resize(img, (512, 512), interpolation=cv2.INTER_LINEAR)
|
|
|
|
|
|
|
|
|
|
| 128 |
face_helper.cropped_faces = [img]
|
| 129 |
else:
|
| 130 |
face_helper.read_image(img)
|
|
@@ -228,7 +233,7 @@ If you have any questions, please feel free to reach me out at <b>shangchenzhou@
|
|
| 228 |

|
| 229 |
"""
|
| 230 |
|
| 231 |
-
gr.Interface(
|
| 232 |
inference, [
|
| 233 |
gr.inputs.Image(type="filepath", label="Input"),
|
| 234 |
gr.inputs.Checkbox(default=True, label="Background_Enhance"),
|
|
@@ -249,3 +254,6 @@ gr.Interface(
|
|
| 249 |
['05.jpg', True, True, 2, 0.1]
|
| 250 |
]
|
| 251 |
).launch()
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
from basicsr.utils import imwrite, img2tensor, tensor2img
|
| 17 |
from basicsr.utils.download_util import load_file_from_url
|
| 18 |
from facelib.utils.face_restoration_helper import FaceRestoreHelper
|
| 19 |
+
from facelib.utils.misc import is_gray
|
| 20 |
from basicsr.archs.rrdbnet_arch import RRDBNet
|
| 21 |
from basicsr.utils.realesrgan_utils import RealESRGANer
|
| 22 |
|
|
|
|
| 109 |
draw_box = False
|
| 110 |
detection_model = "retinaface_resnet50"
|
| 111 |
|
| 112 |
+
upscale = int(upscale) # covert type to int
|
| 113 |
face_helper = FaceRestoreHelper(
|
| 114 |
upscale,
|
| 115 |
face_size=512,
|
|
|
|
| 127 |
if has_aligned:
|
| 128 |
# the input faces are already cropped and aligned
|
| 129 |
img = cv2.resize(img, (512, 512), interpolation=cv2.INTER_LINEAR)
|
| 130 |
+
face_helper.is_gray = is_gray(img, threshold=5)
|
| 131 |
+
if face_helper.is_gray:
|
| 132 |
+
print('Grayscale input: True')
|
| 133 |
face_helper.cropped_faces = [img]
|
| 134 |
else:
|
| 135 |
face_helper.read_image(img)
|
|
|
|
| 233 |

|
| 234 |
"""
|
| 235 |
|
| 236 |
+
demo = gr.Interface(
|
| 237 |
inference, [
|
| 238 |
gr.inputs.Image(type="filepath", label="Input"),
|
| 239 |
gr.inputs.Checkbox(default=True, label="Background_Enhance"),
|
|
|
|
| 254 |
['05.jpg', True, True, 2, 0.1]
|
| 255 |
]
|
| 256 |
).launch()
|
| 257 |
+
|
| 258 |
+
demo.queue(concurrency_count=4)
|
| 259 |
+
demo.launch()
|