File size: 3,568 Bytes
d14d8cc
720bf8c
cd1b549
d14d8cc
a8e02b6
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f727ce9
a8e02b6
 
 
 
bd276da
cd1b549
 
 
 
7262063
a8e02b6
7262063
a8e02b6
7262063
 
 
cd1b549
00fdca9
7262063
f727ce9
7262063
a8e02b6
 
 
 
 
00fdca9
a8e02b6
 
d14d8cc
a8e02b6
 
 
 
 
 
f727ce9
bd276da
 
f727ce9
bd276da
15ce179
 
 
 
 
a0a091e
 
e2d0d10
a0a091e
a8e02b6
 
e07f1cc
f727ce9
a8e02b6
 
a0a091e
ba6cc09
15ce179
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
import gradio as gr
import requests
from io import BytesIO

# 행동별 KSS 점수 설정 (제곱 값 적용)
kss_mapping = {
    "운전하다": 1,
    "눈비비기": 21,
    "어깨를두드리다": 25,
    "목을만지다": 25,
    "하품": 36,
    "뺨을때리다": 64,
    "꾸벅꾸벅졸다": 81,
    "몸못가누기": 100,
}

risk_images = {
    "매우 안전": "image1.png",
    "안전": "image2.png",
    "주의": "image3.png",
    "위험": "image4.png",
    "매우 위험": "image5.png",
}

def get_risk_status(avg_kss, slope):
    """
    윈도우 내 평균 KSS에 따라 5단계 위험 상태를 반환.
    """
    if avg_kss < 9:
        return "매우 안전", "image1.png", None
    elif avg_kss < 20:
        return "안전", "image2.png", None
    elif avg_kss < 40:
        return "주의", "image3.png", "약간 피로해보여요.잠시 쉬었다 가시는걸 추천드려요.mp3"
    elif avg_kss < 75:
        return "위험", "image4.png", "미치셨습니까 휴먼.mp3"
    else:
        return "매우 위험", "image5.png", "사이렌.mp3"

def analyze_frame(image):
    try:
        byte_io = BytesIO()
        image.save(byte_io, 'png')
        byte_io.seek(0)

        r = requests.post(
            'https://6b003cv20250210-prediction.cognitiveservices.azure.com/customvision/v3.0/Prediction/03fa2862-cb54-4344-b484-630379edffaa/classify/iterations/Iteration4/image',
            headers={
                'Prediction-Key': '8ypy2B3ZECnRG0PaYKzpSNvOz8yAhfF7MY2z2wQxSzkweNlhgI4SJQQJ99BBACYeBjFXJ3w3AAAIACOG0WmE',
                'Content-Type': 'application/octet-stream',
            },
            data=byte_io,
        )

        if r.status_code != 200:
            return "결과 없음", "image1.png", None, None

        top_predictions_3 = sorted(r.json()['predictions'], key=lambda x: x['probability'], reverse=True)[:3]
        top_prediction_1 = top_predictions_3[0]
        action_name = top_prediction_1['tagName']
        kss_score = kss_mapping.get(action_name, 0)
        avg_kss = kss_score

        # 위험 상태 및 이미지/음성 정보 가져오기
        risk_state, risk_image, audio_file = get_risk_status(avg_kss, None)

        results_text = f"🎬 실시간 행동 분석\n\n"
        for prediction in top_predictions_3:
            results_text += f"{prediction['tagName']}: {prediction['probability'] * 100:.2f}%\n"
        results_text += f"🔹 가장 유사한 행동: {action_name} | KSS 점수: {kss_score}\n"
        results_text += f"📊 현재 위험 수준: {risk_state}\n"

        return results_text, risk_image, audio_file, avg_kss

    except Exception as e:
        return f"오류 발생: {str(e)}", "image1.png", None, None

with gr.Blocks(
    analytics_enabled=False,
    title='졸음운전 알리미',
    head='''<meta name="theme-color" content="#0f0f11">''',
) as app:
    with gr.Row():
        with gr.Column():
            input_img = gr.Image(streaming=True, sources=["webcam"], type="pil")
        with gr.Column():
            output_label = gr.Textbox(label="🔍 분석 결과")
            output_image = gr.Image(label="📊 위험 수준", height=200, width=200)
            output_audio = gr.Audio(type='filepath', label="🔊 음성 경고", loop=True, autoplay=True)
            output_slider = gr.Slider(minimum=0, maximum=100, step=1, label="⚠️ 위험 수준")

    input_img.stream(analyze_frame, [input_img], [output_label, output_image, output_audio])

if __name__ == "__main__":
    app.launch(favicon_path='./favicon.png', show_api=False)