Bin
2025-12-17 2b99d77d73ba568beff0a549534017caaad8a6de
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#!/usr/bin/env python
"""
COCO 导出测试脚本
用于测试 COCO 导出功能并打印详细信息
"""
import os
import sys
 
# 设置环境变量(与 start.sh 保持一致)
os.environ.setdefault('LABEL_STUDIO_BASE_DATA_DIR', '/data/label-studio-data')
os.environ.setdefault('TZ', 'Asia/Shanghai')
 
# 添加项目路径 - 需要添加 label_studio 目录
sys.path.insert(0, '/data/label-studio/label_studio')
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'core.settings.label_studio')
 
import django
django.setup()
 
from django.conf import settings
from projects.models import Project
from data_export.models import DataExport
from data_export.serializers import ExportDataSerializer
 
def test_coco_export():
    """测试 COCO 导出功能"""
    print("=" * 80)
    print("COCO 导出测试脚本")
    print("=" * 80)
    
    # 1. 检查配置
    print("\n[1] 检查配置:")
    print(f"MEDIA_ROOT: {settings.MEDIA_ROOT}")
    print(f"UPLOAD_DIR: {settings.UPLOAD_DIR}")
    print(f"完整上传路径: {os.path.join(settings.MEDIA_ROOT, settings.UPLOAD_DIR)}")
    print(f"路径是否存在: {os.path.exists(os.path.join(settings.MEDIA_ROOT, settings.UPLOAD_DIR))}")
    print(f"CONVERTER_DOWNLOAD_RESOURCES 默认值: {settings.CONVERTER_DOWNLOAD_RESOURCES}")
    
    upload_dir = os.path.join(settings.MEDIA_ROOT, settings.UPLOAD_DIR)
    if os.path.exists(upload_dir):
        print(f"上传目录内容: {os.listdir(upload_dir)}")
        # 检查项目1的文件夹
        project1_dir = os.path.join(upload_dir, '1')
        if os.path.exists(project1_dir):
            files = os.listdir(project1_dir)
            print(f"项目1的文件数量: {len(files)}")
            if files:
                print(f"示例文件: {files[0]}")
    
    # 2. 检查项目
    print("\n[2] 检查项目:")
    try:
        project = Project.objects.get(id=1)
        print(f"项目 ID: {project.id}")
        print(f"项目标题: {project.title}")
        print(f"任务数量: {project.tasks.count()}")
        print(f"标注数量: {sum(t.annotations.count() for t in project.tasks.all())}")
    except Project.DoesNotExist:
        print("错误:项目1不存在")
        return
    
    # 3. 获取任务数据
    print("\n[3] 获取任务数据:")
    tasks = project.tasks.all()
    if tasks.exists():
        first_task = tasks.first()
        print(f"第一个任务 ID: {first_task.id}")
        print(f"任务数据: {first_task.data}")
        
        # 检查图片路径
        if 'image' in first_task.data:
            image_path = first_task.data['image']
            print(f"图片路径(在数据中): {image_path}")
            
            # 尝试解析路径
            if image_path.startswith('/data/'):
                # 移除 /data/ 前缀
                relative_path = image_path.replace('/data/', '')
                full_path = os.path.join(settings.MEDIA_ROOT, relative_path)
                print(f"完整文件路径: {full_path}")
                print(f"文件是否存在: {os.path.exists(full_path)}")
                if os.path.exists(full_path):
                    print(f"文件大小: {os.path.getsize(full_path)} 字节")
    else:
        print("警告:项目中没有任务")
        return
    
    # 4. 测试导出
    print("\n[4] 测试导出:")
    print("正在序列化任务数据...")
    task_data = ExportDataSerializer(tasks, many=True).data
    print(f"序列化的任务数量: {len(task_data)}")
    
    if task_data:
        print("\n第一个任务的数据结构:")
        first_task_keys = list(task_data[0].keys())
        print(f"字段: {', '.join(first_task_keys)}")
        
        if 'data' in task_data[0]:
            print(f"data 字段内容: {task_data[0]['data']}")
    
    # 5. 检查 label-studio-sdk 版本
    print("\n[5] 检查依赖:")
    try:
        import label_studio_sdk
        print(f"label-studio-sdk 版本: {label_studio_sdk.__version__}")
    except:
        print("警告:无法导入 label_studio_sdk")
    
    print("\n" + "=" * 80)
    print("测试完成")
    print("=" * 80)
 
if __name__ == '__main__':
    test_coco_export()