from tensorflow.keras.models import load_model # importing the preprocessing steps for the model architecture which i used for transfer learning from tensorflow.keras.applications.xception import preprocess_input import numpy as np from tensorflow.keras.preprocessing.image import load_img, img_to_array import streamlit as st import cv2 # import tensorflow as tf # print(tf.__version__) # print(np.__version__) # print(st.__version__) # print(cv2.__version__) st.write('# Cat and Dog Classifier') st.markdown( ''' This app uses transfer learning on the Xception model to predict images of cats and dogs. It achieved an accuracy of approx. 99 percent on the validation set. *View on [Github](https://github.com/eskayML/cat-and-dogs-classification)* > ### Enter an image of either a cat or a dog for the model to predict. ''' ) # image_path = 'sample_images/hang-niu-Tn8DLxwuDMA-unsplash.jpg' model = load_model('cat_and_dog_classifier.h5') def test_image(object_image): # Convert the file to an opencv image. file_bytes = np.asarray(bytearray(object_image.read()), dtype=np.uint8) opencv_image = cv2.imdecode(file_bytes, 1) opencv_image = cv2.resize(opencv_image, (200, 200)) opencv_image.shape = (1, 200, 200, 3) opencv_image = preprocess_input(opencv_image) predictions = model.predict(opencv_image) if predictions[0, 0] >= 0.5: result = 'DOG' confidence = predictions[0, 0] * 100 else: result = 'CAT' confidence = 100 - (predictions[0, 0] * 100) return result, round(confidence, 2) # it returns the predicted label and the precision i.e the confidence score object_image = st.file_uploader("Upload an image...", type=[ 'png', 'jpg', 'webp', 'jpeg']) submit = st.button('Predict') if submit: if object_image is not None: output = test_image(object_image) # Displaying the image st.image(object_image, channels="BGR") st.markdown(f"""## This is an image of a: {output[0]} """) st.write(f'# Confidence: ${ output[1]}$ %') # print(f'The image was predicted as a {test_image(image_path)}')