轻量级图像数据标注平台
支持多种 YOLO 格式导出,专为目标检测数据集制作设计
| 管理后台仪表盘 | 标注界面 |
|---|---|
![]() |
![]() |
| 数据集管理 | 工作量统计 |
|---|---|
![]() |
![]() |
- 用户注册/登录(JWT 认证)
- 管理员/普通用户角色区分
- 用户管理(添加、禁用、删除、重置密码)
- 会话管理(退出时自动清除 Token)
- 创建数据集(指定图片目录)
- 自动扫描导入图片
- 数据集激活/停用
- 数据集统计信息
- 添加/编辑/删除标注类别
- 自定义类别颜色
- 自定义快捷键
- 类别排序
- Canvas 画布标注
- 绘制矩形边界框
- 调整边界框大小
- 删除边界框
- 画布缩放/平移
- 图片自动分配机制
- 保存/跳过操作
- 标注进度显示
- YOLOv5/v7/v8 格式 (Ultralytics)
- YOLO Darknet 格式 (v3/v4)
- COCO JSON 格式
- 自定义训练/验证/测试集比例
- 可选包含未标注图片
- 整体统计概览
- 每日标注量统计
- 用户工作量排行
- 统计数据导出 (CSV/JSON)
- 撤销/重做功能
- 标注历史记录
- 快捷键帮助面板
- 图片上一张/下一张导航
- 标注框复制/粘贴
- 标注框微调(键盘方向键)
- 自动保存
- 图片旋转标注
- 图片翻转
- 亮度/对比度调整预览
- 数据增强导出选项
- 预标注功能(接入 YOLO 模型)
- 智能标注建议
- 自动标注审核
- 标注任务分配
- 标注质量审核
- 评论/反馈系统
- 实时协作
- 多语言支持 (i18n)
- 深色模式
- 移动端适配
- 视频标注支持
- 语义分割标注
- 关键点标注
- WebSocket 实时通知
- 第三方登录 (OAuth)
| 层级 | 技术 |
|---|---|
| 前端 | Vue 3 + Vite + Element Plus + Pinia |
| 后端 | Python 3.10+ + FastAPI + PyMySQL |
| 数据库 | MySQL 8.0+ |
| 认证 | JWT (python-jose + bcrypt) |
torch-markup/
├── frontend/ # Vue 3 前端
│ ├── src/
│ │ ├── views/ # 页面组件
│ │ ├── components/ # 通用组件
│ │ ├── stores/ # Pinia 状态管理
│ │ ├── router/ # 路由配置
│ │ └── utils/ # 工具函数
│ └── package.json
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── core/ # 核心配置(数据库、认证)
│ │ ├── routers/ # API 路由
│ │ └── main.py # 应用入口
│ └── requirements.txt
├── database/
│ └── init.sql # 数据库初始化脚本
├── demo/ # 演示数据集
├── docs/ # 文档和截图
│ └── images/ # README 截图
├── dev.sh # 开发启动脚本
├── CLAUDE.md # 开发规范
└── README.md
- Python 3.10+
- Node.js 18+
- MySQL 8.0+
# 1. 初始化数据库
mysql -u root -p < database/init.sql
# 2. 配置环境变量
cp backend/.env.example backend/.env
# 编辑 .env 文件,设置数据库密码
# 3. 一键启动
./dev.sh启动后:
- 前端: http://localhost:5173
- 后端: http://localhost:8000
- API 文档: http://localhost:8000/docs
按 Ctrl+C 停止服务并自动清除所有登录状态。
mysql -u root -p < database/init.sqlcd backend
# 创建虚拟环境
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑 .env 设置 DATABASE_URL
# 启动服务
uvicorn app.main:app --reload --host 127.0.0.1 --port 8000cd frontend
# 安装依赖
npm install
# 启动开发服务器
npm run dev| 角色 | 用户名 | 密码 |
|---|---|---|
| 管理员 | admin | 123456 |
# docker-compose.yml
version: '3.8'
services:
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: your_password
MYSQL_DATABASE: torch_markup
volumes:
- mysql_data:/var/lib/mysql
- ./database/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "3306:3306"
backend:
build: ./backend
environment:
DATABASE_URL: mysql+pymysql://root:your_password@mysql:3306/torch_markup
SECRET_KEY: your-production-secret-key
ports:
- "8000:8000"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
volumes:
mysql_data:cd backend
pip install gunicorn
# 启动
gunicorn app.main:app -w 4 -k uvicorn.workers.UvicornWorker -b 0.0.0.0:8000cd frontend
npm run build
# 将 dist 目录部署到 NginxNginx 配置示例:
server {
listen 80;
server_name your-domain.com;
# 前端静态文件
location / {
root /var/www/torch-markup/dist;
try_files $uri $uri/ /index.html;
}
# API 代理
location /api {
proxy_pass http://127.0.0.1:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}| 变量名 | 说明 | 默认值 |
|---|---|---|
DATABASE_URL |
数据库连接字符串 | mysql+pymysql://root:123456@localhost:3306/torch_markup |
SECRET_KEY |
JWT 密钥(生产环境请更换) | your-super-secret-key |
ACCESS_TOKEN_EXPIRE_MINUTES |
Token 过期时间(分钟) | 1440 |
CORS_ORIGINS |
允许的跨域来源 | ["http://localhost:5173"] |
| 快捷键 | 功能 |
|---|---|
Ctrl+S |
保存当前标注 |
N |
跳过当前图片(无目标) |
Ctrl+Z |
撤销 |
Ctrl+Shift+Z |
重做 |
Delete / Backspace |
删除选中的框 |
滚轮 |
缩放画布 |
空格+拖动 |
平移画布 |
1-9 / 自定义键 |
切换类别 |
dataset/
├── data.yaml # 配置文件
├── images/
│ ├── train/ # 训练图片
│ ├── val/ # 验证图片
│ └── test/ # 测试图片
└── labels/
├── train/ # 训练标签 (.txt)
├── val/
└── test/
# 标签格式 (归一化坐标 0-1)
class_id x_center y_center width height
dataset/
├── classes.names # 类别名称
├── dataset.data # 配置文件
├── train.txt # 训练图片路径列表
├── val.txt
├── test.txt
├── images/ # 所有图片
└── labels/ # 所有标签
dataset/
├── annotations/
│ ├── instances_train.json
│ ├── instances_val.json
│ └── instances_test.json
├── train/ # 训练图片
├── val/
└── test/
请截取以下页面的截图,保存到 docs/images/ 目录:
| 文件名 | 页面 | 说明 |
|---|---|---|
logo.png |
- | 项目 Logo (200x200) |
dashboard.png |
/admin |
管理后台仪表盘 |
annotation.png |
/annotate/1 |
标注界面(显示图片和标注框) |
datasets.png |
/admin/datasets |
数据集管理页面 |
categories.png |
/admin/categories/1 |
类别管理页面 |
users.png |
/admin/users |
用户管理页面 |
statistics.png |
/admin/statistics |
统计页面 |
export.png |
/admin/export |
数据导出页面 |
login.png |
/login |
登录页面 |
home.png |
/ |
首页(数据集列表) |
启动后端后访问 http://localhost:8000/docs 查看完整的 Swagger API 文档。
主要 API 端点:
| 方法 | 路径 | 说明 |
|---|---|---|
| POST | /api/auth/login |
用户登录 |
| POST | /api/auth/register |
用户注册 |
| GET | /api/datasets |
获取数据集列表 |
| POST | /api/datasets |
创建数据集 |
| POST | /api/datasets/{id}/scan |
扫描导入图片 |
| GET | /api/images/next/{dataset_id} |
获取下一张待标注图片 |
| POST | /api/images/{id}/save |
保存标注 |
| POST | /api/export |
导出数据集 |
| GET | /api/admin/users |
获取用户列表 |
| GET | /api/admin/statistics/overview |
获取统计概览 |
- Fork 本仓库
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 提交 Pull Request
请遵循 CLAUDE.md 中的开发规范。
MIT License - 详见 LICENSE 文件




