|
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(debug=True)
|
|
|