|
import gradio as gr |
|
import json as js |
|
import util |
|
from fileservice import app |
|
from fastapi.staticfiles import StaticFiles |
|
from pose import infer, draw |
|
from abgr import remove_bg, split_image |
|
|
|
def image_changed(image): |
|
if image == None: |
|
return "estimation", {} |
|
|
|
print("make mask") |
|
cvimage = util.pil2cv(image) |
|
mask, fg, bg = split_image(cvimage[..., ::-1]) |
|
|
|
print("pose not found") |
|
pose_result, _ = infer(cvimage) |
|
|
|
candidate, subset = util.convert_to_openpose(pose_result) |
|
candidateJson = util.candidate_to_json_string(candidate) |
|
subsetJson = util.subset_to_json_string(subset) |
|
jsonText = f'{{"candidate":{candidateJson}, "subset":{subsetJson}, "width":{image.width}, "height":{image.height}}}' |
|
return f'{image.width}px x {image.height}px, {len(subset)} indivisual(s)', jsonText, mask, fg, bg |
|
|
|
with gr.Blocks(css="""button { min-width: 80px; }""") as demo: |
|
with gr.Row(): |
|
with gr.Column(scale=1): |
|
source = gr.Image(type="pil") |
|
info = gr.Markdown("""info""") |
|
gr.Examples( |
|
examples=["static/sample1.png", "static/sample2.png", "static/sample3.png"], |
|
inputs=source, |
|
) |
|
btn = gr.Button("Import") |
|
with gr.Accordion(label="Parts", open=False): |
|
mask = gr.Image() |
|
frontImage = gr.Image(image_mode="RGBA") |
|
backImage = gr.Image(image_mode="RGBA") |
|
gr.Markdown(""" |
|
#### Reference |
|
Pose estimation: [MMPose](https://github.com/open-mmlab/mmpose) |
|
|
|
Image splitting: [anime-segmentation](https://github.com/SkyTNT/anime-segmentation/) |
|
""") |
|
with gr.Accordion(label="Json", open=False): |
|
json = gr.JSON(label="Json") |
|
with gr.Column(scale=3): |
|
gr.HTML('<canvas id="canvas" width="512" height="512"></canvas>') |
|
with gr.Row(): |
|
gr.HTML('<canvas id="canvas2" width="512" height="512" style="display:none"></canvas>') |
|
gr.HTML('<canvas id="canvas3" width="512" height="512" style="display:none"></canvas>') |
|
gr.HTML('<canvas id="canvas4" width="512" height="512" style="display:none"></canvas>') |
|
gr.HTML('<canvas id="microscope" width="50" height="50" style="display:none"></canvas>') |
|
|
|
source.change( |
|
fn = image_changed, |
|
inputs = [source], |
|
outputs = [info, json, mask, frontImage, backImage]) |
|
|
|
btn.click( |
|
fn = None, |
|
inputs = [frontImage, backImage, json], |
|
outputs = [], |
|
_js="(frontImage, backImage, json) => { initializeEditor(); importPose(json); importPicture(frontImage); importBackground(backImage); return []; }") |
|
|
|
demo.load(fn=None, inputs=[], outputs=[], _js="() => { initializeEditor(); importPose(); return []; }") |
|
|
|
print("mount") |
|
app.mount("/static", StaticFiles(directory="static"), name="static") |
|
app.mount("/js", StaticFiles(directory="js"), name="js") |
|
gr.mount_gradio_app(app, demo, path="/") |
|
|