Skip to content

Commit eb7eaf7

Browse files
authored
Update README.md
1 parent dbedf31 commit eb7eaf7

File tree

1 file changed

+186
-0
lines changed

1 file changed

+186
-0
lines changed

README.md

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,188 @@
11
# ciga
22
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+
![confusion_matrix_normalized](https://github.com/user-attachments/assets/8c02c9d4-bc14-4321-872f-f42b272f3781)
171+
![confusion_matrix](https://github.com/user-attachments/assets/18b9ee93-cd06-4923-98ef-8feff489b164)
172+
![val_batch2_pred](https://github.com/user-attachments/assets/0ce19e7e-1848-4bb2-9cb9-dbcfca138bd2)
173+
![val_batch2_labels](https://github.com/user-attachments/assets/0ce8484e-5a82-4c02-b554-42c58a80c7e4)
174+
![val_batch1_pred](https://github.com/user-attachments/assets/63766593-0375-472d-b908-4c613e7a2c9e)
175+
![val_batch1_labels](https://github.com/user-attachments/assets/fd07b9a7-9248-4a45-a0b5-bd5384f0b2b2)
176+
![val_batch0_pred](https://github.com/user-attachments/assets/de2af524-ee95-4796-b73a-967e78706b1c)
177+
![val_batch0_labels](https://github.com/user-attachments/assets/0b9126e6-d72a-417c-9f6b-6fdbfef83f18)
178+
![train_batch2](https://github.com/user-attachments/assets/22bf7c68-b6bc-4e1c-a10a-3b14f2e3fb16)
179+
![train_batch1](https://github.com/user-attachments/assets/93c75e15-e50c-4cdb-bcd5-660170fbb303)
180+
![train_batch0](https://github.com/user-attachments/assets/669c1d8e-b318-4cd4-bb2b-efd21354b49b)
181+
![results](https://github.com/user-attachments/assets/275ddf62-b244-440a-9640-db57091a3d89)
182+
[results.csv](https://github.com/user-attachments/files/18089864/results.csv)
183+
![R_curve](https://github.com/user-attachments/assets/4d476c3c-6fc3-49b0-851f-797652f1dbc4)
184+
![PR_curve](https://github.com/user-attachments/assets/46386b4b-cb14-4ab1-89db-02b6b0ea138b)
185+
![P_curve](https://github.com/user-attachments/assets/88cc3689-970c-46d1-bbe5-41e16fc7e6e8)
186+
![labels_correlogram](https://github.com/user-attachments/assets/07fadfe8-3624-4682-8eea-ab892711b599)
187+
![labels](https://github.com/user-attachments/assets/64dd8031-7755-4046-9df2-c4829a68c394)
188+
![F1_curve](https://github.com/user-attachments/assets/a58e0c54-3f51-4589-b31d-eb07ff8a3819)

0 commit comments

Comments
 (0)