|
|
@@ -0,0 +1,388 @@
|
|
|
+"""
|
|
|
+初始化图片标注示例数据脚本
|
|
|
+
|
|
|
+创建多种图片标注项目和任务,用于测试图片标注功能。
|
|
|
+包括:目标检测、图像分类、图像分割、关键点标注等。
|
|
|
+"""
|
|
|
+import requests
|
|
|
+import json
|
|
|
+
|
|
|
+# API 基础 URL
|
|
|
+BASE_URL = "http://localhost:8000"
|
|
|
+
|
|
|
+# 1. 目标检测标注配置(矩形框标注)
|
|
|
+OBJECT_DETECTION_CONFIG = """<View>
|
|
|
+ <Header value="目标检测 - 物体识别"/>
|
|
|
+ <Image name="image" value="$image"/>
|
|
|
+ <RectangleLabels name="label" toName="image">
|
|
|
+ <Label value="人" background="red"/>
|
|
|
+ <Label value="车" background="blue"/>
|
|
|
+ <Label value="自行车" background="green"/>
|
|
|
+ <Label value="狗" background="orange"/>
|
|
|
+ <Label value="猫" background="purple"/>
|
|
|
+ </RectangleLabels>
|
|
|
+</View>"""
|
|
|
+
|
|
|
+# 2. 图像分类标注配置
|
|
|
+IMAGE_CLASSIFICATION_CONFIG = """<View>
|
|
|
+ <Header value="图像分类"/>
|
|
|
+ <Image name="image" value="$image"/>
|
|
|
+ <Choices name="category" toName="image" choice="single" showInline="true">
|
|
|
+ <Choice value="风景"/>
|
|
|
+ <Choice value="人物"/>
|
|
|
+ <Choice value="动物"/>
|
|
|
+ <Choice value="建筑"/>
|
|
|
+ <Choice value="食物"/>
|
|
|
+ <Choice value="其他"/>
|
|
|
+ </Choices>
|
|
|
+</View>"""
|
|
|
+
|
|
|
+# 3. 图像分割标注配置(多边形标注)
|
|
|
+IMAGE_SEGMENTATION_CONFIG = """<View>
|
|
|
+ <Header value="图像分割 - 精细标注"/>
|
|
|
+ <Image name="image" value="$image"/>
|
|
|
+ <PolygonLabels name="label" toName="image">
|
|
|
+ <Label value="前景" background="rgba(255, 0, 0, 0.5)"/>
|
|
|
+ <Label value="背景" background="rgba(0, 0, 255, 0.5)"/>
|
|
|
+ <Label value="物体" background="rgba(0, 255, 0, 0.5)"/>
|
|
|
+ </PolygonLabels>
|
|
|
+</View>"""
|
|
|
+
|
|
|
+# 4. 关键点标注配置(人体姿态估计)
|
|
|
+KEYPOINT_DETECTION_CONFIG = """<View>
|
|
|
+ <Header value="关键点标注 - 人体姿态"/>
|
|
|
+ <Image name="image" value="$image"/>
|
|
|
+ <KeyPointLabels name="keypoint" toName="image">
|
|
|
+ <Label value="头部" background="red"/>
|
|
|
+ <Label value="肩膀" background="blue"/>
|
|
|
+ <Label value="肘部" background="green"/>
|
|
|
+ <Label value="手腕" background="orange"/>
|
|
|
+ <Label value="膝盖" background="purple"/>
|
|
|
+ <Label value="脚踝" background="pink"/>
|
|
|
+ </KeyPointLabels>
|
|
|
+</View>"""
|
|
|
+
|
|
|
+# 5. 多标签图像分类配置
|
|
|
+MULTI_LABEL_CLASSIFICATION_CONFIG = """<View>
|
|
|
+ <Header value="多标签图像分类"/>
|
|
|
+ <Image name="image" value="$image"/>
|
|
|
+ <Choices name="attributes" toName="image" choice="multiple" showInline="false">
|
|
|
+ <Choice value="室内"/>
|
|
|
+ <Choice value="室外"/>
|
|
|
+ <Choice value="白天"/>
|
|
|
+ <Choice value="夜晚"/>
|
|
|
+ <Choice value="晴天"/>
|
|
|
+ <Choice value="雨天"/>
|
|
|
+ <Choice value="有人"/>
|
|
|
+ <Choice value="无人"/>
|
|
|
+ </Choices>
|
|
|
+</View>"""
|
|
|
+
|
|
|
+# 6. 图像质量评估配置
|
|
|
+IMAGE_QUALITY_CONFIG = """<View>
|
|
|
+ <Header value="图像质量评估"/>
|
|
|
+ <Image name="image" value="$image"/>
|
|
|
+ <Choices name="quality" toName="image" choice="single" showInline="true">
|
|
|
+ <Choice value="优秀"/>
|
|
|
+ <Choice value="良好"/>
|
|
|
+ <Choice value="一般"/>
|
|
|
+ <Choice value="较差"/>
|
|
|
+ </Choices>
|
|
|
+ <Choices name="issues" toName="image" choice="multiple" showInline="false">
|
|
|
+ <Choice value="模糊"/>
|
|
|
+ <Choice value="曝光过度"/>
|
|
|
+ <Choice value="曝光不足"/>
|
|
|
+ <Choice value="噪点多"/>
|
|
|
+ <Choice value="色彩失真"/>
|
|
|
+ </Choices>
|
|
|
+</View>"""
|
|
|
+
|
|
|
+# 示例图片任务数据
|
|
|
+# 使用公开的测试图片 URL(来自 Unsplash 等免费图片网站)
|
|
|
+SAMPLE_IMAGE_TASKS = [
|
|
|
+ # 目标检测任务
|
|
|
+ {
|
|
|
+ "name": "街道场景-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1449824913935-59a10b8d2000?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "街道场景-2",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1477959858617-67f85cf4f1df?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "公园场景",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1441974231531-c6227db76b6e?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ # 图像分类任务
|
|
|
+ {
|
|
|
+ "name": "风景图片-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1506905925346-21bda4d32df4?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "建筑图片-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1480714378408-67cf0d13bc1b?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "动物图片-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1425082661705-1834bfd09dca?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ # 图像分割任务
|
|
|
+ {
|
|
|
+ "name": "物体分割-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1518791841217-8f162f1e1131?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "物体分割-2",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1514888286974-6c03e2ca1dba?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ # 关键点标注任务
|
|
|
+ {
|
|
|
+ "name": "人体姿态-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1571019614242-c5c5dee9f50b?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "人体姿态-2",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1517836357463-d25dfeac3438?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ # 多标签分类任务
|
|
|
+ {
|
|
|
+ "name": "场景分析-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1464822759023-fed622ff2c3b?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "场景分析-2",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1469474968028-56623f02e42e?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+
|
|
|
+ # 图像质量评估任务
|
|
|
+ {
|
|
|
+ "name": "质量评估-1",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1472214103451-9374bd1c798e?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ {
|
|
|
+ "name": "质量评估-2",
|
|
|
+ "data": {
|
|
|
+ "image": "https://images.unsplash.com/photo-1501594907352-04cda38ebc29?w=800"
|
|
|
+ }
|
|
|
+ },
|
|
|
+]
|
|
|
+
|
|
|
+
|
|
|
+def create_project(name, description, config):
|
|
|
+ """创建项目"""
|
|
|
+ url = f"{BASE_URL}/api/projects"
|
|
|
+ data = {
|
|
|
+ "name": name,
|
|
|
+ "description": description,
|
|
|
+ "config": config
|
|
|
+ }
|
|
|
+
|
|
|
+ response = requests.post(url, json=data)
|
|
|
+ if response.status_code == 201:
|
|
|
+ project = response.json()
|
|
|
+ print(f"✓ 创建项目成功: {project['name']} (ID: {project['id']})")
|
|
|
+ return project
|
|
|
+ else:
|
|
|
+ print(f"✗ 创建项目失败: {response.status_code} - {response.text}")
|
|
|
+ return None
|
|
|
+
|
|
|
+
|
|
|
+def create_task(project_id, task_name, task_data):
|
|
|
+ """创建任务"""
|
|
|
+ url = f"{BASE_URL}/api/tasks"
|
|
|
+ data = {
|
|
|
+ "project_id": project_id,
|
|
|
+ "name": task_name,
|
|
|
+ "data": task_data
|
|
|
+ }
|
|
|
+
|
|
|
+ response = requests.post(url, json=data)
|
|
|
+ if response.status_code == 201:
|
|
|
+ task = response.json()
|
|
|
+ print(f" ✓ 创建任务: {task['name']} (ID: {task['id']})")
|
|
|
+ return task
|
|
|
+ else:
|
|
|
+ print(f" ✗ 创建任务失败: {response.status_code} - {response.text}")
|
|
|
+ return None
|
|
|
+
|
|
|
+
|
|
|
+def main():
|
|
|
+ """主函数"""
|
|
|
+ print("=" * 60)
|
|
|
+ print("初始化图片标注平台示例数据")
|
|
|
+ print("=" * 60)
|
|
|
+ print()
|
|
|
+
|
|
|
+ # 1. 创建目标检测项目
|
|
|
+ print("1. 创建目标检测项目...")
|
|
|
+ detection_project = create_project(
|
|
|
+ name="目标检测 - 街道场景",
|
|
|
+ description="标注街道场景中的人、车、自行车等物体",
|
|
|
+ config=OBJECT_DETECTION_CONFIG
|
|
|
+ )
|
|
|
+
|
|
|
+ if detection_project:
|
|
|
+ print(" 创建目标检测任务...")
|
|
|
+ for i in range(3):
|
|
|
+ create_task(
|
|
|
+ detection_project['id'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['name'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['data']
|
|
|
+ )
|
|
|
+ print()
|
|
|
+
|
|
|
+ # 2. 创建图像分类项目
|
|
|
+ print("2. 创建图像分类项目...")
|
|
|
+ classification_project = create_project(
|
|
|
+ name="图像分类",
|
|
|
+ description="将图片分类为风景、人物、动物、建筑、食物等类别",
|
|
|
+ config=IMAGE_CLASSIFICATION_CONFIG
|
|
|
+ )
|
|
|
+
|
|
|
+ if classification_project:
|
|
|
+ print(" 创建图像分类任务...")
|
|
|
+ for i in range(3, 6):
|
|
|
+ create_task(
|
|
|
+ classification_project['id'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['name'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['data']
|
|
|
+ )
|
|
|
+ print()
|
|
|
+
|
|
|
+ # 3. 创建图像分割项目
|
|
|
+ print("3. 创建图像分割项目...")
|
|
|
+ segmentation_project = create_project(
|
|
|
+ name="图像分割 - 物体轮廓",
|
|
|
+ description="使用多边形工具精细标注物体轮廓",
|
|
|
+ config=IMAGE_SEGMENTATION_CONFIG
|
|
|
+ )
|
|
|
+
|
|
|
+ if segmentation_project:
|
|
|
+ print(" 创建图像分割任务...")
|
|
|
+ for i in range(6, 8):
|
|
|
+ create_task(
|
|
|
+ segmentation_project['id'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['name'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['data']
|
|
|
+ )
|
|
|
+ print()
|
|
|
+
|
|
|
+ # 4. 创建关键点标注项目
|
|
|
+ print("4. 创建关键点标注项目...")
|
|
|
+ keypoint_project = create_project(
|
|
|
+ name="关键点标注 - 人体姿态估计",
|
|
|
+ description="标注人体关键点(头部、肩膀、肘部、手腕、膝盖、脚踝)",
|
|
|
+ config=KEYPOINT_DETECTION_CONFIG
|
|
|
+ )
|
|
|
+
|
|
|
+ if keypoint_project:
|
|
|
+ print(" 创建关键点标注任务...")
|
|
|
+ for i in range(8, 10):
|
|
|
+ create_task(
|
|
|
+ keypoint_project['id'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['name'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['data']
|
|
|
+ )
|
|
|
+ print()
|
|
|
+
|
|
|
+ # 5. 创建多标签分类项目
|
|
|
+ print("5. 创建多标签分类项目...")
|
|
|
+ multi_label_project = create_project(
|
|
|
+ name="多标签图像分类",
|
|
|
+ description="为图片添加多个属性标签(室内/室外、白天/夜晚等)",
|
|
|
+ config=MULTI_LABEL_CLASSIFICATION_CONFIG
|
|
|
+ )
|
|
|
+
|
|
|
+ if multi_label_project:
|
|
|
+ print(" 创建多标签分类任务...")
|
|
|
+ for i in range(10, 12):
|
|
|
+ create_task(
|
|
|
+ multi_label_project['id'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['name'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['data']
|
|
|
+ )
|
|
|
+ print()
|
|
|
+
|
|
|
+ # 6. 创建图像质量评估项目
|
|
|
+ print("6. 创建图像质量评估项目...")
|
|
|
+ quality_project = create_project(
|
|
|
+ name="图像质量评估",
|
|
|
+ description="评估图片质量并标注存在的问题(模糊、曝光等)",
|
|
|
+ config=IMAGE_QUALITY_CONFIG
|
|
|
+ )
|
|
|
+
|
|
|
+ if quality_project:
|
|
|
+ print(" 创建图像质量评估任务...")
|
|
|
+ for i in range(12, 14):
|
|
|
+ create_task(
|
|
|
+ quality_project['id'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['name'],
|
|
|
+ SAMPLE_IMAGE_TASKS[i]['data']
|
|
|
+ )
|
|
|
+ print()
|
|
|
+
|
|
|
+ print("=" * 60)
|
|
|
+ print("图片标注示例数据初始化完成!")
|
|
|
+ print("=" * 60)
|
|
|
+ print()
|
|
|
+ print("已创建的项目类型:")
|
|
|
+ print("1. 目标检测 - 使用矩形框标注物体")
|
|
|
+ print("2. 图像分类 - 单标签分类")
|
|
|
+ print("3. 图像分割 - 使用多边形精细标注")
|
|
|
+ print("4. 关键点标注 - 人体姿态估计")
|
|
|
+ print("5. 多标签分类 - 场景属性标注")
|
|
|
+ print("6. 图像质量评估 - 质量评分和问题标注")
|
|
|
+ print()
|
|
|
+ print("你现在可以:")
|
|
|
+ print("1. 访问 http://localhost:4200/projects 查看项目列表")
|
|
|
+ print("2. 点击项目查看详情和任务")
|
|
|
+ print("3. 点击'开始标注'按钮进行图片标注")
|
|
|
+ print()
|
|
|
+ print("注意:")
|
|
|
+ print("- 图片来自 Unsplash 免费图片库")
|
|
|
+ print("- 需要网络连接才能加载图片")
|
|
|
+ print("- 如果图片加载失败,请检查网络连接")
|
|
|
+ print()
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == "__main__":
|
|
|
+ try:
|
|
|
+ main()
|
|
|
+ except requests.exceptions.ConnectionError:
|
|
|
+ print("✗ 错误: 无法连接到后端服务器")
|
|
|
+ print(" 请确保后端服务器正在运行:")
|
|
|
+ print(" cd backend && python -m uvicorn main:app --reload --host 0.0.0.0 --port 8000")
|
|
|
+ except Exception as e:
|
|
|
+ print(f"✗ 发生错误: {e}")
|
|
|
+ import traceback
|
|
|
+ traceback.print_exc()
|