Team Ai
Datasetpublic

DmytroKhitro/pixel-art-normal-maps

Pixel-Art Normal Maps Synthetic (pixel-art sprite → camera-space normal map) image pairs for training and evaluating normal-map generation models for 2D pixel-art. This dataset accompanies a master's thesis on normal-map generation for pixelated images. Code: https://github.com/Dmiktor/pixel-art-normal-maps Load from datasets import load_dataset ds = load_dataset("<HF_USERNAME>/pixel-art-normal-maps", split="train") ex = ds[0] ex["color"] # PIL.Image - RGBA… See the full description on the dataset page: https://huggingface.co/datasets/DmytroKhitro/pixel-art-normal-maps.

sourceHugging Facecc-by-4.0updated 4mo agoView on Hugging Face
2likes17downloads
Dataset Card

Pixel-Art Normal Maps

Synthetic (pixel-art sprite → camera-space normal map) image pairs for training and evaluating normal-map generation models for 2D pixel-art.

This dataset accompanies a master's thesis on normal-map generation for pixelated images. Code: https://github.com/Dmiktor/pixel-art-normal-maps

Load

python
from datasets import load_dataset

ds = load_dataset("<HF_USERNAME>/pixel-art-normal-maps", split="train")
ex = ds[0]
ex["color"]    # PIL.Image - RGBA pixel-art sprite (model INPUT)
ex["normal"]   # PIL.Image - camera-space normal map (TARGET)
ex["size"], ex["model_id"], ex["filename"]

Columns

ColumnTypeDescription
colorimage (RGBA)pixel-art sprite, transparent background — model input
normalimage (RGB)camera-space normal map, N_rgb = (N + 1) / 2 · 255 — target
sizeintrender size in px (32, 48, 64, 80 or 96)
model_idstringid of the source 3D model the pair was rendered from
filenamestringoriginal render name (<id>_<model>_r<rot>_e<elev>_s<size>[...])

One train split. Stored as Parquet with the image bytes embedded (loads anywhere, no external files).

PropertyValue
Paired images14,497
Unique source models648
Sprite sizes32, 48, 64, 80, 96 px
Colour formatRGBA, transparent background
Normal encodingcamera space, N_rgb = (N + 1) / 2 · 255
Suggested val split10 % (seed 42) → 1,449 images

How it was made

Low-poly 3D models indexed by Objaverse++ are filtered with CLIP to keep clean single-character meshes, then rendered twice in Blender under identical camera and pose: a stylised pixel-art colour pass and a matching camera-space normal pass. Identical framing means the two images align pixel-for-pixel.

Baseline results (masked angular error, validation = 1,449 images)

MethodMean angular error (°)
Sobel (luminance)49.70
Sobel (alpha)44.26
Beveling (EDT)35.28
U-Net (this work)25.62

Citation

bibtex
@misc{shapovalov2026pixelnormalmaps,
  author = {Shapovalov, Dmytro},
  title  = {Pixel-Art Normal Maps: a synthetic dataset for normal-map generation},
  year   = {2026},
  howpublished = {Hugging Face Hub},
  note   = {Derived from Objaverse++ / Objaverse assets}
}

License & attribution

Released under CC BY 4.0. Rendered from Objaverse++ / Objaverse 3D assets, which carry their own licenses — please attribute Objaverse++ and respect upstream model licenses.