Spaces:
Runtime error
Runtime error
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)) | |