|
import os, glob |
|
from flask import Flask, request, render_template |
|
from transformers import pipeline |
|
from ultralytics import YOLO |
|
|
|
app = Flask(__name__) |
|
app.config['UPLOAD_FOLDER'] = 'static/uploads' |
|
app.config['MARKED_FOLDER'] = 'static/marked' |
|
PREDICT_FOLDER = os.path.join(app.config['MARKED_FOLDER'], 'predict') |
|
|
|
|
|
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) |
|
os.makedirs(PREDICT_FOLDER, exist_ok=True) |
|
|
|
|
|
pipe = pipeline("image-classification", model="JorgeGIT/Finetuned-Leukemia-cell") |
|
yolo_model = YOLO("runs/detect/leukemia-yolo-model/weights/best.pt") |
|
|
|
|
|
def calculate_combined_risk(blast_risk, huggingface_score, age, sex): |
|
score = 0.6 * blast_risk + 0.4 * huggingface_score |
|
if age and int(age) > 60: |
|
score += 5 |
|
if sex == 'male': |
|
score += 2 |
|
return min(round(score, 1), 100) |
|
|
|
@app.route('/', methods=['GET']) |
|
def home(): |
|
return render_template('index.html') |
|
|
|
@app.route('/upload', methods=['GET', 'POST']) |
|
def upload_file(): |
|
if request.method == 'POST': |
|
file = request.files.get('file') |
|
age = request.form.get('age') |
|
sex = request.form.get('sex') |
|
|
|
if not file or file.filename == '' or not age or not sex: |
|
return "กรุณากรอกข้อมูลให้ครบ" |
|
|
|
filename = file.filename |
|
filepath = os.path.join(app.config['UPLOAD_FOLDER'], filename) |
|
file.save(filepath) |
|
|
|
results = yolo_model.predict( |
|
source=filepath, |
|
save=True, |
|
project=app.config['MARKED_FOLDER'], |
|
name='predict', |
|
exist_ok=True |
|
) |
|
|
|
list_of_files = glob.glob(os.path.join(PREDICT_FOLDER, '*.jpg')) |
|
latest_file = max(list_of_files, key=os.path.getctime) |
|
marked_filename = os.path.relpath(latest_file, 'static').replace('\\', '/') |
|
|
|
total_cells = len(results[0].boxes) |
|
abnormal_cells = 0 |
|
for box in results[0].boxes: |
|
cls_id = int(box.cls[0].item()) |
|
class_name = results[0].names[cls_id] |
|
if 'blast' in class_name.lower(): |
|
abnormal_cells += 1 |
|
blast_risk = round((abnormal_cells / total_cells) * 100, 1) if total_cells else 0.0 |
|
|
|
result = pipe(filepath) |
|
lla_result = [ |
|
{'label': 'โอกาสการเกิดโรค Leukemia = ', 'score': round(res['score'] * 1000, 1)} |
|
for res in result if res['label'].lower() == 'lla' |
|
] |
|
huggingface_score = lla_result[0]['score'] if lla_result else 0.0 |
|
|
|
combined_risk = calculate_combined_risk(blast_risk, huggingface_score, age, sex) |
|
|
|
return render_template('result.html', |
|
filename=filename, |
|
marked_filename=marked_filename, |
|
total_cells=total_cells, |
|
abnormal_cells=abnormal_cells, |
|
blast_risk=blast_risk, |
|
huggingface_score=huggingface_score, |
|
combined_risk=combined_risk, |
|
age=age, |
|
sex=sex |
|
) |
|
|
|
return render_template('upload.html') |
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860) |
|
|
|
|