|
1 | 1 | # ciga
|
2 | 2 | Cigarette Detection yolo
|
| 3 | + |
| 4 | +### **README - YOLOv8 모델을 사용한 실시간 객체 탐지 및 알림 시스템** |
| 5 | + |
| 6 | +--- |
| 7 | + |
| 8 | +#### **1. 개요** |
| 9 | +이 프로젝트는 **YOLOv8 (You Only Look Once version 8)** 모델을 사용하여 **실시간 객체 탐지**를 수행하고, 특정 객체 (예: 담배)가 탐지되었을 때 **알림 소리**를 울리도록 구현한 시스템입니다. 이 시스템은 **OpenCV**, **Ultralytics YOLO**, 그리고 **pygame** 라이브러리를 활용하여 웹캠에서 실시간 비디오 스트림을 캡처하고, 이를 처리하여 탐지된 객체에 대한 시각적 표시 및 소리 알림을 제공합니다. |
| 10 | + |
| 11 | +이 시스템은 다음과 같은 구성 요소로 이루어져 있습니다: |
| 12 | +- **YOLOv8 모델**을 사용한 객체 탐지 |
| 13 | +- **웹캠 비디오 스트림**을 사용하여 실시간 영상 입력 |
| 14 | +- **알림 소리**: 특정 객체(예: 담배)가 탐지되면 소리를 재생 |
| 15 | +- **스레드 기반의 비동기 처리**: 알림 소리와 객체 탐지 처리 분리 |
| 16 | + |
| 17 | +--- |
| 18 | + |
| 19 | +#### **2. 주요 기능** |
| 20 | + |
| 21 | +1. **YOLOv8 모델로 실시간 객체 탐지**: |
| 22 | + - 웹캠에서 입력된 영상을 YOLOv8 모델로 처리하여 객체를 탐지합니다. |
| 23 | + - 탐지된 객체는 **Bounding Box**와 함께 화면에 표시됩니다. |
| 24 | + |
| 25 | +2. **알림 소리**: |
| 26 | + - 특정 객체(예: 담배)가 탐지되면 알림 소리를 재생합니다. |
| 27 | + - 소리는 `pygame` 라이브러리를 사용하여 재생되며, 소리가 반복되지 않도록 관리합니다. |
| 28 | + |
| 29 | +3. **스레드를 활용한 비동기 소리 재생**: |
| 30 | + - 소리 재생은 별도의 스레드에서 처리되어, 객체 탐지와 동시에 소리가 반복적으로 재생될 수 있도록 구현됩니다. |
| 31 | + |
| 32 | +4. **실시간 웹캠 스트리밍**: |
| 33 | + - OpenCV를 이용하여 웹캠에서 실시간으로 영상을 캡처하고, 이를 표시합니다. |
| 34 | + |
| 35 | +--- |
| 36 | + |
| 37 | +#### **3. 동작 원리** |
| 38 | + |
| 39 | +이 시스템은 두 주요 프로세스를 병행하여 처리합니다: 객체 탐지와 소리 재생. 전체 시스템의 동작 흐름은 아래와 같습니다. |
| 40 | + |
| 41 | +1. **YOLOv8 모델 로드**: |
| 42 | + - 학습된 YOLOv8 모델 파일(`trained_model.pt`)을 로드합니다. |
| 43 | + - 이 모델은 웹캠에서 실시간으로 캡처된 이미지에서 객체를 탐지하는 데 사용됩니다. |
| 44 | + |
| 45 | +2. **웹캠 영상 캡처**: |
| 46 | + - `cv2.VideoCapture(0)`을 사용하여 기본 카메라(Webcam)에서 비디오 스트림을 가져옵니다. |
| 47 | + - 각 프레임을 YOLOv8 모델에 전달하여 객체 탐지를 수행합니다. |
| 48 | + |
| 49 | +3. **객체 탐지 및 알림 소리 재생**: |
| 50 | + - YOLOv8 모델은 객체를 탐지하여 **Bounding Box**를 이미지에 그립니다. |
| 51 | + - 탐지된 객체가 'cigarette'라면 알림 소리(`alert_sound.mp3`)가 재생됩니다. |
| 52 | + - 소리는 `pygame.mixer.music`을 사용하여 재생되며, 소리 재생 여부는 별도의 스레드에서 처리됩니다. |
| 53 | + |
| 54 | +4. **객체 탐지 결과 출력**: |
| 55 | + - 객체 탐지 결과(탐지된 클래스 및 해당 위치)는 **Bounding Box** 형태로 실시간 비디오에 오버레이됩니다. |
| 56 | + - 탐지된 객체가 없다면, 탐지되지 않은 상태로 비디오가 출력됩니다. |
| 57 | + |
| 58 | +--- |
| 59 | + |
| 60 | +#### **4. 코드 분석** |
| 61 | + |
| 62 | +##### **4.1. 모델 로드 및 웹캠 설정** |
| 63 | + |
| 64 | +```python |
| 65 | +# YOLOv8 모델 로드 (학습한 모델 파일 경로) |
| 66 | +model = YOLO('trained_model.pt') |
| 67 | + |
| 68 | +# 웹캠 열기 (기본 카메라 0번 사용) |
| 69 | +cap = cv2.VideoCapture(0) |
| 70 | +``` |
| 71 | + |
| 72 | +- `YOLO('trained_model.pt')`: YOLOv8 모델을 로드합니다. 이 모델은 **자신이 학습한 객체 인식 모델**을 사용하여 실시간 탐지를 수행합니다. |
| 73 | +- `cv2.VideoCapture(0)`: OpenCV를 사용하여 기본 웹캠에서 비디오 스트림을 캡처합니다. |
| 74 | + |
| 75 | +##### **4.2. 알림 소리 처리** |
| 76 | + |
| 77 | +```python |
| 78 | +# 알림 소리 파일 경로 (소리 파일을 프로젝트 폴더에 넣고 사용) |
| 79 | +alert_sound = 'alert_sound.mp3' |
| 80 | + |
| 81 | +# pygame 초기화 |
| 82 | +pygame.mixer.init() |
| 83 | + |
| 84 | +# 소리 재생을 위한 비동기 함수 |
| 85 | +def play_alert_sound(): |
| 86 | + while True: |
| 87 | + pygame.mixer.music.load(alert_sound) |
| 88 | + pygame.mixer.music.play() |
| 89 | + print("소리 재생됨!") # 소리 재생 시 출력 |
| 90 | + time.sleep(1) # 너무 자주 반복되지 않도록 잠시 대기 |
| 91 | + |
| 92 | +# 소리 재생을 위한 스레드 시작 |
| 93 | +alert_thread = threading.Thread(target=play_alert_sound, daemon=True) |
| 94 | +alert_thread.start() |
| 95 | +``` |
| 96 | + |
| 97 | +- `pygame.mixer.init()`: `pygame`의 믹서 모듈을 초기화합니다. 소리 파일을 재생할 준비를 합니다. |
| 98 | +- `play_alert_sound()`: 알림 소리를 무한 반복하여 재생하는 함수입니다. 소리가 재생될 때마다 1초 간격을 두고 반복됩니다. |
| 99 | +- `threading.Thread(target=play_alert_sound, daemon=True)`: 별도의 스레드를 사용하여 소리를 비동기적으로 처리합니다. 이는 객체 탐지와 소리 재생이 동시에 이루어질 수 있게 합니다. |
| 100 | + |
| 101 | +##### **4.3. 객체 탐지 및 소리 알림** |
| 102 | + |
| 103 | +```python |
| 104 | +# YOLOv8 모델로 객체 탐지 |
| 105 | +results = model(frame) |
| 106 | + |
| 107 | +# 결과에서 탐지된 객체 확인 |
| 108 | +cigarette_detected = False |
| 109 | + |
| 110 | +# results.pred[0]는 YOLO 모델이 반환하는 첫 번째 이미지에 대한 탐지 결과입니다 |
| 111 | +for result in results[0].boxes: |
| 112 | + class_id = int(result.cls.item()) # 결과 클래스 ID 추출 |
| 113 | + if model.names[class_id] == 'cigarette': # 'cigarette' 클래스가 탐지되었는지 확인 |
| 114 | + cigarette_detected = True |
| 115 | + break |
| 116 | +``` |
| 117 | + |
| 118 | +- `results = model(frame)`: 모델을 사용하여 입력된 `frame`에서 객체 탐지를 수행합니다. |
| 119 | +- `results[0].boxes`: 탐지된 객체들의 정보를 가져옵니다. 각 객체는 **클래스 ID**와 **경계 상자 좌표** 등의 정보를 포함합니다. |
| 120 | +- `if model.names[class_id] == 'cigarette'`: 탐지된 객체가 'cigarette'인지 확인하고, 해당 객체가 발견되면 `cigarette_detected`를 `True`로 설정합니다. |
| 121 | + |
| 122 | +##### **4.4. 소리 재생 제어** |
| 123 | + |
| 124 | +```python |
| 125 | +if cigarette_detected: |
| 126 | + print("Cigarette detected!") # 탐지 시 출력 |
| 127 | + if not is_playing: # 소리가 재생 중이 아니면 |
| 128 | + pygame.mixer.music.set_volume(1.0) # 볼륨을 최대값으로 설정 |
| 129 | + is_playing = True |
| 130 | +else: |
| 131 | + print("No cigarette detected!") # 탐지되지 않으면 출력 |
| 132 | + pygame.mixer.music.set_volume(0.0) # 볼륨을 0으로 설정 |
| 133 | + is_playing = False |
| 134 | +``` |
| 135 | + |
| 136 | +- `pygame.mixer.music.set_volume(1.0)`: 담배가 탐지된 경우 알림 소리를 **최대 볼륨**으로 설정하여 재생합니다. |
| 137 | +- `pygame.mixer.music.set_volume(0.0)`: 담배가 탐지되지 않은 경우 소리를 **음소거**로 설정합니다. |
| 138 | + |
| 139 | +##### **4.5. 실시간 웹캠 출력** |
| 140 | + |
| 141 | +```python |
| 142 | +# 탐지된 결과를 영상에 표시 |
| 143 | +annotated_frame = results[0].plot() # 탐지된 객체 표시 |
| 144 | + |
| 145 | +# 실시간 웹캠 영상 출력 |
| 146 | +cv2.imshow('Webcam Feed', annotated_frame) |
| 147 | +``` |
| 148 | + |
| 149 | +- `results[0].plot()`: 탐지된 객체에 대한 **Bounding Box**를 그려서 반환합니다. |
| 150 | +- `cv2.imshow('Webcam Feed', annotated_frame)`: 실시간으로 처리된 프레임을 화면에 출력합니다. |
| 151 | + |
| 152 | +--- |
| 153 | + |
| 154 | +#### **5. 종료 및 리소스 해제** |
| 155 | + |
| 156 | +```python |
| 157 | +# 웹캠 및 창 닫기 |
| 158 | +cap.release() |
| 159 | +cv2.destroyAllWindows() |
| 160 | +``` |
| 161 | + |
| 162 | +- `cap.release()`: 웹캠 스트리밍을 종료합니다. |
| 163 | +- `cv2.destroyAllWindows()`: OpenCV 창을 닫습니다. |
| 164 | + |
| 165 | +--- |
| 166 | + |
| 167 | +#### **6. 결론** |
| 168 | + |
| 169 | +이 시스템은 **YOLOv8 모델**을 사용하여 실시간으로 객체를 탐지하고, **특정 객체**가 탐지되면 **알림 소리**를 재생하는 간단한 객체 탐지 시스템입니다. `pygame`과 `threading`을 활용하여 소리 재생을 비동기적으로 처리하고, **OpenCV**를 사용하여 실시간으로 웹캠 영상에 탐지 결과를 표시합니다. |
| 170 | + |
| 171 | + |
| 172 | + |
| 173 | + |
| 174 | + |
| 175 | + |
| 176 | + |
| 177 | + |
| 178 | + |
| 179 | + |
| 180 | + |
| 181 | + |
| 182 | +[results.csv](https://github.com/user-attachments/files/18089864/results.csv) |
| 183 | + |
| 184 | + |
| 185 | + |
| 186 | + |
| 187 | + |
| 188 | + |
0 commit comments