📺 동영상 보기 🎬
🔗 블로그 프로젝트 링크 🌐
Cigarette Detection yolo
이 프로젝트는 YOLOv8 (You Only Look Once version 8) 모델을 사용하여 실시간 객체 탐지를 수행하고, 특정 객체 (예: 담배)가 탐지되었을 때 알림 소리를 울리도록 구현한 시스템입니다. 이 시스템은 OpenCV, Ultralytics YOLO, 그리고 pygame 라이브러리를 활용하여 웹캠에서 실시간 비디오 스트림을 캡처하고, 이를 처리하여 탐지된 객체에 대한 시각적 표시 및 소리 알림을 제공합니다.
이 시스템은 다음과 같은 구성 요소로 이루어져 있습니다:
- YOLOv8 모델을 사용한 객체 탐지
- 웹캠 비디오 스트림을 사용하여 실시간 영상 입력
- 알림 소리: 특정 객체(예: 담배)가 탐지되면 소리를 재생
- 스레드 기반의 비동기 처리: 알림 소리와 객체 탐지 처리 분리
-
YOLOv8 모델로 실시간 객체 탐지:
- 웹캠에서 입력된 영상을 YOLOv8 모델로 처리하여 객체를 탐지합니다.
- 탐지된 객체는 Bounding Box와 함께 화면에 표시됩니다.
-
알림 소리:
- 특정 객체(예: 담배)가 탐지되면 알림 소리를 재생합니다.
- 소리는
pygame
라이브러리를 사용하여 재생되며, 소리가 반복되지 않도록 관리합니다.
-
스레드를 활용한 비동기 소리 재생:
- 소리 재생은 별도의 스레드에서 처리되어, 객체 탐지와 동시에 소리가 반복적으로 재생될 수 있도록 구현됩니다.
-
실시간 웹캠 스트리밍:
- OpenCV를 이용하여 웹캠에서 실시간으로 영상을 캡처하고, 이를 표시합니다.
이 시스템은 두 주요 프로세스를 병행하여 처리합니다: 객체 탐지와 소리 재생. 전체 시스템의 동작 흐름은 아래와 같습니다.
-
YOLOv8 모델 로드:
- 학습된 YOLOv8 모델 파일(
trained_model.pt
)을 로드합니다. - 이 모델은 웹캠에서 실시간으로 캡처된 이미지에서 객체를 탐지하는 데 사용됩니다.
- 학습된 YOLOv8 모델 파일(
-
웹캠 영상 캡처:
cv2.VideoCapture(0)
을 사용하여 기본 카메라(Webcam)에서 비디오 스트림을 가져옵니다.- 각 프레임을 YOLOv8 모델에 전달하여 객체 탐지를 수행합니다.
-
객체 탐지 및 알림 소리 재생:
- YOLOv8 모델은 객체를 탐지하여 Bounding Box를 이미지에 그립니다.
- 탐지된 객체가 'cigarette'라면 알림 소리(
alert_sound.mp3
)가 재생됩니다. - 소리는
pygame.mixer.music
을 사용하여 재생되며, 소리 재생 여부는 별도의 스레드에서 처리됩니다.
-
객체 탐지 결과 출력:
- 객체 탐지 결과(탐지된 클래스 및 해당 위치)는 Bounding Box 형태로 실시간 비디오에 오버레이됩니다.
- 탐지된 객체가 없다면, 탐지되지 않은 상태로 비디오가 출력됩니다.
# YOLOv8 모델 로드 (학습한 모델 파일 경로)
model = YOLO('trained_model.pt')
# 웹캠 열기 (기본 카메라 0번 사용)
cap = cv2.VideoCapture(0)
YOLO('trained_model.pt')
: YOLOv8 모델을 로드합니다. 이 모델은 자신이 학습한 객체 인식 모델을 사용하여 실시간 탐지를 수행합니다.cv2.VideoCapture(0)
: OpenCV를 사용하여 기본 웹캠에서 비디오 스트림을 캡처합니다.
# 알림 소리 파일 경로 (소리 파일을 프로젝트 폴더에 넣고 사용)
alert_sound = 'alert_sound.mp3'
# pygame 초기화
pygame.mixer.init()
# 소리 재생을 위한 비동기 함수
def play_alert_sound():
while True:
pygame.mixer.music.load(alert_sound)
pygame.mixer.music.play()
print("소리 재생됨!") # 소리 재생 시 출력
time.sleep(1) # 너무 자주 반복되지 않도록 잠시 대기
# 소리 재생을 위한 스레드 시작
alert_thread = threading.Thread(target=play_alert_sound, daemon=True)
alert_thread.start()
pygame.mixer.init()
:pygame
의 믹서 모듈을 초기화합니다. 소리 파일을 재생할 준비를 합니다.play_alert_sound()
: 알림 소리를 무한 반복하여 재생하는 함수입니다. 소리가 재생될 때마다 1초 간격을 두고 반복됩니다.threading.Thread(target=play_alert_sound, daemon=True)
: 별도의 스레드를 사용하여 소리를 비동기적으로 처리합니다. 이는 객체 탐지와 소리 재생이 동시에 이루어질 수 있게 합니다.
# YOLOv8 모델로 객체 탐지
results = model(frame)
# 결과에서 탐지된 객체 확인
cigarette_detected = False
# results.pred[0]는 YOLO 모델이 반환하는 첫 번째 이미지에 대한 탐지 결과입니다
for result in results[0].boxes:
class_id = int(result.cls.item()) # 결과 클래스 ID 추출
if model.names[class_id] == 'cigarette': # 'cigarette' 클래스가 탐지되었는지 확인
cigarette_detected = True
break
results = model(frame)
: 모델을 사용하여 입력된frame
에서 객체 탐지를 수행합니다.results[0].boxes
: 탐지된 객체들의 정보를 가져옵니다. 각 객체는 클래스 ID와 경계 상자 좌표 등의 정보를 포함합니다.if model.names[class_id] == 'cigarette'
: 탐지된 객체가 'cigarette'인지 확인하고, 해당 객체가 발견되면cigarette_detected
를True
로 설정합니다.
if cigarette_detected:
print("Cigarette detected!") # 탐지 시 출력
if not is_playing: # 소리가 재생 중이 아니면
pygame.mixer.music.set_volume(1.0) # 볼륨을 최대값으로 설정
is_playing = True
else:
print("No cigarette detected!") # 탐지되지 않으면 출력
pygame.mixer.music.set_volume(0.0) # 볼륨을 0으로 설정
is_playing = False
pygame.mixer.music.set_volume(1.0)
: 담배가 탐지된 경우 알림 소리를 최대 볼륨으로 설정하여 재생합니다.pygame.mixer.music.set_volume(0.0)
: 담배가 탐지되지 않은 경우 소리를 음소거로 설정합니다.
# 탐지된 결과를 영상에 표시
annotated_frame = results[0].plot() # 탐지된 객체 표시
# 실시간 웹캠 영상 출력
cv2.imshow('Webcam Feed', annotated_frame)
results[0].plot()
: 탐지된 객체에 대한 Bounding Box를 그려서 반환합니다.cv2.imshow('Webcam Feed', annotated_frame)
: 실시간으로 처리된 프레임을 화면에 출력합니다.
# 웹캠 및 창 닫기
cap.release()
cv2.destroyAllWindows()
cap.release()
: 웹캠 스트리밍을 종료합니다.cv2.destroyAllWindows()
: OpenCV 창을 닫습니다.
이 시스템은 YOLOv8 모델을 사용하여 실시간으로 객체를 탐지하고, 특정 객체가 탐지되면 알림 소리를 재생하는 간단한 객체 탐지 시스템입니다. pygame
과 threading
을 활용하여 소리 재생을 비동기적으로 처리하고, OpenCV를 사용하여 실시간으로 웹캠 영상에 탐지 결과를 표시합니다.
results.csv