# easy_dataset **Repository Path**: ekukuku/easy_dataset ## Basic Information - **Project Name**: easy_dataset - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-04-25 - **Last Updated**: 2026-08-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Easy Dataset > 一个开源的 AI 数据集管理与 YOLO 训练一体化平台,覆盖「图像导入 → 样本清洗 → 人工/自动标注 → 模型训练 → 推理验证 → 数据导出」的完整工作流。 [![Go](https://img.shields.io/badge/Go-1.25-00ADD8?logo=go)](https://go.dev/) [![Vue](https://img.shields.io/badge/Vue-3.x-4FC08D?logo=vue.js)](https://vuejs.org/) [![Vben Admin](https://img.shields.io/badge/Vben%20Admin-5.7-1677ff)](https://doc.vben.pro/) [![YOLO](https://img.shields.io/badge/YOLO-v8%2Fv9%2Fv10%2Fv11-blue)](https://docs.ultralytics.com/) [![License](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE) --- ## ✨ 项目简介 Easy Dataset 面向计算机视觉工程师与算法团队,提供一个**开箱即用**的数据集运营平台: - 你只需上传原始图片/视频,平台自动完成去重、清洗、缩略图生成、EXIF 解析 - 通过内置的标注工作台进行框选标注,并可**一键调用已训练模型自动打标** - 配置好训练参数后,平台会自动在 Docker 容器中调起 YOLOv8/9/10/11 训练,实时回传日志与指标 - 训练完成后可直接用新模型对新样本进行推理验证,或导出 YOLO 格式数据集/模型权重 项目采用**前后端分离 + 容器化**架构:Go 后端负责调度与数据管理,前端基于企业级 Vben Admin,YOLO 训练/推理通过 Docker 容器隔离执行(支持 CPU / GPU)。 --- ## 🚀 核心功能 ### 数据集管理 - 数据集多版本管理(版本号、快照、差异对比) - 数据集分享与导入(跨用户/跨项目复用) - 按部门/用户的权限隔离(多租户) - 一键导出 YOLO 格式 ZIP(图片 + labels + `dataset.yaml`) ### 图像样本 - 批量导入(压缩包、文件夹、拖拽上传),支持大数据量的**异步导入任务** - 图像去重(基于感知哈希 `goimagehash`) - 自动生成 200px 缩略图 + EXIF 元数据提取 - **智能清洗**:模糊/低质量/重复样本识别与批量剔除 - **智能采样**:按比例/分布/不确定性采样 ### 标注工作台 - 多标签框选标注(支持一框多类) - **标注任务分配**:将图片批量指派给多位标注员,支持重新分配与审核 - **自动标注**:调用已训练模型批量生成候选框(`pending` 状态),人工一键确认/拒绝 - 标注预填充、快捷键、确认/审核两种模式 ### YOLO 训练(Docker 化) - 支持 **YOLOv8 / v9 / v10 / v11** 四个版本 × **CPU / GPU** 两种变体(共 8 个镜像) - 4 步向导式创建训练任务(数据集 → 模型 → 参数 → 确认) - 实时训练日志(`tail -f`)、训练指标(loss、mAP 等)可视化 - 训练曲线、混淆矩阵、检测结果图自动展示 - 模型对比、训练任务自动恢复(进程重启后续跑) - 权重缓存复用(跨任务共享 `yolo_weights` 目录) ### 推理验证 - 支持**图像 + 视频**推理,输出带框图与 `results.json` - 与自动标注复用同一套 Docker 预测容器 ### 实时通知 - WebSocket 推送(训练进度、任务分配、自动标注完成、异常告警) ### 系统管理 - 用户 / 角色 / 部门 / 菜单 四级权限体系 - JWT 认证(Access Token + Refresh Token),Refresh Token 通过 httpOnly Cookie 传递 - NVIDIA GPU 在线检测 --- ## 🏗️ 技术栈 ### 后端(Go 1.25) | 能力 | 技术选型 | | --- | --- | | Web 框架 | Gin v1.12 | | ORM | GORM v1.31 + PostgreSQL 15 | | 配置 | Viper + `.env` | | 日志 | Uber Zap(结构化) | | 认证 | `golang-jwt/jwt v5` | | 实时通信 | `gorilla/websocket` | | 图像处理 | `disintegration/imaging`、`corona10/goimagehash`、`goexif` | | 系统监控 | `shirou/gopsutil`(GPU/CPU/内存) | | 容器调度 | Docker CLI(DooD,Docker-out-of-Docker) | ### 前端 | 能力 | 技术选型 | | --- | --- | | 框架 | Vue 3 + Vue Router + Pinia | | UI 模板 | [Vben Admin 5.7](https://doc.vben.pro/) | | 组件库 | Ant Design Vue | | 构建工具 | Vite + TypeScript + pnpm workspace | | 请求库 | `@vben/request`(axios 封装) | | 数据获取 | `@tanstack/vue-query` | | E2E 测试 | Playwright | ### 基础设施 - **数据库**:PostgreSQL 15(Alpine 镜像,默认端口 `13002`) - **镜像加速**:阿里云源 `docker.1ms.run` - **部署**:Dockerfile + Nginx 反向代理 --- ## 📁 项目结构 ``` easy_dataset/ ├── backend/ # Go 后端 │ ├── cmd/server/main.go # 应用入口 │ ├── internal/ │ │ ├── config/ # Viper 配置 │ │ ├── database/ # GORM 初始化 │ │ ├── middleware/ # JWT / CORS / 错误处理 │ │ ├── common/ # 响应封装、存储抽象、分页、安全 │ │ ├── model/ # GORM 模型(18 张表) │ │ ├── handler/ # HTTP 处理器(init() 自注册) │ │ ├── service/ # 业务逻辑(25+ 模块) │ │ ├── schema/ # 请求/响应 DTO │ │ ├── router/ # 路由注册表 │ │ ├── notify/ # WebSocket Hub │ │ ├── dockerx/ # Docker 容器生命周期管理 │ │ └── seed/ # 种子数据 │ ├── docker/yolo/ # YOLO 容器方案 │ │ ├── yolov8/ yolov9/ yolov10/ yolov11/ # 各版本 CPU/GPU Dockerfile │ │ ├── train_entrypoint.py # 训练入口脚本 │ │ ├── predict_entrypoint.py # 推理入口脚本 │ │ ├── build-all.sh # 一键构建全部镜像 │ │ └── yolo-images.sh # 镜像导出/导入(离线迁移) │ ├── uploads/ images/ datasets/ exports/ # 运行时数据目录 │ ├── train_workspace/ models/ yolo_weights/ # 训练数据目录 │ ├── Dockerfile │ ├── .env.example │ └── go.mod ├── frontend/ # 前端(Vben Admin monorepo) │ ├── playground/ # 主应用 │ │ ├── src/ │ │ │ ├── views/ # 页面(dataset / train / annotation / image ...) │ │ │ ├── api/ # API 请求层 │ │ │ ├── router/routes/modules/ # 路由模块 │ │ │ └── locales/ # 国际化 │ │ └── vite.config.ts │ ├── packages/ # @vben/* 公共包 │ ├── Dockerfile │ └── package.json ├── db.sh / db.ps1 # PostgreSQL 容器管理脚本 ├── rule.md # 开发规范 └── README.md ``` --- ## 🚦 快速开始 ### 环境要求 | 依赖 | 最低版本 | 说明 | | --- | --- | --- | | Go | 1.25+ | 后端编译 | | Node.js | 20+ | 前端构建 | | pnpm | 9+ | 前端包管理(必须,不支持 npm/yarn) | | Docker | 24+ | 数据库、YOLO 训练容器 | | NVIDIA Driver + nvidia-container-toolkit | 可选 | GPU 训练需要 | ### 一、启动数据库 使用项目自带脚本一键启动 PostgreSQL 容器(镜像 `postgres:15-alpine`,端口 `13002`): ```bash # Linux / macOS ./db.sh start # Windows PowerShell .\db.ps1 start ``` 支持的命令:`start | stop | restart | status | reset | logs` 首次启动后,数据库连接信息为: ``` Host: localhost Port: 13002 User: postgres Password: postgres Database: easy_ai_dataset ``` ### 二、启动后端 ```bash cd backend # 1) 复制配置 cp .env.example .env # Windows 用 copy .env.example .env # 按需修改 .env(尤其是 JWT secret、DATABASE_URL) # 2) 下载依赖并启动 go mod download go run ./cmd/server ``` 后端启动于 `http://0.0.0.0:8000`,启动时会自动: - 执行 GORM `AutoMigrate`(18 张表) - 注入种子数据(幂等,包括默认管理员账号) - 恢复进程重启前未完成的训练任务 - 同步标准菜单 ### 三、构建 YOLO 镜像(首次运行训练前必须) ```bash # 一键构建全部 8 个镜像(YOLOv8/9/10/11 × CPU/GPU) bash backend/docker/yolo/build-all.sh # 仅构建部分 bash backend/docker/yolo/build-all.sh --versions yolov11 --variants cpu ``` 构建产物: ``` easy-ai/yolov8-cpu:latest easy-ai/yolov8-gpu:latest easy-ai/yolov9-cpu:latest easy-ai/yolov9-gpu:latest easy-ai/yolov10-cpu:latest easy-ai/yolov10-gpu:latest easy-ai/yolov11-cpu:latest easy-ai/yolov11-gpu:latest ``` ### 四、启动前端 ```bash cd frontend pnpm install pnpm dev ``` 前端启动于 `http://localhost:5555`(Vite 开发服务器),`/api` 请求会自动代理到后端 `http://localhost:8000`。 ### 五、登录访问 浏览器打开 `http://localhost:5555`,使用种子数据中的默认管理员账号登录(首次登录后请立即修改密码)。 --- ## ⚙️ 关键配置项 后端 `.env` 关键项(完整列表见 [backend/.env.example](backend/.env.example)): | 分组 | 配置项 | 默认值 | 说明 | | --- | --- | --- | --- | | 数据库 | `DATABASE_URL` | `host=localhost port=13002 ...` | GORM DSN | | JWT | `ACCESS_TOKEN_SECRET` | `access_token_secret` | **生产必须修改** | | JWT | `ACCESS_TOKEN_EXPIRE_MINUTES` | `10080`(7天) | Access Token 有效期 | | JWT | `REFRESH_TOKEN_EXPIRE_DAYS` | `30` | Refresh Token 有效期 | | CORS | `CORS_ORIGINS` | `*` | 允许的前端域名 | | 存储 | `IMAGE_DIR` | `./images` | 样本图像目录 | | 存储 | `THUMBNAIL_SIZE` | `200` | 缩略图最长边 | | 训练 | `TRAIN_WORKSPACE_DIR` | `./train_workspace` | 训练任务工作空间 | | 训练 | `MODEL_STORAGE_DIR` | `./models` | 训练产物存放 | | 训练 | `YOLO_WEIGHTS_CACHE_DIR` | `./yolo_weights` | 官方权重缓存 | | 训练 | `TRAIN_WORKSPACE_RETENTION_DAYS` | `7` | 工作空间清理周期 | | 服务 | `HOST` / `PORT` | `0.0.0.0` / `8000` | 监听地址 | --- ## 📚 开发文档 - **开发规范**:见 [rule.md](rule.md)(后端模块创建流程、前端必用组件、路由自注册、响应格式、Docker 挂载规范等) - **Vben Admin**:https://doc.vben.pro/ - **Ultralytics YOLO**:https://docs.ultralytics.com/ --- ## 🤝 贡献 开发前请务必阅读 [rule.md](rule.md),严格遵守: - 后端:`handler` + `service` + `schema` + `model` 四层架构,`init()` + `router.Register()` 自注册 - 前端:必须使用 `useVbenVxeGrid` / `useVbenForm` / `useVbenModal` / `requestClient`,禁止直接使用 Ant 原生 Table/Form/Modal - 所有用户可见文本必须使用 `$t()` 国际化 - 响应格式必须通过 `common.SuccessResponse` / `common.PageResponse` --- ## 📄 License MIT