Spaces:
Sleeping
Sleeping
| import pandas as pd | |
| import numpy as np | |
| from pathlib import Path | |
| # CSV ๋ก๋ | |
| df = pd.read_csv("results.csv") | |
| # QC์ฉ ์ค๋ณต ์์ ID | |
| qc_video = "Wan2.2/Wan2.2_BodyWeightSquats_03_g09_c02.mp4" | |
| # ์ซ์ํ ๋ณํ | |
| for col in ["action_consistency", "physical_plausibility"]: | |
| df[col] = pd.to_numeric(df[col], errors="coerce") | |
| # QC์ฉ ์์๋ง ํํฐ๋ง | |
| dup_df = df[df["video_id"] == qc_video].copy() | |
| qc_rows = [] | |
| for pid, g in dup_df.groupby("participant_id"): | |
| if len(g) < 2: | |
| continue # 1ํ๋ง ์๋ตํ ์ฐธ๊ฐ์ ์ ์ธ | |
| ac = g["action_consistency"].dropna().to_numpy() | |
| pp = g["physical_plausibility"].dropna().to_numpy() | |
| qc_rows.append({ | |
| "participant_id": pid, | |
| "n_repeat": len(g), | |
| "ac_mean": np.mean(ac), | |
| "ac_std": np.std(ac, ddof=0), | |
| "ac_range": np.max(ac) - np.min(ac), | |
| "ac_mae": np.mean(np.abs(ac - np.mean(ac))), | |
| "pp_mean": np.mean(pp), | |
| "pp_std": np.std(pp, ddof=0), | |
| "pp_range": np.max(pp) - np.min(pp), | |
| "pp_mae": np.mean(np.abs(pp - np.mean(pp))), | |
| }) | |
| qc = pd.DataFrame(qc_rows) | |
| # ํ์ง ํ์ (์๊ณ๊ฐ์ ํ์ ์ ์กฐ์ ) | |
| qc["low_quality_flag"] = ( | |
| (qc["ac_std"] > 2.0) | (qc["ac_range"] > 4.0) | | |
| (qc["pp_std"] > 2.0) | (qc["pp_range"] > 4.0) | |
| ) | |
| # ์ ์ฅ | |
| Path("qc_outputs").mkdir(exist_ok=True) | |
| qc_path = "qc_outputs/participant_qc_single_duplicate.csv" | |
| qc.to_csv(qc_path, index=False) | |
| print(f"Saved to {qc_path}") | |
| # ๊ฒฐ๊ณผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ | |
| print(qc.sort_values("low_quality_flag", ascending=False)) | |