이 안내서는 CCTV·드론 영상에서 연기와 화염 후보를 찾아 근무자에게 보여 주는 탐지 모델을 만드는 과정을 다룹니다. 학습 코드는 코딩 에이전트가 써 줄 수 있으므로, 이 안내서는 무엇을 탐지해 어디까지 쓸지와 어떤 데이터로 확인할지처럼 사람이 정해야 하는 것을 중심으로 씁니다.
- 탐지 대상·카메라·결과를 볼 사람·완성 기준을 모델보다 먼저 정할 수 있습니다.
- 용도와 이용 조건에 맞는 공개 데이터셋을 고르고 영상·카메라 단위로 나눌 수 있습니다.
- 미탐과 오탐을 나누어 평가하고 임계값 변경의 양쪽 영향을 확인할 수 있습니다.
- 탐지 결과를 경보 후보로만 쓰고 사람 확인과 재학습으로 연결할 수 있습니다.
AI에게 맡기는 프롬프트
코딩 에이전트에게 공개 데이터셋으로 탐지 모델을 학습·평가하게 할 때 쓰는 프롬프트입니다. 공개 데이터셋만 내려받은 작업 폴더에서 씁니다. 관할 CCTV 영상에는 사람과 차량번호가 찍히므로 외부 AI에 넣지 않고, 실제 영상으로 평가해야 하면 기관 절차를 거쳐 승인된 내부 환경에서 합니다.
[목적] 공개 화재·연기 데이터셋으로 연기(smoke)·화염(fire) 탐지 모델을 학습하고, 경보 후보로 쓸 수 있는지 평가합니다. 결과는 시범 운영 여부를 검토하는 보고용 자료입니다. [자료] data 폴더의 공개 데이터셋(이름과 이용 조건은 README에 적었습니다). 데이터셋의 성격과 이용 조건은 https://119-ai-studio.kr/kg/topic-fire-smoke-vision.txt 에서 맥락을 먼저 파악하고, 근거는 원문 주소와 함께 정리해 주세요. [작업 규칙] - 학습·검증·시험은 영상·카메라·촬영일 단위로 나누고, 같은 영상의 프레임이 두 곳에 들어가지 않았는지 확인한 결과를 출력해 주세요. - 가중치 이름과 학습 인자는 설치된 라이브러리의 공식 문서에서 확인한 것만 씁니다. - data 폴더 밖의 파일은 열지 말고, 영상을 외부로 보내지 마세요. [완성 기준] 클래스별 미탐·오탐 수, 임계값 세 가지에서의 변화 표, 오탐 프레임 목록(원인 칸은 비워 둡니다). 평가한 고유 이미지 수가 시험 세트 이미지 수와 같은지 검산하고, 미탐·오탐은 클래스별 객체 수로 따로 세어 주세요. 자료에 없는 값(카메라 화각, 이용 조건 등)은 [확인 필요]로 남겨 주세요. [하지 말 것] 정확도 한 숫자로 요약하지 마세요. 자동 경보 발령이나 현장 대응 방식은 정하지 마세요. 확인 기준은 https://119-ai-studio.kr/fire-smoke-detection.html 안내서를 따릅니다. 작업 전에 빠진 정보가 있으면 먼저 질문해 주세요.
결과를 받은 뒤 확인할 것은 다음과 같습니다.
- 같은 영상·카메라의 프레임이 학습과 시험에 함께 들어 있지 않은지 출력으로 봅니다.
- 평가한 고유 이미지 수가 시험 세트 이미지 수와 같은지, 미탐·오탐이 클래스별 객체 수로 나뉘어 있는지 봅니다.
- 오탐 프레임을 직접 열어 노을·조명·수증기 같은 원인을 사람이 분류합니다.
먼저 정할 것
모델을 고르기 전에 사람이 다음을 정합니다.
| 정할 것 | 예 |
|---|---|
| 탐지 대상 | 연기와 화염 두 클래스 |
| 카메라 종류 | 건물 CCTV, 산불 감시 카메라, 드론. 시점이 다르면 데이터도 달라집니다. |
| 결과를 볼 사람과 쓰는 방식 | 근무자 화면에 후보 장면을 표시하는 데까지 |
| 완성 기준 | 카메라별 하루 오경보 수, 영상 단위 미탐, 첫 경보까지 걸린 시간 |
| 추가로 필요한 것 | 영상 사용 승인, 관제 연동 담당, 라이브러리·데이터 라이선스 확인 |
연기는 화염보다 먼저 나타나 조기 경보에서 중요하지만, 경계가 흐릿하고 수증기·안개·구름처럼 비슷한 배경이 많아 탐지가 어렵습니다. 그래서 연기 후보는 낮은 임계값으로 넓게 모으고, 경보는 시간 누적과 사람 확인을 거쳐 냅니다.
동작 원리
영상 탐지는 긴 동영상을 한꺼번에 이해하는 일이 아닙니다. 카메라가 보내는 영상을 프레임이라는 정지 화면으로 나누고, 각 화면에서 후보 영역을 찾은 뒤, 후보마다 fire 또는 smoke일 가능성과 위치를 냅니다. 신뢰도 임계값보다 낮은 후보는 제외합니다.
모델은 사람이 화염·연기를 네모 상자(bounding box)와 클래스로 표시한 예시를 보고 그 안의 시각 패턴을 익힙니다. 그래서 라벨 기준이 사람마다 다르면 모델의 판단도 흔들립니다.
여기까지가 한 프레임의 판단입니다. 운영 경보는 그다음 단계입니다. 프레임별 탐지 이력을 짧게 모아 지속 여부를 보고, 마스킹 구역인지 확인하고, 사람에게 보여 줄 장면과 함께 알림 후보를 만듭니다. 모델 출력과 경보 발령은 같은 결정이 아닙니다.
그래서 상자 자체가 엉뚱하면 데이터와 모델을 살피고, 상자는 맞는데 알림이 너무 잦으면 임계값·시간 누적·영역 마스킹을 살핍니다.
데이터 고르기와 나누기
처음에는 용도별로 몇 건만 고르고, 이용 조건은 데이터셋 카드와 원문에서 다시 확인합니다. 나머지는 학습 데이터셋 허브에 있습니다.
| 용도 | 데이터셋 | 이용 조건 | 주의 |
|---|---|---|---|
| 기준선 학습 | D-Fire | CC0 | 일부 이미지는 원 제공처 조건을 따릅니다. |
| 오탐 줄이기 | Pyro-SDIS | Apache-2.0 | 산불 감시 카메라의 운영 오탐이 음성 샘플로 들어 있습니다. |
| 국내 CCTV·유사 장면 | 화재 발생 예측 영상, 같은 영상 고도화 | AI 허브 이용 조건, 신청·승인 | 정상 장면이 함께 있습니다. |
| 영상 단위 평가 | FIRESENSE, HPWREN FIgLib | CC BY 4.0, CC BY-NC 4.0 | 영상 단위 양성·음성, 발화 전후 장면이 있습니다. |
| 카메라 종류 교차 | FASDD | CC BY-SA 4.0 | 지상 카메라·드론·위성 이미지가 있습니다. |
데이터를 나눌 때는 비율보다 나누는 단위가 먼저입니다. 같은 영상·같은 카메라·같은 날의 프레임은 학습·검증·시험 가운데 한 곳에만 둡니다. 이웃 프레임이 양쪽에 들어가면 검증 점수가 실제보다 높게 나옵니다.
라벨 기준은 문서로 적어 작업자끼리 맞춥니다. 상자는 화염·연기의 윤곽 전체와 그 위로 이어지는 연기 기둥까지 감싸고, 노을·붉은 조명·수증기는 배경으로 둡니다. 라벨 품질 점검은 훈련 데이터 라벨 품질, 학습 전에 잡기에 있습니다.
관할 CCTV와 같은 화각의 영상이 있어야 새 카메라의 성능을 확인할 수 있습니다. 다만 실제 CCTV 영상은 개인정보 보호법 원문과 기관의 영상정보 처리 절차를 확인한 뒤에만 모읍니다.
멀티모달 모델과 자동 라벨의 사용 범위
이미지를 이해하는 대화형 AI(멀티모달 모델)는 경보 후보 몇 장에 대한 2차 의견과 라벨 상자 초안에 씁니다.
- 상시 실시간 판정에는 쓰지 않습니다. 연속 영상을 계속 보내야 하고 응답 지연과 비용이 생깁니다.
- 외부 서비스로 CCTV 프레임을 보내기 전에는 개인정보, AI에 넣기 전에 점검하기로 점검합니다. 자체 서버용 모델 후보는 AI 도구에 있고, 화재 영상에서의 성능은 기관이 따로 확인합니다.
- 자동 라벨 초안은 그대로 정답으로 쓰지 않습니다. 사람이 원본 영상과 라벨 기준을 보고 확정합니다.
모델 학습
경량 YOLO 계열은 작은 장비에서도 돌릴 수 있습니다. 처리 속도는 장비와 해상도에 따라 다르므로 실제로 쓸 장비에서 잽니다.
from ultralytics import YOLO # 공식 사전학습 가중치(n은 가장 작은 크기). 이름은 공식 문서의 모델 표에서 확인합니다. model = YOLO("yolo26n.pt") # 화재 데이터셋으로 미세조정 model.train(data="fire_smoke.yaml", epochs=100, imgsz=640, patience=20)
사전학습 모델에서 시작해 화재 데이터로 미세조정(fine-tuning)하면 처음부터 학습할 때보다 적은 데이터로 시작할 수 있습니다. 코드는 AI가 써 주더라도, 사용한 데이터셋·분할 기준·가중치 이름·결과는 기록으로 남깁니다.
성능 평가 방법
조기 경보에서는 두 오류의 비용이 다르므로 정확도 하나로 묶지 않고 나눠 봅니다.
- 미탐(놓침): 실제 화재를 못 잡음. Recall로 관리합니다.
- 오탐(허위): 화재가 아닌데 경보. 근무자의 신뢰를 떨어뜨립니다. Precision으로 관리합니다.
객체탐지는 보통 mAP(클래스별 평균 정밀도)로 모델끼리 비교합니다. 다만 연기는 경계가 흐려 mAP가 운영 성능을 다 보여 주지 못합니다. 운영 검토에는 카메라별 하루 오경보 건수, 영상 단위 미탐, 연기가 처음 보인 시각부터 첫 경보까지 걸린 시간을 함께 씁니다.
신뢰도 임계값을 어디에 두느냐에 따라 경보 성향이 바뀝니다.
| 신뢰도 임계값 | 경보 성향 | 미탐(놓침) | 오탐(허위) |
|---|---|---|---|
| 낮게(예: 0.25) | 웬만하면 후보로 냄 | 적음 | 많음 |
| 중간(예: 0.5) | 균형 | 보통 | 보통 |
| 높게(예: 0.7) | 확실할 때만 냄 | 많음 | 적음 |
조기 경보에서는 놓침의 대가가 크므로 보통 임계값을 낮게 잡아 미탐을 줄이고, 늘어난 오탐은 운영 규칙으로 거릅니다. 위 숫자는 방향을 보여 주는 예시이며, 실제 값은 카메라별 미탐·오탐 목록을 보고 담당자가 정합니다.
가상 상황: 새벽 물류창고의 옅은 연기
다음은 학습용 가상 상황입니다. 새벽 5시, 관할 물류창고 CCTV에 옅은 회색 기운이 한 프레임 잡힙니다. 단일 프레임만 보고 경보를 내면, 그것이 아침 해의 역광이나 환기구 수증기였을 때 헛경보가 나갑니다. 헛경보가 몇 번 반복되면 야간 근무자는 시스템을 믿지 않게 되고, 실제 화재 알림도 오작동으로 넘길 수 있습니다.
반대로 "여러 프레임에 걸쳐 같은 자리에서 계속 잡힐 때만 경보 후보"로 두면, 스쳐 지나간 역광은 걸러지고 번지며 지속되는 신호만 남습니다. 같은 모델이라도 경보를 언제 낼지에 따라 근무자의 신뢰가 달라집니다.
오탐 줄이기
단일 프레임의 탐지만으로 경보를 내면 노을·반사광에 쉽게 속습니다.
- 시간 누적: N개 연속 프레임에서 탐지될 때만 경보 후보로 올립니다.
- 영역 마스킹: 하늘·창문처럼 늘 오탐이 나는 구역을 뺍니다.
- 2차 확인: 연기 후보가 지속되면 열화상·감지기 신호나 근무자 확인을 붙입니다. 화염이 함께 보일 때만 경보를 내면 화염이 보이기 전의 초기 연기를 놓칩니다.
시간 누적은 최근 프레임들의 탐지 여부를 모아 두고 일정 횟수 이상일 때만 경보 후보를 내는 방식입니다.
from collections import deque recent = deque(maxlen=5) # 최근 5개 프레임의 연기 탐지 여부 def should_alert(smoke_detected): recent.append(smoke_detected) return sum(recent) >= 3 # 5프레임 중 3프레임 이상일 때만 경보 후보
선택지와 트레이드오프
같은 모델이라도 운영 규칙에 따라 쓰임이 달라집니다.
| 선택지 | 맞는 상황 | 얻는 것 | 감수할 점 |
|---|---|---|---|
| 단일 프레임 후보 표시 | 사람이 화면을 계속 보고 즉시 후보만 받아야 할 때 | 빠른 표시 | 반사광·수증기 같은 순간 오탐이 많이 보일 수 있음 |
| 여러 프레임 시간 누적 | 짧은 흔들림보다 지속 신호가 중요한 알림 | 순간 오탐 감소 | 누적 조건만큼 알림이 늦어질 수 있음 |
| 엣지 추론 후 사람 확인 | 영상 외부 전송을 줄이고 현장 지연을 관리해야 할 때 | 전송 범위와 지연을 줄일 여지 | 장비 성능·업데이트·장애 상태를 현장에서 관리해야 함 |
가상 사례: 교육 담당자의 훈련 영상 오탐 검수
다음은 설명을 위한 가상 사례입니다. 교육 담당자가 연무를 사용한 훈련 영상의 탐지 결과를 검토해 왜 틀렸는지 분류합니다. 영상에는 연무 장면, 붉은 조명, 역광이 섞여 있고, 일부는 카메라 각도가 바뀌어 있습니다.
담당자는 틀린 상자를 곧바로 지우지 않고 연무를 놓침, 조명을 화염으로 봄, 새 화각에서 상자 흔들림처럼 원인을 나눕니다. 조명 오탐은 배경 예시 보강 후보로, 새 화각 오류는 해당 카메라 프레임 수집 후보로 보냅니다. 훈련용 연무를 학습에 넣을지는 라벨 기준을 먼저 확인한 뒤 정합니다.
검수자가 모델 출력이나 자동 라벨 초안만 보고 정답 라벨까지 따라 그리면 실패합니다. 기존 오류가 다음 학습 데이터에 그대로 들어가기 때문입니다. 원본 영상과 라벨 기준을 사람이 다시 보고, 수정 이유를 기록한 항목만 다음 학습 후보로 승인합니다.
현장 배치에서 챙길 것
- 지연: 후보 생성부터 알림 표시까지 걸린 시간을 쓸 장비에서 잽니다.
- 관제 연동: 탐지 → 후보 표시 → 근무자 확인 → 발령 순서를 지키고, 발령은 소속 기관 기준에 따릅니다.
- 재학습: 계절 변화나 새 CCTV로 영상 분포가 바뀝니다. 조건을 정해 재학습하는 틀은 예측 모델 운영, 드리프트 감지와 재학습 시점과 같고, 영상에서는 카메라별 오탐률과 근무자가 기각한 후보의 비율을 지표로 씁니다.
- 개인정보: 실제 CCTV 프레임에는 사람·차량번호가 찍히므로, 모으거나 공유하기 전에 기관 절차와 개인정보, AI에 넣기 전에 점검하기를 거칩니다.
- 라이선스: Ultralytics 저장소의 라이선스는 오픈 소스 카드 기준 AGPL-3.0입니다. 기관 시스템에 넣기 전에 원문을 담당자와 확인합니다.
국내에서는 소방청 국립소방연구원이 지하주차장 전기차 화재 초기 연기를 영상으로 식별하는 기술을 연구하고 있습니다(공공 AI 도입 사례).
이 방법이 잘 안 통할 때
탐지 모델이 잘 보지 못하는 조건은 다음과 같습니다.
- 짙은 안개·야간: 연기와 배경의 구분이 어려워집니다. 열화상·감지기 같은 다른 신호와 함께 봅니다.
- 가림: 발화점이 건물·수목에 가리면 연기가 그 위로 올라온 뒤에야 잡힙니다.
- 처음 보는 각도·렌즈: 학습에 없던 화각의 새 CCTV는 성능이 떨어질 수 있어 그 카메라의 승인된 프레임으로 따로 평가합니다.
이런 조건의 카메라일수록 근무자 확인 단계를 빼지 않습니다.
문제 해결
| 증상 | 가능한 원인 | 처방 | 확인 |
|---|---|---|---|
| 새 카메라에서만 탐지가 급격히 흔들림 | 학습에 없던 화각·조명·렌즈 | 해당 카메라의 승인된 프레임을 오류 유형별로 모아 재평가 | 기존 카메라와 새 카메라의 지표를 분리해 비교 |
| 노을 시간에 화염 알림이 반복됨 | 반사광·붉은 배경이 화염 특징과 겹침 | 오탐 프레임을 배경 예시로 검토하고 고정 구역이면 마스킹 후보화 | 같은 시간대의 비화재 영상을 다시 재생해 알림 수 확인 |
| 모델 상자는 맞는데 경보가 너무 늦음 | 시간 누적 조건이 과도하거나 처리 지연이 큼 | 프레임 처리 시간과 누적 조건을 따로 측정해 병목을 분리 | 후보 생성 시각과 알림 표시 시각을 기록해 비교 |
자주 묻는 질문
Q. 신뢰도 임계값은 한 번 정하면 모든 카메라에 같이 써도 되나요?
카메라의 각도·조명·배경이 다르면 같은 임계값에서도 오류 양상이 달라질 수 있습니다. 공통 시작값을 둘 수는 있지만, 카메라별 미탐과 오탐을 확인한 뒤 적용 범위를 사람이 승인합니다.
Q. 시간 누적을 쓰면 미탐이 사라지나요?
아닙니다. 순간 오탐을 줄이는 데 도움이 되지만, 짧게 보이는 실제 신호가 누적 조건을 못 채울 수도 있습니다. 누적 전후의 미탐을 따로 비교합니다.
Q. 오탐 프레임은 전부 학습 데이터에 넣으면 되나요?
먼저 라벨 오류, 새로운 배경, 운영 규칙 문제를 구분합니다. 학습으로 풀 문제가 아니면 데이터만 늘고 원인은 남으므로, 사람 검수로 이유가 확정된 프레임만 후보로 둡니다.
Q. 탐지 결과로 자동 발령까지 연결해도 되나요?
이 안내서의 결과는 조기경보 후보입니다. 카메라 장애와 시각적 혼동이 남으므로 실제 행동은 소속 기관 기준과 사람 확인 절차를 거쳐야 합니다.
핵심 정리
- 탐지 대상·카메라 종류·결과를 볼 사람·완성 기준을 먼저 정하고 그다음 모델을 고릅니다.
- 데이터는 용도와 이용 조건으로 고르고, 영상·카메라·촬영일 단위로 나눕니다.
- 미탐과 오탐을 나눠 보고, 카메라별 오경보 수와 첫 경보까지 걸린 시간을 함께 잽니다.
- 탐지 결과는 경보 후보이며, 발령은 근무자 확인과 소속 기관 기준을 거칩니다. 실제 CCTV 영상은 기관 절차를 거친 뒤에만 씁니다.
다음 단계
- 훈련 데이터 라벨 품질, 학습 전에 잡기 — 모델을 다시 학습하기 전에 상자 기준과 의심 라벨을 점검하는 다음 단계입니다.
- 예측 모델 운영, 드리프트 감지와 재학습 시점 — 배치 뒤 계절·카메라 변화로 성능이 달라지는지를 운영 지표로 연결할 수 있습니다.
- AI 결과, 제출 전 확인 사항 — 탐지 결과를 보고·공유할 때 자동 후보와 사람 판단을 구분하는 마지막 확인입니다.