File size: 4,044 Bytes
51defdc | 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 | #!/usr/bin/env python3
# SPDX-License-Identifier: Apache-2.0
"""Build (and optionally send) a ``POST /predict`` request for meteor-p150. Standard library only.
# the shipped sample: eight camera files + its calibration preset + ego speed + stream, from its manifest
python3 code/tt_meteor/server/client.py --sample code/tt_meteor/samples/synthetic_8cam.json --out req.json
curl -s localhost:20000/predict -H 'Content-Type: application/json' -d @req.json
# your own frame: the eight cameras (an absent narrow camera as an all-zero image), a calibration JSON
# (SERVING.md 3.1) or a preset listed by /info, and the ego speed in m/s; send it and print the response
python3 code/tt_meteor/server/client.py --image CAM_FRONT_WIDE=fw.jpg ... --image CAM_BACK_NARROW=bn.jpg \
--calib rig.json --ego-speed 8.3 --stream-id car1 --url http://127.0.0.1:20000
Everything but ``--sample`` and ``--ego-speed`` is the vendored ``ttaw/server/client.py`` (C08): ``--image NAME=PATH``
(repeat), ``--calib`` / ``--calib-preset``, ``--param k=v`` (repeat), ``--stream-id``, ``--reset``,
``--output-format json|npz``, ``--out``, ``--url``. Runs from the model repository with any Python 3.9+, without numpy
and without installing the package. In Python, use ``tt_meteor.ttaw.server.client`` (``build_request``, ``post``,
``wait_ready``, ...) and ``tt_meteor.server.smoke_test.build_sample_request``.
"""
import argparse
import json
import sys
from pathlib import Path
HERE = Path(__file__).resolve().parent
sys.path.insert(0, str(HERE))
sys.path.insert(0, str(HERE.parent / "ttaw" / "server")) # first: its client.py, not this file
import client as ttaw_client # noqa: E402 (the vendored stdlib-only client)
def _param(spec: str):
k, _, v = spec.partition("=")
try:
return k, json.loads(v)
except ValueError:
return k, v
def main(argv=None) -> int:
ap = argparse.ArgumentParser(description=__doc__.split("\n\n")[0])
ap.add_argument("--sample", help="a sample manifest (samples/<name>.json): images, calibration, ego speed, stream")
ap.add_argument("--image", action="append", default=[], help="NAME=PATH, repeat per camera")
ap.add_argument("--calib", help="calibration JSON file")
ap.add_argument("--calib-preset", help="a preset name listed by /info")
ap.add_argument("--ego-speed", type=float, help="ego speed in m/s (required unless --sample)")
ap.add_argument("--param", action="append", default=[], help="k=v (JSON value), repeat")
ap.add_argument("--stream-id")
ap.add_argument("--reset", action="store_true")
ap.add_argument("--output-format", default="json", choices=["json", "npz"])
ap.add_argument("--out", help="write the request JSON here")
ap.add_argument("--url", help="POST it to this server and print the response")
a = ap.parse_args(argv)
if a.sample:
from smoke_test import build_sample_request # noqa: E402 (stdlib only)
req = build_sample_request(Path(a.sample))
if a.param:
req["params"] = dict(_param(p) for p in a.param)
if a.ego_speed is not None:
req["ego_speed"] = a.ego_speed
if a.output_format != "json":
req["output_format"] = a.output_format
else:
if a.ego_speed is None:
ap.error("--ego-speed is required (m/s), unless --sample gives it")
req = ttaw_client.build_request(images=a.image, calib=a.calib, calib_preset=a.calib_preset,
params=dict(_param(p) for p in a.param), stream_id=a.stream_id,
reset=a.reset, output_format=a.output_format)
req["ego_speed"] = a.ego_speed
if a.out:
Path(a.out).write_text(json.dumps(req))
if a.url:
code, body = ttaw_client.post(a.url, req)
print(json.dumps(body, indent=1)[:20000])
return 0 if code == 200 else 1
if not a.out:
json.dump(req, sys.stdout)
return 0
if __name__ == "__main__":
sys.exit(main())
|