Files
DataMate/runtime/datamate-python/app/module/annotation/interface/export.py
Jerry Yan c48d2fdeb8 feat(annotation): 添加标注数据导出功能
- 新增导出对话框组件,支持多种格式选择
- 实现 JSON、JSONL、CSV、COCO、YOLO 五种导出格式
- 添加导出统计信息显示,包括总文件数和已标注数
- 集成前端导出按钮和后端 API 接口
- 支持仅导出已标注数据和包含原始数据选项
- 实现文件下载和命名功能
2026-01-18 16:54:02 +08:00

90 lines
2.5 KiB
Python

"""
标注数据导出接口
提供标注数据的批量导出功能,支持多种格式:
- JSON: Label Studio 原生格式
- JSONL: JSON Lines 格式
- CSV: 表格格式
- COCO: 目标检测格式
- YOLO: YOLO 格式
"""
from __future__ import annotations
from fastapi import APIRouter, Depends, Path, Query
from fastapi.responses import Response
from sqlalchemy.ext.asyncio import AsyncSession
from app.core.logging import get_logger
from app.db.session import get_db
from app.module.shared.schema import StandardResponse
from ..schema.export import (
ExportAnnotationsRequest,
ExportAnnotationsResponse,
ExportFormat,
)
from ..service.export import AnnotationExportService
logger = get_logger(__name__)
router = APIRouter(
prefix="/export",
tags=["annotation/export"],
)
@router.get(
"/projects/{project_id}/stats",
response_model=StandardResponse[ExportAnnotationsResponse],
)
async def get_export_stats(
project_id: str = Path(..., description="标注项目ID"),
db: AsyncSession = Depends(get_db),
):
"""获取导出统计信息(总文件数、已标注数等)"""
service = AnnotationExportService(db)
stats = await service.get_export_stats(project_id)
return StandardResponse(code=200, message="success", data=stats)
@router.get("/projects/{project_id}/download")
async def download_annotations(
project_id: str = Path(..., description="标注项目ID"),
format: ExportFormat = Query(default=ExportFormat.JSON, description="导出格式"),
include_data: bool = Query(default=False, description="是否包含原始数据"),
only_annotated: bool = Query(default=True, description="是否只导出已标注数据"),
db: AsyncSession = Depends(get_db),
):
"""
下载标注数据
支持的格式:
- json: Label Studio 原生 JSON 格式
- jsonl: JSON Lines 格式(每行一条记录)
- csv: CSV 表格格式
- coco: COCO 目标检测格式
- yolo: YOLO 格式(ZIP 压缩包)
"""
service = AnnotationExportService(db)
request = ExportAnnotationsRequest(
format=format,
include_data=include_data,
only_annotated=only_annotated,
)
content, filename, content_type = await service.export_annotations(
project_id=project_id,
request=request,
)
return Response(
content=content,
media_type=content_type,
headers={
"Content-Disposition": f'attachment; filename="{filename}"',
"Content-Length": str(len(content)),
},
)