DNN / app.py
hyunjunian's picture
live
e2d0d10
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)