SAR 위성영상과 건물 공간정보를 이용해 건물의 면적·높이 변화를 추정하고, 불법 증축 의심 대상을 지도에서 확인하는 해커톤 프로젝트의 최종 코드와 시각화 자료입니다.
이 저장소의 판정은 행정·법률상 확정 판정이 아닌 AI 기반 선별 결과입니다. 현장 확인과 공적 장부 검토가 필요합니다.
- 2022·2025 건물 벡터를 공간 조인해 분석 대상을 정리합니다.
- SAR 영상을 80m 단위 칩으로 만들고 학습 데이터를 구성합니다.
- Module A의 U-Net(ResNet34)이 건물 면적 마스크를 예측합니다.
- Module B의 2채널 ResNet34가 건물 높이를 회귀합니다.
- 허가 정보와 AI 예측값의 차이를 임계값과 비교해 정상·수평·수직·복합 의심으로 분류합니다.
- 최종 GeoJSON을 Streamlit/Folium 대시보드에 표시합니다.
final_analysis_complete.geojson에서 집계한 결과입니다.
| 판정 | 건수 |
|---|---|
| 전체 분석 건물 | 157,383 |
| 정상 | 117,185 |
| 수평 증축 의심(면적) | 40,054 |
| 수직 증축 의심(높이) | 73 |
| 복합 불법 증축 의심 | 71 |
| 전체 의심 판정 | 40,198 |
통합 추론 코드에는 Module A 평균 IoU 0.59, Module B RMSE 1.98m, 최소 층고 2.29m를 판정 기준값으로 사용했습니다. 이 값들은 현재 코드에 고정된 해커톤 실험 설정이며, 운영 적용 전 별도 검증과 보정이 필요합니다.
산점도는 최대 10,000개 표본의 실제 높이와 예측 높이를 비교합니다. 현재 결과에는 높은 건물에서의 과소추정 경향이 보여, 추가 학습·이상치 처리·높이 구간별 보정이 필요합니다. 이미지의 한글 글꼴이 없는 실행 환경에서는 일부 글자가 네모로 표시될 수 있습니다.
| 파일 | 역할 |
|---|---|
filter_buildings_spatial.py |
연도별 건물 벡터 공간 조인 |
raster.py |
건물 벡터를 학습용 마스크로 래스터화 |
tiling.py |
Module A용 SAR·마스크 칩 생성 |
prepare_B.py |
Module B용 SAR·마스크 칩과 높이 라벨 생성 |
dataset.py |
Module A 데이터셋 |
dataset_B.py |
Module B 데이터셋 |
train_unet.py |
면적 세그멘테이션 모델 학습 |
train_B.py |
높이 회귀 모델 학습 |
test.py |
두 모델의 통합 추론과 최종 GeoJSON 생성 |
plotscatter.py |
높이 예측 산점도 생성 |
app.py |
불법 증축 의심 건물 지도 대시보드 |
Python 3.11 이상과 GDAL을 포함한 지리공간 라이브러리 설치 환경을 권장합니다.
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtNVIDIA GPU를 사용할 경우 CUDA 환경에 맞는 PyTorch 설치가 별도로 필요할 수 있습니다.
원천데이터, 생성된 칩, 모델 가중치, 최종 GeoJSON은 용량과 데이터 배포 조건 때문에 저장소에 포함하지 않았습니다. 실행하려면 다음 구조로 별도 준비해야 합니다.
data/
├── SF_2025_Filtered_by_2022.shp (+ .dbf/.shx/.prj/.cpg)
├── module_area.tif
├── training_data/
│ ├── K5_Stack.tif
│ ├── SF_Footprint.shp (+ sidecar files)
│ └── SF_Footprints_2025_with_height.shp (+ sidecar files)
├── training_dataset_A/
│ ├── module_A_input/
│ └── masks/
└── training_dataset_B/
├── module_B_input/
├── module_B_mask/
└── Y_labels.csv
pth_folder/
├── best_model_unet.pth
└── best_model_height.pth
final_analysis_complete.geojson
경로 또는 컬럼명이 다른 데이터는 각 스크립트 상단의 설정값을 수정해야 합니다.
이미 학습된 가중치가 있다면 통합 추론부터 실행할 수 있습니다.
python test.py
streamlit run app.py처음부터 재학습하려면 다음 순서로 실행합니다.
python filter_buildings_spatial.py
python raster.py
python tiling.py
python prepare_B.py
python train_unet.py
python train_B.py
python test.py
python plotscatter.py
streamlit run app.py대용량 데이터는 Git LFS에 무조건 올리기보다, 원 배포처 링크·체크섬·다운로드 안내를 별도로 제공하는 방식을 권장합니다.
