synapse-sdk 2025.10.1__py3-none-any.whl → 2025.10.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of synapse-sdk might be problematic. Click here for more details.
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-action.md +934 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-overview.md +560 -0
- synapse_sdk/devtools/docs/docs/plugins/categories/upload-plugins/upload-plugin-template.md +715 -0
- synapse_sdk/devtools/docs/docs/plugins/plugins.md +12 -5
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-action.md +934 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-overview.md +560 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/categories/upload-plugins/upload-plugin-template.md +715 -0
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current.json +16 -4
- synapse_sdk/devtools/docs/sidebars.ts +13 -1
- synapse_sdk/plugins/README.md +487 -80
- synapse_sdk/plugins/categories/pre_annotation/actions/__init__.py +4 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/__init__.py +3 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/pre_annotation/action.py +10 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/__init__.py +28 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/action.py +145 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/enums.py +269 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/exceptions.py +14 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/factory.py +76 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/models.py +97 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/orchestrator.py +250 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/run.py +64 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/__init__.py +17 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/annotation.py +284 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/base.py +170 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/extraction.py +83 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/metrics.py +87 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/preprocessor.py +127 -0
- synapse_sdk/plugins/categories/pre_annotation/actions/to_task/strategies/validation.py +143 -0
- synapse_sdk/plugins/categories/upload/actions/upload/__init__.py +2 -1
- synapse_sdk/plugins/categories/upload/actions/upload/models.py +134 -94
- synapse_sdk/plugins/categories/upload/actions/upload/steps/cleanup.py +2 -2
- synapse_sdk/plugins/categories/upload/actions/upload/steps/metadata.py +106 -14
- synapse_sdk/plugins/categories/upload/actions/upload/steps/organize.py +113 -36
- synapse_sdk/plugins/categories/upload/templates/README.md +365 -0
- {synapse_sdk-2025.10.1.dist-info → synapse_sdk-2025.10.3.dist-info}/METADATA +1 -1
- {synapse_sdk-2025.10.1.dist-info → synapse_sdk-2025.10.3.dist-info}/RECORD +40 -20
- synapse_sdk/devtools/docs/docs/plugins/developing-upload-template.md +0 -1463
- synapse_sdk/devtools/docs/docs/plugins/upload-plugins.md +0 -1964
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/developing-upload-template.md +0 -1463
- synapse_sdk/devtools/docs/i18n/ko/docusaurus-plugin-content-docs/current/plugins/upload-plugins.md +0 -2077
- {synapse_sdk-2025.10.1.dist-info → synapse_sdk-2025.10.3.dist-info}/WHEEL +0 -0
- {synapse_sdk-2025.10.1.dist-info → synapse_sdk-2025.10.3.dist-info}/entry_points.txt +0 -0
- {synapse_sdk-2025.10.1.dist-info → synapse_sdk-2025.10.3.dist-info}/licenses/LICENSE +0 -0
- {synapse_sdk-2025.10.1.dist-info → synapse_sdk-2025.10.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,560 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: upload-plugin-overview
|
|
3
|
+
title: 업로드 플러그인 개요
|
|
4
|
+
sidebar_position: 1
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# 업로드 플러그인 개요
|
|
8
|
+
|
|
9
|
+
업로드 플러그인은 메타데이터 지원, 보안 검증, 체계적인 데이터 단위 생성을 통해 Synapse 플랫폼으로 파일을 처리하는 포괄적인 파일 업로드 및 데이터 수집 작업을 제공합니다.
|
|
10
|
+
|
|
11
|
+
## 빠른 개요
|
|
12
|
+
|
|
13
|
+
**카테고리:** 업로드
|
|
14
|
+
**사용 가능한 작업:** `upload`
|
|
15
|
+
**실행 방법:** 작업 기반 실행
|
|
16
|
+
|
|
17
|
+
## 주요 특징
|
|
18
|
+
|
|
19
|
+
- **다중 경로 모드 지원**: 각 자산에 대한 개별 경로 설정으로 다른 위치에서 파일 업로드
|
|
20
|
+
- **Excel 메타데이터 통합**: Excel 파일에서 자동 메타데이터 주석 달기
|
|
21
|
+
- **유연한 파일 구성**: 다양한 사용 사례를 위한 단일 경로 또는 다중 경로 모드
|
|
22
|
+
- **배치 처리**: 대규모 업로드를 위한 최적화된 배치 처리
|
|
23
|
+
- **진행 상황 추적**: 워크플로우 단계 전반에 걸친 실시간 진행 상황 업데이트
|
|
24
|
+
- **보안 검증**: 포괄적인 파일 및 Excel 보안 검사
|
|
25
|
+
|
|
26
|
+
## 사용 사례
|
|
27
|
+
|
|
28
|
+
- 메타데이터 주석이 포함된 대량 파일 업로드
|
|
29
|
+
- Excel 기반 메타데이터 매핑 및 검증
|
|
30
|
+
- 재귀적 디렉토리 처리
|
|
31
|
+
- 유형 기반 파일 구성
|
|
32
|
+
- 배치 데이터 단위 생성
|
|
33
|
+
- 다중 소스 데이터셋 업로드 (다른 위치의 센서, 카메라, 주석)
|
|
34
|
+
- 크기 및 내용 검증을 통한 보안 파일 처리
|
|
35
|
+
|
|
36
|
+
## 지원되는 업로드 소스
|
|
37
|
+
|
|
38
|
+
- 로컬 파일 시스템 경로 (파일 및 디렉토리)
|
|
39
|
+
- 재귀적 디렉토리 스캔
|
|
40
|
+
- 향상된 파일 주석을 위한 Excel 메타데이터 파일
|
|
41
|
+
- 자동 구성 기능이 있는 혼합 파일 유형
|
|
42
|
+
- 자산별 경로 구성이 있는 분산 데이터 소스
|
|
43
|
+
|
|
44
|
+
## 구성 모드
|
|
45
|
+
|
|
46
|
+
### 모드 1: 단일 경로 모드 (기본값 - `use_single_path: true`)
|
|
47
|
+
|
|
48
|
+
모든 자산이 하나의 기본 디렉토리를 공유합니다. 시스템은 각 파일 사양에 대한 하위 디렉토리를 예상합니다.
|
|
49
|
+
|
|
50
|
+
```json
|
|
51
|
+
{
|
|
52
|
+
"name": "표준 업로드",
|
|
53
|
+
"use_single_path": true,
|
|
54
|
+
"path": "/data/experiment",
|
|
55
|
+
"is_recursive": true,
|
|
56
|
+
"storage": 1,
|
|
57
|
+
"data_collection": 5
|
|
58
|
+
}
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**예상 디렉토리 구조:**
|
|
62
|
+
|
|
63
|
+
```
|
|
64
|
+
/data/experiment/
|
|
65
|
+
├── pcd_1/ # 포인트 클라우드
|
|
66
|
+
│ └── *.pcd
|
|
67
|
+
├── image_1/ # 이미지
|
|
68
|
+
│ └── *.jpg
|
|
69
|
+
└── json_meta_1/ # 메타데이터
|
|
70
|
+
└── *.json
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 모드 2: 다중 경로 모드 (`use_single_path: false`)
|
|
74
|
+
|
|
75
|
+
각 자산에는 자체 경로 및 재귀 설정이 있습니다. 분산 데이터 소스에 적합합니다.
|
|
76
|
+
|
|
77
|
+
```json
|
|
78
|
+
{
|
|
79
|
+
"name": "다중 소스 업로드",
|
|
80
|
+
"use_single_path": false,
|
|
81
|
+
"assets": {
|
|
82
|
+
"pcd_1": {
|
|
83
|
+
"path": "/sensors/lidar/scan_001",
|
|
84
|
+
"is_recursive": false
|
|
85
|
+
},
|
|
86
|
+
"image_1": {
|
|
87
|
+
"path": "/sensors/camera/front",
|
|
88
|
+
"is_recursive": true
|
|
89
|
+
},
|
|
90
|
+
"json_meta_1": {
|
|
91
|
+
"path": "/metadata/annotations",
|
|
92
|
+
"is_recursive": false
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
"storage": 1,
|
|
96
|
+
"data_collection": 5
|
|
97
|
+
}
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## 기본 사용법
|
|
101
|
+
|
|
102
|
+
### CLI 사용법
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# 단일 경로 모드 (전통적)
|
|
106
|
+
synapse plugin run upload '{
|
|
107
|
+
"name": "데이터셋 업로드",
|
|
108
|
+
"use_single_path": true,
|
|
109
|
+
"path": "/data/training",
|
|
110
|
+
"is_recursive": true,
|
|
111
|
+
"storage": 1,
|
|
112
|
+
"data_collection": 5
|
|
113
|
+
}'
|
|
114
|
+
|
|
115
|
+
# 다중 경로 모드 (고급)
|
|
116
|
+
synapse plugin run upload '{
|
|
117
|
+
"name": "다중 센서 업로드",
|
|
118
|
+
"use_single_path": false,
|
|
119
|
+
"assets": {
|
|
120
|
+
"lidar": {"path": "/sensors/lidar", "is_recursive": true},
|
|
121
|
+
"camera": {"path": "/sensors/camera", "is_recursive": false}
|
|
122
|
+
},
|
|
123
|
+
"storage": 1,
|
|
124
|
+
"data_collection": 5
|
|
125
|
+
}'
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
### Python API 사용법
|
|
129
|
+
|
|
130
|
+
```python
|
|
131
|
+
from synapse_sdk.plugins.categories.upload.actions.upload.action import UploadAction
|
|
132
|
+
|
|
133
|
+
# 업로드 매개변수 구성
|
|
134
|
+
params = {
|
|
135
|
+
"name": "데이터셋 업로드",
|
|
136
|
+
"use_single_path": true,
|
|
137
|
+
"path": "/data/training_images",
|
|
138
|
+
"is_recursive": True,
|
|
139
|
+
"storage": 1,
|
|
140
|
+
"data_collection": 5,
|
|
141
|
+
"max_file_size_mb": 100
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
action = UploadAction(params=params, plugin_config=plugin_config)
|
|
145
|
+
result = action.start()
|
|
146
|
+
|
|
147
|
+
print(f"업로드된 파일 수: {result['uploaded_files_count']}")
|
|
148
|
+
print(f"생성된 데이터 단위 수: {result['generated_data_units_count']}")
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 구성 매개변수
|
|
152
|
+
|
|
153
|
+
### 필수 매개변수
|
|
154
|
+
|
|
155
|
+
| 매개변수 | 유형 | 설명 | 예시 |
|
|
156
|
+
| ----------------- | ----- | ------------------ | ------------- |
|
|
157
|
+
| `name` | `str` | 업로드 이름 | `"내 업로드"` |
|
|
158
|
+
| `storage` | `int` | 스토리지 ID | `1` |
|
|
159
|
+
| `data_collection` | `int` | 데이터 컬렉션 ID | `5` |
|
|
160
|
+
|
|
161
|
+
### 모드별 필수 매개변수
|
|
162
|
+
|
|
163
|
+
**단일 경로 모드** (`use_single_path: true`):
|
|
164
|
+
|
|
165
|
+
- `path` (str): 기본 디렉토리 경로
|
|
166
|
+
|
|
167
|
+
**다중 경로 모드** (`use_single_path: false`):
|
|
168
|
+
|
|
169
|
+
- `assets` (dict): 자산별 `path` 및 `is_recursive` 설정이 포함된 자산별 구성
|
|
170
|
+
|
|
171
|
+
### 선택적 매개변수
|
|
172
|
+
|
|
173
|
+
| 매개변수 | 유형 | 기본값 | 설명 |
|
|
174
|
+
| ------------------------------- | ------------- | ------- | --------------------------------- |
|
|
175
|
+
| `description` | `str \| None` | `None` | 업로드 설명 |
|
|
176
|
+
| `project` | `int \| None` | `None` | 프로젝트 ID |
|
|
177
|
+
| `use_single_path` | `bool` | `true` | 모드 전환 |
|
|
178
|
+
| `is_recursive` | `bool` | `true` | 재귀적 스캔 (단일 경로 모드) |
|
|
179
|
+
| `excel_metadata_path` | `str \| None` | `None` | Excel 메타데이터 파일 경로 (향후 버전에서 지원 중단 예정, `excel_metadata` 사용 권장) |
|
|
180
|
+
| `excel_metadata` | `dict \| None`| `None` | Excel 메타데이터 (base64 인코딩, 권장) |
|
|
181
|
+
| `max_file_size_mb` | `int` | `50` | 최대 파일 크기 (MB) |
|
|
182
|
+
| `creating_data_unit_batch_size` | `int` | `100` | 데이터 단위 생성을 위한 배치 크기 |
|
|
183
|
+
| `use_async_upload` | `bool` | `True` | 비동기 처리 사용 |
|
|
184
|
+
|
|
185
|
+
## Excel 메타데이터 지원
|
|
186
|
+
|
|
187
|
+
업로드 플러그인은 유연한 헤더 지원, 포괄적인 파일 이름 매칭 및 다양한 사용 사례를 위한 두 가지 별도의 입력 방법을 통해 고급 Excel 메타데이터 처리를 제공합니다.
|
|
188
|
+
|
|
189
|
+
### 입력 방법
|
|
190
|
+
|
|
191
|
+
Excel 메타데이터를 제공하는 두 가지 별도의 매개변수가 있습니다:
|
|
192
|
+
|
|
193
|
+
#### 1. 파일 경로 방법 (`excel_metadata_path`)
|
|
194
|
+
|
|
195
|
+
:::info 향후 지원 중단 공지
|
|
196
|
+
이 매개변수는 향후 버전에서 지원 중단될 예정입니다.
|
|
197
|
+
새로운 구현에서는 base64 인코딩을 사용하는 `excel_metadata` 매개변수를 권장합니다.
|
|
198
|
+
:::
|
|
199
|
+
|
|
200
|
+
**사용 사례:** Excel 파일이 서버의 파일 시스템에 존재하는 전통적인 파일 기반 업로드.
|
|
201
|
+
|
|
202
|
+
Excel 파일에 대한 간단한 문자열 경로:
|
|
203
|
+
|
|
204
|
+
```json
|
|
205
|
+
{
|
|
206
|
+
"excel_metadata_path": "/data/metadata.xlsx"
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**장점:**
|
|
211
|
+
- 기존 구현과의 하위 호환성
|
|
212
|
+
- 간단하고 직관적
|
|
213
|
+
- 파일 시스템에 직접 액세스
|
|
214
|
+
|
|
215
|
+
**참고:** 향후 호환성을 위해 base64 인코딩 방법으로 마이그레이션 고려 (아래 방법 2 참조)
|
|
216
|
+
|
|
217
|
+
#### 2. Base64 인코딩 방법 (`excel_metadata`) - **권장**
|
|
218
|
+
|
|
219
|
+
**사용 사례:** 파일이 인코딩된 데이터로 전송되는 웹 프론트엔드, API 및 클라우드 통합.
|
|
220
|
+
|
|
221
|
+
원본 파일 이름과 함께 Excel 파일을 base64로 인코딩된 데이터로 전송:
|
|
222
|
+
|
|
223
|
+
```json
|
|
224
|
+
{
|
|
225
|
+
"excel_metadata": {
|
|
226
|
+
"data": "UEsDBBQABgAIAAAAIQDd4Z...", // base64로 인코딩된 Excel 파일
|
|
227
|
+
"filename": "metadata.xlsx"
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
**장점:**
|
|
233
|
+
- 중간 파일 저장소가 필요하지 않음
|
|
234
|
+
- 웹 업로드 양식에 적합
|
|
235
|
+
- API 친화적인 JSON 페이로드
|
|
236
|
+
- 자동 임시 파일 정리
|
|
237
|
+
- **앞으로 권장되는 방법**
|
|
238
|
+
|
|
239
|
+
**Python 예제:**
|
|
240
|
+
```python
|
|
241
|
+
import base64
|
|
242
|
+
|
|
243
|
+
# Excel 파일 읽기 및 base64로 인코딩
|
|
244
|
+
with open("metadata.xlsx", "rb") as f:
|
|
245
|
+
excel_bytes = f.read()
|
|
246
|
+
encoded_excel = base64.b64encode(excel_bytes).decode("utf-8")
|
|
247
|
+
|
|
248
|
+
# 업로드 매개변수에서 사용
|
|
249
|
+
upload_params = {
|
|
250
|
+
"name": "웹 업로드",
|
|
251
|
+
"path": "/data/files",
|
|
252
|
+
"storage": 1,
|
|
253
|
+
"data_collection": 5,
|
|
254
|
+
"excel_metadata": {
|
|
255
|
+
"data": encoded_excel,
|
|
256
|
+
"filename": "metadata.xlsx"
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
:::warning 중요
|
|
262
|
+
`excel_metadata_path`와 `excel_metadata`를 동시에 사용할 수 **없습니다**. 사용 사례에 가장 적합한 방법을 선택하세요:
|
|
263
|
+
- 서버 측 파일의 경우 `excel_metadata_path` 사용 (향후 버전에서 지원 중단 예정)
|
|
264
|
+
- 모든 사용 사례에 `excel_metadata` 사용 (새로운 구현에 권장)
|
|
265
|
+
:::
|
|
266
|
+
|
|
267
|
+
### 향후 호환성을 위한 마이그레이션 예제
|
|
268
|
+
|
|
269
|
+
새로운 구현에서는 `excel_metadata` 사용을 권장합니다. 마이그레이션 방법:
|
|
270
|
+
|
|
271
|
+
```python
|
|
272
|
+
import base64
|
|
273
|
+
|
|
274
|
+
# 현재 방식 (향후 지원 중단 예정):
|
|
275
|
+
upload_params = {
|
|
276
|
+
"name": "내 업로드",
|
|
277
|
+
"path": "/data/files",
|
|
278
|
+
"storage": 1,
|
|
279
|
+
"data_collection": 5,
|
|
280
|
+
"excel_metadata_path": "/data/metadata.xlsx" # 향후 지원 중단 예정
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
# 새로운 구현에 권장되는 방식:
|
|
284
|
+
with open("/data/metadata.xlsx", "rb") as f:
|
|
285
|
+
excel_bytes = f.read()
|
|
286
|
+
encoded_excel = base64.b64encode(excel_bytes).decode("utf-8")
|
|
287
|
+
|
|
288
|
+
upload_params = {
|
|
289
|
+
"name": "내 업로드",
|
|
290
|
+
"path": "/data/files",
|
|
291
|
+
"storage": 1,
|
|
292
|
+
"data_collection": 5,
|
|
293
|
+
"excel_metadata": {
|
|
294
|
+
"data": encoded_excel,
|
|
295
|
+
"filename": "metadata.xlsx"
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
### Excel 형식
|
|
301
|
+
|
|
302
|
+
두 가지 헤더 형식이 모두 지원됩니다 (대소문자 구분 없음):
|
|
303
|
+
|
|
304
|
+
**옵션 1: "filename" 헤더**
|
|
305
|
+
| filename | category | description | custom_field |
|
|
306
|
+
|----------|----------|-------------|--------------|
|
|
307
|
+
| image1.jpg | nature | Mountain landscape | high_res |
|
|
308
|
+
| image2.png | urban | City skyline | processed |
|
|
309
|
+
|
|
310
|
+
**옵션 2: "filename" 헤더**
|
|
311
|
+
| file_name | category | description | custom_field |
|
|
312
|
+
|-----------|----------|-------------|--------------|
|
|
313
|
+
| image1.jpg | nature | Mountain landscape | high_res |
|
|
314
|
+
| image2.png | urban | City skyline | processed |
|
|
315
|
+
|
|
316
|
+
### 파일 이름 매칭
|
|
317
|
+
|
|
318
|
+
시스템은 5계층 우선순위 매칭 알고리즘을 사용합니다:
|
|
319
|
+
|
|
320
|
+
1. **정확한 스템 일치** (가장 높은 우선순위): `image1`이 `image1.jpg`와 일치
|
|
321
|
+
2. **정확한 파일 이름 일치**: `image1.jpg`가 `image1.jpg`와 일치
|
|
322
|
+
3. **메타데이터 키 스템 일치**: `path/image1.ext`의 스템이 `image1`과 일치
|
|
323
|
+
4. **부분 경로 일치**: `/uploads/image1.jpg`에 `image1`이 포함됨
|
|
324
|
+
5. **전체 경로 일치**: 복잡한 구조에 대한 전체 경로 일치
|
|
325
|
+
|
|
326
|
+
### 보안 검증
|
|
327
|
+
|
|
328
|
+
Excel 파일은 보안 검증을 거칩니다:
|
|
329
|
+
|
|
330
|
+
```python
|
|
331
|
+
# 기본 보안 제한
|
|
332
|
+
max_file_size_mb: 10 # 파일 크기 제한
|
|
333
|
+
max_rows: 100000 # 행 수 제한
|
|
334
|
+
max_columns: 50 # 열 수 제한
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
### 구성
|
|
338
|
+
|
|
339
|
+
`config.yaml`에서 Excel 보안을 구성합니다:
|
|
340
|
+
|
|
341
|
+
```yaml
|
|
342
|
+
actions:
|
|
343
|
+
upload:
|
|
344
|
+
excel_config:
|
|
345
|
+
max_file_size_mb: 10
|
|
346
|
+
max_rows: 100000
|
|
347
|
+
max_columns: 50
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
## 진행 상황 추적
|
|
351
|
+
|
|
352
|
+
업로드 작업은 세 가지 주요 단계에 걸쳐 진행 상황을 추적합니다:
|
|
353
|
+
|
|
354
|
+
| 카테고리 | 비율 | 설명 |
|
|
355
|
+
| --------------------- | ---- | ----------------------------------- |
|
|
356
|
+
| `analyze_collection` | 2% | 매개변수 검증 및 설정 |
|
|
357
|
+
| `upload_data_files` | 38% | 파일 업로드 처리 |
|
|
358
|
+
| `generate_data_units` | 60% | 데이터 단위 생성 및 최종화 |
|
|
359
|
+
|
|
360
|
+
## 일반적인 사용 사례
|
|
361
|
+
|
|
362
|
+
### 1. 간단한 데이터셋 업로드
|
|
363
|
+
|
|
364
|
+
```json
|
|
365
|
+
{
|
|
366
|
+
"name": "학습 데이터셋",
|
|
367
|
+
"use_single_path": true,
|
|
368
|
+
"path": "/datasets/training",
|
|
369
|
+
"is_recursive": true,
|
|
370
|
+
"storage": 1,
|
|
371
|
+
"data_collection": 2
|
|
372
|
+
}
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
### 2. 다중 소스 센서 데이터
|
|
376
|
+
|
|
377
|
+
```json
|
|
378
|
+
{
|
|
379
|
+
"name": "다중 카메라 데이터셋",
|
|
380
|
+
"use_single_path": false,
|
|
381
|
+
"assets": {
|
|
382
|
+
"front_camera": { "path": "/cameras/front", "is_recursive": true },
|
|
383
|
+
"rear_camera": { "path": "/cameras/rear", "is_recursive": true },
|
|
384
|
+
"lidar": { "path": "/sensors/lidar", "is_recursive": false }
|
|
385
|
+
},
|
|
386
|
+
"storage": 1,
|
|
387
|
+
"data_collection": 2
|
|
388
|
+
}
|
|
389
|
+
```
|
|
390
|
+
|
|
391
|
+
### 3. 메타데이터가 포함된 데이터셋 (파일 경로)
|
|
392
|
+
|
|
393
|
+
```json
|
|
394
|
+
{
|
|
395
|
+
"name": "주석이 달린 데이터셋",
|
|
396
|
+
"use_single_path": true,
|
|
397
|
+
"path": "/data/annotated",
|
|
398
|
+
"is_recursive": true,
|
|
399
|
+
"excel_metadata_path": "/data/metadata.xlsx",
|
|
400
|
+
"storage": 1,
|
|
401
|
+
"data_collection": 5
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### 4. Base64 메타데이터가 포함된 데이터셋 (API/웹 사용 사례)
|
|
406
|
+
|
|
407
|
+
```json
|
|
408
|
+
{
|
|
409
|
+
"name": "웹 메타데이터 업로드",
|
|
410
|
+
"use_single_path": true,
|
|
411
|
+
"path": "/data/uploads",
|
|
412
|
+
"is_recursive": true,
|
|
413
|
+
"excel_metadata": {
|
|
414
|
+
"data": "UEsDBBQABgAIAAAAIQDd4Zg...",
|
|
415
|
+
"filename": "metadata.xlsx"
|
|
416
|
+
},
|
|
417
|
+
"storage": 1,
|
|
418
|
+
"data_collection": 5
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
**Python 예제 - Excel을 Base64로 변환:**
|
|
423
|
+
|
|
424
|
+
```python
|
|
425
|
+
import base64
|
|
426
|
+
|
|
427
|
+
# Excel 파일을 읽고 base64로 변환
|
|
428
|
+
with open('metadata.xlsx', 'rb') as f:
|
|
429
|
+
excel_data = f.read()
|
|
430
|
+
encoded = base64.b64encode(excel_data).decode('utf-8')
|
|
431
|
+
|
|
432
|
+
# 업로드 매개변수에 사용
|
|
433
|
+
params = {
|
|
434
|
+
"name": "웹 업로드",
|
|
435
|
+
"path": "/data/uploads",
|
|
436
|
+
"excel_metadata": {
|
|
437
|
+
"data": encoded,
|
|
438
|
+
"filename": "metadata.xlsx"
|
|
439
|
+
},
|
|
440
|
+
"storage": 1,
|
|
441
|
+
"data_collection": 5
|
|
442
|
+
}
|
|
443
|
+
```
|
|
444
|
+
|
|
445
|
+
## 이점
|
|
446
|
+
|
|
447
|
+
### 사용자용
|
|
448
|
+
|
|
449
|
+
- **유연성**: 단일 작업으로 여러 다른 위치에서 파일 업로드
|
|
450
|
+
- **세분화된 제어**: 전역이 아닌 자산별로 재귀 검색 설정
|
|
451
|
+
- **조직화**: 복잡한 파일 구조를 데이터 컬렉션 사양에 매핑
|
|
452
|
+
- **사용 사례 지원**: 다중 센서 데이터 수집, 분산 데이터셋, 이기종 소스
|
|
453
|
+
|
|
454
|
+
### 개발자용
|
|
455
|
+
|
|
456
|
+
- **하위 호환성**: 기존 코드가 변경 없이 계속 작동
|
|
457
|
+
- **타입 안전**: 명확한 오류 메시지가 포함된 전체 Pydantic 검증
|
|
458
|
+
- **유지보수성**: 단일 경로와 다중 경로 로직 간의 깔끔한 분리
|
|
459
|
+
- **확장성**: 향후 더 많은 자산별 구성 옵션을 쉽게 추가 가능
|
|
460
|
+
|
|
461
|
+
## 다음 단계
|
|
462
|
+
|
|
463
|
+
- **플러그인 개발자용**: 사용자 정의 업로드 플러그인을 파일 처리 로직과 함께 생성하려면 [BaseUploader 템플릿 가이드](./upload-plugin-template.md)를 참조하십시오.
|
|
464
|
+
- **SDK/액션 개발자용**: 아키텍처 세부 정보, 전략 패턴 및 액션 내부에 대해서는 [업로드 액션 개발](./upload-plugin-action.md)을 참조하십시오.
|
|
465
|
+
|
|
466
|
+
## 마이그레이션 가이드
|
|
467
|
+
|
|
468
|
+
### 레거시에서 현재 버전으로
|
|
469
|
+
|
|
470
|
+
업로드 작업은 100% 하위 호환성을 유지합니다. 기본 동작 (`use_single_path=true`)은 이전 버전과 동일하게 작동합니다.
|
|
471
|
+
|
|
472
|
+
#### 마이그레이션 필요 없음
|
|
473
|
+
|
|
474
|
+
기존 구성은 변경 없이 계속 작동합니다:
|
|
475
|
+
|
|
476
|
+
```python
|
|
477
|
+
# 이 레거시 사용법은 여전히 작동합니다
|
|
478
|
+
params = {
|
|
479
|
+
"name": "내 업로드",
|
|
480
|
+
"path": "/data/files",
|
|
481
|
+
"storage": 1,
|
|
482
|
+
"data_collection": 5
|
|
483
|
+
}
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
#### 다중 경로 모드 채택
|
|
487
|
+
|
|
488
|
+
새로운 다중 경로 기능을 사용하려면:
|
|
489
|
+
|
|
490
|
+
1. `use_single_path: false`로 설정
|
|
491
|
+
2. `path` 필드 제거 (무시됨)
|
|
492
|
+
3. 자산별 구성이 포함된 `assets` 사전을 추가
|
|
493
|
+
|
|
494
|
+
```python
|
|
495
|
+
# 새로운 다중 경로 모드
|
|
496
|
+
params = {
|
|
497
|
+
"name": "다중 소스 업로드",
|
|
498
|
+
"use_single_path": false,
|
|
499
|
+
"assets": {
|
|
500
|
+
"pcd_1": {"path": "/sensors/lidar", "is_recursive": false},
|
|
501
|
+
"image_1": {"path": "/cameras/front", "is_recursive": true}
|
|
502
|
+
},
|
|
503
|
+
"storage": 1,
|
|
504
|
+
"data_collection": 5
|
|
505
|
+
}
|
|
506
|
+
```
|
|
507
|
+
|
|
508
|
+
## 문제 해결
|
|
509
|
+
|
|
510
|
+
### 일반적인 문제
|
|
511
|
+
|
|
512
|
+
#### "파일을 찾을 수 없음" 오류
|
|
513
|
+
|
|
514
|
+
```bash
|
|
515
|
+
# 경로가 존재하고 읽을 수 있는지 확인
|
|
516
|
+
ls -la /path/to/data
|
|
517
|
+
test -r /path/to/data && echo "읽을 수 있음" || echo "읽을 수 없음"
|
|
518
|
+
|
|
519
|
+
# 파일이 존재하는지 확인
|
|
520
|
+
find /path/to/data -name "*.jpg" | head -10
|
|
521
|
+
```
|
|
522
|
+
|
|
523
|
+
#### Excel 처리 오류
|
|
524
|
+
|
|
525
|
+
```bash
|
|
526
|
+
# 파일 형식 및 크기 확인
|
|
527
|
+
file /path/to/metadata.xlsx
|
|
528
|
+
ls -lh /path/to/metadata.xlsx
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
#### 모드 검증 오류
|
|
532
|
+
|
|
533
|
+
- **단일 경로 모드**: `path`가 제공되었는지 확인
|
|
534
|
+
- **다중 경로 모드**: `assets`가 하나 이상의 자산 구성과 함께 제공되었는지 확인
|
|
535
|
+
|
|
536
|
+
## 모범 사례
|
|
537
|
+
|
|
538
|
+
### 디렉토리 구성
|
|
539
|
+
|
|
540
|
+
- 명확하고 설명적인 디렉토리 이름 사용
|
|
541
|
+
- 합리적인 디렉토리 크기 유지 (디렉토리당 10,000개 미만 파일)
|
|
542
|
+
- 안정성을 위해 절대 경로 사용
|
|
543
|
+
|
|
544
|
+
### 성능 최적화
|
|
545
|
+
|
|
546
|
+
- 필요할 때만 재귀 활성화
|
|
547
|
+
- 최상의 성능을 위해 Excel 파일을 5MB 미만으로 유지
|
|
548
|
+
- 균형 잡힌 디렉토리 구조로 파일 구성
|
|
549
|
+
|
|
550
|
+
### 보안 고려 사항
|
|
551
|
+
|
|
552
|
+
- 처리 전에 모든 경로 검증
|
|
553
|
+
- 소스 데이터에 읽기 전용 권한 사용
|
|
554
|
+
- 적절한 Excel 크기 제한 설정
|
|
555
|
+
|
|
556
|
+
## 지원 및 리소스
|
|
557
|
+
|
|
558
|
+
- **액션 개발 가이드**: [업로드 플러그인 액션 개발](./upload-plugin-action.md)
|
|
559
|
+
- **템플릿 개발 가이드**: [업로드 플러그인 템플릿 개발](./upload-plugin-template.md)
|
|
560
|
+
- **API 참조**: 자세한 API 참조는 액션 개발 설명서를 참조하십시오.
|