DivideTiles - 타일 처리
개요
DivideTiles 인터페이스는 재구성 전에 장면을 타일로 분할하는 데 사용됩니다. 이 인터페이스는 2D 규칙 격자, 3D 규칙 격자, 메모리 기반 적응형 타일링 방법을 지원하며, 대규모 데이터셋 처리에 적합합니다.
사용 사례
- 초대규모 데이터셋 (수천 장의 이미지)
- 메모리 제한 처리 환경
- 병렬 처리가 필요한 프로젝트
- 분산 컴퓨팅 시나리오
작동 원리
인터페이스 호출
명령줄 호출
# 방법 1: 메인 엔진을 통해
reconstruct_full_engine.exe -reconstruct_type 4 -task_json divide_config.json
# 방법 2: 독립 타일링 엔진
divide_engine.exe divide_config.json
매개변수 설명
reconstruct_type
:4
로 고정 (DivideTiles를 나타냄)task_json
: 구성 파일 경로
구성 매개변수
필수 매개변수
매개변수 | 타입 | 설명 |
---|---|---|
working_dir | string | 작업 디렉토리 (AT 결과 포함 필요) |
gdal_folder | string | GDAL 데이터 경로 |
resolution_level | int | 재구성 정밀도 (1=높음, 2=중간, 3=낮음) |
divide_parameters | JSON | 타일링 매개변수 |
roi_for_3d | JSON | 3D 재구성용 ROI |
선택적 매개변수
매개변수 | 타입 | 기본값 | 설명 |
---|---|---|---|
roi_coordinate_system | JSON | WGS84 | ROI 좌표계 |
타일링 매개변수 (divide_parameters)
매개변수 | 타입 | 기본값 | 설명 |
---|---|---|---|
divide_mode | int | - | 타일링 모드: 0=2D 격자, 1=3D 격자, 2=메모리 적응형 |
tile_size | double | - | 격자 크기 (모드 0/1에서 필수) |
target_memory | double | 0 | 목표 메모리 제한 (GB) |
reconstruct_whole_tile | bool | false | 전체 타일 재구성 여부 (경계 클리핑 없음) |
tile_system | JSON | AT 좌표계 | 타일링 좌표계 |
타일링 모드 설명
1. 2D 규칙 격자 (divide_mode = 0)
지형 변화가 적은 지역에 적합:
{
"divide_mode": 0,
"tile_size": 500.0, // 500m x 500m 격자
"tile_system": {
"type": 3,
"epsg_code": 32650 // UTM 투영 좌표계
}
}
2. 3D 규칙 격자 (divide_mode = 1)
고도 변화가 큰 지역에 적합:
{
"divide_mode": 1,
"tile_size": 300.0, // 300m x 300m x 300m 정육면체
"tile_system": {
"type": 1 // 로컬 좌표계
}
}
3. 메모리 적응형 타일링 (divide_mode = 2)
메모리 제한에 기반한 자동 타일링:
{
"divide_mode": 2,
"target_memory": 16.0, // 타일당 최대 16GB 메모리
"reconstruct_whole_tile": false
}
완전한 구성 예제
도시 규모 장면 2D 타일링
{
"working_dir": "C:/Projects/CityScale",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 0,
"tile_size": 1000.0, // 1km 격자
"tile_system": {
"type": 3,
"epsg_code": 32650
},
"reconstruct_whole_tile": true
},
"roi_for_3d": {
"boundary": [
[500000, 2500000],
[510000, 2500000],
[510000, 2510000],
[500000, 2510000]
],
"min_z": 0,
"max_z": 500
},
"roi_coordinate_system": {
"type": 3,
"epsg_code": 32650
}
}
산악 지형 3D 타일링
{
"working_dir": "C:/Projects/Mountain",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 1,
"tile_size": 500.0, // 500m 정육면체
"tile_system": {
"type": 0, // LocalENU
"origin_point": [114.123, 22.123, 100.0]
}
},
"roi_for_3d": {
"boundary": [...],
"min_z": 100,
"max_z": 2000 // 큰 고도 차이
}
}
메모리 제한 환경
{
"working_dir": "C:/Projects/LimitedMemory",
"gdal_folder": "C:/MipMap/SDK/data",
"resolution_level": 2,
"divide_parameters": {
"divide_mode": 2,
"target_memory": 8.0, // 사용 가능한 메모리 8GB만
"reconstruct_whole_tile": false
},
"roi_for_3d": {
"boundary": [...]
}
}
출력 결과
tiles.json 파일 구조
타일링 후 생성되는 tiles.json
:
{
"tiles": [
{
"name": "tile_0_0",
"empty": false,
"max_memory": 12.5, // GB
"roi": {
"boundary": [...],
"min_z": 100,
"max_z": 200
}
},
{
"name": "tile_0_1",
"empty": false,
"max_memory": 15.3,
"roi": {...}
}
],
"divide_mode": 0,
"tile_system": {...},
"tile_grid": { // 격자 정보 (모드 0/1)
"origin": [500000, 2500000],
"rows": 10,
"cols": 10
},
"tile_size": 1000.0
}
타일링 결과 사용
Reconstruct3D는 자동으로 tiles.json
을 읽고 타일 재구성을 수행합니다:
{
"license_id": 9200,
"working_dir": "C:/Projects/CityScale", // tiles.json 포함
// ... 기타 Reconstruct3D 매개변수
}
타일링 전략 선택
장면 유형 비교
장면 유형 | 권장 모드 | 격자 크기 제안 | 설명 |
---|---|---|---|
평평한 도시 | 2D 격자 | 500-2000m | 평평한 지형, 작은 고도 변화 |
산악 지형 | 3D 격자 | 300-1000m | 큰 고도 차이, 수직 계층화 필요 |
혼합 장면 | 메모리 적응형 | - | 타일링 스키마 자동 최적화 |
선형 엔지니어링 | 2D 격자 | 사용자 정의 | 경로 방향을 따라 긴 스트립 설정 |
메모리 추정
타일당 메모리 요구량 ≈ (타일 내 이미지 수 × 이미지 해상도 × 3) / 압축비
참고 값:
- 100장 20MP 이미지 ≈ 8-12 GB
- 200장 20MP 이미지 ≈ 16-24 GB
병렬 처리
로컬 병렬
import subprocess
import json
import concurrent.futures
# 타일링 결과 읽기
with open("tiles.json", "r") as f:
tiles_info = json.load(f)
def process_tile(tile):
if tile["empty"]:
return
config = {
"license_id": 9200,
"working_dir": f"./output/{tile['name']}",
"tile_name": tile["name"],
# ... 기타 매개변수
}
with open(f"{tile['name']}.json", "w") as f:
json.dump(config, f)
subprocess.run([
"reconstruct_full_engine.exe",
"-reconstruct_type", "2",
"-task_json", f"{tile['name']}.json"
])
# 병렬 처리
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
executor.map(process_tile, tiles_info["tiles"])
분산 처리
타일링 결과를 여러 머신에 분산하여 처리할 수 있습니다:
- 마스터 노드가 타일링 수행
- tiles.json과 데이터 분산
- 각 노드가 할당된 타일을 독립적으로 처리
- 결과 집계
모범 사례
1. 타일 크기 선택
- 충분한 메모리: 경계 효과를 줄이기 위해 더 큰 타일 사용
- 제한된 메모리: 안정성 보장을 위해 더 작은 타일 사용
- 병렬 처리: 타일 수와 타일당 처리 시간의 균형
2. 중첩 영역 처리
{
"reconstruct_whole_tile": true, // 완전한 타일 생성
// 후처리에서 중첩 영역 병합
}
3. 좌표계 선택
- 2D 타일링: 투영 좌표계 사용 (미터 단위)
- 3D 타일링: 로컬 또는 LocalENU
- 지리 좌표계에서 3D 타일링 피하기
4. ROI 최적화
{
"roi_for_3d": {
"boundary": [
// AT에서 생성된 Smart ROI 사용
// 클리핑을 피하기 위해 경계를 적절히 확장
]
}
}
성능 최적화
1. 처리 시간 추정
총 시간 = 타일링 시간 + max(타일당 처리 시간) + 병합 시간
2. 로드 밸런싱
max_memory
분포 확인- 타일 간 로드 균형을 위한 매개변수 조정
- 동적 작업 할당 고려
3. 스토리지 최적화
- 작업 디렉토리에 SSD 사용
- 여러 디스크에 타일 결과 분산
- 충분한 임시 공간 확보
일반적인 문제
Q: 타일링 후 타일 경계에 갭이 있습니까?
A:
reconstruct_whole_tile: true
설정- 타일 간 중첩 증가 (ROI 확장)
- 후처리에서 병합 최적화
Q: 일부 타일이 처리에 실패합니까?
A:
- 타일의
max_memory
가 제한을 초과하는지 확인 - 특정 타일의 이미지 분포 검토
- 재타일링 또는 매개변수 조정 고려
Q: 타일이 너무 많습니까?
A:
tile_size
또는target_memory
증가- 다른 타일링 모드 사용
- 계층적 처리 전략 고려
고급 응용
사용자 정의 타일링 스키마
tiles.json을 기반으로 다음이 가능합니다:
- 타일 경계 수동 조정
- 작은 타일 병합
- 큰 타일 분할
- 우선순위 설정
증분 업데이트
# 변경된 영역만 처리
changed_tiles = identify_changed_areas()
for tile in changed_tiles:
process_tile(tile)
다음 단계
- 타일 재구성을 위한 Reconstruct3D 학습
- 더 많은 처리 기법을 위한 기본 개념 확인
팁: 적절한 타일링 전략은 대규모 데이터 처리의 핵심입니다. 전체 데이터셋을 처리하기 전에 먼저 작은 데이터로 테스트하여 최적의 매개변수를 찾는 것이 좋습니다.