| import os |
| import cv2 |
| import glob |
| import pandas as pd |
| import numpy as np |
| import sys |
|
|
| |
| sys.path.append(os.path.join(os.path.dirname(__file__), '..')) |
| from features import extract_features |
|
|
| def audit_features(): |
| groups = { |
| 'dataset_real': 'dataset/my_photos/real/*', |
| 'dataset_screen': 'dataset/my_photos/screen/*', |
| 'failure_real': 'manual_test/failure_cases/real/*', |
| 'failure_screen': 'manual_test/failure_cases/screen/*', |
| } |
|
|
| results = [] |
|
|
| for group_name, path_pattern in groups.items(): |
| base_path = os.path.join(os.path.dirname(__file__), '..', path_pattern) |
| for filepath in glob.glob(base_path): |
| if not os.path.isfile(filepath): |
| continue |
| |
| img = cv2.imread(filepath) |
| if img is None: |
| continue |
| |
| _, features_dict = extract_features(img) |
| features_dict['image'] = os.path.basename(filepath) |
| features_dict['group'] = group_name |
| |
| |
| if 'real' in group_name: |
| features_dict['label'] = 0 |
| else: |
| features_dict['label'] = 1 |
| |
| results.append(features_dict) |
|
|
| if not results: |
| print("No images found to audit.") |
| return |
|
|
| df = pd.DataFrame(results) |
| |
| |
| os.makedirs(os.path.join(os.path.dirname(__file__), '..', 'reports'), exist_ok=True) |
| df.to_csv(os.path.join(os.path.dirname(__file__), '..', 'reports', 'feature_audit.csv'), index=False) |
|
|
| |
| feature_cols = [c for c in df.columns if c not in ['image', 'group', 'label']] |
| |
| stats = [] |
| for f in feature_cols: |
| real_vals = df[df['label'] == 0][f] |
| screen_vals = df[df['label'] == 1][f] |
| |
| real_mean = real_vals.mean() |
| screen_mean = screen_vals.mean() |
| |
| stats.append({ |
| 'feature': f, |
| 'real_mean': real_mean, |
| 'real_std': real_vals.std(), |
| 'screen_mean': screen_mean, |
| 'screen_std': screen_vals.std(), |
| 'diff': screen_mean - real_mean, |
| 'abs_diff': abs(screen_mean - real_mean) |
| }) |
|
|
| stats_df = pd.DataFrame(stats) |
| stats_df = stats_df.sort_values('abs_diff', ascending=False) |
| stats_df.to_csv(os.path.join(os.path.dirname(__file__), '..', 'reports', 'feature_group_stats.csv'), index=False) |
| |
| |
| with open(os.path.join(os.path.dirname(__file__), '..', 'reports', 'feature_audit_summary.md'), 'w') as f: |
| f.write("# Feature Audit Summary\n\n") |
| f.write("## Top Separating Features (High Abs Diff)\n") |
| f.write(stats_df.head(10).to_markdown(index=False)) |
| f.write("\n\n") |
| |
| f.write("## Suspicious Features (Real > Screen)\n") |
| suspicious = stats_df[stats_df['diff'] < 0] |
| f.write(suspicious.to_markdown(index=False)) |
| f.write("\n") |
|
|
| if __name__ == "__main__": |
| audit_features() |
|
|