CCTV와 드론 영상은 화재를 가장 먼저 목격하는 눈입니다. 이 안내서는 영상 스트림에서 화염과 연기를 실시간으로 탐지해 조기 경보로 연결하는 전 과정을, 현장 적용 관점에서 단계별로 정리합니다.
- 화염·연기 객체탐지가 라벨에서 무엇을 배우는지 설명할 수 있습니다.
- 미탐과 오탐을 나누어 평가하고 운영 목적에 맞는 임계값을 검토할 수 있습니다.
- 단일 프레임 탐지와 시간 누적 경보의 차이를 비교할 수 있습니다.
- 탐지 결과를 사람 확인과 재학습으로 연결하는 운영 흐름을 설계할 수 있습니다.
동작 원리
영상 탐지는 긴 동영상을 한꺼번에 이해하는 일이 아닙니다. 카메라가 보내는 영상을 프레임이라는 정지 화면으로 나누고, 각 화면에서 후보 영역을 찾은 뒤, 후보마다 fire 또는 smoke일 가능성과 위치를 냅니다. 같은 물체 주변에 겹친 후보가 여러 개 생기면 대표 상자를 남기고, 정한 신뢰도 임계값보다 낮은 후보는 제외합니다.
여기까지가 한 프레임의 판단입니다. 운영 경보는 그 다음 층입니다. 프레임별 탐지 이력을 짧게 모아 지속 여부를 보고, 마스킹 구역인지 확인하고, 사람에게 보여 줄 장면과 함께 알림 후보를 만듭니다. 즉 모델 출력과 경보 발령은 같은 결정이 아닙니다. 모델은 화면의 후보를 내고, 운영 규칙은 시간·구역·사람 확인을 더해 행동 여부를 정합니다.
이 구분을 알면 문제를 찾는 순서도 선명해집니다. 상자 자체가 엉뚱하면 데이터와 모델을 살피고, 상자는 맞는데 알림이 너무 잦으면 임계값·시간 누적·영역 마스킹을 살핍니다. 모든 문제를 재학습으로만 풀지 않아도 됩니다.
탐지 모델은 무엇을 배우는가
신임 대원에게 "연기를 알아보라"고 가르치는 장면을 떠올려 보세요. 연소 화학을 강의하는 게 아니라, 연기가 찍힌 사진 수백 장을 보여 주며 "이게 연기다" 하고 짚어 줍니다. 충분히 보고 나면 대원은 처음 가 보는 건물에서도 연기를 알아봅니다. 객체탐지 모델도 똑같은 방식으로 배웁니다.
기술적으로 보면, 모델은 "연기는 회색이고 위로 퍼진다" 같은 규칙을 문장으로 외우지 않습니다. 사람이 화염·연기를 네모 상자(bounding box)로 표시한 예시를 수없이 보고, 그 상자 안의 시각 패턴을 스스로 익힙니다. 각 상자에는 그것이 fire인지 smoke인지 클래스가 붙어 있고, 모델은 "이런 모양·색·질감이면 연기"라는 감을 데이터로부터 잡아 갑니다.
그래서 이 작업의 성패는 모델 종류보다 어떤 예시를 얼마나 정확히 보여 주느냐에 달려 있습니다. 아무리 좋은 신경망도 잘못 표시된 예시로 배우면 잘못 배웁니다. 다음 절의 라벨링에 공을 들여야 하는 이유입니다.
무엇을 탐지할 것인가
화재 탐지는 두 개의 클래스로 나눠 접근합니다. fire(화염)와 smoke(연기)입니다. 연기는 화염보다 먼저, 더 넓게 나타나므로 조기 경보에서 특히 중요합니다.
다만 연기는 화염보다 탐지가 어렵습니다. 경계가 흐릿하고, 수증기·안개·구름·먼지처럼 생김새가 비슷한 배경이 많기 때문입니다. 그래서 연기 클래스는 더 많은 예시와 더 세심한 라벨을 필요로 합니다. 불꽃이 눈에 보일 때는 이미 늦은 경우가 많으니, 이 어려운 연기 쪽에 공을 들이는 것이 조기 경보의 값어치입니다.
현장 규칙: 연기 탐지는 민감하게, 경보 발령은 보수적으로. 두 단계를 분리하면 오탐을 크게 줄일 수 있습니다.
데이터 준비와 라벨링
공개 화재 데이터셋에 더해, 관할 구역의 실제 CCTV 프레임을 일부 섞으면 성능이 눈에 띄게 좋아집니다. 실제 설치 각도·조명을 모델이 학습하기 때문입니다.
- 박스 라벨은 화염/연기의 윤곽 전체를 넉넉히 감싸도록
- 혼동 객체(노을, 붉은 조명, 수증기)는 배경으로 명확히 분리
- 학습:검증:테스트 = 7:2:1 비율 권장
라벨을 어떻게 그리느냐가 곧 모델의 교재입니다. 같은 프레임이라도 이렇게 갈립니다.
- 잘된 상자: 옅은 연기의 가장자리까지, 배경이 비쳐 보이는 부분도 넉넉히 감쌈. 연기 기둥이 화염 위로 이어지면 그 기둥도 포함.
- 흔한 실수: 화염만 딱 맞게 감싸고 그 위 연기는 빠뜨림 / 주방 환기구·온수 배관의 수증기를 연기로 표시 / 사람마다 상자 기준이 달라 같은 장면을 다르게 라벨.
이런 라벨 자체의 품질을 학습 전에 걸러 내는 방법은 훈련 데이터 라벨 품질, 학습 전에 잡기에 따로 정리돼 있습니다. 라벨링 작업 도구(Label Studio·CVAT)는 안전한 AI 운영 도구를 참고하세요.
모델 학습
경량 YOLO 계열은 엣지 장비에서도 실시간 추론이 가능해 현장 배치에 적합합니다.
from ultralytics import YOLO # 경량 사전학습 모델에서 시작 model = YOLO("yolo-n.pt") # 화재 데이터셋으로 미세조정 model.train(data="fire_smoke.yaml", epochs=100, imgsz=640, patience=20)
사전학습 모델은 일반 사물의 시각 특징을 이미 익힌 상태입니다. 그래서 화재 데이터로 미세조정(fine-tuning)만 얹으면, 맨바닥에서 배우는 것보다 훨씬 적은 데이터로 시작할 수 있습니다. 신임 대원이 이미 눈썰미가 있어서 몇 장만 보여 줘도 우리 현장에 적응하는 것과 비슷합니다.
성능을 어떻게 평가하나
성능을 하나의 숫자로 줄이면 위험합니다. 가정용 화재 경보기를 떠올려 보세요. 너무 예민하면 라면 끓일 때마다 울려 결국 사람들이 배터리를 빼 버리고, 너무 둔하면 정작 불이 나도 조용합니다. 탐지 모델도 이 두 실패를 따로 재야 합니다.
조기 경보에서는 두 오류의 비용이 다릅니다. 단일 정확도가 아니라 둘을 나눠 봐야 합니다.
- 미탐(놓침): 실제 화재를 못 잡음 — 치명적. Recall로 관리
- 오탐(허위): 화재가 아닌데 경보 — 신뢰·피로 비용. Precision으로 관리
객체탐지는 보통 mAP(클래스별 평균 정밀도)로 종합 비교합니다. 연기 클래스는 Recall을 우선합니다(먼저·넓게 잡아야 하므로). 신뢰도(confidence) 임계값을 낮추면 Recall은 오르고 오탐도 늘어나므로, 운영 단계에서 조절합니다.
이 임계값을 어디에 두느냐로 경보 성향이 통째로 바뀝니다.
| 신뢰도 임계값 | 경보 성향 | 미탐(놓침) | 오탐(허위) |
|---|---|---|---|
| 낮게(예: 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에 넣기 전에 점검하기를 거치세요.
이 방법이 잘 안 통할 때
탐지 모델도 못 보는 영역이 있습니다. 한계를 미리 알아야 사람 단계를 어디에 둘지 정할 수 있습니다.
- 짙은 안개·야간: 연기와 배경의 구분이 사라져 탐지가 급격히 어려워집니다. 영상만으로 밀어붙이기보다 열화상 등 다른 센서와 함께 봐야 합니다.
- 가림(occlusion): 발화점이 건물·수목에 가리면, 연기가 그 위로 충분히 올라온 뒤에야 잡힙니다. 그만큼 경보가 늦어질 수 있습니다.
- 처음 보는 각도·렌즈: 학습에 없던 화각의 신규 CCTV는 한동안 성능이 떨어집니다. 그 카메라의 프레임을 모아 재학습해야 제 실력이 나옵니다.
이런 한계일수록 "탐지 → 사람 확인 → 발령"의 사람 단계를 촘촘히 두는 것이, 모델만 더 키우는 것보다 안전합니다.
문제 해결
| 증상 | 가능한 원인 | 처방 | 확인 |
|---|---|---|---|
| 새 카메라에서만 탐지가 급격히 흔들림 | 학습에 없던 화각·조명·렌즈 | 해당 카메라의 승인된 프레임을 오류 유형별로 모아 재평가 | 기존 카메라와 새 카메라의 지표를 분리해 비교 |
| 노을 시간에 화염 알림이 반복됨 | 반사광·붉은 배경이 화염 특징과 겹침 | 오탐 프레임을 배경 예시로 검토하고 고정 구역이면 마스킹 후보화 | 같은 시간대의 비화재 영상을 다시 재생해 알림 수 확인 |
| 연기는 보이는데 상자가 자주 끊김 | 옅은 경계 라벨 부족 또는 임계값이 높음 | 연기 라벨 기준을 재검토하고 임계값별 미탐·오탐을 함께 측정 | 낮춘 임계값에서 Recall과 오탐 목록을 동시에 확인 |
| 모델 상자는 맞는데 경보가 너무 늦음 | 시간 누적 조건이 과도하거나 처리 지연이 큼 | 프레임 처리 시간과 누적 조건을 따로 측정해 병목을 분리 | 후보 생성 시각과 알림 표시 시각을 기록해 비교 |
자주 묻는 질문
Q. 신뢰도 임계값은 한 번 정하면 모든 카메라에 같이 써도 되나요?
카메라의 각도·조명·배경이 다르면 같은 임계값에서도 오류 양상이 달라질 수 있습니다. 공통 시작값을 둘 수는 있지만, 카메라별 미탐과 오탐을 확인한 뒤 적용 범위를 사람이 승인해야 합니다.
Q. 시간 누적을 쓰면 미탐이 사라지나요?
아닙니다. 순간 오탐을 줄이는 데 도움이 되지만, 짧게 보이는 실제 신호가 누적 조건을 못 채울 수도 있습니다. 누적 전후의 미탐을 별도로 비교해야 합니다.
Q. 오탐 프레임은 전부 학습 데이터에 넣으면 되나요?
먼저 라벨 오류, 새로운 배경, 운영 규칙 문제를 구분합니다. 모델 학습으로 풀 문제가 아닌데 모두 넣으면 데이터만 늘고 원인은 남습니다. 사람 검수로 이유가 확정된 프레임만 후보로 관리합니다.
Q. 탐지 결과로 자동 발령까지 연결해도 되나요?
이 안내서의 결과는 조기경보 후보입니다. 카메라 장애와 시각적 혼동이 남으므로 실제 행동은 소속 기관 기준과 사람 확인 절차를 거쳐야 합니다.
핵심 정리
- 객체탐지 모델은 사람이 표시한 상자와 클래스의 일관성을 교재로 삼습니다.
- 프레임별 모델 출력과 시간·구역을 반영한 운영 경보는 서로 다른 층입니다.
- 미탐과 오탐을 분리해 보고, 임계값 변경의 양쪽 영향을 함께 확인합니다.
- 새 환경의 오류는 원인을 분류하고 사람 검수 기록과 함께 재학습 후보로 보냅니다.
다음 단계
- 훈련 데이터 라벨 품질, 학습 전에 잡기 — 모델을 다시 학습하기 전에 상자 기준과 의심 라벨을 점검하는 다음 단계입니다.
- 예측 모델 운영, 드리프트 감지와 재학습 시점 — 배치 뒤 계절·카메라 변화로 성능이 달라지는지를 운영 지표로 연결할 수 있습니다.
- AI 결과, 제출 전 1분 점검 — 탐지 결과를 보고·공유할 때 자동 후보와 사람 판단을 구분하는 마지막 관문입니다.