Kwon's 데이터분석기

캡스톤 디자인 - Raspberry Pi4를 이용한 실시간 화재 탐지 카메라 본문

Deep Learning

캡스톤 디자인 - Raspberry Pi4를 이용한 실시간 화재 탐지 카메라

DataKwon 2023. 12. 20. 15:46

대학교 캡스톤 디자인의 프로젝트를 수행을 하였다.

프로젝트 수행을 하기 위한 주제를 선정을 몇가지를 팀원끼리 선정을 하였으며, 하루동안의 토론을 통해 제가 정한 주제인 실시간 화재 탐지 카메라를 만들어 보기로 하였다.

이러한 주제를 선정한 이유는 우리나라는 산간지형이 많으며, 사계절이 뚜렷하여 특정 계절에는 화재가 자주 발생을 하여 화재에 대한 피해액이 매우 크다는 것을 들어본 적이 있기 때문이다.

이러한 화재가 얼마나 자주 발생하고, 피해액이 얼마인지 소방통계청(https://www.nfds.go.kr/stat/general.do)에서 통계를 확인해보았다.

소방통계청 2020년~2023년12월까지 화재통계
2020년부터 2023년 12월까지 화재건수

 

이렇게 2020년부터 2023년까지 화재 발생이 많고 피해액도 크다는 것을 확인할 수 있었다.

이러한 화재를 조금 더 빠른 대처가 가능한 방법에 대해서 고민해본 결과 화재가 발생하는 것을 대체적으로 화재감지센서, 일반 카메라를 사용한 화재탐지를 한다는 것을 파악을 하였다.

만약 화재를 센서와 일반 카메라가 아닌 인공지능을 탑재한 카메라를 통해서 실시간으로 화재를 탐지해준다면 화재를 조기에 발견을 하여 더욱 빠른 대처로 피해가 줄어들지 않을까? 라는 생각을 하게되었으며 인공지능을 활용한 실시간 화재탐지 카메라를 만들어보기로 하였다.

 

이러한 화재탐지 카메라를 만들기 위해 사용한 물품으로 AI를 탑재시킬 수 있는 모듈인 Raspberry pi4를 사용하였으며, 카메라는 대학생이어서 큰 돈을 사용하지 못한다는 조건으로 기본적인 Raspberry V2 카메라를 사용하였다.

 

먼저 Raspberry pi4에 카메라를 연동을 시켜주는 것으로 프로젝트를 수행한다.

연동하는 방법은 이 블로그에서 참고를 하여 연동을 시켜주었다.

(https://velog.io/@addps5012/%EB%9D%BC%EC%A6%88%EB%B2%A0%EB%A6%AC%ED%8C%8C%EC%9D%B4-V2-%EC%B9%B4%EB%A9%94%EB%9D%BC-%EC%97%B0%EA%B2%B0%ED%95%98%EA%B8%B0)

 

이제 카메라를 통해서 화재를 실시간으로 감지를 해야하는데, 많은 모델들이 존재하지만, 그 중 우리는 인공지능 모델 중 Ultralytics에서 만든 YOLO V8을 사용하였다.

YOLO V8에 대한 간단한 설명으로는 아래 사이트를 참고하기를 바란다.

(https://yolov8.com/)

 

Raspberry pi4에 yolov8을 사용하기 위해 밑작업이 존재하지만, 실수로 밑작업에 대해서 남겨둔 코드를 저장하지 않았는지 찾을 수 없었다.(직접 찾아주길 바란다, 덕분에 코드를 저장하는 습관이 생겼다.)

 

Raspberry pi4에 직접 모델을 학습시켜서 사용하기에는 Raspberry pi4는 모델학습을 하기에는 모듈성능이 좋지 않기 때문에 외부 컴퓨터에서 직접 모델을 학습을 시킨 후, 학습시킨 모델(Pretrained Model)을 들고와서 Raspberry pi4에 넣어주는 방법을 사용을 하였다.

 

YOLO V8의 모델에서 내가 원하는 탐지를 시켜주기 위해서는 모델에 내가 원하는 객체를 탐지할 수 있게 이미지 라벨링이 되어있는 데이터가 필요하다. 이러한 데이터를 얻기 위해서 많은 곳에서 찾아본 결과 Roboflow에서 이미지 라벨링이 되어있는 데이터를 찾을 수 있었다. (원하는 라벨링된 이미지 찾는 사이트: https://universe.roboflow.com/)

여기서 다른사람이 직접 이미지 라벨링을 한 것을 들고와서 YOLO V8 모델에 학습을 시켜주었다.

모델 학습은 내가 가진 노트북이나 컴퓨터의 GPU가 좋지 않기 때문에 Google의 Colab에 gpu사용을 하여 학습을 시켰다.

 

Google colab에서 roboflow 데이터를 들고와서 YOLO V8학습시키는 코드

!nvidia-smi # NVIDIA GPU드라이버 및 GPU 관련 정보 확인

import os
HOME = os.getcwd()
print(HOME)  # colab 경로 확인


!pip install ultralytics==8.0.20 # YOLO를 포함한 객체 검출 및 CV 딥러닝 라이브러리 설치


import ultralytics # ultralytics 들고오기
ultralytics.checks() # ultralytics 정보 체크


!mkdir {HOME}/datasets # 경로에 datasets라는 디렉토리 생성
%cd {HOME}/datasets # 현재 디렉토리를 datasets로 변경
!pip install roboflow --quiet  # roboflow 라이브러리 설치 - quiet: 설치과정 출력 최소화

#roboflow데이터를 들고오기

from roboflow import Roboflow
rf = Roboflow(api_key="~~~~~~~~~")
project = rf.workspace("~~~~").project("~~~~~~~~~")
dataset = project.version(3).download("yolov8")
'''
~표시 한 것은 데이터 불러오기 위한 api_key 등 정보이기에 가려주었으며, 들고오는 데이터에 따라
달라지기 때문에 지워주었다. 들고오는 방법은 아래에 바로 알려주겠다.
'''

위 코드에서 roboflow에서 데이터를 들고오는 방법에 대해서 알려줄 것이다.

위에 roboflow universe라는 사이트에 들어가 내가 원하는 라벨링 된 데이터에 대해서 검색을 한 후, 검색결과 중 하나를 정해 들어간다. 그러면 오른쪽 위에 이미지 처럼 Download this Dataset이 있을 것이다.

Download this Dataset을 누르면, Format과 show download code라고 나올것이다.

여기서 Format에서 자신이 사용할 인공지능 모델을 선택해준다. 나는 YOLOv8을 사용하므로 YOLOv8을 선택해준다.

그 후 show download code가 선택되어있는데 이 설정 그대로 선택해주고 Continue를 눌러주면 된다.

download zip to computer는 컴퓨터에 위 사진을 전부 zip파일 형식으로 저장한다는 것이기에 이 사이트에서 바로 들고와서 사용하는 나는 이러한 설정이 불필요하다. Continue를 눌러주면 로딩창이 뜨며 기다려줘야한다.

 

완료가 되면 이러한 코드가 뜨는데 이 코드를 복사해서 roboflow 데이터 불러오는 코드에 넣어서 실행시키면 된다.

 

이제 다시 YOLOv8모델 학습으로 돌아온다.

%cd {HOME}

# 이 코드를 통해서 모델을 학습을 시켜준다.
!yolo task=detect model=train model=yolov8n.pt data=/content/datasets/fire-and-smoke-detection-3/data.yaml epochs=100 imgsz=640 plots=True
'''
코드 세분해서 설명
model=train model=yolov8n.pt: YOLOv8 모델은 많은 pt가 존재한다.(pre-trained: 미리 학습된)
data=/content/datasets/fire-and-smoke-detection-3/data.yaml: roboflow에서 들고온 데이터
epochs=100: 100번 학습
'''

이렇게 모델을 학습을 한다. 이때 참고하면 좋을 것은 pt에 대한 설명이다. 

YOLO의 pt 종류

YOLO에는 미리 학습된 모델이 존재한다. 각자 s, m, l, x로 되어있는데 v8부터는 n도 존재한다.

n: nano, s: small, m: medium, l: large, x: xlarge로 모델의 깊이와 관련이 있는 것이다.

여기서 하나를 선택해 Custom Data를 학습을 시켜서 모델을 만들면 되는 것이다.

 

이렇게 학습을 완료를 하였으면, 이러한 모델이 불이나 연기가 잘 탐지가 되는지 확인, 검수를 해본다.

이를 위해서 화재에 대한 동영상을 colab에 넣고 직접 만든 모델을 적용시켜 탐지가 잘되는지 확인해보는 것이다.

# colab에 넣은 비디오에 직접 만든 모델 pt를 적용시켜 잘 탐지하는지 검증한다.
# 비디오를 저장하고 비디오를 키면 비디오에 학습시킨 객체에 대해서 라벨링을 수행해준다.
!yolo task=detect mode=predict model="/content/runs/detect/train/weights/best.pt" source="fire.mp4" save=True

이렇게 학습이 완료되었으면, best.pt라는 Custom Data로 학습시킨 YOLOv8 모델 파일을 저장하고, Raspberry pi4에

옮기도록 한다.

 

Raspberry pi4에 best.pt모델을 적절한 위치에 옮겨두었으면 이제 카메라에 이러한 모델을 적용시켜 실시간으로 화재를  탐지할 수 있도록 적용을 시킬 것이다. Raspberry pi4 내부에는 기본적인 파이썬이 없기 때문에 Raspberry pi4 내부에 존재하는 텍스트 에디터인 Geany를 사용하여 파이썬 코드를 실행시켜 줄 것이다.

from tkinter import *  # 알림창을 띄우기 위한 모듈
import tkinter.messagebox # 알림창 띄우기 위한 모듈
from ultralytics import YOLO  # ultralytics에서의 YOLO 모듈
import cv2 # 이미지 처리를 위한 모듈
import numpy as np  # 넘파이 모듈
import torch # torch 모듈
from time import time # time 모듈

#학습시킨 모델의 best.pt를 사용한다.(Geany 텍스트 에디터와 같은 위치에 best.pt 있어야한다.)
model = YOLO('best.pt') 

# 라즈베리파이에 연결한 카메라를 cap으로 지정
cap = cv2.VideoCapture(0)

#카메라 끄는 기본값 설정
ESC_KEY_CODE = 27
Q_KEY_CODE = ord('q')

#FPS 초기값
prev_time = 0
FPS = 10


# YOLOV8 실시간 카메라 출력 코드 - best.pt를 모델로 지정
wsshile True:
  ret, frame = cap.read()

  if not ret:
    break

    resized_frame = cv2.resize(frame, (640, 640))
    results = model.predict(resized_frame, show = True)

    # boundingbox count information: 바운딩 박스 정보
    result = results[0]

    #바운딩 박스가 1개 이상 나오면
    if len(result.boxes) > 0:
      #메세지 박스 출력
      tkinter.messagebox.showwarning('Detection!', 'Fire or Smoke Detection!')
      continue
    else:
      continue

    if cv2.waitkey(1) == ord('q'):
      break

#FPS 조절
while True:
  ret, frame = cap.read()
  current_time = time.time() - prev_time

  if (ret is True) and (current_time > 1./FPS):
    prev_time = time.time()

    resized_frame = cv2.resize(frame, (640, 640))
    results = model.predict(resized_frame, show = True)

  if cv2.waitley(1) == ord('q'):
    break

cap.release()
cv2.destroyAllWindows()

Geany 텍스트 에디터(.py 파일로 만들어야함)에 위 코드를 들고와서 코드를 실행을 한다면 카메라를 통해서 실시간으로 학습시킨 데이터에 맞춰 객체에 대해서 박스가 생기고, 박스가 탐지가 된다면 tkinter의 메세지박스가 출력이 되도록 만들어 주었다.

 

이렇게 Raspberry pi4와 카메라를 이용하여 실시간으로 화재를 감지할 수 있는 인공지능 카메라를 만들어보았다.

이러한 프로젝트를 수행하면서 새로운 분야의 인공지능 프로그램을 사용을 하고 적용을 할 수 있었다.

 

캡스톤 디자인 결과물 문제점

1. Raspberry pi4의 모듈 성능으로 인하여, 실시간으로 카메라 탐지하기에는 속도가 느리다.

2. 라벨링된 이미지의 퀄리티와 양이 적거나 좋지않기 때문에 모델을 만들어도 성능이 원하는 만큼이 나오질 않았다.

3. YOLOv8 모델 학습을 하기위해 colab을 사용하였는데, colab에는 일정시간이 지나면 초기화가 되는 단점이 존재하여, 더욱 깊게 학습을 시키지 못하여서 모델 성능이 일정이상 올리기 힘들었다.

4. 모델에 지정한 불이나 연기에 대한 바운딩박스가 출력되면 메세지박스가 출력되는데, 메세지 박스가 출력되면 메세지 박스 출력되는 기준으로 카메라의 작동이 멈춰 있어서 객체가 탐지가 되면 알림을 보내는 방식을 변경해야할 것 같다.

 

캡스톤 디자인 프로젝트 느낀점

팀에서 팀장을 맡고 역할 분담을 하던 중 프로그래밍을 그나마 가능했던 사람이 나뿐이어서 실력이 부족하지만 많이 찾아보며 프로그래밍을 주도적으로 맡게 되었고, 다른 팀원은 프로그래밍 외의 다른 역할을 맡아주며, 간단한 반복 코드 업무를 다른 팀원이 도와주면서 원활하게 프로젝트를 끝낼 수 있었다.

서로 도움이 필요할 때에는 망설임 없이 도움을 요청해 혼자하면 오래걸릴 것을 서로 도움을 주어 최대한 빠르게 문제를 해결을 해주었으며, 서로간의 일정에 문제가 있을때에 일정 조율을 통해서 함께하는 팀으로 만들어나갈려고 노력을 하였다.