Spaces:
Running
Running
File size: 4,013 Bytes
26a9456 d7f3620 b9371bb 61bd4aa f251776 a6e209b 638a4e8 214cbbd 959a59f a3e4fb1 d7f3620 2c05e7c 45bc16e d7f3620 523daa6 396303a d7f3620 523daa6 8948487 396303a 7286c79 396303a 300b53a 214cbbd 26a9456 214cbbd d7f3620 d7b3b72 7286c79 d7b3b72 26a9456 2bd9163 b439c96 d7f3620 45bc16e 26a9456 d7f3620 eec8b99 d7f3620 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
#This code is largely based on: https://huggingface.co/spaces/diffusers/controlnet-3d-pose
import gradio as gr
from PIL import Image, ImageFilter, ImageOps
from io import BytesIO
import numpy as np
import base64
import cv2
import os
import uuid
uid=uuid.uuid4()
canvas_html = '<div style="height:50%"><pose-maker/></div>'
low_threshold = 100
high_threshold = 200
load_js = """
async () => {
const url = "https://huggingface.co/datasets/mishig/gradio-components/raw/main/mannequinAll.js"
fetch(url)
.then(res => res.text())
.then(text => {
const script = document.createElement('script');
script.type = "module"
script.src = URL.createObjectURL(new Blob([text], { type: 'application/javascript' }));
document.head.appendChild(script);
});
}
"""
get_js_image = """
async (canvas, prompt) => {
const poseMakerEl = document.querySelector("pose-maker");
const imgBase64 = poseMakerEl.captureScreenshotDepthMap();
return [imgBase64, prompt]
}
"""
js_change_rotation_axis = """
async (axis) => {
const poseMakerEl = document.querySelector("pose-maker");
poseMakerEl.changeRotationAxis(axis);
}
"""
js_pose_template = """
async (pose) => {
const poseMakerEl = document.querySelector("pose-maker");
poseMakerEl.setPose(pose);
}
"""
def get_canny_filter(image):
if not isinstance(image, np.ndarray):
image = np.array(image)
image = cv2.Canny(image, low_threshold, high_threshold)
image = image[:, :, None]
image = np.concatenate([image, image, image], axis=2)
canny_image = Image.fromarray(image)
return canny_image
def generate_images(canvas,output_type):
base64_img = canvas
image_data = base64.b64decode(base64_img.split(',')[1])
left =128
top = 0
right = 384
bottom = 512
input_img = Image.open(BytesIO(image_data)).convert(
'RGB').resize((512,512)).crop((left, top, right, bottom))
#input_img = input_img.filter(ImageFilter.GaussianBlur(radius=2))
input_img = ImageOps.invert(get_canny_filter(input_img)) if output_type == "Canny" else input_img
input_img = ImageOps.invert(input_img) if output_type == "Depth" else input_img
#input_img = Image.open(BytesIO(base64_img)).resize((512,512)).crop((left, top, right, bottom)) if output_type == "Base" else input_img
#input_img = ImageOps.invert(input_img)
input_img.save(f"{uid}-pose.png")
out = os.path.abspath(f"{uid}-pose.png")
out_url = f'https://omnibus-model-mover.hf.space/file={out}'
return f"{uid}-pose.png",f"{uid}-pose.png",out_url
def placeholder_fn(axis):
pass
with gr.Blocks() as b:
with gr.Row():
canvas = gr.HTML(canvas_html, elem_id="canvas_html", visible=True)
with gr.Column():
rotation_axis = gr.Radio(choices=["x", "y", "z"], value="x", label="Joint rotation axis")
pose_template = gr.Radio(choices=["regular", "ballet", "handstand", "split", "kick", "chilling"], value="regular", label="Pose template")
output_type = gr.Radio(choices=["Depth", "Canny"], value="Depth", label="Image Output")
run_button = gr.Button("Generate")
out_text = gr.Textbox(label="Image URL")
out_file=gr.File()
out_im = gr.Image(type='filepath',show_share_button=True)
rotation_axis.change(fn=placeholder_fn,
inputs=[rotation_axis],
outputs=[],
queue=False,
_js=js_change_rotation_axis)
pose_template.change(fn=placeholder_fn,
inputs=[pose_template],
outputs=[],
queue=False,
_js=js_pose_template)
run_button.click(fn=generate_images,
inputs=[canvas,output_type],
outputs=[out_im,out_file,out_text],
_js=get_js_image)
b.load(None,None,None,_js=load_js)
b.launch() |