BLOG
클라우드에서 데이터를 공유하고 컴퓨팅하면 데이터 사용자는 데이터 액세스가 아닌 데이터 분석에 집중할 수 있습니다. Open Data on AWS 는 클라우드에서 공개 데이터 셋을 검색하고 공유하는 데 도움을 줍니다. Registry of Open Data on AWS는 대량의 공공 오픈 데이터를 호스팅합니다. 데이터셋는 유전체학에서 기후, 교통 정보에 이르기까지 다양하며, 구조가 잘되어 있고 쉽게 접근할 수 있습니다. 이러한 데이터 세트는 클라우드의 머신 러닝(ML) 모델 개발에도 사용할 수 있습니다.
오늘은 SpaceNet 위성 이미지와 USGS 3DEP LiDAR 데이터, 두 개의 대규모 지리 공간 데이터 셋에서 건물과 도로를 추출하는 방법을 알려드리겠습니다. 두 데이터 세트는 AWS의 Registry of Open Data에서 호스팅됩니다.
먼저 Amazon SageMaker 노트북 인스턴스를 시작하는 방법을 보여드리고, 하이레벨 수준의 튜토리얼 노트북을 안내해 드리겠습니다. 노트북은 SpaceNet challenges (위성 이미지 만 사용)에서 우승한 알고리즘을 재현합니다. 이 SpaceNet 위성 이미지 외에도 USGS 3DEP (3D Elevation Program) LiDAR 데이터를 비교 및 결합하여 동일한 데이터 를 추출합니다.
또한 여기선 AWS의 ML 서비스를 실행하여 클라우드의 대규모 지리 공간 데이터에서 기능을 추출하는 방법을 보여드립니다. 예제를 통해 사용자는 AWS에서 ML 모델을 교육하고, 위성 또는 LiDAR 데이터를 사용할 수있는 다른 지역에 모델을 적용하며, 성능 향상을위한 새로운 아이디어를 실험 할 수 있습니다. 이 튜토리얼의 전체 코드와 노트북은 GitHub repo를 참고해 주시기 바랍니다.
데이터 셋
그렇다면 먼저 데이터 셋에 대해 자세히 알아보겠습니다.
SpaceNet 데이터 셋
SpaceNet은 2016년 8월에 공동 등록된 지도 기능과 함께 무료로 사용할 수있는 이미지 저장소를 제공하는 개방형 혁신 프로젝트로 시작되었습니다. 레이블이 지정된 위성 이미지의 대량 모음집으로 이 프로젝트는 또한 자동 건물 추출, 도로 추출, 최근 발표된 다중 시간 도시 개발 분석에 이르기까지 다양한 활동을 진행했습니다. 데이터 세트는 리우데 자네이루, 라스 베이거스, 파리를 포함한 11 개의 관심 영역(AOI)을 다룹니다. 이 게시물에서는 Las Vegas를 사용합니다. 이 AOI의 이미지는 151,367개의 빌딩 폴리곤 레이블과 3,685km의 도로 레이블로 216km2 영역을 포함합니다.
다음 이미지는 DigitalGlobe의 ‘SpaceNet Challenges First Round, Moves to Higher Resolution Challenges’ 기사 글에서 가져온 것 입니다.
USGS 3DEP LiDAR 데이터 셋
두 번째 데이터 세트는 LiDAR(Light Detection and Ranging) 데이터 형식의 USGS 3D Elevation Program (3DEP)에서 가져 옵니다. 이 프로그램의 목표는 10 년 이내에 수집된 일관적인 고해상도 지형 고도 데이터에 대한 최초의 국가 기준선을 제공하기 위해 전국적인 LiDAR 인수를 완료하는 것입니다. LiDAR는 지구까지의 거리를 측정하기 위해 초당 수십만 개의 근적외선 펄스를 방출하는 원격 감지 방법입니다. 이러한 광 펄스는 지구의 모양과 표면 특성에 대한 정확한 3D 정보를 생성합니다.
USGS 3DEP LiDAR는 두 가지 형식으로 제공됩니다. 첫 번째는 EPT(Entwine Point Tiles) 형식의 공용 저장소로, 무손실, 전체 해상도, 스트리밍 가능한 octree 구조입니다. 이 형식은 온라인 시각화에 적합합니다. 다음 이미지는 Las Vegas에서 LiDAR 시각화의 예를 보여줍니다.
다른 형식은 요청자 지불 액세스 권한이있는 LAZ(압축 LAS)입니다. 이 게시물에서는 LiDAR 데이터를 두 번째 형식으로 사용합니다.
데이터 등록
이 게시물에서는 SpaceNet 위성 이미지와 USGS LiDAR 데이터를 모두 사용할 수있는 Las Vegas AOI를 선택합니다. SpaceNet 데이터 범주 중 30cm 해상도의 팬 날카롭게 3 밴드 RGB 지오 티프와 해당 건물 및 도로 레이블을 사용합니다. 시각적 특징 추출 성능을 향상시키기 위해 화이트 밸런싱으로 데이터를 처리하고 후 처리의 용이성을 위해 8 비트 (0–255) 값으로 변환합니다. 다음 그래프는 처리 후 모든 이미지의 RGB 값 집계 히스토그램을 보여줍니다.
위성 이미지는 2D 이미지 인 반면 USGS LiDAR 데이터는 3D 포인트 클라우드이므로 2D 위성 이미지와 정렬하려면 변환 및 투영이 필요합니다. LAStools를 사용 하여 각 3D LiDAR 포인트를 SpaceNet 타일에 해당하는 픽셀 단위 위치에 매핑하고 두 세트의 속성 이미지인 고도 및 반사 강도를 생성합니다. 고도는 약 2,000 ~ 3,000 피트이며 강도는 0 ~ 5,000 단위입니다. 다음 그래프는 고도 및 반사 강도 값에 대한 모든 이미지의 집계된 히스토그램을 보여줍니다.
마지막으로 LiDAR 속성 중 하나를 병합하고 RGB 이미지와 병합합니다. LiDAR 속성 값은 8 비트 상한 인 255보다 클 수 있으므로 이미지는 16 비트로 저장됩니다. 이 자습서에서는 공개적으로 액세스 할 수 있는 Amazon Simple Storage Service(Amazon S3) 버킷을 통해 처리 및 병합된 데이터를 사용할 수 있습니다. 다음은 병합된 RGB + LiDAR 이미지의 세 가지 샘플입니다. 왼쪽에서 오른쪽으로 열은 RGB 이미지, LiDAR 고도 속성 및 LiDAR 반사 강도 속성입니다.
노트북 인스턴스 생성
SageMaker는 ML 모델을 구축, 교육, 배포 및 모니터링 할 수 있는 완전 관리 형 서비스입니다. 모듈 식 설계를 통해 ML 수명주기의 여러 단계에서 사용 사례에 적합한 기능을 선택하고 선택할 수 있습니다. SageMaker는 인프라 관리의 무거운 작업을 추상화하고 다양한 기능과 종량제 가격 모델을 사용하여 대규모 ML 활동에 원하는 민첩성과 확장 성을 제공하는 기능을 제공합니다.
SageMaker 온 디맨드 노트북 인스턴스는 Jupyter 노트북 앱을 실행하는 완전 관리 형 컴퓨팅 인스턴스 입니다. SageMaker는 인스턴스 및 관련 리소스 생성을 관리합니다. 노트북에는 ML 워크 플로를 실행하거나 다시 만드는 데 필요한 모든 것이 포함되어 있습니다. 노트북 인스턴스에서 Jupyter 노트북을 사용하여 데이터를 준비 및 처리하고, 모델을 학습시키기위한 코드를 작성하고, 모델을 SageMaker 호스팅에 배포하고, 모델을 테스트 또는 검증할 수 있습니다. 여러 문제의 경우 각 시나리오에 가장 적합한 인스턴스 유형을 선택할 수 있습니다 (예: 높은 처리량, 높은 메모리 사용량 또는 실시간 추론).
딥 러닝 모델을 학습하는 데 시간이 오래 걸릴 수 있지만 합리적인 컴퓨팅 비용으로이 게시물의 추론 부분을 재현 할 수 있습니다. ml.p3.8xlarge (4 x V100 GPU) 이상의 SageMaker 노트북 인스턴스 내에서 노트북을 실행하는 것이 좋습니다. 네트워크 훈련 및 추론은 메모리 집약적인 프로세스입니다. 메모리 부족 또는 RAM 부족 오류가 발생 batch_size하는 경우 구성 파일 (.yml 형식)에서를 줄이는 것이 좋습니다.
노트북 인스턴스를 작성하려면 다음 단계를 완료하십시오.
- SageMaker 콘솔에서 노트북 인스턴스를 선택 합니다.
- 노트북 인스턴스 생성을 선택 합니다.
- 노트북 인스턴스의 이름을 입력합니다(예: open-data-tutorial).
- 인스턴스 유형을 8xlarge로 설정합니다.
- 추가 구성을 선택 합니다.
- 볼륨 크기를 60GB로 설정합니다.
- 노트북 인스턴스 생성을 선택합니다.
- 인스턴스가 준비되면 Open in JupyterLab을 선택합니다.
- 런처에서 터미널을 열고 제공된 코드를 실행할 수 있습니다.
환경 배포 및 데이터 세트 다운로드
JupyterLab 터미널에서 다음 명령어를 실행합니다.
$ cd ~/SageMaker/$ ./setup-env.sh tutorial_env
$ git clone https://github.com/aws-samples/aws-open-data-satellite-lidar-tutorial.git
$ cd aws-open-data-satellite-lidar-tutorial
그러면 GitHub에서 자습서 저장소가 다운로드되고 자습서 디렉터리로 이동합니다.
그 후 setup-env.sh를 실행 하여 Conda 환경을 설정합니다.(다음 코드 참조) 환경 이름을 tutorial_env에서 다른 이름으로 변경할 수 있습니다.
$ ./setup-env.sh tutorial_env
환경 이름을 변경했다면 conda_tutorial_env 또는 conda_[name]이라는 새 Jupyter 커널이 생선된 후 완료까지 약 10 ~ 15 분이 소요될 수 있습니다. conda완료 후 몇 분 정도 기다렸다가 Jupyter 페이지를 새로 고쳐야 할 수 있습니다.
다음으로 자습서 파일을 호스팅하는 퍼블릭 S3 버킷에서 필요한 데이터를 다운로드합니다.
$ ./download-from-s3.sh
완료하는 데 최대 5 분이 소요될 수 있으며 최소 23GB의 노트북 인스턴스 스토리지가 필요합니다.
건물 추출
이번 챕터를 위해 Building-Footprint.ipynb 노트북을 시작합니다.
첫 번째 와 두 번째 과제는 다양한 AOI의 위성 이미지에서 건물 발자국을 추출하는 것을 목표로 했습니다. 네 번째 SpaceNet의 과제는 좀 더 도전적인 오프나디르(사선처럼 보이는 각도) 이미지로 유사한 과제를 제기했습니다. 여기서는 성공적인 알고리즘을 재현하고 RGB 이미지와 LiDAR 데이터로 성능을 평가합니다.
데이터 훈련
Las Vegas AOI에서 SpaceNet 데이터는 200m x 200m 크기로 배열됩니다. SpaceNet 이미지와 LiDAR 데이터를 모두 사용할 수있는 3,084 개의 타일을 선택하고 함께 병합합니다. 불행히도 SpaceNet 챌린지에서 채점하기 위한 테스트 데이터의 레이블은 게시되지 않았으므로 병합된 데이터의 훈련 및 평가를 위해 70 %와 30 %로 분할했습니다. LiDAR 고도와 강도 사이에서 건물 추출을 위한 고도를 선택합니다. 다음 코드를 참조하십시오.
# Create Pandas data frame, containing columns ‘image’ and ‘label’.
total_df = pd.DataFrame({‘image’: img_path_list
‘label’: mask_path_list})
# Split this data frame to training data and blind test data.
split_mask = np.random.rand(len(total_df)) < 0.7
train_df = total_df[split_mask]
test_df = total_df[~split_mask]
모델
여기서는 XD_XD의 SpaceNet challenge 4에서 우승한 알고리즘을 재현합니다. 이 모델에는 인코더와 디코더 사이의 스킵 연결이 있는 U-net 아키텍처와 백본 인코더로 수정된 VGG16이 있습니다. 이 모델은 세 가지 유형의 입력을 받습니다.
- 원본 콘테스트와 동일한 3 채널 RGB 이미지
- 1 채널 LiDAR 고도 이미지
- 4 채널 RGB + LiDAR 병합 이미지
이 게시물에 설명된 세 가지 입력 유형을 기반으로 세 가지 모델을 훈련하고 성능을 비교합니다.
교육용 레이블은 CosmiQ Works에서 개발한 ML 파이프 라인 라이브러리 인 Solaris의 다각형 geojson에서 변환된 바이너리 마스크입니다. 이진 교차 엔트로피 손실과 Jaccard 손실의 결합 손실을 가중치 요인으로 선택합니다.\alpha=0.8:
\ mathcal {L} =
\ alpha \ mathcal {L} _ \ mathrm {BCE} + (1 –
\ alpha \ mathcal {L} _ \ mathrm {Jaccard})
배치 크기 20, Adam 최적화 프로그램 및 100 Epoch 동안 10-4 학습률로 모델을 훈련합니다. 교육은 ml.p3.8xlarge SageMaker 노트북 인스턴스에서 완료하는 데 약 100 분이 걸립니다. 다음 코드를 참조하십시오.
# Load customized multi-channel input VGG16-Unet model.
from networks.vgg16_unet import get_modified_vgg16_unet
custom_model = get_modified_vgg16_unet(
in_channels=config[‘data_specs’][‘channels’])
custom_model_dict = {
‘model_name’: ‘modified_vgg16_unet’,
‘arch’: custom_model}
# Select config file and link training datasets.
config = sol.utils.config.parse(‘./configs/buildings/RGB+ELEV.yml’)
config[‘training_data_csv’] = train_csv_path
# Create solaris trainer, and train with configuration.
trainer = sol.nets.train.Trainer(config, custom_model_dict=custom_model_dict)
trainer.train()
다음 이미지는 건물 추출 입력 및 출력의 예를 보여줍니다. 왼쪽에서 오른쪽으로 열은 RGB 이미지, LiDAR 고도 이미지, RGB 및 LiDAR 데이터로 학습 된 모델 예측, Ground Truth Building Footprint 마스크입니다.
평가
훈련된 모델을 사용하여 테스트 데이터 세트에서 모델 추론을 수행합니다(30 % 홀드 아웃).
custom_model_dict = {
‘model_name’: ‘modified_vgg16_unet’,
‘arch’: custom_model,
‘weight_path’: config[‘training’][‘model_dest_path’]}
config[‘train’] = False
# Create solaris inferer, and do inference on test data.
inferer = sol.nets.infer.Inferer(config, custom_model_dict=custom_model_dict)
inferer(test_df)
모델 추론 후, 원래 컨테스트에서와 동일한 측정 항목 인 통합 교차점 (IoU) ≥ 0.5 기준 인 집계 된 F-1 점수를 사용하여 모델 성능을 평가합니다. 이 점수를 계산하는 데는 두 단계가 있습니다. 먼저 건물 풋 프린트 바이너리 마스크를 제안 된 다각형으로 변환합니다.
# Convert these probability maps to building polygons.
def pred_to_prop(pred_file, img_path):
pred_path = os.path.join(pred_dir, pred_file)
pred = skimage.io.imread(pred_path)[…, 0]
prop_file = \
pred_file.replace(‘RGB+ELEV’, ‘geojson_buildings’).replace(‘tif’, ‘geojson’)
prop_path = os.path.join(prop_dir, prop_file)
prop = sol.vector.mask.mask_to_poly_geojson(
pred_arr=pred,
reference_im=img_path,
do_transform=True,
min_area=1e-10,
output_path=prop_path)
다음으로 제안된 다각형을 Ground Truth 다각형 (SpaceNet 건물 레이블)과 비교하고 집계된 F-1 점수를 계산합니다.
# Evaluate aggregated F-1 scores.
def compute_score(prop_path, bldg_path):
evaluator = sol.eval.base.Evaluator(bldg_path)
evaluator.load_proposal(prop_path, conf_field_list=[])
score = evaluator.eval_iou(miniou=0.5, calculate_class_scores=False)
# score_list.append(score[0]) # skip because single-class
return score[0] # single-class
다음 표는 RGB 이미지, LiDAR 고도 이미지 및 RGB + LiDAR 병합 이미지로 훈련 된 세 가지 모델의 F-1 점수를 보여줍니다. 원래 SpaceNet 경쟁에서와 같이 RGB 만 사용하는 것과 비교할 때 LiDAR 고도 이미지 만 사용하여 훈련된 모델은 몇 퍼센트 더 나쁜 점수를 얻습니다. 훈련에서 RGB와 LiDAR 고도를 모두 결합하면 모델이 RGB 전용 모델보다 성능이 뛰어납니다. 참고로 이 AOI에서 SpaceNet 챌린지 2의 상위 3 개 팀 의 F-1 점수는 0.885, 0.829, 0.787입니다 (점수에 다른 테스트 세트를 사용하기 때문에 직접 비교하지는 않습니다).
훈련 데이터 유형 | 집계 된 F-1 점수 |
RGB 이미지 | 0.8268 |
LiDAR 고도 | 0.80676 |
RGB + LiDAR 병합 | 0.85312 |
도로 추출
이번 챕터를 실습하려면 Road-Network.ipynb 노트북을 시작하십시오.
세 번째 SpaceNet의 도전은 위성 사진에서 도로 네트워크를 추출하는 것을 목표로 했습니다. 다섯 번째 SpaceNet 도전은 이동 시간과 계획의 최적의 라우팅을 최소화하기 위해 도로 네트워크 추출과 함께 주행 속도를 예측합니다. 건물 추출과 유사하게, 우리는 최고의 알고리즘을 재현하고 RGB 이미지, LiDAR 속성 또는 둘 모두를 사용하여 다른 모델을 훈련하고 성능을 평가합니다.
데이터 훈련
도로망 추출은 400m x 400m 크기의 더 큰 타일을 사용합니다. 918 개의 병합 된 타일을 생성하고 훈련 및 평가를 위해 70 %/ 30 %로 분할합니다. 이 경우 도로 표면은 포장된 표면, 비포장 도로 또는 아스팔트와 같이 배경간에 고 한 반사율을 갖는 재료로 구성되는 경우가 많기 때문에 도로 추출을 위해 반사율 강도를 선택합니다.
모델
도로망 추출을위한 CRESI 알고리즘을 재현합니다 . 또한 U-net 아키텍처를 가지고 있지만 ResNet을 백본 인코더로 사용합니다. 다시, 세 가지 다른 유형의 입력으로 모델을 훈련시킵니다
- 3 채널 RGB 이미지
- 1 채널 LiDAR 강도 이미지
- 4 채널 RGB + LiDAR 병합 이미지
도로 위치와 속도를 함께 추출하기 위해 바이너리로드 마스크는 훈련을 위한 충분한 정보를 제공하지 않습니다. CRESI 논문에서 언급했듯이 속도 메타 데이터를 연속 마스크(0–1 값) 또는 다중 클래스 바이너리 마스크로 변환할 수 있습니다. 그들의 테스트 결과는 다중 클래스 바이너리 마스크가 더 나은 성능을 보여주기 때문에 후자의 변환 체계를 사용합니다. 다음 이미지는 8등급 도로 마스크를 분해합니다. 처음 7개의 바이너리 마스크는 0–65mph 이내의 7개의 속도 빈에 해당하는 도로를 나타냅니다. 여덟 번째 마스크(오른쪽 아래)는 모든 이전 마스크의 집계를 나타냅니다.
다음 이미지는 다중 클래스 도로 마스크의 시각화를 보여줍니다. 왼쪽은 RGB 이미지 타일입니다. 오른쪽은 노란색-빨간색 컬러 맵이 저속에서 고속 (0–65mph)까지의 속도 값을 나타내는 색상 코딩이있는 도로 마스크입니다.
건물 추출과 동일한 설정으로 모델을 훈련합니다. 다음 이미지는 도로 추출 입력 및 출력의 예를 보여줍니다. 왼쪽에서 오른쪽으로 열은 RGB 이미지, LiDAR 반사 강도 이미지, RGB 및 LiDAR 데이터로 학습 된 모델 예측, 지상 진실 도로 마스크입니다.
평가
도로 추출 성능을 평가 하기 위해 평균 경로 길이 유사성 (APLS) 점수를 구현합니다. APLS는 논리적 토폴로지(도로 네트워크 내의 연결)와 물리적 토폴로지(도로 가장자리 및 노드 위치)를 모두 고려하기 때문에 이 메트릭은 SpaceNet 도로 문제에 사용됩니다. APLS는 길이 또는 이동 시간에 따라 가중치를 부여 할 수 있습니다. 점수가 높을수록 성능이 향상됩니다. 다음 코드를 참조하십시오.
# Skeletonize the prediction mask into non-geo road network graph.
!python ./libs/apls/skeletonize.py –results_dir={results_dir}
# Match geospatial info and create geo-projected graph.
!python ./libs/apls/wkt_to_G.py –imgs_dir={img_dir} –results_dir={results_dir}
# Infer road speed on each graph edge based on speed bins.
!python ./libs/apls/infer_speed.py –results_dir={results_dir} \
–speed_conversion_csv_file=’./data/roads/speed_conversion_binned7.csv’
# Compute length-based APLS score.
!python ./libs/apls/apls.py –output_dir={results_dir} \
–truth_dir={os.path.join(data_dir, ‘geojson_roads_speed’)} \
–im_dir={img_dir} \
–prop_dir={os.path.join(results_dir, ‘graph_speed_gpickle’)} \
–weight=’length’
# Compute time-based APLS score.
!python ./libs/apls/apls.py –output_dir={results_dir} \
–truth_dir={os.path.join(data_dir, ‘geojson_roads_speed’)} \
–im_dir={img_dir} \
–prop_dir={os.path.join(results_dir, ‘graph_speed_gpickle’)} \
–weight=’travel_time_s’
다중 클래스 도로 마스크 예측을 골격 및 속도 가중치 그래프로 변환하고 APLS 점수를 계산합니다. 다음 표는 세 가지 모델의 APLS 점수를 보여줍니다. 건물 추출 결과와 유사하게 LiDAR 전용 결과는 RGB 전용 결과에 가까운 점수를 달성하는 반면 RGB + LiDAR은 최상의 성능을 제공합니다.
훈련 데이터 유형 | APLS 길이 | APLS 시간 |
RGB 이미지 | 0.59624 | 0.54298 |
LiDAR 강도 | 0.57811 | 0.52697 |
RGB + LiDAR 병합 | 0.63651 | 0.58518 |
결론
SageMaker 노트북 인스턴스를 사용하여 AWS의 Registry of Open Data에 호스팅 된 두 개의 대규모 지리 공간 데이터 세트에서 건물과 도로를 추출하는 방법을 보여줍니다. SageMaker 노트북 인스턴스에는 ML 워크 플로를 실행하거나 다시 생성하는 데 필요한 모든 것이 포함되어 있습니다. 사용하기 쉽고 다양한 시나리오에 가장 잘 맞도록 사용자 정의 할 수 있습니다.
AWS의 Open Data 레지스트리의 LiDAR 데이터 세트를 사용하고 SpaceNet 건물 및 도로 문제에서 우승한 알고리즘을 재현함으로써 LiDAR 데이터를 사용하여 유사한 정확도로 동일한 작업을 수행하고 결합시 RGB 모델을 능가할 수 있음을 보여줍니다.
GitHub에서 공유되는 전체 코드 및 노트북과 퍼블릭 S3 버킷에서 호스팅되는 필수 데이터를 사용하여 맵 기능 추출 작업을 재현하고, 모델을 다른 관심 영역에 적용하고, 새로운 아이디어로 혁신하여 모델 성능을 개선할 수 있습니다. 이 튜토리얼의 전체 코드와 노트북은 GitHub repo를 참고해 주시기 바랍니다.
메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.