{ "schemaVersion": 1, "kind": "quickdraw-classifier", "classes": [ "airplane", "apple", "banana", "bicycle", "bird", "book", "bus", "cake", "camera", "car", "cat", "chair", "clock", "cloud", "coffee cup", "computer", "dog", "door", "eye", "face", "fish", "flower", "hamburger", "hand", "house", "ice cream", "key", "light bulb", "moon", "mountain", "pencil", "pizza", "rain", "rainbow", "star", "sun", "telephone", "tree", "truck", "umbrella" ], "sourceCacheFingerprint": "5d56d8dd9ccc445000f843298d921611e777f90010f75bdfd344988a67b2f4bb", "trainingData": { "cacheFingerprint": "5d56d8dd9ccc445000f843298d921611e777f90010f75bdfd344988a67b2f4bb", "sourceManifestFingerprint": "91aa4345a785276c8ddd3afeb659f9418117121e4b03d12accdcb466351654e7", "sourceManifestSha256": "98de0a2954e9111d8c1015a3b59afecd2b085a53078d53b13427c1a2e0e79544", "sampling": { "seed": 20260815, "perClass": { "train": 3000, "valid": 500, "test": 500 } }, "splits": { "train": { "count": 120000, "images": { "filename": "train-images.npy", "bytes": 491520128, "sha256": "f0b13c42b667dc8b368ebbc24f7d154fdc7b2736128887c2b73cd3d848e4af2c", "shape": [ 120000, 64, 64 ], "dtype": "uint8" }, "labels": { "filename": "train-labels.npy", "bytes": 240128, "sha256": "cad1bef39f1b1578c1908ece8273676b650747ae12f6ba2ef7fff07e0518df76", "shape": [ 120000 ], "dtype": "int16" } }, "valid": { "count": 20000, "images": { "filename": "valid-images.npy", "bytes": 81920128, "sha256": "e22c85d7741e7d661620c9db2b2acea9cbc01c025cd4371c45c2c12813e679e9", "shape": [ 20000, 64, 64 ], "dtype": "uint8" }, "labels": { "filename": "valid-labels.npy", "bytes": 40128, "sha256": "1c8d3d1400e77e2acf7caea884285c7b9b192c63b9ef24e5c7169f12c0ed298c", "shape": [ 20000 ], "dtype": "int16" } }, "test": { "count": 20000, "images": { "filename": "test-images.npy", "bytes": 81920128, "sha256": "b08466e72d7494e664ac8f8b2f8b42857ac2e23ded846aa62e19430babad3a0d", "shape": [ 20000, 64, 64 ], "dtype": "uint8" }, "labels": { "filename": "test-labels.npy", "bytes": 40128, "sha256": "1c8d3d1400e77e2acf7caea884285c7b9b192c63b9ef24e5c7169f12c0ed298c", "shape": [ 20000 ], "dtype": "int16" } } }, "rasterizerFiles": { "worker": { "path": "scripts/rasterize-stroke3-worker.mjs", "sha256": "54bffd0ffc04c8d2958327a2206104676623d175f868c4e407774fd08db3431f" }, "implementation": { "path": "src/sketch-rasterizer.mjs", "sha256": "73f93553d1961265f8c0a63519b91da736f2bd4f081d6699ed60ba3b74eafa59" } }, "builder": { "path": "scripts/build-training-cache.py", "sha256": "69bf16f53bf66bf850acd922e10c1ecafce68ee0fffb55cbce799da5aa181c93", "dependencies": { "model/integrity.py": "8b2aaa5ead6ec5739acaf279926deb553bc945eb8a3d5ccadb3fd20d3021c2a9" }, "runtime": { "python": "3.9.6", "numpy": "1.26.4" } }, "node": { "version": "v24.14.1", "sha256": "91d3afb67a7dc211f642f2328f822505ff1c1ad381e98ffdd21b003970deeeda" } }, "rasterizer": { "worker": "scripts/rasterize-stroke3-worker.mjs", "size": 64, "padding": 4, "strokeWidth": 2.5, "supersample": 4 }, "architecture": { "inputShape": [ 1, 64, 64 ], "numClasses": 40, "channels": [ 32, 64, 128 ], "embeddingSize": 192, "dropout": 0.2 }, "model": { "filename": "quickdraw-mvp.onnx", "format": "ONNX", "opset": 17, "bytes": 1980135, "sha256": "ba83ba933fa4d93399036f80ec3848257154f1e1661e0f1270beac17d0947c46", "parameterCount": 494760, "input": { "name": "bitmap", "shape": [ "batch", 1, 64, 64 ], "dtype": "float32", "normalization": "uint8 / 255" }, "output": { "name": "logits", "shape": [ "batch", 40 ], "dtype": "float32" } }, "training": { "seed": 20260815, "epochs": 8, "bestEpoch": 8, "batchSize": 256, "optimizer": { "name": "AdamW", "learningRate": 0.001, "weightDecay": 0.0001 }, "numWorkers": 0, "minimumTestAccuracy": 0.7, "minimumPerClassAccuracy": 0.7, "deterministicAlgorithms": true, "device": "mps", "history": [ { "epoch": 1, "train": { "loss": 1.056165291372935, "accuracy": 0.7128833333333333, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.6744539570093155, "accuracy": 0.8125, "top5Accuracy": 0.9579, "perClassAccuracy": [ 0.764, 0.946, 0.696, 0.88, 0.69, 0.74, 0.588, 0.848, 0.908, 0.872, 0.638, 0.892, 0.888, 0.924, 0.766, 0.828, 0.572, 0.946, 0.858, 0.862, 0.842, 0.62, 0.924, 0.924, 0.97, 0.932, 0.572, 0.836, 0.71, 0.952, 0.85, 0.594, 0.932, 0.94, 0.9, 0.948, 0.43, 0.85, 0.778, 0.89 ] } }, { "epoch": 2, "train": { "loss": 0.5841791171073913, "accuracy": 0.835875, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.45889934716224673, "accuracy": 0.8725, "top5Accuracy": 0.97585, "perClassAccuracy": [ 0.842, 0.97, 0.878, 0.922, 0.618, 0.882, 0.918, 0.918, 0.962, 0.726, 0.8, 0.92, 0.95, 0.906, 0.81, 0.912, 0.718, 0.95, 0.88, 0.874, 0.884, 0.85, 0.942, 0.936, 0.948, 0.914, 0.88, 0.8, 0.662, 0.96, 0.928, 0.88, 0.948, 0.962, 0.916, 0.904, 0.654, 0.91, 0.766, 0.9 ] } }, { "epoch": 3, "train": { "loss": 0.48913656921386717, "accuracy": 0.8603083333333333, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.4167406298160553, "accuracy": 0.8825, "top5Accuracy": 0.9774, "perClassAccuracy": [ 0.878, 0.942, 0.846, 0.9, 0.632, 0.944, 0.912, 0.926, 0.958, 0.79, 0.812, 0.928, 0.904, 0.892, 0.83, 0.896, 0.74, 0.942, 0.906, 0.914, 0.908, 0.91, 0.924, 0.95, 0.954, 0.892, 0.814, 0.878, 0.742, 0.98, 0.954, 0.918, 0.91, 0.96, 0.938, 0.884, 0.724, 0.858, 0.796, 0.914 ] } }, { "epoch": 4, "train": { "loss": 0.43742944836616515, "accuracy": 0.8745666666666667, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.3852368968963623, "accuracy": 0.88965, "top5Accuracy": 0.9801, "perClassAccuracy": [ 0.872, 0.978, 0.864, 0.968, 0.734, 0.922, 0.924, 0.9, 0.966, 0.858, 0.782, 0.932, 0.866, 0.894, 0.862, 0.912, 0.808, 0.912, 0.912, 0.926, 0.9, 0.86, 0.954, 0.926, 0.966, 0.944, 0.848, 0.852, 0.792, 0.964, 0.95, 0.944, 0.844, 0.968, 0.948, 0.92, 0.774, 0.886, 0.636, 0.918 ] } }, { "epoch": 5, "train": { "loss": 0.39647118004163107, "accuracy": 0.885475, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.3675016505241394, "accuracy": 0.8968, "top5Accuracy": 0.97995, "perClassAccuracy": [ 0.832, 0.974, 0.84, 0.956, 0.802, 0.936, 0.788, 0.862, 0.96, 0.866, 0.81, 0.936, 0.956, 0.926, 0.916, 0.934, 0.784, 0.946, 0.932, 0.926, 0.916, 0.846, 0.954, 0.932, 0.966, 0.93, 0.796, 0.878, 0.752, 0.962, 0.93, 0.844, 0.946, 0.964, 0.968, 0.964, 0.726, 0.914, 0.858, 0.944 ] } }, { "epoch": 6, "train": { "loss": 0.36662511706352235, "accuracy": 0.892825, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.36927314329147337, "accuracy": 0.8964, "top5Accuracy": 0.98105, "perClassAccuracy": [ 0.866, 0.966, 0.79, 0.922, 0.81, 0.864, 0.826, 0.882, 0.962, 0.8, 0.8, 0.958, 0.948, 0.932, 0.866, 0.96, 0.674, 0.954, 0.934, 0.914, 0.904, 0.844, 0.978, 0.94, 0.966, 0.948, 0.858, 0.89, 0.828, 0.954, 0.952, 0.904, 0.936, 0.97, 0.958, 0.936, 0.704, 0.914, 0.898, 0.946 ] } }, { "epoch": 7, "train": { "loss": 0.3465169951756795, "accuracy": 0.897975, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.35224454931616783, "accuracy": 0.9008, "top5Accuracy": 0.9812, "perClassAccuracy": [ 0.882, 0.974, 0.89, 0.946, 0.75, 0.906, 0.9, 0.91, 0.972, 0.828, 0.762, 0.95, 0.948, 0.926, 0.892, 0.95, 0.722, 0.952, 0.946, 0.932, 0.902, 0.836, 0.958, 0.95, 0.966, 0.946, 0.866, 0.894, 0.782, 0.968, 0.944, 0.852, 0.928, 0.968, 0.954, 0.94, 0.802, 0.892, 0.796, 0.95 ] } }, { "epoch": 8, "train": { "loss": 0.321421586004893, "accuracy": 0.9052166666666667, "top5Accuracy": null, "perClassAccuracy": null }, "valid": { "loss": 0.34855738773345946, "accuracy": 0.90335, "top5Accuracy": 0.9813, "perClassAccuracy": [ 0.882, 0.976, 0.888, 0.97, 0.862, 0.914, 0.908, 0.904, 0.97, 0.92, 0.85, 0.9, 0.938, 0.93, 0.912, 0.898, 0.77, 0.912, 0.904, 0.932, 0.876, 0.922, 0.956, 0.906, 0.95, 0.936, 0.872, 0.858, 0.814, 0.956, 0.902, 0.912, 0.938, 0.964, 0.89, 0.94, 0.806, 0.916, 0.734, 0.946 ] } } ] }, "metrics": { "test": { "loss": 0.3516912404060364, "accuracy": 0.9005, "top5Accuracy": 0.98195, "perClassAccuracy": [ 0.9, 0.968, 0.844, 0.96, 0.836, 0.916, 0.912, 0.914, 0.944, 0.916, 0.86, 0.872, 0.938, 0.916, 0.898, 0.916, 0.784, 0.924, 0.888, 0.922, 0.872, 0.91, 0.96, 0.912, 0.942, 0.936, 0.878, 0.884, 0.784, 0.956, 0.9, 0.918, 0.946, 0.978, 0.838, 0.958, 0.796, 0.922, 0.738, 0.964 ] }, "onnxTest": { "loss": 0.35169129371643065, "accuracy": 0.9005, "top5Accuracy": 0.98195, "perClassAccuracy": [ 0.9, 0.968, 0.844, 0.96, 0.836, 0.916, 0.912, 0.914, 0.944, 0.916, 0.86, 0.872, 0.938, 0.916, 0.898, 0.916, 0.784, 0.924, 0.888, 0.922, 0.872, 0.91, 0.96, 0.912, 0.942, 0.936, 0.878, 0.884, 0.784, 0.956, 0.9, 0.918, 0.946, 0.978, 0.838, 0.958, 0.796, 0.922, 0.738, 0.964 ] }, "maxLogitDifference": 4.00543212890625e-05 }, "runtime": { "python": "3.9.6", "platform": "macOS-26.6-arm64-arm-64bit", "machine": "arm64", "numpy": "1.26.4", "torch": "2.8.0", "onnx": "1.19.1", "onnxruntime": "1.19.2" }, "browserRuntime": { "package": "onnxruntime-web", "version": "1.22.0", "lockfileSha256": "e50f2a9ff0a010abd2b3a25c0a54b8d5465602c4c47bcd037e716e9f1bd5ea5d" }, "source": { "repositoryRevision": "d2786f128e3b1ec07cfee1b4ef14ab797f53c026", "filesMatchRevision": true, "files": { "model/__init__.py": "925a4d0bae99898cc145c54eb034f79f5d662ba8f7ae7854f540134c171088b0", "model/quickdraw_cnn.py": "cb1906705fdae3d6cb67e1b897558fb01a040bf3400051d5c03d2709e1f19c8f", "model/integrity.py": "8b2aaa5ead6ec5739acaf279926deb553bc945eb8a3d5ccadb3fd20d3021c2a9", "scripts/build-training-cache.py": "69bf16f53bf66bf850acd922e10c1ecafce68ee0fffb55cbce799da5aa181c93", "scripts/rasterize-stroke3-worker.mjs": "54bffd0ffc04c8d2958327a2206104676623d175f868c4e407774fd08db3431f", "scripts/train-quickdraw-model.py": "3d208847fab3f2fb870a8fbea678cb3d7c2f797007a183623fab306405283ee5", "src/sketch-rasterizer.mjs": "73f93553d1961265f8c0a63519b91da736f2bd4f081d6699ed60ba3b74eafa59", "package.json": "de13417c20a49a170d66856b17941731a64fad6913d1badeb4de1509dd396f82", "package-lock.json": "e50f2a9ff0a010abd2b3a25c0a54b8d5465602c4c47bcd037e716e9f1bd5ea5d", "requirements-data.txt": "e77e7045d01a9431264f9262c6b199d8e7988c139276a5266a3cf689588ad66e", "requirements-model.txt": "58d3cbb9c136a64c66502affdf57da0b0cd2a911332059a5f51eda5a3e7770f6" } }, "fingerprint": "e0c9f0e3edabeb2d9f80c00e95ac311b906eecac5aced2a89730c2d10ff15602" }