AINovice2005's picture
|
download
raw
3.15 kB
# Image Dataset Curation Pipeline
Build a production-quality vision dataset from a noisy image collection
through a multi-stage curation funnel with multi-format export.
## What this example shows
- Multi-stage curation pipeline: resolution → corruption → dedup → aspect ratio
- Two-pass corrupt image detection using `PIL.Image.verify()` + `img.load()`
- Perceptual deduplication via 32×32 RGB thumbnail hashing
- Aspect ratio validation with configurable thresholds
- Multi-format export: Arrow (`save_to_disk`) + Parquet (`to_parquet`) + JSON manifest
- Full funnel report tracking row counts dropped at every stage
- `@asset_check` with ERROR severity for hard bounds violations
## Dataset
[`zh-plus/tiny-imagenet`](https://huggingface.co/datasets/zh-plus/tiny-imagenet) — 100,000 training images
across 200 ImageNet classes, resized to 64×64. Compact enough for local
runs while exercising all curation stages realistically.
| Split | Rows | Classes |
|-------|------|---------|
| train | 100,000 | 200 |
| valid | 10,000 | 200 |
## Asset graph
```
tiny_imagenet_raw
resolution_filtered (drop < 32px or > 4096px)
corrupt_removed (verify + load pass)
deduplicated_images (32×32 RGB pixel hash)
aspect_ratio_validated (keep 0.25 – 4.0)
/ \
▼ ▼
curated_ curation_report (full funnel stats)
export (+ all upstream stages)
```
## Curation thresholds
| Stage | Rule | Default |
|-------|------|---------|
| Resolution | `MIN_WIDTH/HEIGHT = 32`, `MAX = 4096` | configurable at top of `assets.py` |
| Corruption | `img.load()` raises → corrupt | — |
| Deduplication | 32×32 RGB MD5 hash match | — |
| Aspect ratio | `0.25 ≤ w/h ≤ 4.0` | configurable |
## Asset checks
| Check | Severity | Condition |
|-------|----------|-----------|
| `check_curation_retention` | WARN | Curated set ≥ 90% of deduplicated rows |
| `check_aspect_bounds` | ERROR | Zero aspect ratio violations in final output |
## Storage layout
```
.dagster_hf_storage/
├── tiny_imagenet_raw/
├── resolution_filtered/
├── corrupt_removed/
├── deduplicated_images/
├── aspect_ratio_validated/
└── curated_images/
├── arrow/ ← save_to_disk() format
├── curated.parquet ← portable Parquet
└── manifest.json
```
## Corrupt detection note
PIL's `verify()` is destructive — it consumes the image file pointer.
Always call it on a `.copy()` and use `img.load()` as the primary check
for datasets where images are already decoded into memory:
```python
def _check_corrupt_via_load(img) -> bool:
try:
img.load()
return False
except Exception:
return True
```
## How to run
```bash
pip install dagster dagster-hf-datasets Pillow
cd dagster_hf_datasets_examples
dagster dev -m image_dataset_curation.definitions
```
Materialize sequentially from `tiny_imagenet_raw` through `aspect_ratio_validated`,
then `curated_export` and `curation_report` in parallel as the final stage.

Xet Storage Details

Size:
3.15 kB
·
Xet hash:
794695e6a42719fc228ad6edb0030687d05c32d65a609dc108ced3311bc35317

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.