File size: 4,307 Bytes
18f06de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ebddd45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18f06de
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ebddd45
18f06de
 
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import os
import time
import streamlit as st
from PIL import Image
import numpy as np
from tensorflow.keras.preprocessing.image import ImageDataGenerator # type: ignore
from tensorflow.keras.models import load_model # type: ignore
from tensorflow.keras.preprocessing import image # type: ignore

def Get_Information(predicted_name):
    # Đường dẫn đến thư mục 'Dataset/Train'
    train_dir = 'Dataset/Train'

    # Duyệt qua mỗi lớp trong thư mục 'Dataset/Train'
    for class_name in class_names:
        # Nếu class_name không phải là predicted_name, tiếp tục vòng lặp
        if class_name != predicted_name:
            continue

        # Đường dẫn đến tệp 'information.text' trong thư mục của lớp
        info_file_path = os.path.join(train_dir, class_name, 'information.text')

        # Kiểm tra xem tệp 'information.text' có tồn tại không
        if os.path.exists(info_file_path):
            # Đọc nội dung của tệp
            with open(info_file_path, 'r', encoding='utf-8') as f:
                info_text = f.read()
            
            return info_text
        else:
            return f"Không tìm thấy tệp 'information.text' trong thư mục của lớp '{class_name}'."
        
def Get_Notes(predicted_name):
    # Đường dẫn đến thư mục 'Dataset/Train'
    train_dir = 'Dataset/Train'

    # Duyệt qua mỗi lớp trong thư mục 'Dataset/Train'
    for class_name in class_names:
        # Nếu class_name không phải là predicted_name, tiếp tục vòng lặp
        if class_name != predicted_name:
            continue

        # Đường dẫn đến tệp 'notes.info' trong thư mục của lớp
        info_file_path = os.path.join(train_dir, class_name, 'notes.info')

        # Kiểm tra xem tệp 'notes.info' có tồn tại không
        if os.path.exists(info_file_path):
            # Đọc nội dung của tệp
            with open(info_file_path, 'r', encoding='utf-8') as f:
                info_text = f.read()
            
            return info_text
        else:
            return f"Không tìm thấy tệp 'notes.info' trong thư mục của lớp '{class_name}'."

# Tải mô hình
model = load_model('Model.keras')

# Khởi tạo ImageDataGenerator
datagen = ImageDataGenerator(rescale=1./255)

# Tải dữ liệu từ thư mục 'Dataset/Train'
train_data = datagen.flow_from_directory(
    'Dataset/Train',
    target_size=(224, 224),
    batch_size=32,
    class_mode='categorical'
)

# Get the dictionary of class indices
class_indices = train_data.class_indices

# Get the list of class names
class_names = list(class_indices.keys())

st.title("Nhận diện và tra cứu thông tin động vật quý hiếm thông qua học sâu")

uploaded_file = st.sidebar.file_uploader("Hoặc chọn một hình ảnh từ máy tính của bạn", type=['jpg', 'png'])
photo = st.camera_input("Chụp một bức ảnh")

if uploaded_file is not None or photo is not None:
    if photo is not None:
        img = Image.open(photo)
    else:
        img = Image.open(uploaded_file)
        st.image(img, caption='Hình ảnh đã tải lên.', use_column_width=True)
    
    img = img.resize((224, 224))
    
    # Convert the image to a numpy array
    img_array = image.img_to_array(img)

    # Add a third dimension (for batch size), and rescale pixel values to [0, 1]
    img_array = np.expand_dims(img_array, axis=0)
    img_array /= 255.

    with st.spinner('Đang xử lý...'):
        # Use the model to predict the image's label
        predictions = model.predict(img_array)
        time.sleep(3)

    # The output of the model is a 2D array, with shape (1, num_classes). 
    # To get the predicted label, we get the index of the maximum value in the array.
    predicted_label = np.argmax(predictions)

    # Use the predicted label to get the class name
    predicted_class_name = class_names[predicted_label]

    st.write("Độ Chính Xác")
    st.bar_chart(predictions)

    st.write("`ID: " + str(predicted_label) + "`")
    st.write("## Tên: " + predicted_class_name)
    st.markdown(Get_Notes(predicted_class_name))
    with st.expander("Xem thông tin chi tiết"):
        st.markdown(Get_Information(predicted_class_name))