ls-yolo-backend / _wsgi.py
davanstrien's picture
davanstrien HF Staff
Initial: HumanSignal yolo example patched for HF Spaces
3f7dd83 verified
import os
import argparse
import json
import logging
import logging.config
# Set a default log level if LOG_LEVEL is not defined
log_level = os.getenv("LOG_LEVEL", "INFO")
logging.config.dictConfig(
{
"version": 1,
"disable_existing_loggers": False, # Prevent overriding existing loggers
"formatters": {
"standard": {
"format": "[%(asctime)s] [%(levelname)s] [%(name)s::%(funcName)s::%(lineno)d] %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": log_level,
"stream": "ext://sys.stdout",
"formatter": "standard",
}
},
"root": {
"level": log_level,
"handlers": ["console"],
"propagate": True,
},
}
)
from label_studio_ml.api import init_app
from model import YOLO
_DEFAULT_CONFIG_PATH = os.path.join(os.path.dirname(__file__), "config.json")
def get_kwargs_from_config(config_path=_DEFAULT_CONFIG_PATH):
if not os.path.exists(config_path):
return dict()
with open(config_path) as f:
config = json.load(f)
assert isinstance(config, dict)
return config
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Label studio")
parser.add_argument(
"-p", "--port", dest="port", type=int, default=9090, help="Server port"
)
parser.add_argument(
"--host", dest="host", type=str, default="0.0.0.0", help="Server host"
)
parser.add_argument(
"--kwargs",
"--with",
dest="kwargs",
metavar="KEY=VAL",
nargs="+",
type=lambda kv: kv.split("="),
help="Additional LabelStudioMLBase model initialization kwargs",
)
parser.add_argument(
"-d", "--debug", dest="debug", action="store_true", help="Switch debug mode"
)
parser.add_argument(
"--log-level",
dest="log_level",
choices=["DEBUG", "INFO", "WARNING", "ERROR"],
default=log_level,
help="Logging level",
)
parser.add_argument(
"--model-dir",
dest="model_dir",
default=os.path.dirname(__file__),
help="Directory where models are stored (relative to the project directory)",
)
parser.add_argument(
"--check",
dest="check",
action="store_true",
help="Validate model instance before launching server",
)
parser.add_argument(
"--basic-auth-user",
default=os.environ.get("ML_SERVER_BASIC_AUTH_USER", None),
help="Basic auth user",
)
parser.add_argument(
"--basic-auth-pass",
default=os.environ.get("ML_SERVER_BASIC_AUTH_PASS", None),
help="Basic auth pass",
)
args = parser.parse_args()
# setup logging level
if args.log_level:
logging.root.setLevel(args.log_level)
def isfloat(value):
try:
float(value)
return True
except ValueError:
return False
def parse_kwargs():
param = dict()
for k, v in args.kwargs:
if v.isdigit():
param[k] = int(v)
elif v == "True" or v == "true":
param[k] = True
elif v == "False" or v == "false":
param[k] = False
elif isfloat(v):
param[k] = float(v)
else:
param[k] = v
return param
kwargs = get_kwargs_from_config()
if args.kwargs:
kwargs.update(parse_kwargs())
if args.check:
print('Check "' + YOLO.__name__ + '" instance creation..')
model = YOLO(**kwargs)
app = init_app(
model_class=YOLO,
basic_auth_user=args.basic_auth_user,
basic_auth_pass=args.basic_auth_pass,
)
app.run(host=args.host, port=args.port, debug=args.debug)
else:
# for uWSGI use
app = init_app(model_class=YOLO)