HighCWu's picture
init app
e9d4572
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()