upload dataset
|
|
@ -2,5 +2,5 @@ __pycache__
|
||||||
.vscode
|
.vscode
|
||||||
models/*
|
models/*
|
||||||
results/*
|
results/*
|
||||||
dataset/*
|
# dataset/*
|
||||||
uploads/*
|
uploads/*
|
||||||
61
app.py
|
|
@ -169,7 +169,12 @@ def _serialize_prediction_row(prediction_row):
|
||||||
|
|
||||||
pred_id = prediction_row.get('id')
|
pred_id = prediction_row.get('id')
|
||||||
prediction = str(prediction_row.get('prediction') or '').lower()
|
prediction = str(prediction_row.get('prediction') or '').lower()
|
||||||
confidence = float(prediction_row.get('confidence') or 0.0)
|
source = str(prediction_row.get('source') or 'image_processing')
|
||||||
|
diagnosis_label = prediction_row.get('diagnosis_label')
|
||||||
|
confidence_value = prediction_row.get('confidence')
|
||||||
|
confidence = float(confidence_value or 0.0)
|
||||||
|
show_confidence = source != 'manual_expert_system'
|
||||||
|
display_label = diagnosis_label if source == 'manual_expert_system' and diagnosis_label else ('Positif PMK' if prediction == 'sakit' else 'Sehat')
|
||||||
|
|
||||||
return {
|
return {
|
||||||
'id': pred_id,
|
'id': pred_id,
|
||||||
|
|
@ -177,8 +182,12 @@ def _serialize_prediction_row(prediction_row):
|
||||||
'filename': prediction_row.get('filename') or '',
|
'filename': prediction_row.get('filename') or '',
|
||||||
'image_path': prediction_row.get('image_path') or '',
|
'image_path': prediction_row.get('image_path') or '',
|
||||||
'prediction': prediction,
|
'prediction': prediction,
|
||||||
|
'source': source,
|
||||||
|
'diagnosis_label': diagnosis_label,
|
||||||
|
'display_label': display_label,
|
||||||
'prediction_label': 'Positif PMK' if prediction == 'sakit' else 'Sehat',
|
'prediction_label': 'Positif PMK' if prediction == 'sakit' else 'Sehat',
|
||||||
'confidence': round(confidence, 1),
|
'confidence': round(confidence, 1) if show_confidence else None,
|
||||||
|
'show_confidence': show_confidence,
|
||||||
'timestamp': prediction_row.get('timestamp'),
|
'timestamp': prediction_row.get('timestamp'),
|
||||||
'detail_url': url_for('detail_deteksi', pred_id=pred_id),
|
'detail_url': url_for('detail_deteksi', pred_id=pred_id),
|
||||||
'image_url': url_for('uploaded_file', filename=prediction_row.get('filename') or '') if prediction_row.get('filename') else None,
|
'image_url': url_for('uploaded_file', filename=prediction_row.get('filename') or '') if prediction_row.get('filename') else None,
|
||||||
|
|
@ -218,6 +227,7 @@ def get_data_riwayat_deteksi():
|
||||||
|
|
||||||
recent = []
|
recent = []
|
||||||
total_confidence = 0.0
|
total_confidence = 0.0
|
||||||
|
confidence_count = 0
|
||||||
positif = 0
|
positif = 0
|
||||||
negatif = 0
|
negatif = 0
|
||||||
|
|
||||||
|
|
@ -236,7 +246,9 @@ def get_data_riwayat_deteksi():
|
||||||
continue
|
continue
|
||||||
|
|
||||||
recent.append(serialized)
|
recent.append(serialized)
|
||||||
|
if serialized.get('show_confidence') and serialized.get('confidence') is not None:
|
||||||
total_confidence += float(serialized.get('confidence') or 0.0)
|
total_confidence += float(serialized.get('confidence') or 0.0)
|
||||||
|
confidence_count += 1
|
||||||
if serialized['prediction'] == 'sakit':
|
if serialized['prediction'] == 'sakit':
|
||||||
positif += 1
|
positif += 1
|
||||||
elif serialized['prediction'] == 'sehat':
|
elif serialized['prediction'] == 'sehat':
|
||||||
|
|
@ -247,7 +259,7 @@ def get_data_riwayat_deteksi():
|
||||||
'total': total,
|
'total': total,
|
||||||
'positif': positif,
|
'positif': positif,
|
||||||
'negatif': negatif,
|
'negatif': negatif,
|
||||||
'akurasi_rata_rata': round(total_confidence / total, 1) if total else 0.0,
|
'akurasi_rata_rata': round(total_confidence / confidence_count, 1) if confidence_count else 0.0,
|
||||||
}
|
}
|
||||||
|
|
||||||
return jsonify({
|
return jsonify({
|
||||||
|
|
@ -483,6 +495,7 @@ def predict():
|
||||||
'confidence': confidence,
|
'confidence': confidence,
|
||||||
'features_table': features_table,
|
'features_table': features_table,
|
||||||
'filepath': filepath,
|
'filepath': filepath,
|
||||||
|
'source': 'image_processing',
|
||||||
'db_id': existing_db_id
|
'db_id': existing_db_id
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -616,14 +629,10 @@ def expert_system_page():
|
||||||
diag_list = diagnosis['diagnosis']
|
diag_list = diagnosis['diagnosis']
|
||||||
main_diag = diag_list[0]
|
main_diag = diag_list[0]
|
||||||
|
|
||||||
# Tentukan prediction berdasarkan severity
|
# Diagnosis dari sistem pakar berarti PMK terdeteksi,
|
||||||
|
# jadi hasil deteksi disimpan sebagai sakit/positif PMK.
|
||||||
severity = main_diag.get('severity', 'sedang')
|
severity = main_diag.get('severity', 'sedang')
|
||||||
if severity == 'berat':
|
|
||||||
prediction = 'sakit'
|
prediction = 'sakit'
|
||||||
elif severity == 'sedang':
|
|
||||||
prediction = 'sakit'
|
|
||||||
else:
|
|
||||||
prediction = 'sehat'
|
|
||||||
|
|
||||||
confidence = main_diag.get('score', 0.5)
|
confidence = main_diag.get('score', 0.5)
|
||||||
|
|
||||||
|
|
@ -644,8 +653,14 @@ def expert_system_page():
|
||||||
features_dict=features_dict
|
features_dict=features_dict
|
||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
session.setdefault('last_prediction', {})
|
session['last_prediction'] = {
|
||||||
session['last_prediction']['db_id'] = int(prediction_id)
|
'db_id': int(prediction_id),
|
||||||
|
'filename': 'manual_expert_system',
|
||||||
|
'original_filename': 'Diagnosis Sistem Pakar (Manual)',
|
||||||
|
'prediction': prediction,
|
||||||
|
'confidence': float(confidence),
|
||||||
|
'source': 'manual_expert_system'
|
||||||
|
}
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
print(f"✓ Created prediction entry for manual expert system diagnosis, id={prediction_id}")
|
print(f"✓ Created prediction entry for manual expert system diagnosis, id={prediction_id}")
|
||||||
|
|
@ -686,7 +701,6 @@ def expert_system_page():
|
||||||
prediction_id=prediction_id,
|
prediction_id=prediction_id,
|
||||||
diagnosis_dict=diagnosis_details,
|
diagnosis_dict=diagnosis_details,
|
||||||
severity=severity,
|
severity=severity,
|
||||||
confidence=float(score),
|
|
||||||
timestamp=datetime.datetime.utcnow()
|
timestamp=datetime.datetime.utcnow()
|
||||||
)
|
)
|
||||||
diagnosis['saved_diagnosis_id'] = diag_id
|
diagnosis['saved_diagnosis_id'] = diag_id
|
||||||
|
|
@ -697,13 +711,14 @@ def expert_system_page():
|
||||||
import traceback
|
import traceback
|
||||||
traceback.print_exc()
|
traceback.print_exc()
|
||||||
|
|
||||||
# Jika ada hasil prediksi sebelumnya, tambahkan ke konteks
|
# Jika ada hasil prediksi berbasis image processing sebelumnya, tambahkan ke konteks
|
||||||
|
last_prediction = session.get('last_prediction', {})
|
||||||
image_info = None
|
image_info = None
|
||||||
if 'last_prediction' in session:
|
if last_prediction.get('source') == 'image_processing':
|
||||||
image_info = {
|
image_info = {
|
||||||
'filename': session['last_prediction']['original_filename'],
|
'filename': last_prediction.get('original_filename', ''),
|
||||||
'prediction': session['last_prediction']['prediction'],
|
'prediction': last_prediction.get('prediction', ''),
|
||||||
'confidence': session['last_prediction']['confidence']
|
'confidence': last_prediction.get('confidence', 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return render_template('expert_system.html',
|
return render_template('expert_system.html',
|
||||||
|
|
@ -714,13 +729,14 @@ def expert_system_page():
|
||||||
image_info=image_info)
|
image_info=image_info)
|
||||||
|
|
||||||
# GET request - tampilkan form
|
# GET request - tampilkan form
|
||||||
# Ambil informasi gambar dari session jika ada
|
# Ambil informasi gambar dari session jika hasil sebelumnya berasal dari image processing
|
||||||
|
last_prediction = session.get('last_prediction', {})
|
||||||
image_info = None
|
image_info = None
|
||||||
if 'last_prediction' in session:
|
if last_prediction.get('source') == 'image_processing':
|
||||||
image_info = {
|
image_info = {
|
||||||
'filename': session['last_prediction']['original_filename'],
|
'filename': last_prediction.get('original_filename', ''),
|
||||||
'prediction': session['last_prediction']['prediction'],
|
'prediction': last_prediction.get('prediction', ''),
|
||||||
'confidence': session['last_prediction']['confidence']
|
'confidence': last_prediction.get('confidence', 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
return render_template('expert_system.html',
|
return render_template('expert_system.html',
|
||||||
|
|
@ -825,7 +841,6 @@ def riwayat_diagnosis():
|
||||||
'gejala': ','.join(gejala_list) if isinstance(gejala_list, list) else str(gejala_list),
|
'gejala': ','.join(gejala_list) if isinstance(gejala_list, list) else str(gejala_list),
|
||||||
'diagnosis': diagnosis_obj.get('nama', 'Tidak diketahui'),
|
'diagnosis': diagnosis_obj.get('nama', 'Tidak diketahui'),
|
||||||
'severity': r.get('severity', 'sedang'),
|
'severity': r.get('severity', 'sedang'),
|
||||||
'confidence': r.get('confidence') or 0.0,
|
|
||||||
'rekomendasi': '|'.join(solusi_list) if isinstance(solusi_list, list) else str(solusi_list)
|
'rekomendasi': '|'.join(solusi_list) if isinstance(solusi_list, list) else str(solusi_list)
|
||||||
})
|
})
|
||||||
data_source = 'mysql'
|
data_source = 'mysql'
|
||||||
|
|
|
||||||
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 105 KiB |
|
After Width: | Height: | Size: 98 KiB |
|
After Width: | Height: | Size: 77 KiB |
|
After Width: | Height: | Size: 231 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 211 KiB |
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 226 KiB |
|
After Width: | Height: | Size: 190 KiB |
|
After Width: | Height: | Size: 261 KiB |
|
After Width: | Height: | Size: 284 KiB |
|
After Width: | Height: | Size: 261 KiB |
|
After Width: | Height: | Size: 349 KiB |
|
After Width: | Height: | Size: 390 KiB |
|
After Width: | Height: | Size: 297 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 288 KiB |
|
After Width: | Height: | Size: 269 KiB |
|
After Width: | Height: | Size: 263 KiB |
|
After Width: | Height: | Size: 397 KiB |
|
After Width: | Height: | Size: 224 KiB |
|
After Width: | Height: | Size: 642 KiB |
|
After Width: | Height: | Size: 258 KiB |
|
After Width: | Height: | Size: 439 KiB |
|
After Width: | Height: | Size: 293 KiB |
|
After Width: | Height: | Size: 327 KiB |
|
After Width: | Height: | Size: 343 KiB |
|
After Width: | Height: | Size: 388 KiB |
|
After Width: | Height: | Size: 265 KiB |
|
After Width: | Height: | Size: 217 KiB |
|
After Width: | Height: | Size: 371 KiB |
|
After Width: | Height: | Size: 466 KiB |
|
After Width: | Height: | Size: 273 KiB |
|
After Width: | Height: | Size: 265 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 270 KiB |
|
After Width: | Height: | Size: 290 KiB |
|
After Width: | Height: | Size: 274 KiB |
|
After Width: | Height: | Size: 390 KiB |
|
After Width: | Height: | Size: 221 KiB |
|
After Width: | Height: | Size: 732 KiB |
|
After Width: | Height: | Size: 394 KiB |
|
After Width: | Height: | Size: 133 KiB |
|
After Width: | Height: | Size: 230 KiB |
|
After Width: | Height: | Size: 276 KiB |
|
After Width: | Height: | Size: 250 KiB |
|
After Width: | Height: | Size: 440 KiB |
|
After Width: | Height: | Size: 307 KiB |
|
After Width: | Height: | Size: 313 KiB |
|
After Width: | Height: | Size: 312 KiB |
|
After Width: | Height: | Size: 431 KiB |
|
After Width: | Height: | Size: 253 KiB |
|
After Width: | Height: | Size: 203 KiB |
|
After Width: | Height: | Size: 384 KiB |
|
After Width: | Height: | Size: 512 KiB |
|
After Width: | Height: | Size: 291 KiB |
|
After Width: | Height: | Size: 271 KiB |
|
After Width: | Height: | Size: 240 KiB |
|
After Width: | Height: | Size: 335 KiB |
|
After Width: | Height: | Size: 161 KiB |
|
After Width: | Height: | Size: 293 KiB |
|
After Width: | Height: | Size: 330 KiB |
|
After Width: | Height: | Size: 402 KiB |
|
After Width: | Height: | Size: 371 KiB |
|
After Width: | Height: | Size: 399 KiB |
|
After Width: | Height: | Size: 298 KiB |
|
After Width: | Height: | Size: 266 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 272 KiB |
|
After Width: | Height: | Size: 280 KiB |
|
After Width: | Height: | Size: 274 KiB |
|
After Width: | Height: | Size: 392 KiB |
|
After Width: | Height: | Size: 204 KiB |
|
After Width: | Height: | Size: 704 KiB |
|
After Width: | Height: | Size: 400 KiB |
|
After Width: | Height: | Size: 139 KiB |
|
After Width: | Height: | Size: 219 KiB |
|
After Width: | Height: | Size: 385 KiB |
|
After Width: | Height: | Size: 246 KiB |
|
After Width: | Height: | Size: 444 KiB |
|
After Width: | Height: | Size: 298 KiB |
|
After Width: | Height: | Size: 309 KiB |
|
After Width: | Height: | Size: 314 KiB |
|
After Width: | Height: | Size: 404 KiB |
|
After Width: | Height: | Size: 264 KiB |
|
After Width: | Height: | Size: 196 KiB |
|
After Width: | Height: | Size: 354 KiB |
|
After Width: | Height: | Size: 464 KiB |
|
After Width: | Height: | Size: 213 KiB |
|
After Width: | Height: | Size: 293 KiB |
|
After Width: | Height: | Size: 262 KiB |
|
After Width: | Height: | Size: 356 KiB |
|
After Width: | Height: | Size: 169 KiB |
|
After Width: | Height: | Size: 296 KiB |
|
After Width: | Height: | Size: 338 KiB |
|
After Width: | Height: | Size: 434 KiB |