ajoy0071998's picture
Update app.py
2c0741e verified
import streamlit as st
import numpy as np
import torch
import cv2
from tensorflow.keras.models import load_model
from tensorflow.keras.preprocessing import image as keras_image
from PIL import Image
# Load the pre-trained MobileNetV2 model from the .h5 file
@st.cache_resource
def load_mobilenet_model():
return load_model('mobilenetv2_classifier.h5') # Replace with your .h5 file path
mobilenet_model = load_mobilenet_model()
# Load the YOLOv5 model (pre-trained)
@st.cache_resource
def load_yolov5_model():
return torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
yolov5_model = load_yolov5_model()
# Function to preprocess and predict image using MobileNetV2 with class messages
def predict_image(model, img, target_size=(224, 224)):
st.image(img, caption="Uploaded Image", use_column_width=True)
img = img.resize(target_size)
img_array = keras_image.img_to_array(img)
img_array = np.expand_dims(img_array, axis=0)
img_array /= 255.0 # Normalize to match the training preprocessing
predictions = model.predict(img_array)[0]
# Get indices sorted by prediction confidence (in descending order)
sorted_indices = np.argsort(predictions)[::-1]
primary_class_index = sorted_indices[0]
primary_confidence = predictions[primary_class_index]
# Check if the primary predicted label is 1 and has a confidence below 0.7
if primary_class_index != 1 and primary_confidence < 0.7:
secondary_class_index = sorted_indices[1]
secondary_confidence = predictions[secondary_class_index]
return secondary_class_index, secondary_confidence
return primary_class_index, primary_confidence
# Map class indices to specific messages
class_messages = {
0: "Face is not visible",
1: "Looking at the system",
2: "Looking down",
3: "Looking left",
4: "Looking right",
5:"Looking up"
}
# Function to count people using YOLOv5
def count_people(img):
img_array = np.array(img)
results = yolov5_model(img_array)
detections = results.pandas().xyxy[0]
person_detections = detections[detections['name'] == 'person']
num_people = len(person_detections)
return num_people, results
# Function to detect communication devices using YOLOv5
def detect_device(img):
img_array = np.array(img)
results = yolov5_model(img_array)
detections = results.pandas().xyxy[0]
device_detections = detections[detections['name'].str.contains('phone|tablet|computer', case=False, na=False)]
return device_detections, results
# Streamlit UI setup
st.title("Image Analysis App")
# Upload image
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
if uploaded_file is not None:
img = Image.open(uploaded_file)
# Display the uploaded image
st.image(img, caption="Uploaded Image", use_column_width=True)
# Run classification with MobileNetV2
st.subheader("Image Classification")
predicted_index, confidence = predict_image(mobilenet_model, img)
if predicted_index in class_messages:
st.write(f"Prediction: {class_messages[predicted_index]}")
st.write(f"Confidence score: {confidence:.2f}")
else:
st.write("Prediction not recognized.")
# Run person counting with YOLOv5
st.subheader("People Counting")
num_people, people_results = count_people(img)
st.write(f"Number of people detected: {num_people}")
people_results.show() # Show image with bounding boxes
# Run device detection with YOLOv5
st.subheader("Communication Device Detection")
device_detections, device_results = detect_device(img)
if not device_detections.empty:
st.write("Communication devices detected:")
st.write(device_detections[['name', 'confidence']])
device_results.show() # Show image with bounding boxes
else:
st.write("No communication devices detected in the image.")
else:
st.write("Please upload an image to analyze.")