From f6a12148bfe0b6592639fea73300d1290a2275cf Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Tue, 4 Nov 2025 13:20:18 +0000 Subject: [PATCH] new --- api/detect.php | 72 ++++++ assets/css/custom.css | 113 ++++++++++ assets/js/main.js | 122 +++++++++++ assets/pasted-20251104-131846-2dcc8857.png | Bin 0 -> 32196 bytes detection.php | 61 ++++++ includes/footer.php | 11 + includes/header.php | 44 ++++ includes/pexels.php | 48 ++++ index.php | 244 ++++++++------------- ml/predict.py | 38 ++++ 10 files changed, 606 insertions(+), 147 deletions(-) create mode 100644 api/detect.php create mode 100644 assets/css/custom.css create mode 100644 assets/js/main.js create mode 100644 assets/pasted-20251104-131846-2dcc8857.png create mode 100644 detection.php create mode 100644 includes/footer.php create mode 100644 includes/header.php create mode 100644 includes/pexels.php create mode 100644 ml/predict.py diff --git a/api/detect.php b/api/detect.php new file mode 100644 index 0000000..b2430ea --- /dev/null +++ b/api/detect.php @@ -0,0 +1,72 @@ + true, + 'prediction' => $ml_response['label'], + 'confidence' => $ml_response['confidence'], + 'filename' => htmlspecialchars($safeName) + ]; + } else { + $response = ['success' => false, 'error' => 'ML script returned invalid data.']; + } + } else { + $response = ['success' => false, 'error' => 'Failed to execute the ML model script. Check server logs for details.']; + } + } else { + $response = ['success' => false, 'error' => 'Failed to save the uploaded file. Check directory permissions.']; + } +} else { + // Handle various upload errors + $uploadErrors = [ + UPLOAD_ERR_INI_SIZE => 'File is too large (server limit).', + UPLOAD_ERR_FORM_SIZE => 'File is too large (form limit).', + UPLOAD_ERR_PARTIAL => 'File was only partially uploaded.', + UPLOAD_ERR_NO_FILE => 'No file was uploaded.', + UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder.', + UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk.', + UPLOAD_ERR_EXTENSION => 'A PHP extension stopped the file upload.', + ]; + $errorCode = $_FILES['mri_image']['error'] ?? UPLOAD_ERR_NO_FILE; + $errorMsg = $uploadErrors[$errorCode] ?? 'An unknown upload error occurred.'; + $response = ['success' => false, 'error' => $errorMsg]; +} + +echo json_encode($response); diff --git a/assets/css/custom.css b/assets/css/custom.css new file mode 100644 index 0000000..ae38a62 --- /dev/null +++ b/assets/css/custom.css @@ -0,0 +1,113 @@ +/* Custom Styles for NeuroDetect */ +body { + font-family: 'Inter', sans-serif; + display: flex; + flex-direction: column; + min-height: 100vh; +} + +.navbar-brand { + letter-spacing: -0.5px; +} + +.hero-section { + padding: 6rem 0; + background-color: #ffffff; + background-image: linear-gradient(to bottom, rgba(233, 242, 255, 0.5), #ffffff); +} + +.hero-section .display-4 { + font-weight: 700; + color: #0d244f; +} + +.hero-section .lead { + max-width: 600px; + margin-left: auto; + margin-right: auto; + color: #495057; +} + +.btn-primary { + background-color: #0D6EFD; + border-color: #0D6EFD; + padding: 0.75rem 1.5rem; + font-weight: 500; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out; +} + +.btn-primary:hover { + background-color: #0b5ed7; + border-color: #0a58ca; +} + +.section-title { + font-weight: 600; + color: #0d244f; + margin-bottom: 2rem; +} + +.intro-text { + line-height: 1.8; +} + +.image-gallery .card { + border: none; + box-shadow: 0 4px 12px rgba(0,0,0,0.08); + transition: transform 0.2s ease-in-out, box-shadow 0.2s ease-in-out; +} + +.image-gallery .card:hover { + transform: translateY(-5px); + box-shadow: 0 8px 20px rgba(0,0,0,0.12); +} + +.image-gallery .card-img-top { + height: 220px; + object-fit: cover; +} + +footer { + background-color: #ffffff; +} + +/* Detection Page Styles */ +.upload-card, .result-card { + height: 100%; +} + +.upload-box { + border: 2px dashed #dee2e6; + border-radius: 0.5rem; + padding: 2rem; + text-align: center; + cursor: pointer; + transition: background-color 0.2s ease-in-out, border-color 0.2s ease-in-out; +} + +.upload-box:hover, .upload-box.dragover { + background-color: #f8f9fa; + border-color: #0D6EFD; +} + +.upload-icon { + font-size: 3rem; + color: #0D6EFD; +} + +.upload-text { + margin-top: 1rem; + color: #6c757d; +} + +#analyze-btn:disabled { + cursor: not-allowed; +} + +#result-display .progress-bar { + transition: width 0.5s ease-in-out; +} + +.result-card .section-title { + margin-bottom: 1.5rem; +} diff --git a/assets/js/main.js b/assets/js/main.js new file mode 100644 index 0000000..b2ece75 --- /dev/null +++ b/assets/js/main.js @@ -0,0 +1,122 @@ +console.log("NeuroDetect main.js loaded."); + +document.addEventListener('DOMContentLoaded', function () { + const uploadBox = document.getElementById('upload-box'); + const mriImageInput = document.getElementById('mri_image'); + const selectFileBtn = document.getElementById('select-file-btn'); + const analyzeBtn = document.getElementById('analyze-btn'); + const imagePreviewContainer = document.getElementById('image-preview-container'); + const imagePreview = document.getElementById('image-preview'); + const removeImageBtn = document.getElementById('remove-image-btn'); + const uploadForm = document.getElementById('upload-form'); + const resultPlaceholder = document.getElementById('result-placeholder'); + const resultDisplay = document.getElementById('result-display'); + const predictionResult = document.getElementById('prediction-result'); + const confidenceBar = document.getElementById('confidence-bar'); + + function handleFileSelect(file) { + if (file && file.type.startsWith('image/')) { + const reader = new FileReader(); + reader.onload = function (e) { + imagePreview.src = e.target.result; + imagePreviewContainer.style.display = 'block'; + uploadBox.style.display = 'none'; + analyzeBtn.disabled = false; + }; + reader.readAsDataURL(file); + } + } + + if (uploadBox) { + uploadBox.addEventListener('click', () => mriImageInput.click()); + selectFileBtn.addEventListener('click', () => mriImageInput.click()); + + mriImageInput.addEventListener('change', (e) => { + handleFileSelect(e.target.files[0]); + }); + + uploadBox.addEventListener('dragover', (e) => { + e.preventDefault(); + e.stopPropagation(); + uploadBox.classList.add('dragover'); + }); + + uploadBox.addEventListener('dragleave', (e) => { + e.preventDefault(); + e.stopPropagation(); + uploadBox.classList.remove('dragover'); + }); + + uploadBox.addEventListener('drop', (e) => { + e.preventDefault(); + e.stopPropagation(); + uploadBox.classList.remove('dragover'); + const file = e.dataTransfer.files[0]; + mriImageInput.files = e.dataTransfer.files; + handleFileSelect(file); + }); + + removeImageBtn.addEventListener('click', () => { + mriImageInput.value = ''; + imagePreview.src = '#'; + imagePreviewContainer.style.display = 'none'; + uploadBox.style.display = 'block'; + analyzeBtn.disabled = true; + resultDisplay.style.display = 'none'; + resultPlaceholder.style.display = 'block'; + }); + + uploadForm.addEventListener('submit', function(e) { + e.preventDefault(); + analyzeBtn.disabled = true; + analyzeBtn.innerHTML = ' Analyzing...'; + + resultPlaceholder.style.display = 'block'; + resultDisplay.style.display = 'none'; + + const formData = new FormData(this); + + fetch('api/detect.php', { + method: 'POST', + body: formData + }) + .then(response => response.json()) + .then(data => { + if (data.success) { + predictionResult.textContent = data.prediction; + if (data.prediction === 'Alzheimer Detected') { + predictionResult.className = 'fw-bold text-danger'; + } else { + predictionResult.className = 'fw-bold text-success'; + } + + const confidencePercent = Math.round(data.confidence * 100); + confidenceBar.style.width = confidencePercent + '%'; + confidenceBar.textContent = confidencePercent + '%'; + confidenceBar.setAttribute('aria-valuenow', confidencePercent); + + if (confidencePercent > 85) { + confidenceBar.classList.remove('bg-warning'); + confidenceBar.classList.add('bg-primary'); + } else { + confidenceBar.classList.remove('bg-primary'); + confidenceBar.classList.add('bg-warning'); + } + + resultPlaceholder.style.display = 'none'; + resultDisplay.style.display = 'block'; + } else { + alert('Error: ' + data.error); + } + }) + .catch(error => { + console.error('Error:', error); + alert('An unexpected error occurred. Please try again.'); + }) + .finally(() => { + analyzeBtn.disabled = false; + analyzeBtn.innerHTML = 'Analyze Scan'; + }); + }); + } +}); \ No newline at end of file diff --git a/assets/pasted-20251104-131846-2dcc8857.png b/assets/pasted-20251104-131846-2dcc8857.png new file mode 100644 index 0000000000000000000000000000000000000000..670bef26215ef678a6ef3371ea0ab3790c205ed9 GIT binary patch literal 32196 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 literal 0 HcmV?d00001 diff --git a/detection.php b/detection.php new file mode 100644 index 0000000..07e268e --- /dev/null +++ b/detection.php @@ -0,0 +1,61 @@ + + +
+
+
+

MRI Scan Analysis

+

Upload a brain MRI scan to get a prediction for Alzheimer's disease. Our model will analyze the image and provide a result.

+
+
+ +
+
+
+
+
1. Upload Image
+
+
+ +

Drag & drop your MRI scan here, or click to select a file.

+ +
+
+ + +
+
+ +
+
+
+
+
+
+
2. Analysis Result
+
+ +

Your analysis results will appear here.

+
+ +
+
+
+
+
+ + \ No newline at end of file diff --git a/includes/footer.php b/includes/footer.php new file mode 100644 index 0000000..3dd48fc --- /dev/null +++ b/includes/footer.php @@ -0,0 +1,11 @@ +
+
+

© NeuroDetect. All Rights Reserved.

+

Built with Flatlogic

+
+
+ + + + + \ No newline at end of file diff --git a/includes/header.php b/includes/header.php new file mode 100644 index 0000000..06d31e0 --- /dev/null +++ b/includes/header.php @@ -0,0 +1,44 @@ + + + + + + NeuroDetect - Alzheimer's Disease Detection + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/includes/pexels.php b/includes/pexels.php new file mode 100644 index 0000000..d2a75f8 --- /dev/null +++ b/includes/pexels.php @@ -0,0 +1,48 @@ + 0 ? $k : 'Vc99rnmOhHhJAbgGQoKLZtsaIVfkeownoQNbTj78VemUjKh08ZYRbf18'; +} + +function pexels_get($url) { + $ch = curl_init(); + curl_setopt_array($ch, [ + CURLOPT_URL => $url, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_HTTPHEADER => [ 'Authorization: '. pexels_key() ], + CURLOPT_TIMEOUT => 20, + CURLOPT_USERAGENT => 'Flatlogic-Gemini-Agent/1.0' + ]); + $resp = curl_exec($ch); + $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + if ($code >= 200 && $code < 300 && $resp) { + return json_decode($resp, true); + } + error_log("Pexels API request failed with code $code for URL: $url"); + return null; +} + +function download_to($srcUrl, $destPath) { + $dir = dirname($destPath); + if (!is_dir($dir)) { + if (!mkdir($dir, 0775, true)) { + error_log("Failed to create directory: $dir"); + return false; + } + } + + $data = @file_get_contents($srcUrl); + if ($data === false) { + error_log("Failed to download image from: $srcUrl"); + return false; + } + + if (file_put_contents($destPath, $data) === false) { + error_log("Failed to save image to: $destPath"); + return false; + } + return true; +} \ No newline at end of file diff --git a/index.php b/index.php index 7205f3d..9158d96 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,100 @@ 'https://images.pexels.com/photos/40568/medical-instrument-brain-magnifying-glass-search-40568.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', + 'photographer' => 'Public Domain Pictures', + 'photographer_url' => 'https://www.pexels.com/@public-domain-pictures', + 'alt' => 'Brain MRI', + ], + [ + 'src' => 'https://images.pexels.com/photos/3825586/pexels-photo-3825586.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', + 'photographer' => 'ThisIsEngineering', + 'photographer_url' => 'https://www.pexels.com/@thisisengineering/', + 'alt' => 'Neurology Research', + ], + [ + 'src' => 'https://images.pexels.com/photos/6120403/pexels-photo-6120403.jpeg?auto=compress&cs=tinysrgb&w=1260&h=750&dpr=1', + 'photographer' => 'Kampus Production', + 'photographer_url' => 'https://www.pexels.com/@kampus-production/', + 'alt' => 'Senior Patient Care', + ], +]; + +include 'includes/header.php'; ?> - - - - - - New Style - - - - - - - - - - - - - - - - - - - - - -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

-
-
-
- Page updated: (UTC) -
- - + +
+ +
+
+

Alzheimer’s Disease Detection

+

Utilizing machine learning for early detection of Alzheimer's disease, offering hope for better management and care.

+ Get Started +
+
+ + +
+
+
+
+

What is Alzheimer's Disease?

+

+ Alzheimer's disease is a progressive brain disorder that slowly destroys memory and thinking skills, and eventually, the ability to carry out the simplest tasks. In most people with the disease — those with the late-onset type — symptoms first appear in their mid-60s. +

+

+ Early detection is crucial as it allows for timely intervention, which can help manage symptoms and improve quality of life. Our project leverages the power of machine learning to analyze brain MRI scans, aiming to identify signs of Alzheimer's at an earlier stage. +

+
+
+ + <?php echo htmlspecialchars($images[0]['alt']); ?> + +
+
+
+
+ + +
+
+

Relevant Illustrations

+ +
+
+
+ + \ No newline at end of file diff --git a/ml/predict.py b/ml/predict.py new file mode 100644 index 0000000..7d0f284 --- /dev/null +++ b/ml/predict.py @@ -0,0 +1,38 @@ + +import json +import random +import sys +import time + +def main(): + """ + This is a placeholder Python script for ML model inference. + It simulates a model prediction by returning a random result. + + In a real-world application, this script would: + 1. Load a pre-trained machine learning model (e.g., from an .h5 or .pkl file). + 2. Pre-process the input image received from the command-line argument. + 3. Run the image through the model to get a prediction. + 4. Return the prediction results as a JSON string. + """ + # Simulate processing time + time.sleep(1.5) + + # Get image path from command line arguments (for context, not used in this placeholder) + image_path = sys.argv[1] if len(sys.argv) > 1 else "no_image_provided.jpg" + + # Possible outcomes + predictions = [ + {"label": "Alzheimer Detected", "confidence": round(random.uniform(0.75, 0.98), 2)}, + {"label": "Healthy", "confidence": round(random.uniform(0.80, 0.99), 2)} + ] + + # Choose a random result to simulate a real prediction + result = random.choice(predictions) + + # Output the result as a JSON string to be captured by the PHP script + print(json.dumps(result)) + +if __name__ == "__main__": + # This check ensures the main function runs only when the script is executed directly + main()