Spaces:
Runtime error
Runtime error
import re | |
import base64 | |
import datetime | |
import sys | |
import pickle | |
import gzip | |
import json | |
import time | |
import gradio as gr | |
from ai import * | |
from tricks import * | |
from decompositioner import * | |
from rendering import * | |
import os | |
import glob | |
import shutil | |
splash = glob.glob('ui/web-mobile/splash*')[0] | |
os.remove(splash) | |
shutil.copy('res/splash.png', splash) | |
with open('ui/web-mobile/index.html', 'r', encoding='utf-8') as f: | |
page = f.read() | |
with open('ui/web-mobile/index.html', 'w', encoding='utf-8') as f: | |
f.write(page.replace('Cocos Creator | ', '')) | |
def cv2_encode(image: np.ndarray, name): | |
if image is None: | |
return 'null' | |
if '.jpg' in name: | |
_, data = cv2.imencode('.jpeg', image) | |
return 'data:image/jpeg;base64,' + base64.b64encode(data).decode('utf8') | |
else: | |
_, data = cv2.imencode('.png', image) | |
return 'data:image/png;base64,' + base64.b64encode(data).decode('utf8') | |
def get_request_image(request, name): | |
img = request.get(name) | |
img = re.sub('^data:image/.+;base64,', '', img) | |
img = base64.b64decode(img) | |
img = np.fromstring(img, dtype=np.uint8) | |
img = cv2.imdecode(img, -1) | |
return img | |
def npcache(history, room_id, name, data): | |
rooms = list(filter(lambda _room: _room["id"] == room_id, history)) | |
if len(rooms) == 0: | |
room = { "id": room_id } | |
history.append(room) | |
else: | |
room = rooms[0] | |
room[name] = data | |
def npread(history, room_id, name): | |
rooms = list(filter(lambda _room: _room["id"] == room_id, history)) | |
if len(rooms) == 0: | |
return None | |
else: | |
room = rooms[0] | |
return room.get(name, None) | |
def upload_sketch(json_str, history): | |
request = json.loads(json_str) | |
timenow = time.time() | |
ID = datetime.datetime.now().strftime('H%HM%MS%S') | |
room = datetime.datetime.now().strftime('%b%dH%HM%MS%S') + 'R' + str(np.random.randint(100, 999)) | |
sketch = from_png_to_jpg(get_request_image(request, 'sketch')) | |
npcache(history, room, 'sketch.original.jpg', sketch) | |
sketch = go_tail(cli_norm(min_resize(sketch, 512))) | |
print('original_sketch saved') | |
s256 = go_vector(go_cal(mk_resize(sketch, 8)))[:, :, 0] | |
print('s256') | |
s512 = go_vector(go_cal(d_resize(sketch, s256.shape, 2.0)))[:, :, 0] | |
print('s512') | |
s1024 = go_vector(go_cal(d_resize(sketch, s256.shape, 4.0)))[:, :, 0] | |
print('s1024') | |
npcache(history, room, 'sketch.s1024.png', s1024) | |
npcache(history, room, 'sketch.s512.png', s512) | |
npcache(history, room, 'sketch.s256.png', s256) | |
print('edge processed') | |
fill = double_fill(s1024, s512, s256) | |
npcache(history, room, 'sketch.fill', fill) | |
print('filled') | |
npcache(history, room, 'sketch.colorization.png', np.min(sketch, axis=2)) | |
print('sketch processed') | |
print(time.time() - timenow) | |
if len(history) > 5: | |
history = history[-5:] | |
return room + '_' + ID, history | |
def request_result(json_str, history): | |
request = json.loads(json_str) | |
timenow = time.time() | |
room = request.get("room") | |
if len(list(filter(lambda _room: _room["id"] == room, history))) == 0: | |
return None, history | |
skipper = str(request.get("skipper")) | |
light_r = float(request.get("r")) | |
light_g = float(request.get("g")) | |
light_b = float(request.get("b")) | |
light_h = float(request.get("h")) | |
light_max = max([light_r, light_g, light_b, light_h]) | |
inv4 = int(request.get("inv4")) | |
print('inv4=' + str(inv4)) | |
light_r = (light_r + 1e-5) / (light_max + 1e-5) | |
light_g = (light_g + 1e-5) / (light_max + 1e-5) | |
light_b = (light_b + 1e-5) / (light_max + 1e-5) | |
light_h *= 600.0 | |
light_d = request.get("d") | |
need_render = int(request.get("need_render")) | |
print([light_r, light_g, light_b, light_d]) | |
ID = datetime.datetime.now().strftime('H%HM%MS%S') | |
points = request.get("points") | |
points = json.loads(points) | |
npcache(history, room, 'points.' + ID + '.txt', points) | |
if len(points) > 500: | |
return None, history | |
for _ in range(len(points)): | |
points[_][1] = 1 - points[_][1] | |
fill = npread(history, room, 'sketch.fill') | |
s1024 = npread(history, room, 'sketch.s1024.png') | |
sketch = npread(history, room, 'sketch.colorization.png') | |
print(skipper) | |
if npread(history, room, 'albedo.' + skipper + '.png') is not None: | |
albedo = npread(history, room, 'albedo.' + skipper + '.png') | |
npcache(history, room, 'albedo.' + ID + '.png', albedo) | |
print('albedo readed') | |
else: | |
faceID = int(request.get("faceID")) - 65535 | |
print(faceID) | |
if faceID > -1: | |
print('fake ref') | |
face = from_png_to_jpg(cv2.imread("refs/" + str(faceID + 1) + ".png", cv2.IMREAD_UNCHANGED)) | |
else: | |
print('get ref') | |
face = from_png_to_jpg(get_request_image(request, 'face')) | |
npcache(history, room, 'face.' + ID + '.jpg', face) | |
face = s_enhance(face) | |
print('request result room = ' + str(room) + ', ID = ' + str(ID)) | |
print('processing painting in ' + room) | |
if inv4 > 0: | |
sketch_1024 = k_resize(sketch, 64) | |
else: | |
sketch_1024 = k_resize(sketch, 48) | |
hints_1024 = ini_hint(sketch_1024) | |
hints_1024 = opreate_normal_hint(hints_1024, points, length=2, skip_sp=True) | |
baby = go_head( | |
sketch=sketch_1024, | |
global_hint=k_resize(face, 14), | |
local_hint=hints_1024 | |
) | |
npcache(history, room, 'baby.' + ID + '.jpg', baby) | |
print('baby born') | |
composition = d_resize(re_deatlize(deatlize(balance_fill(baby, fill, opreate_normal_hint(ini_hint(s1024), points, length=2, skip_sp=True), s1024)), s1024), sketch.shape) | |
npcache(history, room, 'composition.' + ID + '.jpg', composition) | |
gird = process_overlay(composition, sketch) | |
npcache(history, room, 'gird.' + ID + '.jpg', gird) | |
print('composition saved') | |
if inv4 > 0: | |
albedo = go_render(sketch_1024, d_resize(composition, sketch_1024.shape, 0.5), hints_1024) | |
albedo = go_tail(albedo) | |
albedo = d_resize(re_deatlize(d_resize(albedo, s1024.shape), s1024), sketch.shape) | |
albedo = cv2.cvtColor(albedo, cv2.COLOR_RGB2YUV) | |
albedo[:, :, 0] = go_vgg7(albedo[:, :, 0]) | |
albedo = cv2.cvtColor(albedo, cv2.COLOR_YUV2RGB) | |
else: | |
albedo = re_deatlize(d_resize(baby, s1024.shape), s1024) | |
albedo = d_resize(albedo, sketch.shape, 0.25) | |
albedo = go_tail(albedo) | |
albedo = go_tail(albedo) | |
albedo = d_resize(albedo, sketch.shape) | |
boundary = sketch.astype(np.float32) | |
boundary = cv2.GaussianBlur(boundary, (0, 0), 1.618) - boundary | |
boundary = boundary.clip(0, 255) | |
albedo = cv2.cvtColor(albedo, cv2.COLOR_RGB2HSV).astype(np.float32) | |
albedo[:, :, 1] += albedo[:, :, 1] * boundary / 48.0 | |
albedo[:, :, 2] -= boundary | |
albedo = cv2.cvtColor(albedo.clip(0, 255).astype(np.uint8), cv2.COLOR_HSV2RGB) | |
npcache(history, room, 'albedo.' + ID + '.png', albedo) | |
print('albedo saved') | |
if need_render == 0: | |
npcache(history, room, 'result.' + ID + '.jpg', albedo) | |
# cv2.imwrite('results/' + room + '.' + ID + '.jpg', albedo) | |
print(time.time() - timenow) | |
return room + '_' + ID, history | |
HSV, YUV, DEL = process_albedo(albedo, composition, sketch) | |
npcache(history, room, 'HSV.' + ID + '.jpg', HSV) | |
npcache(history, room, 'YUV.' + ID + '.jpg', YUV) | |
npcache(history, room, 'DEL.' + ID + '.jpg', DEL) | |
print('HSV YUV DEL') | |
albedo_s1024 = d_resize(albedo, s1024.shape) | |
matting = go_mat(albedo_s1024) | |
matting = np.tile(matting[:, :, None], [1, 1, 3]) | |
matting = shade_fill(matting, fill, opreate_normal_hint(ini_hint(s1024), points, length=2, skip_sp=False), s1024) | |
matting = matting[:, :, 0] | |
depth = np.zeros_like(matting, dtype=np.uint8) + 255 | |
depth[matting < 127] = 127 | |
depth[s1024 < 250] = 0 | |
npcache(history, room, 'depth.' + ID + '.jpg', depth) | |
print('depth saved') | |
normal = go_norm(depth).astype(np.float32) | |
normal = ((normal + 1e-4) / (np.max(normal, axis=2, keepdims=True) + 1e-4) * 255.0).clip(0, 255).astype(np.uint8) | |
normal[matting < 127] = 255 | |
normal = re_deatlize(normal, s1024) | |
normal = d_resize(normal, sketch.shape) | |
npcache(history, room, 'normal.' + ID + '.jpg', normal) | |
print('norm saved') | |
mask = np.zeros_like(matting, dtype=np.uint8) + 255 | |
mask[matting < 127] = 0 | |
mask = d_resize(mask, sketch.shape) | |
mask[mask < 127] = 0 | |
mask[mask > 0] = 255 | |
if int(light_d) == 0: | |
result = small_render(normal, mask, albedo, s1024, r=light_r, g=light_g, b=light_b, h=light_h, left=True, top=True) | |
elif int(light_d) == 1: | |
result = small_render(normal, mask, albedo, s1024, r=light_r, g=light_g, b=light_b, h=light_h, left=False, top=True) | |
elif int(light_d) == 2: | |
result = small_render(normal, mask, albedo, s1024, r=light_r, g=light_g, b=light_b, h=light_h, left=True, top=False) | |
else: | |
result = small_render(normal, mask, albedo, s1024, r=light_r, g=light_g, b=light_b, h=light_h, left=False, top=False) | |
if need_render == 2: | |
npcache(history, room, 'result.' + ID + '.jpg', result) | |
# cv2.imwrite('results/' + room + '.' + ID + '.jpg', result) | |
print(time.time() - timenow) | |
return room + '_' + ID, history | |
print('result saved') | |
preview = np.concatenate([np.tile(sketch[:, :, None], [1, 1, 3]), albedo, result], axis=1) | |
npcache(history, room, 'preview.' + ID + '.jpg', preview) | |
print('preview saved') | |
npcache(history, room, 'result.' + ID + '.jpg', result) | |
# cv2.imwrite('results/' + room + '.' + ID + '.jpg', preview) | |
print(time.time() - timenow) | |
return room + '_' + ID, history | |
def download_result(name, history): | |
room_id, name = name.split('/') | |
rooms = list(filter(lambda _room: _room["id"] == room_id, history)) | |
if len(rooms) == 0: | |
return None | |
else: | |
room = rooms[0] | |
real_name = None | |
for k in room.keys(): | |
if name in k: | |
real_name = k | |
break | |
if real_name is None: | |
return None | |
name = real_name | |
result = room.get(name, None) | |
if 'points' in name: | |
return json.dumps(result) | |
return cv2_encode(result, name) | |
with gr.Blocks() as demo: | |
history = gr.State(value=[]) | |
with gr.Row(): | |
with gr.Column(): | |
btn_show = gr.Button("Open Style2Paints V4.2") | |
btn_show.click(None, _js="(_) => open('file/ui/web-mobile/index.html')") | |
with gr.Row(): | |
with gr.Box(): | |
with gr.Row(): | |
upload_sketch_json = gr.Textbox(label="upload_sketch(json string)") | |
with gr.Row(): | |
upload_sketch_btn = gr.Button(label="Submit sketch json") | |
with gr.Row(): | |
upload_sketch_result = gr.Textbox(label="Result", interactive=False) | |
upload_sketch_btn.click(upload_sketch, [upload_sketch_json, history], [upload_sketch_result, history], api_name="upload_sketch") | |
with gr.Box(): | |
with gr.Row(): | |
request_result_json = gr.Textbox(label="request_result(json string)") | |
with gr.Row(): | |
request_result_btn = gr.Button(label="Submit json of request for result") | |
with gr.Row(): | |
request_result_result = gr.Textbox(label="Result", interactive=False) | |
upload_sketch_btn.click(request_result, [request_result_json, history], [request_result_result, history], api_name="request_result") | |
with gr.Box(): | |
with gr.Row(): | |
download_result_json = gr.Textbox(label="download_result(json string)") | |
with gr.Row(): | |
download_result_btn = gr.Button(label="Submit json of download for result") | |
with gr.Row(): | |
download_result_result = gr.Textbox(label="Result", interactive=False) | |
upload_sketch_btn.click(download_result, [download_result_json, history], [download_result_result], api_name="download_result") | |
demo.launch() | |