File size: 1,864 Bytes
60e41bb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from __future__ import annotations

import argparse
import csv
import json
import statistics
import time
from pathlib import Path

from waterleaf.evaluation import score_predictions
from waterleaf.runtime import build_application


def main() -> None:
    parser = argparse.ArgumentParser(description="Evaluate Waterleaf plant identification.")
    parser.add_argument("manifest", type=Path)
    parser.add_argument("--out", type=Path, default=Path("evaluation/results.json"))
    args = parser.parse_args()

    application = build_application()
    rows = []
    latencies = []
    with args.manifest.open(newline="") as handle:
        for item in csv.DictReader(handle):
            images = [Path(value) for value in item["images"].split("|") if value]
            started = time.perf_counter()
            result = application.identification.identify(images)
            latency = time.perf_counter() - started
            latencies.append(latency)
            rows.append(
                {
                    "case_id": item["case_id"],
                    "expected": item["expected_scientific_name"],
                    "predictions": [
                        candidate.scientific_name for candidate in result.candidates
                    ],
                    "latency_seconds": round(latency, 3),
                }
            )

    report = {
        "metrics": score_predictions(rows),
        "latency_seconds": {
            "mean": statistics.fmean(latencies) if latencies else 0,
            "median": statistics.median(latencies) if latencies else 0,
            "max": max(latencies, default=0),
        },
        "cases": rows,
    }
    args.out.parent.mkdir(parents=True, exist_ok=True)
    args.out.write_text(json.dumps(report, indent=2))
    print(json.dumps(report["metrics"], indent=2))


if __name__ == "__main__":
    main()