|
|
```python |
|
|
from flask import Flask, request, jsonify |
|
|
from werkzeug.utils import secure_filename |
|
|
import os |
|
|
from transformers import pipeline |
|
|
from PIL import Image |
|
|
import torch |
|
|
|
|
|
app = Flask(__name__) |
|
|
|
|
|
|
|
|
UPLOAD_FOLDER = 'uploads' |
|
|
os.makedirs(UPLOAD_FOLDER, exist_ok=True) |
|
|
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER |
|
|
|
|
|
|
|
|
toxin_classifier = pipeline( |
|
|
"image-classification", |
|
|
model="facebook/deit-base-patch16-224" |
|
|
) |
|
|
|
|
|
@app.route('/api/analyze', methods=['POST']) |
|
|
def analyze_image(): |
|
|
if 'image' not in request.files: |
|
|
return jsonify({'error': 'No image provided'}), 400 |
|
|
|
|
|
file = request.files['image'] |
|
|
if file.filename == '': |
|
|
return jsonify({'error': 'No selected file'}), 400 |
|
|
|
|
|
if file: |
|
|
filename = secure_filename(file.filename) |
|
|
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) |
|
|
file.save(filepath) |
|
|
|
|
|
try: |
|
|
|
|
|
image = Image.open(filepath) |
|
|
results = toxin_classifier(image) |
|
|
|
|
|
|
|
|
|
|
|
toxin_level = "Medium" |
|
|
safety = "Caution" |
|
|
recommendation = "Limit consumption to 1 serving per week" |
|
|
|
|
|
|
|
|
if results and len(results) > 0: |
|
|
main_prediction = results[0] |
|
|
if main_prediction['score'] > 0.7: |
|
|
toxin_level = "High" |
|
|
safety = "Avoid" |
|
|
recommendation = "Do not consume - high toxin levels detected" |
|
|
elif main_prediction['score'] > 0.4: |
|
|
toxin_level = "Medium" |
|
|
safety = "Caution" |
|
|
else: |
|
|
toxin_level = "Low" |
|
|
safety = "Safe" |
|
|
|
|
|
return jsonify({ |
|
|
'toxin_level': toxin_level, |
|
|
'safety': safety, |
|
|
'recommendation': recommendation, |
|
|
'image_path': f'/uploads/{filename}' |
|
|
}) |
|
|
|
|
|
except Exception as e: |
|
|
return jsonify({'error': str(e)}), 500 |
|
|
|
|
|
if __name__ == '__main__': |
|
|
app.run(debug=True) |
|
|
``` |
|
|
|
|
|
Key changes made: |
|
|
|
|
|
1. Added file upload and analysis functionality to the dashboard |
|
|
2. Created a modal to display scan results |
|
|
3. Added Flask backend API that: |
|
|
- Accepts image uploads |
|
|
- Processes them with a Hugging Face model |
|
|
- Returns analysis results |
|
|
4. Included error handling and loading states |
|
|
5. Added UI for displaying the scan results |
|
|
|
|
|
To implement this: |
|
|
|
|
|
1. Install required Python packages: |
|
|
```bash |
|
|
pip install flask torch transformers pillow |
|
|
``` |
|
|
|
|
|
2. Choose an appropriate Hugging Face model for your food/toxin analysis needs. The example uses a generic image classification model, but you might want: |
|
|
- A food-specific model |
|
|
- A toxicity detection model |
|
|
- Or a custom fine-tuned model |
|
|
|
|
|
3. Run the Flask API: |
|
|
```bash |
|
|
python api.py |
|
|
``` |
|
|
|
|
|
4. Update the frontend to point to your API endpoint |
|
|
|
|
|
The backend currently uses a placeholder model - you should replace it with a model that's actually trained for food toxin analysis. Hugging Face has several food-related models that could be adapted for this purpose. |