Spaces:
Running
Running
from flask import Flask, flash, request, redirect, render_template | |
import os | |
import cv2 | |
import imutils | |
import numpy as np | |
from tensorflow.keras.preprocessing.image import load_img, img_to_array | |
from tensorflow.keras.models import load_model | |
from werkzeug.utils import secure_filename | |
import tempfile | |
from pymongo import MongoClient | |
from datetime import datetime | |
# Load the Brain Tumor CNN Model | |
braintumor_model = load_model('models/braintumor_binary.h5') | |
# Configuring Flask application | |
app = Flask(__name__) | |
app.config['SEND_FILE_MAX_AGE_DEFAULT'] = 0 # Disable caching for images | |
app.secret_key = "nielitchandigarhpunjabpolice" # Secret key for session management | |
# Allowed image file extensions | |
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'jpeg']) | |
# Connect to MongoDB Atlas | |
client = MongoClient("mongodb+srv://test:[email protected]/?retryWrites=true&w=majority") | |
db = client['brain_tumor_detection'] # Database name | |
collection = db['btpredictions'] # Collection name | |
def allowed_file(filename): | |
"""Check if the file is a valid image format (png, jpg, jpeg).""" | |
return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS | |
def brain_tumor(): | |
"""Render the HTML form for the user to upload an image.""" | |
return render_template('braintumor.html') | |
def resultbt(): | |
"""Process the uploaded image and save prediction results to MongoDB.""" | |
if request.method == 'POST': | |
firstname = request.form['firstname'] | |
lastname = request.form['lastname'] | |
email = request.form['email'] | |
phone = request.form['phone'] | |
gender = request.form['gender'] | |
age = request.form['age'] | |
file = request.files['file'] | |
if file and allowed_file(file.filename): | |
temp_file = tempfile.NamedTemporaryFile(delete=False) | |
filename = secure_filename(file.filename) | |
file.save(temp_file.name) | |
flash('Image successfully uploaded and displayed below') | |
try: | |
# Load and preprocess the image | |
img = load_img(temp_file.name, target_size=(128, 128)) # Resize image to match model's input size | |
img_array = img_to_array(img) # Convert image to array | |
img_array = np.expand_dims(img_array, axis=0) / 255.0 # Normalize image and add batch dimension | |
# Make prediction | |
pred = braintumor_model.predict(img_array) | |
prediction = pred[0][0] | |
confidence = prediction if prediction > 0.5 else 1 - prediction # Calculate confidence | |
predicted_class = 'Tumor Detected' if prediction > 0.5 else 'No Tumor Detected' # Determine class based on threshold | |
# Prepare data for MongoDB with JSON-serializable fields | |
result = { | |
"firstname": firstname, | |
"lastname": lastname, | |
"email": email, | |
"phone": phone, | |
"gender": gender, | |
"age": age, | |
"image_name": filename, | |
"prediction": predicted_class, | |
"confidence_score": float(confidence), # Ensure it's a standard float for JSON serialization | |
"timestamp": datetime.utcnow() | |
} | |
# Insert data into MongoDB | |
collection.insert_one(result) | |
# Return the result to the user | |
return render_template('resultbt.html', filename=filename, fn=firstname, ln=lastname, age=age, r=predicted_class, gender=gender) | |
finally: | |
os.remove(temp_file.name) # Ensure temporary file is deleted | |
else: | |
flash('Allowed image types are - png, jpg, jpeg') | |
return redirect(request.url) | |
def dbresults(): | |
"""Fetch all results from MongoDB, show aggregated data, and render in a template.""" | |
# Fetch all documents from MongoDB, sorted by timestamp in descending order | |
all_results = collection.find().sort("timestamp", -1) # Sort by timestamp, latest first | |
# Convert cursor to a list of dictionaries | |
results_list = [] | |
tumor_count = 0 | |
no_tumor_count = 0 | |
for result in all_results: | |
result['_id'] = str(result['_id']) # Convert ObjectId to string for JSON serialization | |
results_list.append(result) | |
# Count total patients with tumor and without tumor | |
if result['prediction'] == 'Tumor Detected': | |
tumor_count += 1 | |
else: | |
no_tumor_count += 1 | |
total_patients = len(results_list) # Total number of patients | |
# Pass the results and aggregated counts to the HTML template | |
return render_template('dbresults.html', | |
results=results_list, | |
total_patients=total_patients, | |
tumor_count=tumor_count, | |
no_tumor_count=no_tumor_count) | |
if __name__ == '__main__': | |
app.run(debug=True) | |