File size: 4,217 Bytes
efc839c
9fe9439
 
297b2e5
f4eea62
9fe9439
f4eea62
efc839c
f4eea62
efc839c
 
f4eea62
efc839c
 
f4eea62
 
 
 
efc839c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
297b2e5
 
 
 
 
 
 
efc839c
 
 
f4eea62
 
efc839c
 
 
 
 
 
 
 
297b2e5
 
 
 
 
 
efc839c
 
921abd0
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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
import pandas as pd
import gradio as gr

CSV_PATH = "./judged-fast-accurate-downsampled.csv"


def load_csv_from_path(path: str):
    try:
        df = pd.read_csv(path)
        return df, ""
    except Exception as e:
        return None, f"Failed to read CSV at {path}: {e}"


def filter_rows(df, mode, similar, text_filter, max_rows):
    if df is None:
        return "No data loaded. Click Reload.", "", None
    if df.empty:
        return "No data in CSV.", "", None

    # Expected columns from judged-fast-accurate CSV
    required = [
        "frame_idx",
        "t_sec",
        "truth_text",
        "fast_text",
        "fast_similar",
        "fast_score",
        "fast_reason",
        "accurate_text",
        "accurate_similar",
        "accurate_score",
        "accurate_reason",
    ]
    missing = [c for c in required if c not in df.columns]
    if missing:
        return f"Missing columns: {missing}", "", None

    df["fast_similar"] = df["fast_similar"].astype(str)
    df["accurate_similar"] = df["accurate_similar"].astype(str)

    if mode != "both":
        if mode == "fast":
            df = df[df["fast_text"].notna()]
        else:
            df = df[df["accurate_text"].notna()]

    if similar != "all":
        val = "True" if similar == "true" else "False"
        df = df[(df["fast_similar"] == val) | (df["accurate_similar"] == val)]

    if text_filter:
        t = text_filter.lower()
        cols = [
            "truth_text",
            "fast_text",
            "fast_reason",
            "accurate_text",
            "accurate_reason",
        ]
        mask = df[cols].fillna("").apply(lambda x: x.str.lower().str.contains(t))
        df = df[mask.any(axis=1)]

    df = df.copy()
    # Pretty display columns
    df["fast"] = (
        "similar=" + df["fast_similar"].fillna("")
        + " score=" + df["fast_score"].fillna("").astype(str)
        + " | " + df["fast_text"].fillna("")
        + " | reason: " + df["fast_reason"].fillna("")
    )
    df["accurate"] = (
        "similar=" + df["accurate_similar"].fillna("")
        + " score=" + df["accurate_score"].fillna("").astype(str)
        + " | " + df["accurate_text"].fillna("")
        + " | reason: " + df["accurate_reason"].fillna("")
    )
    display_cols = ["frame_idx", "t_sec", "truth_text", "fast", "accurate"]

    subset = df[display_cols].head(max_rows)
    summary = (
        f"Rows: {len(df)} | "
        f"fast similar: {sum(df['fast_similar']=='True')} | "
        f"accurate similar: {sum(df['accurate_similar']=='True')}"
    )

    return "", summary, subset


def run_all(path, mode, similar, text_filter, max_rows):
    df, err = load_csv_from_path(path)
    if err:
        return err, "", None
    return filter_rows(df, mode, similar, text_filter, max_rows)


with gr.Blocks() as demo:
    gr.Markdown("# OCR Judge Viewer")
    with gr.Row():
        path_in = gr.Textbox(value=CSV_PATH, label="CSV path", interactive=True)
        reload_btn = gr.Button("Reload")
        mode = gr.Dropdown(["both", "fast", "accurate"], value="both", label="Mode")
        similar = gr.Dropdown(["all", "true", "false"], value="all", label="similar flag")
        text_filter = gr.Textbox(label="Search text", placeholder="search in truth/reasons")
        max_rows = gr.Slider(10, 500, value=100, step=10, label="Max rows")
    err_box = gr.Markdown()
    summary_box = gr.Markdown()
    table = gr.Dataframe(wrap=True)

    reload_btn.click(run_all, [path_in, mode, similar, text_filter, max_rows], [err_box, summary_box, table])
    mode.change(run_all, [path_in, mode, similar, text_filter, max_rows], [err_box, summary_box, table])
    similar.change(run_all, [path_in, mode, similar, text_filter, max_rows], [err_box, summary_box, table])
    text_filter.change(run_all, [path_in, mode, similar, text_filter, max_rows], [err_box, summary_box, table])
    max_rows.change(run_all, [path_in, mode, similar, text_filter, max_rows], [err_box, summary_box, table])
    demo.load(run_all, [path_in, mode, similar, text_filter, max_rows], [err_box, summary_box, table])

if __name__ == "__main__":
    demo.queue().launch(server_name="0.0.0.0", server_port=7860, ssr_mode=False, show_error=True)