## 이미지 어노테이터 전용 스키마
### 지원 도구(Tools)
| Tool Code | 설명 | dependencies |
| ----------------- | ------------------- | --------------------------- |
| `selection_tool` | 선택 도구 | - |
| `bounding_box` | 2D 바운딩 박스 | - |
| `cuboid` | 2.5D 큐보이드 | - |
| `polygon` | 다각형 | - |
| `polyline` | 폴리라인 | - |
| `keypoint` | 키포인트 | - |
| `segmentation` | 시맨틱 세그멘테이션 | - |
| `relation` | 관계 | - |
| `polygon_brush` | 폴리곤 브러시 | polygon |
| `magic_wand` | 마법 지팡이 | polygon |
| `polygon_ai` | AI 폴리곤 | polygon |
| `auto_keypoint` | 자동 키포인트 | keypoint |
| `correction-coin` | 수정 도구 | polygon, polyline, keypoint |
### 이미지 전용 extra (메타데이터)
| 키 예시 | 타입 | 설명 |
| --- | --- | --- |
| `imageWidth` | `number` | 원본 이미지 가로 해상도(px) |
| `imageHeight` | `number` | 원본 이미지 세로 해상도(px) |
| `cameraModel` | `string` | 촬영 기기·렌즈 정보 |
| `captureTime` | `string` | ISO-8601 촬영 시각 |
> 위 값들은 예시이며, 프로젝트 요구 사항에 따라 자유롭게 확장할 수 있습니다.
### annotationsData 구조 (도구별)
**Bounding Box:**
```json
{
"id": "Cd1qfFQFI4",
"coordinate": {
"x": 215,
"y": 242,
"width": 225,
"height": 189,
"rotation": 0.5693 // 선택적, 라디안 단위
}
}
```
**Cuboid:**
```json
{
"id": "Gicwbgst4J",
"coordinate": {
"x": 67,
"y": 1064,
"top": -96,
"left": 56,
"width": 114,
"height": 105,
"perspectiveRatio": 1
}
}
```
**Polygon / Polyline:**
```json
{
"id": "AUjPgaMzQa",
"coordinate": [
{ "x": 89, "y": 1403, "id": "5-Txfmv1Ez" },
{ "x": 177, "y": 1333, "id": "0xJ6ze1dcF" },
{ "x": 258, "y": 1268, "id": "BQAGLuOhzd" }
]
}
```
**Keypoint:**
```json
{
"id": "aLtGYlQKHi",
"coordinate": { "x": 235, "y": 1630 }
}
```
**Segmentation (데이터 압축 적용):**
> 📌 압축 필드(`isCompressed`, `compressionFormat`)는 [2.6 데이터 압축 공통 규격](#26-데이터-압축-공통-규격)을 따릅니다.
```json
{
"id": "segmentation_001",
"tool": "segmentation",
"pixel_indices": [1, 5, 10, 3, 20, 8],
"isCompressed": true,
"compressionFormat": "rle"
}
```
| 필드 | 타입 | 설명 |
| ------------------- | ---------- | ------------------------------------------- |
| `pixel_indices` | `number[]` | 세그멘테이션 픽셀 인덱스 (압축 시 RLE 포맷) |
| `isCompressed` | `boolean` | 압축 여부 |
| `compressionFormat` | `"rle"` | 압축 포맷 |
**Classification (좌표 없음):**
```json
{
"id": "jMpA5sHT5T"
}
```
### 샘플
다양한 도구(bounding_box, polygon, keypoint, segmentation, relation)와 그룹을 포함한 완전한 예제:
```json
{
"extra": {
"image_1": {
"brightness": 0,
"contrast": 0,
"grayscale": false
}
},
"relations": {
"image_1": [
{
"id": "Cd1qfFQFI4AUjPgaMzQa",
"tool": "relation",
"isLocked": false,
"isVisible": true,
"isValid": true,
"annotationId": "Cd1qfFQFI4",
"targetAnnotationId": "AUjPgaMzQa",
"classification": {
"class": "관계_유형A",
"relation_type": "contains"
},
"label": ["관계_유형A"]
}
]
},
"annotations": {
"image_1": [
{
"id": "Cd1qfFQFI4",
"tool": "bounding_box",
"isLocked": false,
"isVisible": true,
"isValid": true,
"isDrawCompleted": true,
"classification": {
"class": "자동차",
"color": "red",
"size": "large"
},
"label": ["자동차", "red", "large"]
},
{
"id": "AUjPgaMzQa",
"tool": "polygon",
"isLocked": false,
"isVisible": true,
"isValid": true,
"isDrawCompleted": true,
"classification": {
"class": "도로",
"surface_type": "asphalt"
},
"label": ["도로"]
},
{
"id": "Gicwbgst4J",
"tool": "cuboid",
"isLocked": false,
"isVisible": true,
"isValid": true,
"isDrawCompleted": true,
"classification": {
"class": "건물"
},
"label": ["건물"]
},
{
"id": "aLtGYlQKHi",
"tool": "keypoint",
"isLocked": true,
"isVisible": true,
"isValid": true,
"isDrawCompleted": true,
"classification": {
"class": "랜드마크",
"landmark_type": "corner"
},
"label": ["랜드마크"]
},
{
"id": "segmentation_001",
"tool": "segmentation",
"isLocked": false,
"isVisible": true,
"isValid": true,
"isDrawCompleted": true,
"classification": {
"class": "하늘"
},
"label": ["하늘"]
},
{
"id": "jMpA5sHT5T",
"tool": "classification",
"isLocked": false,
"isVisible": true,
"isValid": true,
"classification": {
"class": "이미지_분류",
"weather": "sunny",
"time_of_day": "afternoon"
},
"label": ["이미지_분류"]
}
]
},
"annotationsData": {
"image_1": [
{
"id": "Cd1qfFQFI4",
"coordinate": {
"x": 215,
"y": 242,
"width": 225,
"height": 189,
"rotation": 0.5693
}
},
{
"id": "AUjPgaMzQa",
"coordinate": [
{ "x": 89, "y": 1403, "id": "5-Txfmv1Ez" },
{ "x": 177, "y": 1333, "id": "0xJ6ze1dcF" },
{ "x": 258, "y": 1268, "id": "BQAGLuOhzd" },
{ "x": 340, "y": 1350, "id": "CDAHLuOhzd" },
{ "x": 150, "y": 1450, "id": "DDAHLuOhzd" }
]
},
{
"id": "Gicwbgst4J",
"coordinate": {
"x": 67,
"y": 1064,
"top": -96,
"left": 56,
"width": 114,
"height": 105,
"perspectiveRatio": 1
}
},
{
"id": "aLtGYlQKHi",
"coordinate": {
"x": 235,
"y": 1630
}
},
{
"id": "segmentation_001",
"pixel_indices": [0, 150, 320, 200, 1024, 300],
"isCompressed": true,
"compressionFormat": "rle"
},
{
"id": "jMpA5sHT5T"
}
]
},
"annotationGroups": {
"image_1": [
{
"id": "group_001",
"tool": "annotationGroup",
"isLocked": false,
"isValid": true,
"annotationList": [
{
"annotationId": "Cd1qfFQFI4",
"children": []
},
{
"annotationId": "AUjPgaMzQa",
"children": [
{
"annotationId": "aLtGYlQKHi",
"children": []
}
]
}
],
"classification": {
"class": "차량_그룹",
"group_type": "vehicle_context"
}
}
]
},
"assignmentId": 12345
}
```