tinydoc-5m / tinydoc /__main__.py
harryfrz's picture
tinydoc-5m weights (5,035,273 params)
4dce182 verified
Raw History Blame Contribute Delete
1.95 kB
"""tinydoc command line.
python -m tinydoc extract receipt.jpg invoice.pdf --backend onnx --weights models
python -m tinydoc params
"""
import argparse
import json
import sys
def main():
ap = argparse.ArgumentParser(prog="tinydoc")
sub = ap.add_subparsers(dest="cmd", required=True)
ex = sub.add_parser("extract", help="extract structured JSON from images / PDFs")
ex.add_argument("files", nargs="+")
ex.add_argument("--backend", choices=["onnx", "torch"], default="onnx")
ex.add_argument("--weights", default=None, help="models/ (onnx) or runs/ (torch)")
ex.add_argument("--device", default="cpu")
ex.add_argument("--force-ocr", action="store_true", help="OCR PDFs even when they contain usable text")
ex.add_argument("--out", default=None, help="write JSON here (default: stdout)")
ex.add_argument("--compact", action="store_true", help="omit per-segment detail")
sub.add_parser("params", help="print the parameter budget")
args = ap.parse_args()
if args.cmd == "params":
from .models import BUDGET, parameter_report
for k, v in parameter_report().items():
print(f"{k:12s} {v:>10,d} (target {BUDGET.get(k, sum(BUDGET.values())):,d})")
return
from .pipeline.engine import Engine
weights = args.weights or ("models" if args.backend == "onnx" else "runs")
engine = Engine(weights, backend=args.backend, device=args.device)
results = []
for f in args.files:
r = engine.process(f, force_ocr=args.force_ocr)
if args.compact:
for p in r["pages"]:
p.pop("segments", None)
results.append(r)
payload = results[0] if len(results) == 1 else results
text = json.dumps(payload, indent=2, ensure_ascii=False)
if args.out:
with open(args.out, "w") as fh:
fh.write(text)
else:
sys.stdout.write(text + "\n")
if __name__ == "__main__":
main()