数据集【免费下载链接】quickdraw-datasetDocumentation on how to access and use the Quick, Draw! Dataset.项目地址https://gitcode.com/gh_mirrors/qu/quickdraw-dataset点击查看免费下载导读Quick, Draw!涂鸦快画数据集以多种格式存放下百万量级的用户涂鸦其中 ndjsonNewline Delimited JSON是其最直观、最易用命令行处理的格式之一。本文以官方文档 examples/nodejs/ndjson.md 为主线围绕如何用 ndjson-cli 从海量涂鸦中快速筛选、排序并导出感兴趣的子集这一核心场景完整还原文档中的每一条命令并结合仓库中的 README 与 Node.js 解析源码补充数据字段定义、简化流程与实现细节。读完本文你将能够用cat、head、wc与ndjson-filter、ndjson-sort、ndjson-reduce等工具组合像操作普通文本流一样对千万级涂鸦数据进行切片、过滤与导出为后续的数据分析、可视化和模型训练打下基础。1. ndjson一行一个涂鸦对象1.1 什么是 Quick, Draw! 数据集的 ndjson 格式Quick, Draw! 数据集是 Google 发布的、由玩家在你画我猜游戏中贡献的涂鸦集合包含 345 个类别见仓库根目录的 categories.txtface也在其中、超过五千万张涂鸦。仓库 README.md 说明原始数据按类别拆分为独立的 ndjson 文件每个类别一个文件每一行是一个完整的 JSON 对象代表一张涂鸦及其元数据。文档 examples/nodejs/ndjson.md 给出的单行示例结构如下{ key_id:5891796615823360, word:nose, countrycode:AE, timestamp:2017-03-01 20:41:36.70725 UTC, recognized:true, drawing:[[[129,128,129,129,130,130,131,132,132,133,133,133,133,...]]] }配合 README.md 中的字段表各字段含义如下字段类型说明key_id64 位无符号整数全数据集中唯一的涂鸦标识符wordstring游戏提示玩家绘制的类别词recognizedboolean该涂鸦是否被游戏判定为识别成功timestampdatetime涂鸦创建时间countrycodestring玩家所在国家/地区的两位字母代码ISO 3166-1 alpha-2drawingstring以 JSON 数组表示的矢量笔画数据drawing数组的结构为笔画嵌套结构[ [ // 第一笔 stroke [x0, x1, x2, x3, ...], [y0, y1, y2, y3, ...], [t0, t1, t2, t3, ...] ], [ // 第二笔 stroke [x0, x1, x2, x3, ...], [y0, y1, y2, y3, ...], [t0, t1, t2, t3, ...] ], ... // 更多笔画 ]其中x、y是像素坐标t是自第一个点以来的毫秒时间戳x、y为实数t为整数。由于玩家使用的设备与输入方式不同原始涂鸦的包围盒与点数差异很大。1.2 原始数据 vs 简化数据simplified文档明确指出本指南聚焦于simplified drawings简化涂鸦理由是文件体积约为原始数据的1/10而涂鸦观感几乎一致。代价是简化版本丢失了原始数据中的时间信息——如果你后续想分析绘制时序可以在熟悉数据结构后自行探索 raw 数据其格式与简化版几乎完全一致只是多了时间数组且笔画数据点更多。README.md 的 Preprocessed dataset 一节给出了简化流程的完整定义共四步将涂鸦对齐到左上角使坐标最小值归 0均匀缩放使坐标最大值达到 255即归一化到 256×256 区域所有笔画按 1 像素间距重新采样使用 Ramer–Douglas–PeuckerRDP算法、epsilon 取 2.0 进行笔画简化。这也解释了为什么简化版每行示例中的坐标都是 0255 范围内的整数——它们已经被统一到了 256×256 的画布上。1.3 下载对应的类别文件由于每个文件对应一个单词/类别的全部涂鸦你可以按需只下载关心的那一个。以本文示例的face类别为例其简化数据文件为face.ndjson位于 Google Cloud Storage 的quickdraw_dataset/full/simplified目录。若想批量下载所有类别的简化文件README 提供了gsutil方案gsutil -m cp gs://quickdraw_dataset/full/simplified/*.ndjson .说明下载数据需要访问 Google Cloud Storage 公有数据集具体访问方式可参考 Cloud Storage 的公开数据访问文档见 README.md。2. 环境准备安装 ndjson-cli 与 d32.1 ndjson-cli 是什么文档推荐使用 ndjson-cli 这一命令行工具集来快速构造数据子集。它由 D3 作者 Mike Bostock 开发提供ndjson-filter、ndjson-sort、ndjson-reduce等命令核心设计是与标准 Unix 管道pipe无缝衔接——输入输出都是一行一个 JSON的文本流因此可以自然地与cat、head、tail、wc等命令串联。2.2 安装命令仓库 examples/nodejs/package.json 的devDependencies中列出了相关依赖devDependencies: { d3: ^4.9.1, ndjson-cli: ^0.3.0 }对应安装命令如下npm install ndjson-cli npm install d3注意文档中的关键提醒排序功能需要引入 d3因此npm install d3必须在你要执行这些命令的目录下进行。d3 在这里提供d3.ascending、d3.descending等比较函数供ndjson-sort在 Node.js 运行时环境中调用-r d3参数的含义见 4.2 节。3. 快速窥探数据cat / head / tailndjson 格式的最大优势之一就是它可以直接用最朴素的 Unix 命令进行快速预览无需写任何解析代码。文档给出的两个示例# 查看前 5 行 cat face.ndjson | head -n 5 # 查看最后 5 行 cat face.ndjson | tail -n 5head -n 5与tail -n 5分别输出文件的前 5 行与后 5 行。由于每一行就是一个完整的 JSON 对象你可以立即看到face类别中涂鸦的key_id、countrycode、recognized等元数据以及drawing笔画数组。这就是先看两眼、再决定下一步的典型用法。4. 筛选子集ndjson-filter4.1 基础筛选语法ndjson-filter的作用与 Unix 的grep类似但它的匹配对象是反序列化后的 JSON 对象而非纯文本行。它接收一个 JavaScript 表达式表达式中d代表当前行的数据对象表达式返回true的行会被保留。文档给出了四个经典用例# 只保留被游戏识别成功的涂鸦 cat face.ndjson | ndjson-filter d.recognized true | head -n 5 # 统计识别成功的涂鸦数量 cat face.ndjson | ndjson-filter d.recognized true | wc -l # 统计未被识别的涂鸦数量 cat face.ndjson | ndjson-filter d.recognized false | wc -l # 组合条件识别成功 且 玩家位于加拿大countrycode 为 CA cat face.ndjson | ndjson-filter d.recognized true d.countrycode CA | wc -l几个值得注意的细节d.recognized是布尔字段直接与true/false比较即可无需加引号d.countrycode是字符串字段比较时必须加双引号d.countrycode CA多个条件用连接实现识别成功且来自加拿大这类组合筛选wc -l统计行数即筛选后剩余的涂鸦条数——这是快速评估数据子集规模的最直接手段。由于recognized决定了一张涂鸦是否被游戏判定为猜对这类筛选对后续训练分类模型、过滤低质量数据非常实用。4.2 关于字段路径的说明从源码结构看ndjson-filter的表达式在 Node.js 的 JavaScript 上下文中求值因此你可以访问对象的所有字段包括嵌套路径。例如d.word、d.key_id、d.timestamp都是合法的访问方式。文档聚焦于recognized与countrycode两个字段其他字段如按word过滤、按timestamp过滤可举一反三。5. 排序ndjson-sort 与 d35.1 为什么需要 d3ndjson-sort用于对整份数据按某个键排序。与filter不同sort是全局操作需要把整个数据流读入内存再排序输出因此更适合在head -n N限定规模之后再使用见 6.3 节。要让排序更方便文档建议引入 d3其比较函数可以直接作为排序依据。文档中的两个示例# 按涂鸦创建时间升序排列 cat face.ndjson | ndjson-sort -r d3 d3.ascending(a.timestamp, b.timestamp) | head -n 5 # 按笔画复杂度从高到低排列用笔画数衡量 cat face.ndjson | ndjson-sort -r d3 d3.descending(a.drawing.length, b.drawing.length) | head -n 55.2 参数与表达式解读-r d3将d3模块注册为排序表达式可用的运行环境这样表达式中才能调用d3.ascending/d3.descending表达式中a、b分别代表被比较的两行数据对象d3.ascending(a.timestamp, b.timestamp)按timestamp字段升序——结合 1.1 节可知timestamp是创建时间因此第一行即最早的涂鸦d3.descending(a.drawing.length, b.drawing.length)按drawing数组长度即笔画数降序——第一行就是笔画最多、最复杂的涂鸦。组合思路如果你想知道face 类别里谁画得最复杂第二条命令的head -n 5直接给出答案配合head -n 1则可拿到单个最复杂的样本。6. 导出为 JSONndjson-reduce6.1 为什么需要 reducendjson-filter与ndjson-sort的输出仍然是一行一个 JSON的 ndjson 流而有时我们想要的是标准的 JSON 数组文件例如直接JSON.parse加载、或作为 API 响应体返回。ndjson-reduce正是为此设计它把输入的 ndjson 流累积reduce成一个 JSON 数组输出到文件。6.2 基础导出示例文档中的第一个导出用例# 导出所有识别成功且来自加拿大的涂鸦为 canadian-faces.json cat face.ndjson | ndjson-filter d.recognized true d.countrycode CA | ndjson-reduce canadian-faces.json执行后canadian-faces.json是一个标准的 JSON 数组每个元素是一个完整的涂鸦对象可以直接用JSON.parse()读取。6.3 用 head 限制导出规模海量数据下全量导出往往不必要。文档展示了如何用head -n在导出前截断数据流# 只导出前 1000 张加拿大涂鸦 cat face.ndjson | ndjson-filter d.recognized true d.countrycode CA | head -n 1000 | ndjson-reduce canadian-faces.json这是filter → head → reduce三段式流水线先过滤出目标子集再用head取前 N 条最后累积成数组落盘。head位于管道中游意味着内存中只保留最终导出的 N 条对象非常适合百万级文件。6.4 组合排序与截断的完整流水线文档给出的终极示例把筛选、排序、截断、导出四个环节串成一条管道cat face.ndjson | ndjson-filter d.recognized true d.countrycode CA | ndjson-sort -r d3 d3.descending(a.drawing.length, b.drawing.length) | head -n 100 | ndjson-reduce complex-faces.json这条命令的语义是从加拿大玩家、且被识别成功的涂鸦中挑出笔画数最多的前 100 张导出为complex-faces.json。它完整演示了本指南的全部能力——ndjson-filter负责条件筛选ndjson-sort负责按复杂度排序head -n 100截取 Top-100ndjson-reduce将流累积为标准 JSON 数组。此类复杂样本集非常适合作为数据清洗、难度分层或可视化展示的输入。7. 源码佐证Node.js 中如何逐行解析 ndjson命令行工具适合快速探索而在 Node.js 程序中解析这些文件则是 examples/nodejs/simplified-parser.js 演示的内容。它使用ndjsonnpm 包该依赖已声明于 examples/nodejs/package.json以流式方式逐行解析var fs require(fs); var ndjson require(ndjson); // npm install ndjson function parseSimplifiedDrawings(fileName, callback) { var drawings []; var fileStream fs.createReadStream(fileName) fileStream .pipe(ndjson.parse()) .on(data, function(obj) { drawings.push(obj) }) .on(error, callback) .on(end, function() { callback(null, drawings) }); }这段代码揭示了 ndjson 格式的底层读取模型fs.createReadStream创建文件读取流.pipe(ndjson.parse())将文本流按行切分并反序列化为对象data事件逐个收到涂鸦对象。这与ndjson-filter在命令行中的工作方式一致——每一行独立解析、独立处理天然支持流式管道。示例脚本假设你把face-simple.ndjson放入同目录的data文件夹后运行最终会逐条打印key_id与countrycode并输出总数。作为对照examples/nodejs/binary-parser.js 演示了同一数据集的.bin二进制格式解析其recognized字段是 1 个 bit、timestamp是 uint32 秒级时间戳等细节可以帮助你理解 ndjson 与二进制格式在信息密度上的差异。8. 实战要点小结将本文涉及的命令按用途归类形成可直接复用的操作速查目标命令模式预览数据cat face.ndjson \| head -n 5/tail -n 5按条件筛选cat face.ndjson \| ndjson-filter d.recognized true统计子集规模... \| wc -l按字段排序... \| ndjson-sort -r d3 d3.ascending(a.timestamp, b.timestamp)截断取前 N 条... \| head -n 1000导出标准 JSON 数组... \| ndjson-reduce out.json几条关键经验管道即探索流程筛选、排序、截断、导出都可以自由组合顺序通常为 filter → sort → head → reduce每一步都即时可见字符串字段要加引号countrycode这类字符串的比较必须写成d.countrycode CA而布尔字段直接比较即可先 head 再 sortndjson-sort需要全量读入内存对超大文件建议先用 filter/head 缩小规模再排序简化版足够日常使用简化数据体积小约 10 倍、坐标统一在 256×256 范围、不含时间信息是快速实验的默认选择需要时间序列分析时再转向 raw 数据。9. 延伸阅读数据格式总览与全部预处理说明含简化流程、二进制格式、numpy 位图README.md全部 345 个类别清单categories.txtNode.js 流式解析 ndjson 完整示例examples/nodejs/simplified-parser.jsNode.js 解析二进制格式对照示例examples/nodejs/binary-parser.js依赖声明ndjson、ndjson-cli、d3 等examples/nodejs/package.jsonPython 侧解析二进制文件的对照实现examples/binary_file_parser.py如果你打算基于这些涂鸦训练分类模型README 还提供了 Sketch-RNN 相关的.npz预处理数据以及 TensorFlow 教程的指引可与本文的 ndjson 子集导出流程衔接使用。赞分享数据集【免费下载链接】quickdraw-datasetDocumentation on how to access and use the Quick, Draw! Dataset.项目地址https://gitcode.com/gh_mirrors/qu/quickdraw-dataset点击查看免费下载相关推荐xyOps 备份格式XYBK v1.0完全指南基于 NDJSON 的批量数据导出与导入机制xyOps 备份格式XYBK v1.0完全指南基于 NDJSON 的批量数据导出与导入机制 XYBKxyOps Backup Format是 xyOpFlowbite Datatables 插件实战指南基于 Tailwind CSS 构建可搜索、排序、筛选、分页与导出的数据表格Flowbite Datatables 插件实战指南基于 Tailwind CSS 构建可搜索、排序、筛选、分页与导出的数据表格 本指南以 FlowbiteUI组件前端Prisma 数据导出完全指南CLI 命令与原生 Export API 实战基于 NDF 格式Prisma 数据导出完全指南CLI 命令与原生 Export API 实战基于 NDF 格式 本指南系统讲解 Prisma 服务数据导出的两种官方途径—后端数据库GraphQL创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考