Automatic Image Dataset Construction with Multiple Textual Metadata
Overview
This skill provides a framework for automatically collecting diverse, high-quality image datasets from the web using semantic query expansion and progressive CNN-based filtering. The methodology addresses key challenges:
- Dataset Bias: Reduces bias by expanding queries semantically
- Noise Reduction: Filters irrelevant images through clustering and CNNs
- Cross-Dataset Generalization: Creates datasets that generalize well to unseen domains
Key Innovation: Uses Google Books Ngrams Corpora for query expansion to capture richer semantic descriptions, then progressively filters using CNNs.
When to Use This Skill
Use this skill when:
- Building training datasets that need to generalize across domains
- Current datasets suffer from selection bias
- Manual annotation budget is limited
- Need diverse image coverage for a concept
- Building datasets for image classification or object detection
- Comparing performance with established datasets (STL-10, CIFAR-10)
Core Workflow
Phase 1: Query Expansion
Initial Query Definition:
initial_queries = ["dog", "car", "airplane"]
Semantic Expansion with N-gram Corpora:
def expand_query_with_ngrams(query, ngram_data):
"""
Expand query using Google Books Ngrams:
- Find co-occurring terms
- Add synonyms and related concepts
- Include descriptive modifiers
Example: "dog" → ["dog breed", "puppy", "canine",
"dog playing", "dog running", ...]
"""
expansions = []
# Get bigrams containing the query
bigrams = get_ngrams(query, n=2, ngram_data=ngram_data)
# Get trigrams for context
trigrams = get_ngrams(query, n=3, ngram_data=ngram_data)
# Combine and rank by frequency
expansions = rank_by_relevance(bigrams + trigrams)
return expansions
Visual Saliency Filtering:
def filter_expansions(expansions, visual_model):
"""
Remove expansions that are:
- Visually non-salient (abstract concepts)
- Less relevant to visual domain
- Too generic or too specific
Use pre-trained visual model to score saliency
"""
filtered = []
for exp in expansions:
# Check if expansion corresponds to visually identifiable concept
saliency_score = visual_model.predict_saliency(exp)
if saliency_score > threshold:
filtered.append(exp)
return filtered
Phase 2: Web Image Retrieval
Multi-Query Image Collection:
def collect_images(expanded_queries, images_per_query=500):
"""
Retrieve images using expanded queries:
- Use multiple search engines
- Collect metadata (source URL, query used)
- Diversify sources to reduce bias
"""
all_images = []
for query in expanded_queries:
images = search_engine.image_search(
query,
num_results=images_per_query
)
for img in images:
img['source_query'] = query
all_images.extend(images)
return all_images
Initial Preprocessing:
def preprocess_images(images):
"""
- Remove duplicates (perceptual hash)
- Validate image format
- Resize to standard dimensions
- Remove corrupted files
"""
pass
Phase 3: Clustering-Based Noise Filtering
Feature Extraction:
def extract_features(images, cnn_model):
"""
Extract deep features using pre-trained CNN
(e.g., VGG, ResNet features from penultimate layer)
"""
features = []
for img in images:
feat = cnn_model.extract_features(img)
features.append(feat)
return np.array(features)
Cluster Analysis:
from sklearn.cluster import KMeans
def cluster_and_filter(features, images, n_clusters=10):
"""
Cluster images by visual similarity:
- Identify core clusters (likely relevant)
- Remove outlier clusters (likely noise)
- Keep images from dense, coherent clusters
"""
kmeans = KMeans(n_clusters=n_clusters)
clusters = kmeans.fit_predict(features)
# Analyze cluster statistics
cluster_stats = analyze_clusters(clusters, features)
# Remove outlier clusters (low density, high variance)
valid_clusters = [
c for c in cluster_stats
if c['density'] > threshold and c['coherence'] > min_coherence
]
filtered_images = [
img for img, c in zip(images, clusters)
if c in valid_clusters
]
return filtered_images
Phase 4: Progressive CNN Filtering
Initial CNN Training:
def train_initial_classifier(clustered_images, num_classes):
"""
Train initial CNN classifier on clustered data:
- Use cluster assignments as pseudo-labels
- Fine-tune pre-trained model
"""
model = load_pretrained_cnn()
model = fine_tune(model, clustered_images)
return model
Progressive Refinement:
def progressive_filtering(images, model, iterations=3):
"""
Iteratively refine dataset:
1. Classify all images with current model
2. Remove low-confidence predictions
3. Retrain model on refined set
4. Repeat
"""
for i in range(iterations):
# Predict on all images
predictions = model.predict(images)
# Filter by confidence
confident_samples = [
(img, pred) for img, pred in zip(images, predictions)
if pred['confidence'] > confidence_threshold(i)
]
# Retrain on refined set
model = train_classifier(confident_samples)
images = [s[0] for s in confident_samples]
return images, model
Phase 5: Dataset Finalization
Quality Verification:
def verify_dataset_quality(dataset, test_set):
"""
Evaluate dataset quality:
- Cross-dataset generalization (test on STL-10, CIFAR-10)
- Class balance analysis
- Diversity metrics
"""
# Train classifier on generated dataset
model = train_classifier(dataset)
# Test on external datasets
stl10_accuracy = evaluate(model, stl10_test)
cifar10_accuracy = evaluate(model, cifar10_test)
return {
'cross_dataset_acc': (stl10_accuracy + cifar10_accuracy) / 2,
'class_balance': compute_balance(dataset),
'diversity': compute_diversity(dataset)
}
Export Dataset:
dataset/
├── train/
│ ├── class_1/
│ ├── class_2/
│ └── ...
├── val/
├── test/
├── metadata.json
└── dataset_stats.md
Key Techniques
Query Expansion Strategy
- Use Google Books Ngrams (n=2,3,4) for semantic expansion
- Filter by visual saliency to remove abstract terms
- Balance specificity vs. diversity in expansions
Progressive Filtering
- Start with loose confidence threshold (~0.5)
- Increase threshold each iteration (~0.6, 0.7, 0.8)
- Allows gradual refinement without losing good samples early
Reducing Dataset Bias
- Use multiple search engines
- Diversify query expansions
- Cluster analysis ensures visual diversity
- Cross-domain validation confirms generalization
Best Practices
Query Expansion:
- Start with 5-10 core concepts per category
- Generate 20-50 expansions per core concept
- Filter to top 10-20 based on visual saliency
Clustering:
- Use k-means with k = 10-20 clusters per category
- Validate cluster coherence manually on samples
- Remove clusters with < 5% of total images
Progressive Filtering:
- Use 3-5 iterations
- Start confidence threshold: 0.5
- Increase by 0.1 per iteration
- Stop when dataset size stabilizes
Validation:
- Always test on external datasets
- Compare with CIFAR-10, STL-10 baselines
- Report cross-dataset accuracy
Expected Results
Based on original research:
- Generates datasets larger than manually labeled alternatives
- Achieves comparable generalization to STL-10, CIFAR-10
- Significant performance gains on:
- Image classification
- Cross-dataset generalization
- Object detection
Dependencies
# Deep learning
pip install torch torchvision # or tensorflow
# Clustering
pip install scikit-learn
# Image processing
pip install pillow opencv-python
# N-gram data
# Download Google Books Ngrams: https://storage.googleapis.com/books/ngrams/books/datasetsv3.html
Integration with Other Skills
- pytorch: Train classifiers during filtering
- scikit-learn: Clustering and evaluation
- matplotlib: Visualize cluster distributions
- exploratory-data-analysis: Dataset statistics
References
1---2name: textual-metadata-dataset-construction3description: Automatically construct large-scale image datasets from web sources using multiple textual metadata for semantic expansion and CNN-based filtering. This skill implements the methodology from "Automatic Image Dataset Construction with Multiple Textual Metadata" (IEEE ICME 2016). Reduces dataset bias and improves cross-dataset generalization through query expansion and progressive filtering.4license: MIT license5---67# Automatic Image Dataset Construction with Multiple Textual Metadata89## Overview1011This skill provides a framework for automatically collecting diverse, high-quality image datasets from the web using semantic query expansion and progressive CNN-based filtering. The methodology addresses key challenges:12131. **Dataset Bias**: Reduces bias by expanding queries semantically142. **Noise Reduction**: Filters irrelevant images through clustering and CNNs153. **Cross-Dataset Generalization**: Creates datasets that generalize well to unseen domains1617**Key Innovation**: Uses Google Books Ngrams Corpora for query expansion to capture richer semantic descriptions, then progressively filters using CNNs.1819## When to Use This Skill2021Use this skill when:22- Building training datasets that need to generalize across domains23- Current datasets suffer from selection bias24- Manual annotation budget is limited25- Need diverse image coverage for a concept26- Building datasets for image classification or object detection27- Comparing performance with established datasets (STL-10, CIFAR-10)2829## Core Workflow3031### Phase 1: Query Expansion32331. **Initial Query Definition**:34 ```python35 initial_queries = ["dog", "car", "airplane"]36 ```37382. **Semantic Expansion with N-gram Corpora**:39 ```python40 def expand_query_with_ngrams(query, ngram_data):41 """42 Expand query using Google Books Ngrams:43 - Find co-occurring terms44 - Add synonyms and related concepts45 - Include descriptive modifiers46 47 Example: "dog" → ["dog breed", "puppy", "canine", 48 "dog playing", "dog running", ...]49 """50 expansions = []51 52 # Get bigrams containing the query53 bigrams = get_ngrams(query, n=2, ngram_data=ngram_data)54 55 # Get trigrams for context56 trigrams = get_ngrams(query, n=3, ngram_data=ngram_data)57 58 # Combine and rank by frequency59 expansions = rank_by_relevance(bigrams + trigrams)60 61 return expansions62 ```63643. **Visual Saliency Filtering**:65 ```python66 def filter_expansions(expansions, visual_model):67 """68 Remove expansions that are:69 - Visually non-salient (abstract concepts)70 - Less relevant to visual domain71 - Too generic or too specific72 73 Use pre-trained visual model to score saliency74 """75 filtered = []76 for exp in expansions:77 # Check if expansion corresponds to visually identifiable concept78 saliency_score = visual_model.predict_saliency(exp)79 if saliency_score > threshold:80 filtered.append(exp)81 return filtered82 ```8384### Phase 2: Web Image Retrieval85861. **Multi-Query Image Collection**:87 ```python88 def collect_images(expanded_queries, images_per_query=500):89 """90 Retrieve images using expanded queries:91 - Use multiple search engines92 - Collect metadata (source URL, query used)93 - Diversify sources to reduce bias94 """95 all_images = []96 97 for query in expanded_queries:98 images = search_engine.image_search(99 query, 100 num_results=images_per_query101 )102 for img in images:103 img['source_query'] = query104 all_images.extend(images)105 106 return all_images107 ```1081092. **Initial Preprocessing**:110 ```python111 def preprocess_images(images):112 """113 - Remove duplicates (perceptual hash)114 - Validate image format115 - Resize to standard dimensions116 - Remove corrupted files117 """118 pass119 ```120121### Phase 3: Clustering-Based Noise Filtering1221231. **Feature Extraction**:124 ```python125 def extract_features(images, cnn_model):126 """127 Extract deep features using pre-trained CNN128 (e.g., VGG, ResNet features from penultimate layer)129 """130 features = []131 for img in images:132 feat = cnn_model.extract_features(img)133 features.append(feat)134 return np.array(features)135 ```1361372. **Cluster Analysis**:138 ```python139 from sklearn.cluster import KMeans140 141 def cluster_and_filter(features, images, n_clusters=10):142 """143 Cluster images by visual similarity:144 - Identify core clusters (likely relevant)145 - Remove outlier clusters (likely noise)146 - Keep images from dense, coherent clusters147 """148 kmeans = KMeans(n_clusters=n_clusters)149 clusters = kmeans.fit_predict(features)150 151 # Analyze cluster statistics152 cluster_stats = analyze_clusters(clusters, features)153 154 # Remove outlier clusters (low density, high variance)155 valid_clusters = [156 c for c in cluster_stats 157 if c['density'] > threshold and c['coherence'] > min_coherence158 ]159 160 filtered_images = [161 img for img, c in zip(images, clusters)162 if c in valid_clusters163 ]164 165 return filtered_images166 ```167168### Phase 4: Progressive CNN Filtering1691701. **Initial CNN Training**:171 ```python172 def train_initial_classifier(clustered_images, num_classes):173 """174 Train initial CNN classifier on clustered data:175 - Use cluster assignments as pseudo-labels176 - Fine-tune pre-trained model177 """178 model = load_pretrained_cnn()179 model = fine_tune(model, clustered_images)180 return model181 ```1821832. **Progressive Refinement**:184 ```python185 def progressive_filtering(images, model, iterations=3):186 """187 Iteratively refine dataset:188 1. Classify all images with current model189 2. Remove low-confidence predictions190 3. Retrain model on refined set191 4. Repeat192 """193 for i in range(iterations):194 # Predict on all images195 predictions = model.predict(images)196 197 # Filter by confidence198 confident_samples = [199 (img, pred) for img, pred in zip(images, predictions)200 if pred['confidence'] > confidence_threshold(i)201 ]202 203 # Retrain on refined set204 model = train_classifier(confident_samples)205 206 images = [s[0] for s in confident_samples]207 208 return images, model209 ```210211### Phase 5: Dataset Finalization2122131. **Quality Verification**:214 ```python215 def verify_dataset_quality(dataset, test_set):216 """217 Evaluate dataset quality:218 - Cross-dataset generalization (test on STL-10, CIFAR-10)219 - Class balance analysis220 - Diversity metrics221 """222 # Train classifier on generated dataset223 model = train_classifier(dataset)224 225 # Test on external datasets226 stl10_accuracy = evaluate(model, stl10_test)227 cifar10_accuracy = evaluate(model, cifar10_test)228 229 return {230 'cross_dataset_acc': (stl10_accuracy + cifar10_accuracy) / 2,231 'class_balance': compute_balance(dataset),232 'diversity': compute_diversity(dataset)233 }234 ```2352362. **Export Dataset**:237 ```238 dataset/239 ├── train/240 │ ├── class_1/241 │ ├── class_2/242 │ └── ...243 ├── val/244 ├── test/245 ├── metadata.json246 └── dataset_stats.md247 ```248249## Key Techniques250251### Query Expansion Strategy252- Use Google Books Ngrams (n=2,3,4) for semantic expansion253- Filter by visual saliency to remove abstract terms254- Balance specificity vs. diversity in expansions255256### Progressive Filtering257- Start with loose confidence threshold (~0.5)258- Increase threshold each iteration (~0.6, 0.7, 0.8)259- Allows gradual refinement without losing good samples early260261### Reducing Dataset Bias262- Use multiple search engines263- Diversify query expansions264- Cluster analysis ensures visual diversity265- Cross-domain validation confirms generalization266267## Best Practices2682691. **Query Expansion**:270 - Start with 5-10 core concepts per category271 - Generate 20-50 expansions per core concept272 - Filter to top 10-20 based on visual saliency2732742. **Clustering**:275 - Use k-means with k = 10-20 clusters per category276 - Validate cluster coherence manually on samples277 - Remove clusters with < 5% of total images2782793. **Progressive Filtering**:280 - Use 3-5 iterations281 - Start confidence threshold: 0.5282 - Increase by 0.1 per iteration283 - Stop when dataset size stabilizes2842854. **Validation**:286 - Always test on external datasets287 - Compare with CIFAR-10, STL-10 baselines288 - Report cross-dataset accuracy289290## Expected Results291292Based on original research:293- Generates datasets larger than manually labeled alternatives294- Achieves comparable generalization to STL-10, CIFAR-10295- Significant performance gains on:296 - Image classification297 - Cross-dataset generalization298 - Object detection299300## Dependencies301302```bash303# Deep learning304pip install torch torchvision # or tensorflow305306# Clustering307pip install scikit-learn308309# Image processing310pip install pillow opencv-python311312# N-gram data313# Download Google Books Ngrams: https://storage.googleapis.com/books/ngrams/books/datasetsv3.html314```315316## Integration with Other Skills317318- **pytorch**: Train classifiers during filtering319- **scikit-learn**: Clustering and evaluation320- **matplotlib**: Visualize cluster distributions321- **exploratory-data-analysis**: Dataset statistics322323## References324325- "Automatic Image Dataset Construction with Multiple Textual Metadata" (IEEE ICME 2016)326- Google Books Ngram Viewer: https://books.google.com/ngrams