아까 팀장님이랑 이야기 나눈 방식으로 일단 만들어 보았습니다. 이 코드를 살리거나 죽이거나 어떤 방식이든 상관 없습니다.. 혹여나 더 좋은 방법이 있다면 가차없이 버려도 괜찮습니다. 화재감지 관련 내용을 두 분께 맡기고 자러 가보겠습니다.. 학습은 아까 드론으로 촬영한 영상 데이터로 해 놓았습니다. 이 파일에는 아직 추가하지 않았고, 메인 컴퓨터에 있을겁니다. 화재건물만을 라벨링해 학습을 진행했기 때문에 추가 데이터 및 학습이 필요하다면 연습용 경기장에서도 수급이 가능할 것 같습니다.
- 드론이 촬영한 원본 이미지를 입력으로 받아, 자동으로 맵 영역만 crop한 뒤 YOLO 모델로 불 난 건물을 찾고, 섹터 번호 2개를 JSON으로 저장합니다.
- 섹터는 정규화된 건물 중심 좌표(
config.BUILDING_CENTERS_NORM) 중 가장 가까운 건물을 선택하는 방식입니다.
config.py: 경로, 미션 코드, 모델 경로, 맵 crop 좌표, 건물 중심 좌표 설정main.py: 최신 이미지 자동 crop → YOLO 추론 → 섹터 2개 추출 → JSON 저장sectors.py: YOLO 박스 중심과 가장 가까운 건물 센터 계산debug_building_centers.py: 원본 이미지를 자동 crop한 뒤 건물 중심 좌표를 클릭해 정규화 값 확인models/best.pt: YOLO 가중치(직접 추가 필요)
- Python 3.11 가상환경 생성 및 활성화 (예시)
py -3.11 -m venv .venv .venv\Scripts\activate
- 의존성 설치
pip install -r requirements.txt
models/best.pt를models폴더에 복사합니다.
config.IMAGE_DIR: 원본 드론 이미지가 떨어지는 폴더 (기본:~/Documents/maicon/local_inbox)config.JSON_OUT_DIR: 결과 JSON을 저장할 폴더 (기본:~/Documents/ai_outbox)config.MISSION_CODE: 저장될 JSON 파일 이름(MISSION_CODE.json)
config.py에서MAP_CROP_X1, MAP_CROP_Y1, MAP_CROP_X2, MAP_CROP_Y2값을 설정합니다.- 원본 이미지에서 맵 영역의 좌상단/우하단 픽셀 좌표입니다.
- 예:
MAP_CROP_X1, MAP_CROP_Y1 = 150, 120(좌상단) - 예:
MAP_CROP_X2, MAP_CROP_Y2 = 1150, 920(우하단)
- 이 좌표는 원본 이미지 기준이므로, 실제 드론 이미지에서 맵 영역을 확인해서 수정하세요.
주의: 이 과정은 초기 설정 시 한 번만 수행하면 됩니다. 이후 실제 테스트 시에는 자동으로 미리 설정된 좌표를 사용합니다.
- 원본 드론 이미지를
IMAGE_DIR에 넣습니다. python debug_building_centers.py실행- 프로그램이 최신 원본 이미지를 자동으로 crop해서 보여줍니다.
- 1번부터 9번까지 순서대로 각 섹터의 건물 중심을 클릭합니다.
- 각 클릭 시 터미널에 섹터 번호와 정규화 좌표가 출력됩니다.
- 9개 모두 클릭하면 자동으로
config.py에 저장됩니다. - ESC(27) 키로 종료할 수 있습니다.
- 저장된 좌표 확인
config.py의BUILDING_CENTERS_NORM딕셔너리에 섹터 번호별로 좌표가 저장됩니다.- 좌표는 0~1 범위의 정규화 좌표이며 해상도와 무관하게 동일하게 사용됩니다.
- 형식:
{1: (x_norm, y_norm), 2: (x_norm, y_norm), ..., 9: (x_norm, y_norm)}
config.py에서 다음을 확인합니다:MAP_CROP_X1, MAP_CROP_Y1, MAP_CROP_X2, MAP_CROP_Y2가 올바르게 설정되었는지BUILDING_CENTERS_NORM가 실제 값으로 채워졌는지 (초기 설정 완료 여부)
- 원본 드론 이미지를
IMAGE_DIR에 넣습니다. python main.py실행config.IMAGE_DIR의 최신 원본 이미지를 자동으로 선택합니다.- 자동으로 맵 영역만 crop합니다.
- 미리 설정된
BUILDING_CENTERS_NORM좌표를 자동으로 사용합니다. - YOLO 추론 후 감지된 불 박스 중심과 가장 가까운 건물 2개를 선택합니다.
- 두 섹터가 감지되지 않으면 경고만 출력하고 JSON은 저장하지 않습니다.
- 두 섹터가 감지되면
config.JSON_OUT_DIR/MISSION_CODE.json이 생성됩니다.
중요: 실제 테스트 시에는 좌표를 직접 찍는 과정이 없습니다. 미리 설정된 좌표를 자동으로 사용합니다.
- 원본 이미지를
IMAGE_DIR에 넣으면 자동으로 맵 영역만 crop해서 사용합니다. - 촬영 편차가 있더라도 정규화 좌표 덕분에 동일하게 동작합니다.
- 건물 중심 좌표는 초기 설정 시 한 번만 설정하면 되며, 이후 모든 테스트에서 자동으로 사용됩니다.
BUILDING_CENTERS_NORM값을 수동으로 변경할 때마다 저장 후main.py를 다시 실행하세요.MAP_CROP_X1, MAP_CROP_Y1, MAP_CROP_X2, MAP_CROP_Y2값도 드론 촬영 각도가 바뀌면 조정이 필요할 수 있습니다.- 각 섹터 번호(1~9)는
BUILDING_CENTERS_NORM딕셔너리의 키로 저장되어 있어, 좌표별로 섹터 번호가 명확히 매핑됩니다. - 로그와 좌표 출력은 터미널에 표시되므로, IDE 터미널이나 CMD에서 실행하면 편리합니다.