| --- |
| license: mit |
| library_name: diffusers |
| pipeline_tag: text-to-image |
| tags: |
| - gcode |
| - cnc |
| - plotter |
| - polargraph |
| - stable-diffusion |
| - text-to-gcode |
| - diffusion |
| base_model: runwayml/stable-diffusion-v1-5 |
| datasets: |
| - twarner/dcode-imagenet-sketch |
| --- |
| |
| # dcode: Text-to-Gcode Diffusion Model |
|
|
| An end-to-end diffusion model that converts **text prompts directly into G-code** for CNC machines, plotters, and polargraph drawing robots. |
|
|
| ## Overview |
|
|
| dcode is a fine-tuned Stable Diffusion model with a custom G-code decoder head. It takes a text description (e.g., "a sketch of a horse") and outputs machine-executable G-code. |
|
|
| | Component | Description | |
| |-----------|-------------| |
| | Base Model | [Stable Diffusion v1.5](https://huggingface.co/runwayml/stable-diffusion-v1-5) | |
| | Decoder | 200M param transformer (12 layers, 1024 hidden, 16 heads) | |
| | Tokenizer | Custom BPE tokenizer for G-code | |
| | Training Data | [dcode-imagenet-sketch](https://huggingface.co/datasets/twarner/dcode-imagenet-sketch) | |
|
|
| ## Architecture |
|
|
| ``` |
| Text Prompt |
| β |
| [CLIP Text Encoder] β frozen |
| β |
| [UNet Diffusion] β frozen |
| β |
| Latent (4Γ64Γ64) |
| β |
| [CNN Projector] β trained |
| β |
| [Transformer Decoder] β trained |
| β |
| G-code Tokens |
| β |
| G-code Text |
| ``` |
|
|
| ## Usage |
|
|
| ### With Diffusers |
|
|
| ```python |
| import torch |
| from diffusers import StableDiffusionPipeline |
| from huggingface_hub import hf_hub_download |
| from transformers import PreTrainedTokenizerFast |
| |
| # Load components |
| pipe = StableDiffusionPipeline.from_pretrained( |
| "runwayml/stable-diffusion-v1-5", |
| torch_dtype=torch.float16 |
| ).to("cuda") |
| |
| # Download decoder weights |
| weights = hf_hub_download("twarner/dcode-sd-gcode-v3", "pytorch_model.bin") |
| tokenizer_path = hf_hub_download("twarner/dcode-sd-gcode-v3", "gcode_tokenizer/tokenizer.json") |
| |
| # Load custom gcode tokenizer |
| gcode_tokenizer = PreTrainedTokenizerFast(tokenizer_file=tokenizer_path) |
| |
| # Generate latent from text |
| with torch.no_grad(): |
| latent = pipe("a sketch of a horse", output_type="latent").images |
| |
| # ... decode with GcodeDecoderV3 (see repo for full inference code) |
| ``` |
|
|
| ### Interactive Demo |
|
|
| Try the model live: **[huggingface.co/spaces/twarner/dcode](https://huggingface.co/spaces/twarner/dcode)** |
|
|
| ## Training |
|
|
| - **Dataset**: 50,000 ImageNet-Sketch images β 200,000 G-code files |
| - **Hardware**: 8Γ NVIDIA H100 80GB |
| - **Epochs**: 50 |
| - **Batch Size**: 256 effective (32 Γ 8 GPUs) |
| - **Learning Rate**: 1e-4 with cosine schedule |
| - **Regularization**: Label smoothing (0.1), weight decay (0.05) |
|
|
| ## G-code Output |
|
|
| The model generates G-code compatible with: |
| - Polargraph/drawbot machines |
| - Pen plotters |
| - Any G-code compatible CNC |
|
|
| Example output: |
| ```gcode |
| G21 ; mm |
| G90 ; absolute |
| M280 P0 S90 ; pen up |
| G28 ; home |
| |
| G0 X-200.00 Y100.00 F1000 |
| M280 P0 S40 ; pen down |
| G1 X-180.00 Y120.00 F500 |
| G1 X-160.00 Y115.00 F500 |
| ... |
| ``` |
|
|
| ## Machine Specs |
|
|
| Default work area (configurable): |
| - Width: 841mm |
| - Height: 1189mm (A0 paper) |
| - Pen servo: 40Β° down, 90Β° up |
|
|
| ## Project |
|
|
| Full project documentation, hardware build guide, and source code: |
|
|
| **π [teddywarner.org/Projects/Polargraph/#dcode](https://teddywarner.org/Projects/Polargraph/#dcode)** |
|
|
| **GitHub**: [github.com/Twarner491/dcode](https://github.com/Twarner491/dcode) |
|
|
| ## Citation |
|
|
| ```bibtex |
| @misc{dcode2024, |
| author = {Teddy Warner}, |
| title = {dcode: Text-to-Gcode Diffusion Model}, |
| year = {2026}, |
| url = {https://teddywarner.org/Projects/Polargraph/#dcode} |
| } |
| ``` |
|
|
| ## License |
|
|
| MIT License |
|
|