sketch-model / README.md
lcccluck's picture
Add QuickDraw diffusion model and app code
9894238 verified
|
Raw
History Blame Contribute Delete
4.42 kB
---
license: apache-2.0
tags:
- quickdraw
- sketch-generation
- diffusion
- ddpm
- class-conditional
- classifier-free-guidance
library_name: pytorch
pipeline_tag: image-to-image
---
# QuickDraw Sketch Diffusion
This repository contains a small class-conditional DDPM trained on rasterized Google QuickDraw sketches. The model generates 64x64 grayscale sketches with a black background and white strokes.
It also includes a local FastAPI web app for selecting a class, generating sketches with classifier-free guidance, and optionally recognizing the generated image with the bundled 100-class CNN classifier.
## Files
- `models/diffusion/checkpoint_step_500000.pt`: 500k-step class-conditional diffusion checkpoint.
- `train_quickdraw_ddpm.py`: training, sampling, QuickDraw download, rasterization, and model definitions.
- `quickdraw_app/server.py`: FastAPI generation and recognition API.
- `quickdraw_app/static/`: browser UI.
- `quickdraw_app/cnn_classifier.py`: optional CNN recognition helper.
- `quickdraw_app/models/cnn_residual_100cls_64/best_model.pt`: bundled 100-class 64x64 CNN classifier.
- `assets/samples_step_500000.png`: sample grid from the diffusion checkpoint.
## Model Details
- Dataset: Google QuickDraw `full/simplified` drawings.
- Classes: 100 built-in QuickDraw classes.
- Training set used: 50,000 samples per class, about 5 million sketches total.
- Image size: 64x64.
- Channels: 1 grayscale channel.
- Diffusion steps: 200.
- Architecture: compact conditional U-Net.
- Conditioning: class embedding plus classifier-free guidance.
- Checkpoint step: 500,000.
- Default guidance scale: 3.0.
- Output convention: black background, white sketch strokes.
## Quick Start
Install dependencies:
```bash
pip install -r requirements.txt
```
Run the local web app:
```bash
uvicorn quickdraw_app.server:app --host 127.0.0.1 --port 7860
```
Then open:
```text
http://127.0.0.1:7860
```
The first generation loads the checkpoint and may take longer. Later requests reuse the loaded model.
## Python Sampling
```python
import torch
from torchvision.utils import save_image
from train_quickdraw_ddpm import SmallConditionalUNet, make_schedule, pick_device, sample
checkpoint_path = "models/diffusion/checkpoint_step_500000.pt"
device = pick_device()
checkpoint = torch.load(checkpoint_path, map_location=device, weights_only=False)
classes = checkpoint["classes"]
image_size = int(checkpoint["image_size"])
timesteps = int(checkpoint["timesteps"])
base_channels = int(checkpoint["base_channels"])
model = SmallConditionalUNet(len(classes), base_channels=base_channels).to(device)
model.load_state_dict(checkpoint.get("model_unwrapped") or checkpoint["model"])
model.eval()
schedule = make_schedule(timesteps, device)
class_name = "cat"
label = torch.tensor([classes.index(class_name)], device=device)
with torch.no_grad():
image = sample(
model,
label,
image_size,
schedule,
timesteps,
device,
guidance_scale=3.0,
)
save_image((image + 1) / 2, "cat.png")
```
## Training Example
The final run used 100 classes, 50,000 samples per class, 64x64 images, CFG dropout, and 500k optimization steps. A similar run can be started with:
```bash
python train_quickdraw_ddpm.py \
--num-classes 100 \
--samples-per-class 50000 \
--image-size 64 \
--line-width 2 \
--batch-size 512 \
--steps 500000 \
--timesteps 200 \
--base-channels 64 \
--cfg-drop-prob 0.1 \
--guidance-scale 3.0 \
--data-parallel
```
To resume:
```bash
python train_quickdraw_ddpm.py \
--resume models/diffusion/checkpoint_step_500000.pt \
--steps 550000 \
--batch-size 512 \
--data-parallel
```
## Evaluation Note
Using the bundled 100-class 64x64 CNN classifier on 400 generated samples, the diffusion checkpoint reached about 36.00% top-1 and 71.75% top-5 agreement. This is a rough model-to-model sanity check, not a human preference score.
## Limitations
This is a compact 64x64 sketch model. It is useful as a QuickDraw-style benchmark and interactive demo, but it is not a high-resolution image generator. Some classes are visually ambiguous, and CNN agreement can be poor for categories with similar silhouettes.
## Data
The training script downloads examples from the public Google QuickDraw dataset:
```text
https://storage.googleapis.com/quickdraw_dataset/full/simplified/{word}.ndjson
```