Traffic_Sign / app.py
Reyga's picture
Update app.py
ebf3843 verified
import gradio as gr
from ultralytics import YOLO
from gtts import gTTS
import os
from PIL import Image as PILImage
import matplotlib.pyplot as plt
import numpy as np
import cv2
# Load model YOLOv11
model = YOLO('last.pt')
# Fungsi untuk menjelaskan tanda lalu lintas
def explain_signs(labels):
explanations = {
"Stop": "Tanda berhenti. Pengemudi harus berhenti sebelum melanjutkan.",
"Yield": "Tanda memberi jalan. Pengemudi harus memberi jalan kepada kendaraan lain.",
"Speed limit": "Tanda batas kecepatan. Pengemudi tidak boleh melebihi batas kecepatan yang ditentukan.",
"Barrier Ahead": "Tanda menunjukkan adanya penghalang di depan. Pengemudi harus waspada dan mengurangi kecepatan.",
"Cattle": "Tanda ini memberi tahu bahwa ada kemungkinan ternak melintas di jalan. Pengemudi harus berhati-hati.",
"Cycle Crossing": "Tanda menunjukkan bahwa ada jalur sepeda di depan. Pengemudi harus berhati-hati terhadap pengendara sepeda.",
"Falling Rocks": "Tanda peringatan bahwa batu dapat jatuh dari tebing. Pengemudi harus lebih berhati-hati di daerah tersebut.",
"Give Way": "Tanda memberi jalan. Pengemudi harus memberi jalan kepada kendaraan yang datang dari arah lain.",
"Horn Prohibited": "Tanda larangan membunyikan klakson. Pengemudi tidak diperbolehkan menggunakan klakson di area ini.",
"Hump": "Tanda menunjukkan adanya tonjolan atau gundukan di jalan. Pengemudi harus mengurangi kecepatan.",
"Left Hair Pin Bend": "Tanda peringatan bahwa ada tikungan tajam ke kiri. Pengemudi harus mengurangi kecepatan.",
"Left Reverse Bend": "Tanda menunjukkan adanya belokan tajam ke kiri setelah jalur berbelok.",
"Left hand curve": "Tanda peringatan bahwa jalan akan melengkung ke kiri. Pengemudi harus berhati-hati.",
"Men at Work": "Tanda peringatan bahwa ada pekerja di jalan. Pengemudi harus berhati-hati dan siap untuk memperlambat laju.",
"Narrow road ahead": "Tanda menunjukkan bahwa jalan akan menyempit di depan. Pengemudi harus berhati-hati.",
"No Parking": "Tanda larangan parkir. Kendaraan tidak boleh diparkir di area ini.",
"No Stopping": "Tanda larangan berhenti. Pengemudi tidak diperbolehkan berhenti di area ini.",
"Parking Lot Cars": "Tanda menunjukkan bahwa ada mobil yang diparkir di area ini. Pengemudi harus berhati-hati.",
"Pedestrian Crossing": "Tanda menunjukkan bahwa ada jalur penyeberangan pejalan kaki. Pengemudi harus memberi jalan kepada pejalan kaki.",
"Pedestrian Prohibited": "Tanda larangan bagi pejalan kaki. Pejalan kaki tidak diperbolehkan melintas di area ini.",
"Resting Place": "Tanda menunjukkan adanya tempat istirahat di depan. Pengemudi dapat berhenti untuk beristirahat.",
"Right Hair Pin Bend": "Tanda peringatan bahwa ada tikungan tajam ke kanan. Pengemudi harus mengurangi kecepatan.",
"Right Hand Curve": "Tanda peringatan bahwa jalan akan melengkung ke kanan. Pengemudi harus berhati-hati.",
"Right Reverse Bend": "Tanda menunjukkan adanya belokan tajam ke kanan setelah jalur berbelok.",
"Round About": "Tanda menunjukkan adanya bundaran di depan. Pengemudi harus bersiap untuk masuk ke bundaran.",
"School Ahead": "Tanda peringatan bahwa ada sekolah di depan. Pengemudi harus berhati-hati terhadap anak-anak.",
"Slippery Road": "Tanda peringatan bahwa jalan bisa licin. Pengemudi harus mengurangi kecepatan dan berhati-hati.",
"Speed Limit -100-": "Tanda batas kecepatan 100 km/jam. Pengemudi tidak boleh melebihi batas ini.",
"Speed Limit -20-": "Tanda batas kecepatan 20 km/jam. Pengemudi tidak boleh melebihi batas ini.",
"Speed Limit -50-": "Tanda batas kecepatan 50 km/jam. Pengemudi tidak boleh melebihi batas ini.",
"Speed Limit -60-": "Tanda batas kecepatan 60 km/jam. Pengemudi tidak boleh melebihi batas ini.",
"Speed Limit 30": "Tanda batas kecepatan 30 km/jam. Pengemudi tidak boleh melebihi batas ini.",
"Speed limit -40-": "Tanda batas kecepatan 40 km/jam. Pengemudi tidak boleh melebihi batas ini.",
"Steep Ascent": "Tanda peringatan bahwa jalan menanjak curam. Pengemudi harus berhati-hati.",
"Steep Descent": "Tanda peringatan bahwa jalan menurun curam. Pengemudi harus berhati-hati.",
"walking": "Tanda menunjukkan bahwa area ini merupakan jalur pejalan kaki. Pengemudi harus berhati-hati terhadap pejalan kaki."
}
explained_text = []
for label in labels:
explanation = explanations.get(label, f"Tanda {label} tidak memiliki penjelasan.")
explained_text.append(explanation)
return " ".join(explained_text)
def detect_traffic_signs(image_path):
results = model.predict(source=image_path, conf=0.25)
detected_labels = []
original_image = cv2.imread(image_path)
original_image_rgb = cv2.cvtColor(original_image, cv2.COLOR_BGR2RGB)
for result in results:
for box in result.boxes:
x1, y1, x2, y2 = box.xyxy[0]
label = result.names[int(box.cls)]
confidence = box.conf[0]
color = (0, 255, 0)
cv2.rectangle(original_image_rgb, (int(x1), int(y1)), (int(x2), int(y2)), color, 2)
text = f"{label}: {confidence:.2f}"
cv2.putText(original_image_rgb, text, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)
detected_labels.append(label)
output_image_path = "output_image_with_boxes.jpg"
plt.imsave(output_image_path, original_image_rgb)
output_text = ", ".join(detected_labels) if detected_labels else "Tidak ada tanda lalu lintas yang terdeteksi."
explanation = explain_signs(detected_labels) if detected_labels else "Tidak ada penjelasan yang tersedia."
tts = gTTS(explanation, lang='id')
tts_file = "output.mp3"
tts.save(tts_file)
return output_text, output_image_path, tts_file
# Mengatur antarmuka Gradio
iface = gr.Interface(
fn=detect_traffic_signs,
inputs=gr.Image(type="filepath", label="Unggah Gambar Tanda Lalu Lintas"),
outputs=[
gr.Textbox(label="Hasil Deteksi", interactive=False, placeholder="Hasil akan ditampilkan di sini...", elem_id="result_textbox"),
gr.Image(label="Gambar dengan Hasil Deteksi"),
gr.Audio(label="Output Suara", type="filepath")
],
title="Deteksi Tanda Lalu Lintas untuk Mobil Self-Driving",
description="Unggah gambar untuk mendeteksi tanda lalu lintas. Model YOLOv11 digunakan untuk mendeteksi tanda lalu lintas dan output suara akan menjelaskan tanda yang terdeteksi. Silakan tekan tombol play untuk mendengar output suara.",
theme="compact",
css="""
.gradio-container {
background: linear-gradient(135deg, #1DB954, #BB86FC, #3700B3);
color: #ffffff;
border-radius: 10px;
padding: 20px;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.5);
}
h1, h2, h3 {
color: #000000;
}
#result_textbox {
background-color: rgba(255, 255, 255, 0.1);
color: #ffffff;
border-radius: 5px;
}
"""
)
# Menjalankan antarmuka
iface.launch()