APAC Solution Challenge 2025은 Google Developer Groups(GDG on Campus)와 Hack2skill, 그리고 ADB와의 협업으로 진행된, 아시아·태평양 지역 대학생 대상 AI 해커톤입니다.
3월 팀 빌딩 및 신청으로 시작되어 5월 16일에 프로젝트 최종 제출로 진행되었으며, Google 에서 정의한 지속가능발전목표(SDG) 중 5개의 테마가 주제가 되었습니다.
또한 Gemini의 사용은 필수였습니다.

GDGoC 건국대학교 챕터에서 팀을 빌딩하여 대회에 참가하였습니다.
저희 팀은 3명의 개발자와 1명의 디자이너로 구성되었습니다. 저는 백엔드 및 머신러닝 담당으로 1명의 백엔드 개발자와 협업하여 프로젝트를 진행했습니다.
2025년 3월 대한민국에서 동시다발적으로 발생한 산불 사건이 프로젝트의 출발점이었습니다. 기존의 인력 기반 산불 감시 시스템의 한계를 인식하고, 이미 설치된 인프라(CCTV)를 활용한 자동화 솔루션을 고안했습니다.

Vector DB와 관련된 구현 사항은 시간이 촉박하여 제외하였습니다.
직접 컴퓨터 비전을 사용한 AI 알고리즘을 개발하는 것보다 YOLO를 사용하는 것을 선택했습니다. 저희는 잘 정리된 데이터 셋을 제공해서 학습시키기만 하면 되었죠.
“YOLO”는 You Only Look Once의 약자로, 실시간 객체 탐지(Object Detection)에 널리 사용되는 딥러닝 기반 알고리즘입니다. 한 번의 신경망(Convolutional Neural Network) 연산으로 이미지 내의 객체 위치(bounding box)와 클래스(label)를 동시에 예측하는 것이 특징입니다.
YOLO는 이미지를 한 번만 처리해 객체를 탐지하므로 매우 빠르며, 실시간 영상 처리에도 적합한 고속 객체 탐지 알고리즘입니다.
이미지 기반 학습을 해야하다보니 학습 데이터를 구하는 것이 가장 중요했습니다.
저희는 AI HUB에서 제공하는 지역안전재난(산불) 방재의 고도화를 위한 대규모 인공지능 데이터베이스를 사용하여 학습을 수행했습니다.
데이터 용량이 매우컸지만, 이미 라벨링까지 되어있는 데이터셋이어서 사용하기 간편했습니다.
학습은 RTX 4070이 설치된 건국대학교 X-Space 의 실습용 컴퓨터를 사용하여 진행되었습니다.
처음으로 해보는 AI 학습이어서 시간이 얼마나 소요될 지 몰라서 하루 정도 학교에서 학습을 진행했습니다.
에포크(epoch)는 최소 50회~150회 반복해야한다고 정보를 확인했지만 시간 문제로 약 33회만 반복해서 진행했습니다.

객체가 잘 검출 되는 것을 확인했습니다. 이제 이 알고리즘을 활용해서 서버를 구현했습니다.
FastAPI 서버는 단순한 API 제공을 넘어서, 클라이언트의 요청을 받아 YOLO 추론 및 Gemini Vision API 연동까지의 흐름을 매끄럽게 이어주는 역할이었습니다.
server/ ├── app/ │ ├── api/ # API 라우터 모듈 │ │ ├── deps.py # 의존성 주입 함수 │ │ └── v1/ │ │ └── endpoints/ │ │ └── main.py # 주요 API 엔드포인트 │ ├── core/ # 핵심 설정 (CORS, 세팅 등) │ ├── models/ # Pydantic 기반 요청/응답 모델 │ ├── services/ # 서비스 로직 (Gemini 연동, YOLO) │ └── utils/ # 헬퍼 함수들 ├── tests/ # 단위 테스트 └── main.py # FastAPI 진입점
1. /predict API: 실시간 화재 예측
@router.post("/predict", response_model=PredictionResponse) async def predict_fire( image: UploadFile = File(...) ): # 이미지 저장 saved_path = await save_upload_file(image) ... # YOLO 추론 yolo_results = predict_yolo(saved_path) # Gemini Vision 연동 gemini_results = query_gemini(saved_path) ... return result
save_upload_file와 같은 함수는 업로드된 이미지를 로컬 임시 폴더에 저장한 뒤 처리를 진행합니다.
2. YOLO 추론
def predict_yolo(image_path: str) -> list: model = torch.hub.load(...) # YOLO 모델 로드 results = model(image_path) ... return processed_results
3. Gemini Vision 연동
def query_gemini(image_path: str) -> dict: encoded = image_to_base64(image_path) prompt = "이 이미지는 실제 산불로 보입니까?" ... response = requests.post(GEMINI_API_URL, json={...}) return response.json()
4. 웹소켓 실시간 통신 기능
예측 결과를 클라이언트 측 대시보드에 실시간으로 전송하기 위해 WebSocket 관련 기능을 구현했습니다. 이 기능은 실제 관제 시스템처럼, 대시보드에서 예측 결과를 즉시 확인할 수 있도록 합니다.
회고는 4L 방식으로 진행하고자 합니다.