Spaces:
Sleeping
Sleeping
| """ | |
| Create Summary Table of Example Pairs (No Images Needed) | |
| This creates a simple table/figure showing the best example pairs | |
| without needing the actual images. | |
| """ | |
| import pandas as pd | |
| import matplotlib.pyplot as plt | |
| import matplotlib.patches as mpatches | |
| print("="*80) | |
| print("CREATING EXAMPLE SUMMARY TABLE") | |
| print("="*80) | |
| # Load exemplar pairs | |
| exemplar_file = 'hierarchy_analysis/exemplar_image_pairs.csv' | |
| print(f"\nLoading: {exemplar_file}") | |
| exemplars = pd.read_csv(exemplar_file, index_col=0) | |
| print(f"Loaded {len(exemplars)} exemplar pairs") | |
| # Create summary figure | |
| fig = plt.figure(figsize=(16, 12)) | |
| # Title | |
| fig.suptitle('Exemplar Image Pairs Demonstrating Key Findings\n' + | |
| 'Use these pairs to show concrete examples to your professor', | |
| fontsize=16, fontweight='bold', y=0.98) | |
| # SECTION 1: Dissociation examples | |
| dissociation = exemplars[exemplars['example_type'] == 'dissociation'].head(5) | |
| ax1 = plt.subplot(3, 1, 1) | |
| ax1.axis('off') | |
| y_pos = 0.95 | |
| ax1.text(0.5, y_pos, 'FINDING 1: Semantic Dissociation', ha='center', | |
| fontsize=14, fontweight='bold', transform=ax1.transAxes) | |
| y_pos -= 0.08 | |
| ax1.text(0.5, y_pos, 'Language similarity HIGH, Vision similarity LOW → Language captures meaning, not just pixels', | |
| ha='center', fontsize=11, style='italic', transform=ax1.transAxes) | |
| y_pos -= 0.12 | |
| for idx, (pair_idx, row) in enumerate(dissociation.iterrows()): | |
| # Header | |
| ax1.text(0.02, y_pos, f"Example {idx+1}:", fontweight='bold', | |
| fontsize=10, transform=ax1.transAxes) | |
| # Image names | |
| y_pos -= 0.05 | |
| ax1.text(0.02, y_pos, f" Images: {row['image_1'][:30]}... vs {row['image_2'][:30]}...", | |
| fontsize=9, family='monospace', transform=ax1.transAxes) | |
| # Scores | |
| y_pos -= 0.04 | |
| lang_val = row['language_avg'] | |
| vis_val = row['vision_avg'] | |
| diff = lang_val - vis_val | |
| human = row['human_judgement'] | |
| score_text = (f" Language: {lang_val:+.2f} | Vision: {vis_val:+.2f} | " | |
| f"Diff: {diff:+.2f} | Human: {human:.2f}") | |
| # Color code based on values | |
| if lang_val > 0.5: | |
| lang_color = '#27ae60' # Green for high | |
| else: | |
| lang_color = 'black' | |
| if vis_val < -0.5: | |
| vis_color = '#e74c3c' # Red for low | |
| else: | |
| vis_color = 'black' | |
| ax1.text(0.02, y_pos, score_text, fontsize=9, transform=ax1.transAxes) | |
| y_pos -= 0.07 | |
| if y_pos < 0.05: | |
| break | |
| # SECTION 2: Language-Human Alignment | |
| alignment = exemplars[exemplars['example_type'] == 'language_human_alignment'].head(5) | |
| ax2 = plt.subplot(3, 1, 2) | |
| ax2.axis('off') | |
| y_pos = 0.95 | |
| ax2.text(0.5, y_pos, 'FINDING 2: Language-Human Alignment', ha='center', | |
| fontsize=14, fontweight='bold', transform=ax2.transAxes) | |
| y_pos -= 0.08 | |
| ax2.text(0.5, y_pos, 'Language models predict human judgments better than vision models', | |
| ha='center', fontsize=11, style='italic', transform=ax2.transAxes) | |
| y_pos -= 0.12 | |
| for idx, (pair_idx, row) in enumerate(alignment.iterrows()): | |
| # Header | |
| ax2.text(0.02, y_pos, f"Example {idx+1}:", fontweight='bold', | |
| fontsize=10, transform=ax2.transAxes) | |
| # Image names | |
| y_pos -= 0.05 | |
| ax2.text(0.02, y_pos, f" Images: {row['image_1'][:30]}... vs {row['image_2'][:30]}...", | |
| fontsize=9, family='monospace', transform=ax2.transAxes) | |
| # Alignment scores | |
| y_pos -= 0.04 | |
| human = row['human_judgement'] | |
| lang = row['language_avg'] | |
| vis = row['vision_avg'] | |
| lang_dist = abs(human - lang) | |
| vis_dist = abs(human - vis) | |
| closer = vis_dist - lang_dist | |
| score_text = (f" Human: {human:.2f} | Language: {lang:.2f} (dist: {lang_dist:.2f}) | " | |
| f"Vision: {vis:.2f} (dist: {vis_dist:.2f}) → Language {closer:.2f} closer") | |
| ax2.text(0.02, y_pos, score_text, fontsize=9, transform=ax2.transAxes) | |
| y_pos -= 0.07 | |
| if y_pos < 0.05: | |
| break | |
| # SECTION 3: Brain Semantic Preference | |
| brain_pref = exemplars[exemplars['example_type'] == 'brain_semantic_preference'].head(5) | |
| ax3 = plt.subplot(3, 1, 3) | |
| ax3.axis('off') | |
| y_pos = 0.95 | |
| ax3.text(0.5, y_pos, 'FINDING 3: Brain Prioritizes Semantics', ha='center', | |
| fontsize=14, fontweight='bold', transform=ax3.transAxes) | |
| y_pos -= 0.08 | |
| ax3.text(0.5, y_pos, 'Late semantic brain regions respond more than early visual regions', | |
| ha='center', fontsize=11, style='italic', transform=ax3.transAxes) | |
| y_pos -= 0.12 | |
| for idx, (pair_idx, row) in enumerate(brain_pref.iterrows()): | |
| # Header | |
| ax3.text(0.02, y_pos, f"Example {idx+1}:", fontweight='bold', | |
| fontsize=10, transform=ax3.transAxes) | |
| # Image names | |
| y_pos -= 0.05 | |
| ax3.text(0.02, y_pos, f" Images: {row['image_1'][:30]}... vs {row['image_2'][:30]}...", | |
| fontsize=9, family='monospace', transform=ax3.transAxes) | |
| # Brain responses | |
| y_pos -= 0.04 | |
| early = row['hierarchy_early_visual_avg'] | |
| late = row['hierarchy_late_semantic_avg'] | |
| diff = late - early | |
| score_text = (f" Early Visual: {early:+.3f} | Late Semantic: {late:+.3f} | " | |
| f"Diff: {diff:+.3f} | Human: {row['human_judgement']:.2f}") | |
| ax3.text(0.02, y_pos, score_text, fontsize=9, transform=ax3.transAxes) | |
| y_pos -= 0.07 | |
| if y_pos < 0.05: | |
| break | |
| plt.tight_layout(rect=[0, 0, 1, 0.96]) | |
| output_file = 'hierarchy_analysis/exemplar_pairs_summary.png' | |
| plt.savefig(output_file, dpi=300, bbox_inches='tight', facecolor='white') | |
| print(f"\nSaved: {output_file}") | |
| plt.close() | |
| # Also save as a text file for easy reference | |
| print("\nCreating text summary...") | |
| with open('hierarchy_analysis/exemplar_pairs_summary.txt', 'w') as f: | |
| f.write("="*80 + "\n") | |
| f.write("EXEMPLAR IMAGE PAIRS - SUMMARY FOR PROFESSOR\n") | |
| f.write("="*80 + "\n\n") | |
| f.write("FINDING 1: SEMANTIC DISSOCIATION\n") | |
| f.write("-" * 80 + "\n") | |
| f.write("Language models show high similarity, vision models show low similarity\n") | |
| f.write("Proves: Language models capture semantic meaning, not just visual features\n\n") | |
| for idx, (pair_idx, row) in enumerate(dissociation.iterrows()): | |
| f.write(f"Example {idx+1}:\n") | |
| f.write(f" Pair Index: {pair_idx}\n") | |
| f.write(f" Image 1: {row['image_1']}\n") | |
| f.write(f" Image 2: {row['image_2']}\n") | |
| f.write(f" Language Similarity: {row['language_avg']:+.3f} (HIGH)\n") | |
| f.write(f" Vision Similarity: {row['vision_avg']:+.3f} (LOW)\n") | |
| f.write(f" Difference: {row['language_avg'] - row['vision_avg']:+.3f}\n") | |
| f.write(f" Human Judgment: {row['human_judgement']:.3f}\n") | |
| f.write(f" Early Brain: {row['hierarchy_early_visual_avg']:+.3f}\n") | |
| f.write(f" Late Brain: {row['hierarchy_late_semantic_avg']:+.3f}\n") | |
| f.write("\n") | |
| f.write("\n" + "="*80 + "\n") | |
| f.write("FINDING 2: LANGUAGE-HUMAN ALIGNMENT\n") | |
| f.write("-" * 80 + "\n") | |
| f.write("Language models align with human judgments better than vision models\n") | |
| f.write("Proves: Humans judge similarity based on semantics, not just visual features\n\n") | |
| for idx, (pair_idx, row) in enumerate(alignment.iterrows()): | |
| f.write(f"Example {idx+1}:\n") | |
| f.write(f" Pair Index: {pair_idx}\n") | |
| f.write(f" Image 1: {row['image_1']}\n") | |
| f.write(f" Image 2: {row['image_2']}\n") | |
| f.write(f" Human Judgment: {row['human_judgement']:.3f}\n") | |
| f.write(f" Language Model: {row['language_avg']:.3f} (distance: {abs(row['human_judgement'] - row['language_avg']):.3f})\n") | |
| f.write(f" Vision Model: {row['vision_avg']:.3f} (distance: {abs(row['human_judgement'] - row['vision_avg']):.3f})\n") | |
| f.write(f" Language is {abs(row['human_judgement'] - row['vision_avg']) - abs(row['human_judgement'] - row['language_avg']):.3f} closer to human\n") | |
| f.write("\n") | |
| f.write("\n" + "="*80 + "\n") | |
| f.write("FINDING 3: BRAIN PRIORITIZES SEMANTICS\n") | |
| f.write("-" * 80 + "\n") | |
| f.write("Late semantic brain regions respond more than early visual regions\n") | |
| f.write("Proves: Brain uses semantic content for similarity judgments\n\n") | |
| for idx, (pair_idx, row) in enumerate(brain_pref.iterrows()): | |
| f.write(f"Example {idx+1}:\n") | |
| f.write(f" Pair Index: {pair_idx}\n") | |
| f.write(f" Image 1: {row['image_1']}\n") | |
| f.write(f" Image 2: {row['image_2']}\n") | |
| f.write(f" Early Visual (V1-hV4): {row['hierarchy_early_visual_avg']:+.3f} (LOW)\n") | |
| f.write(f" Late Semantic (FFA, VWFA, etc): {row['hierarchy_late_semantic_avg']:+.3f} (HIGH)\n") | |
| f.write(f" Difference: {row['hierarchy_late_semantic_avg'] - row['hierarchy_early_visual_avg']:+.3f}\n") | |
| f.write(f" Human Judgment: {row['human_judgement']:.3f}\n") | |
| f.write("\n") | |
| print("Saved: hierarchy_analysis/exemplar_pairs_summary.txt") | |
| print("\n" + "="*80) | |
| print("DONE!") | |
| print("="*80) | |
| print(""" | |
| Created: | |
| 1. exemplar_pairs_summary.png - Visual summary (no images needed) | |
| 2. exemplar_pairs_summary.txt - Text file with all details | |
| These show the BEST example pairs for each finding. | |
| For your professor meeting: | |
| 1. Show the bar charts (main statistical findings) | |
| 2. Show exemplar_pairs_summary.png (specific examples) | |
| 3. Walk through 1-2 examples in detail: | |
| - "Look at this pair: [image names]" | |
| - "Language says similar (0.86), vision says different (-1.34)" | |
| - "Humans agree with language (2.0)" | |
| - "Brain semantic regions respond (0.22), visual regions don't (-0.22)" | |
| - "This proves our point!" | |
| If you have the actual images, run: | |
| python create_image_examples_figure.py | |
| to create figures WITH the images. | |
| The pair indices are saved so you can look them up in your GUI! | |
| """) | |