File size: 3,655 Bytes
637e338
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
from tensorflow.keras.models import load_model
from PIL import Image
import numpy as np
import os
import cv2
from streamlit_webrtc import VideoTransformerBase, webrtc_streamer

# Model dosyasının yolu
model_path = 'german.h5'

# Modeli yükleme
if os.path.isfile(model_path):
    try:
        model = load_model(model_path)
        st.write("Model başarıyla yüklendi.")
    except Exception as e:
        st.error(f"Model yüklenirken bir hata oluştu: {e}")
else:
    st.error(f"Model dosyası bulunamadı: {model_path}")

def process_img(img):
    img = img.convert('RGB')  # RGBA'dan RGB'ye dönüştürme
    img = img.resize((32, 32), Image.LANCZOS)  # 32x32 piksel boyutuna dönüştürme
    img = np.array(img) / 255.0  # Normalize etme
    img = np.expand_dims(img, axis=0)  # Resme boyut ekleme
    return img

class VideoTransformer(VideoTransformerBase):
    def __init__(self):
        self.model = model
        self.latest_frame = None

    def transform(self, frame):
        img = frame.to_ndarray(format="bgr24")
        self.latest_frame = img
        return img

    def get_latest_frame(self):
        if self.latest_frame is not None:
            return Image.fromarray(cv2.cvtColor(self.latest_frame, cv2.COLOR_BGR2RGB))
        return None

st.title("Almanya Trafik İşaretleri Sınıflandırması / German Traffic Sign Classification :traffic_light:")
st.write('Kamera kullanarak modelimizi trafik işaretinizi sınıflandırsın.\nUse the camera to predict your traffic sign.')

# WebRTC video akışını başlatma
video_transformer = webrtc_streamer(key="example", video_transformer_factory=VideoTransformer)

# Fotoğraf çekme butonu
if st.button("Fotoğraf Çek"):
    if video_transformer.video_transformer:
        frame = video_transformer.video_transformer.get_latest_frame()
        if frame is not None:
            st.image(frame, caption="Çekilen Resim", use_column_width=True)
            img = process_img(frame)
            prediction = model.predict(img)
            prediction_class = np.argmax(prediction)
            
            # Sınıf isimleri
            classes = {
                0: 'Speed limit (20km/h)', 1: 'Speed limit (30km/h)', 2: 'Speed limit (50km/h)', 3: 'Speed limit (60km/h)',
                4: 'Speed limit (70km/h)', 5: 'Speed limit (80km/h)', 6: 'End of speed limit (80km/h)', 7: 'Speed limit (100km/h)',
                8: 'Speed limit (120km/h)', 9: 'No passing', 10: 'No passing veh over 3.5 tons', 11: 'Right-of-way at intersection',
                12: 'Priority road', 13: 'Yield', 14: 'Stop', 15: 'No vehicles', 16: 'Veh > 3.5 tons prohibited', 17: 'No entry',
                18: 'General caution', 19: 'Dangerous curve left', 20: 'Dangerous curve right', 21: 'Double curve', 22: 'Bumpy road',
                23: 'Slippery road', 24: 'Road narrows on the right', 25: 'Road work', 26: 'Traffic signals', 27: 'Pedestrians',
                28: 'Children crossing', 29: 'Bicycles crossing', 30: 'Beware of ice/snow', 31: 'Wild animals crossing',
                32: 'End speed + passing limits', 33: 'Turn right ahead', 34: 'Turn left ahead', 35: 'Ahead only',
                36: 'Go straight or right', 37: 'Go straight or left', 38: 'Keep right', 39: 'Keep left', 40: 'Roundabout mandatory',
                41: 'End of no passing', 42: 'End no passing veh > 3.5 tons'
            }

            st.write("Sonuç: ", classes[prediction_class])
        else:
            st.error("Kamera görüntüsü alınamadı.")
    else:
        st.error("Kamera başlatılmadı.")