Kartikeya Mishra
Deploy SalesCode recapture detector to Space
7c34b66
Raw
History Blame Contribute Delete
3.12 kB
import os
import cv2
import glob
import pandas as pd
import numpy as np
import sys
# Ensure parent directory is in path to import features
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
# Simple ground truth 0 or 1
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)
# Save raw audit
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)
# Group stats
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)
# Generate summary markdown
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()