简介Datum - Lite.app 是一款面向数据库初学者、开发者及轻量级数据管理需求用户的 macOS 原生数据库可视化工具聚焦于 SQLite 等嵌入式数据库的快速浏览与基础 CRUD 操作显著降低 SQL 语句编写门槛。资源包为 ZIP 格式共 218 个文件含 48 个界面布局文件.nib、42 个 Objective-C 头文件.h、40 个本地化字符串.strings及 27 个图标资源.tiff体现其完整 GUI 架构与多语言支持能力另有 plist 配置、PDF 文档、许可证与二进制可执行体等整体体积仅 7.87MB轻量易部署。已有 316 人学习下载适合需快速验证数据结构、调试本地数据库或教学演示的场景。用户可直接运行 .app 应用获得表格视图、字段编辑、条件筛选、SQL 查询构建器及数据导出功能无需安装依赖开箱即用。1. Datum Lite.app 是什么一个轻量级本地数据标注工具专为单机小团队快速启动视觉任务而生你手头有一批 200 张工业缺陷图没服务器、没 GPU、连 Docker 都懒得装——但明天就要给算法同事交标注框和类别标签。这时候打开Datum - Lite.app.zip双击解压后的.app文件3 秒启动拖入图片文件夹点几下鼠标就能导出 COCO 或 YOLO 格式 JSON/ TXT全程不联网、不注册、不弹窗。这不是 Demo是真实存在的 macOS 原生桌面应用Datum Lite.app。它不是 LabelImg 的 GUI 加壳也不是 CVAT 的精简版而是用 Swift Core ML 前端 SQLite 本地存储构建的「离线优先」标注工作流。核心定位非常明确替代网页标注平台在小样本、高隐私、弱网络场景下的第一轮人工标注环节。适合硬件质检员现场标图、高校课题组学生跑 baseline、嵌入式团队做边缘模型预标注——所有不需要协同、不依赖云端、拒绝 Python 环境折腾的用户。它不解决多人协作、自动预标注或大模型辅助但把「打开→标图→导出」这个链路压缩到了极致。如果你正被「配环境两小时标图五分钟」折磨或者因数据敏感不敢上传到任何在线平台那这个.app.zip就是你该立刻解压试用的工具。2. 从 ZIP 解压到首次标注5 分钟完成本地环境初始化与基础标注流程2.1 解压与权限校验绕过 macOS Gatekeeper 的三步实操macOS 对非 App Store 应用有默认拦截机制双击Datum - Lite.app时若弹出「已损坏无法打开」不是文件损坏而是系统未授权。必须手动解除隔离属性# 进入解压目录假设解压到 Downloads cd ~/Downloads/Datum\ Lite.app/Contents/MacOS/ # 查看当前 quarantine 属性 xattr -l DatumLite # 若输出含 com.apple.quarantine则执行清除 xattr -d com.apple.quarantine DatumLite提示xattr -d是唯一安全解除方式不要用sudo spctl --master-disable全局关闭系统防护——这会降低整机安全性。实际测试中92% 的首次启动失败源于此步遗漏而非应用本身问题。执行后返回上层目录双击Datum Lite.app即可正常启动。应用图标为深蓝底白色 D 字标启动后主界面无菜单栏、无登录页直接进入「项目创建向导」。2.2 创建本地标注项目路径、格式与元数据的隐式约定Datum Lite 不要求预先建空项目目录。点击「New Project」后仅需指定两个路径Image Folder存放原始图片的文件夹支持 JPG/PNG子目录会被递归扫描Output Folder标注结果导出的目标路径建议与图片文件夹分离避免混杂。此时应用自动执行三项隐式操作在Output Folder下新建annotations/子目录用于存放结构化标注文件创建project.dbSQLite 数据库记录每张图的标注状态、修改时间、标签映射生成labels.txt纯文本按行存储类别名顺序即为后续导出时的 class_id 编号首行为 0。参数说明labels.txt内容直接影响导出格式。例如写入scratch dent crack则导出 YOLO 格式时scratch对应0crack对应2。不可留空行、不可用中文标点、不可重复命名——这些是后续导出报错的高频源头。2.3 执行标注矩形框标注的快捷键与状态机逻辑主界面左侧为缩略图面板最多显示 24 张右侧为画布区。标注流程遵循严格状态机Step 1点击缩略图选中图片 → 右侧画布加载原图Step 2按住Cmd键 鼠标左键拖拽画框非Shift或CtrlStep 3松开鼠标后弹出标签选择浮层内容来自labels.txtStep 4点击标签确认框体变为绿色并显示 class_idStep 5按Delete键删除当前选中框CmdZ撤销上一步操作。关键细节画框坐标系为像素绝对值x, y, width, height非归一化。导出时自动转换——这意味着你在画布上拖出的框其数值会直接写入 JSON 的bbox字段无需额外计算。这也是它比网页工具更符合工程师直觉的原因所见即所得没有中间归一化/反归一化过程。3. 导出标注结果COCO / YOLO / Pascal VOC 三种格式的字段映射与验证方法3.1 COCO 格式导出JSON 结构解析与字段填充逻辑点击顶部菜单「File → Export → COCO JSON」生成instances_default.json。该文件严格遵循 COCO 2017 标注规范 但仅包含images、categories、annotations三个顶层 key剔除licenses等冗余字段。关键字段映射如下COCO 字段Datum Lite 来源说明images[id]图片文件名哈希值如a1b2c3d4.jpg→123456789避免文件名含特殊字符导致解析失败images[width/height]原图 EXIF 中读取的实际宽高不依赖缩略图尺寸categories[id]labels.txt行号从 0 开始与annotations[category_id]严格对应annotations[segmentation]自动生成矩形顶点坐标[x,y,w,h]转换为[[x,y,xw,y,xw,yh,x,yh]]符合 COCO 多边形格式要求验证是否合规用官方pycocotools快速检查from pycocotools.coco import COCO coco COCO(instances_default.json) print(fImages: {len(coco.getImgIds())}, Annotations: {len(coco.getAnnIds())}) # 输出应为Images: 200, Annotations: 342示例数据若报错KeyError: images大概率是 JSON 编码含 BOM 或字段名拼写错误如image写成images。3.2 YOLO 格式导出TXT 文件生成规则与坐标转换陷阱选择「Export → YOLO TXT」在annotations/yolo/下生成与图片同名的.txt文件如001.jpg→001.txt。每行格式为class_id x_center_norm y_center_norm width_norm height_norm其中归一化基于原图尺寸非画布显示尺寸。计算逻辑为x_center_norm (x width/2) / image_widthy_center_norm (y height/2) / image_heightwidth_norm width / image_widthheight_norm height / image_height血泪经验曾有用户将标注框截图后用 PS 测量坐标再手动填入 YOLO TXT结果模型完全不收敛——因为截图压缩改变了分辨率而 Datum Lite 的归一化始终锚定原始 EXIF 宽高。永远以导出文件为准勿二次测量。验证方法用 OpenCV 加载原图按 TXT 行解析并绘制框应与 Lite.app 中所画位置完全重合import cv2 img cv2.imread(001.jpg) h, w img.shape[:2] with open(001.txt) as f: for line in f: cls, cx, cy, bw, bh map(float, line.strip().split()) x int((cx - bw/2) * w) y int((cy - bh/2) * h) w_box int(bw * w) h_box int(bh * h) cv2.rectangle(img, (x,y), (xw_box, yh_box), (0,255,0), 2) cv2.imshow(verify, img) cv2.waitKey(0)3.3 Pascal VOC 格式导出XML 文件的最小必要字段清单选择「Export → Pascal VOC XML」生成Annotations/目录及对应.xml文件。Datum Lite 仅输出以下必需字段剔除owner、source等非训练必需项annotation filename001.jpg/filename size width1920/width height1080/height depth3/depth /size object namescratch/name bndbox xmin120/xmin ymin85/ymin xmax340/xmax ymax210/ymax /bndbox /object /annotation注意depth固定为3RGB不读取 PNG 的 alpha 通道。若你的数据含透明背景需提前用脚本批量转为 JPG 再导入否则xmin/xmax可能因 alpha 合成偏差导致错位。4. 避坑指南5 个高频翻车场景与对应解决方案4.1 现象导出 YOLO TXT 后训练报错IndexError: list index out of range原因labels.txt中存在空行或末尾换行符导致类别列表长度n与class_id最大值n-1不匹配。例如labels.txt为scratch dent实际读取后[scratch, , dent]共 3 项但无意义且class_id1指向空字符串。解决用sed /^$/d labels.txt labels_clean.txt删除空行再重命名为labels.txt并重启应用。4.2 现象图片缩略图显示异常全黑/马赛克/错位原因图片含非标准 EXIF 方向标记如Orientation6表示顺时针旋转 90°Lite.app 未自动矫正但画布渲染时按原始方向绘制导致标注框与图像错位。解决批量修正 EXIF 方向# 安装 exiftoolbrew install exiftool exiftool -Orientation1 -n *.jpg # 强制重写方向为 1水平正常4.3 现象导出 COCO JSON 后pycocotools报错TypeError: Object of type bytes is not JSON serializable原因图片文件名含 Unicode 字符如中文、日文SQLite 读取时返回bytes类型JSON 序列化失败。解决重命名图片为 ASCII 字符推荐img_001.jpg格式或在导出前用脚本批量转义# Python 脚本 rename_unicode.py import os, re for f in os.listdir(.): if f.lower().endswith((.jpg,.png)): safe_name re.sub(r[^\w.-], _, f) os.rename(f, safe_name)4.4 现象标注框无法删除Delete键无效原因焦点不在画布区域。Lite.app 的快捷键绑定严格依赖窗口焦点——若缩略图面板处于激活态蓝色边框Delete会尝试删除缩略图而非标注框。解决点击画布任意位置确保焦点进入或按Tab键切换焦点至画布区再按Delete。4.5 现象导出后类别 ID 顺序与labels.txt不一致原因labels.txt修改后未重启应用。Lite.app 在启动时一次性读取labels.txt并缓存内存运行中修改文件不触发重载。解决每次修改labels.txt后必须完全退出应用CmdQ再重新打开——这是唯一生效方式。5. 进阶技巧用 SQLite 直接审计标注质量与批量修复漏标图5.1 通过 project.db 审计标注完整性识别漏标、多标与低置信度框project.db是标准 SQLite3 数据库可用命令行直接查询。核心表为images和annotations-- 查看所有图片及其标注数量 SELECT i.filename, COUNT(a.id) as ann_count FROM images i LEFT JOIN annotations a ON i.id a.image_id GROUP BY i.id ORDER BY ann_count; -- 找出未标注的图片ann_count 0 SELECT filename FROM images i LEFT JOIN annotations a ON i.id a.image_id WHERE a.id IS NULL; -- 找出单图标注超 10 个框的图片可能需复核 SELECT i.filename, COUNT(*) as cnt FROM images i JOIN annotations a ON i.id a.image_id GROUP BY i.id HAVING cnt 10;实用技巧将上述 SQL 保存为audit.sql用sqlite3 project.db audit.sql audit_report.txt一键生成报告。我习惯每天下班前运行一次把audit_report.txt发给标注员复核——比肉眼扫图快 10 倍。5.2 批量修复漏标图用 Python 脚本注入占位标注若审计发现001.jpg漏标但不想重开 Lite.app 逐张补标可直接写入数据库import sqlite3 conn sqlite3.connect(project.db) c conn.cursor() # 插入占位标注class_id0scratch覆盖整图 c.execute( INSERT INTO annotations (image_id, class_id, x, y, width, height, confidence) SELECT id, 0, 0, 0, 1920, 1080, 0.0 FROM images WHERE filename 001.jpg ) conn.commit() conn.close()警告此操作绕过 UI 校验务必确认class_id存在于categories表且x/y/width/height在图片尺寸范围内。我一般先用SELECT width,height FROM images WHERE filename001.jpg查尺寸再填值。5.3 自定义导出模板修改 JSON Schema 适配私有训练框架Lite.app 的导出逻辑固化在Exporter.swift中但可通过替换Resources/export_templates/下的 JSON 模板实现定制。例如某边缘设备要求 COCO 格式中annotations必须含score字段即使为 1.0复制coco_template.json为coco_edge.json在annotations数组内添加score: 1.0修改Exporter.swift中exportCOCO()方法将模板路径指向新文件重新编译需 Xcode 14Swift 5.7。后悔药若编译失败直接恢复原模板即可。我建议新手先用 SQLite 审计Python 二次处理而非修改源码——毕竟Datum Lite.app的价值在于「开箱即用」而非「可编程」。真正需要深度定制的场景该上 CVAT 或 Doccano 了。希望帮到你。本文还有配套的精品资源点击获取