nanee-animation1 / examples /fix_annotations.py
ygauravyy's picture
Upload 722 files
d49f7bc verified
# Copyright (c) Meta Platforms, Inc. and affiliates.
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
import argparse
import base64
from flask import Flask, render_template, request
import json
import os
import sys
import yaml
global cfg_path
global char_folder
app = Flask(__name__, template_folder=os.path.abspath("./fixer_app/"))
def load_cfg(path):
with open(path, "r") as f:
cfg_text = f.read()
cfg_yaml = yaml.load(cfg_text, Loader=yaml.Loader)
return cfg_yaml
def write_cfg(path, cfg):
with open(path, "w") as f:
yaml.dump(cfg, f)
@app.route("/")
def index():
global cfg_path
global char_folder
cfg = load_cfg(cfg_path)
base64_img = {"data": ""}
with open(os.path.join(char_folder, "texture.png"), "rb") as image_file:
base64_img['data'] = str(base64.b64encode(image_file.read()), "utf-8")
return render_template('dist/index.html', cfg=cfg, image=base64_img)
@app.route("/annotations/submit", methods=["POST"])
def post_cfg():
output, message = process(request)
if output:
print(output)
return render_template('submit.html', code=output, message=message)
def process(request):
try:
formdata = request.form.get('data')
except Exception as e:
return None, f"Error parsing data from request. No JSON data was found: {e}"
try:
jsondata = json.loads(formdata)
except Exception as e:
return None, f"Error parsing submission data into JSON. Invalid format?: {e}"
# convert joint locations from floats to ints
for joint in jsondata['skeleton']:
joint['loc'][0] = round(joint['loc'][0])
joint['loc'][1] = round(joint['loc'][1])
try:
new_cfg = yaml.dump(jsondata)
except Exception as e:
return None, f"Error converting submission to YAML data. Invalid format?: {e}"
try:
write_cfg(os.path.join(cfg_path), jsondata)
except Exception as e:
return None, f"Error saving down file to `{cfg_path}: {e}`"
return new_cfg, f"Successfully saved config to `{cfg_path}`"
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('char_folder', type=str, help="the location of the character bundle")
parser.add_argument('--port', type=int, default=5050, help="the port the tool launches on")
args = parser.parse_args()
char_folder = args.char_folder
cfg_path = os.path.join(char_folder, "char_cfg.yaml")
if not os.path.isfile(cfg_path):
print(f"[Error] File not found. Expected config file at: {cfg_path}")
sys.exit(1)
app.run(port=args.port, debug=False)