9.6 KiB
Setup Guide - Rice Leaf Disease Classification API
Panduan lengkap untuk mengintegrasikan model CNN klasifikasi penyakit daun padi ke aplikasi web Laravel.
📋 Persyaratan
Backend (Python Flask API)
- Python 3.8 atau lebih baru
- TensorFlow/Keras 2.10+
- OpenCV
- Flask
Frontend (Laravel Web)
- Laravel 10+
- PHP 8.0+
- Composer
🚀 Setup Langkah demi Langkah
Bagian 1: Setup Python API Server
1.1 Install Dependencies Python
Buka terminal/PowerShell di folder rice leaf diseases dataset/:
# Navigasi ke folder dataset
cd "d:\PROJECT TA\rice leaf diseases dataset"
# Buat virtual environment (opsional tapi recommended)
python -m venv venv
# Aktifkan virtual environment
# Windows:
venv\Scripts\activate
# Install dependencies
pip install -r requirements_api.txt
1.2 Pastikan Model File Ada
Pastikan salah satu dari file model ini ada di folder rice leaf diseases dataset/:
rice_leaf_disease_model.keras✅ (Preferred)rice_leaf_disease_model.h5rice_leaf_disease_model.json(+ weights file)
File-file ini seharusnya sudah ada dari training notebook.
1.3 Jalankan API Server
# Letakkan di folder yang sama dengan model file
python api_server.py
Output yang diharapkan:
============================================================
Rice Leaf Disease Classification API Server
============================================================
Working directory: d:\PROJECT TA\rice leaf diseases dataset
Loading model...
✓ Model ditemukan: rice_leaf_disease_model.keras
✓ Model berhasil dimuat!
Model input shape: (None, 224, 224, 3)
Number of layers: 25
============================================================
Starting Flask API Server...
============================================================
Server berjalan di http://127.0.0.1:5000/
Tekan CTRL+C untuk menghentikan.
🔴 PENTING: Server Python harus tetap berjalan saat menggunakan API dari Laravel!
Bagian 2: Setup Laravel Web API
2.1 Register API Routes
Edit file web_TA/bootstrap/app.php atau pastikan menggunakan API routes:
// Di dalam bootstrap/app.php atau di app structure Anda
// Pastikan routes/api.php dimuat:
// Jika menggunakan Laravel 11, routes sudah auto-loaded
// Jika menggunakan Laravel 10, tambahkan di RouteServiceProvider
File routes/api.php sudah dibuat dan berisi endpoint classification.
2.2 Konfigurasi Laravel
Pastikan file .env sudah dikonfigurasi:
APP_NAME="Padi Disease Classification"
APP_ENV=local
APP_DEBUG=true
APP_KEY=base64:... # Jalankan php artisan key:generate jika belum
# Database configuration
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=padi_db
DB_USERNAME=root
DB_PASSWORD=
2.3 Run Laravel
cd "d:\PROJECT TA\web_TA"
# Install dependencies jika belum
composer install
# Generate key
php artisan key:generate
# Run development server
php artisan serve
Laravel akan berjalan di http://127.0.0.1:8000
🔌 API Endpoints
Test Koneksi
curl -X GET http://127.0.0.1:8000/api/classification/test
Response:
{
"success": true,
"message": "Koneksi ke model API berhasil",
"model_info": {
"status": "ok",
"model_loaded": true,
"classes": ["Bacterialblight", "Brownspot", "Leafsmut"]
}
}
Klasifikasi Gambar (Analyze Only)
Endpoint: POST /api/classification/classify
curl -X POST http://127.0.0.1:8000/api/classification/classify \
-F "image=@path/to/image.jpg"
Response:
{
"success": true,
"message": "Klasifikasi berhasil",
"data": {
"predicted_class": "Bacterialblight",
"confidence": "95.23%",
"confidence_value": 0.9523,
"all_predictions": {
"Bacterialblight": 0.9523,
"Brownspot": 0.0380,
"Leafsmut": 0.0097
},
"disease_info": {
"name": "Bercak Bakteri (Bacterial Blight)",
"description": "...",
"symptoms": [...],
"treatment": [...],
"severity": "Sedang hingga Tinggi"
},
"timestamp": "2024-03-09T10:30:45Z"
}
}
Klasifikasi & Simpan Gambar
Endpoint: POST /api/classification/classify-and-save
curl -X POST http://127.0.0.1:8000/api/classification/classify-and-save \
-F "image=@path/to/image.jpg" \
-F "notes=Dari lapangan area A"
Response: Sama seperti di atas + image_path untuk akses gambar yang disimpan
💻 Contoh Penggunaan di Frontend
HTML Form Upload
<form id="classificationForm" enctype="multipart/form-data">
<div>
<label for="image">Pilih Gambar Daun:</label>
<input type="file" id="image" name="image" accept="image/*" required>
</div>
<div>
<label for="notes">Catatan (opsional):</label>
<textarea id="notes" name="notes" rows="3"></textarea>
</div>
<button type="submit">Klasifikasi</button>
<div id="result"></div>
</form>
<script>
document.getElementById('classificationForm').addEventListener('submit', async (e) => {
e.preventDefault();
const formData = new FormData(this);
try {
const response = await fetch('/api/classification/classify-and-save', {
method: 'POST',
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
}
});
const data = await response.json();
if (data.success) {
displayResults(data.data);
} else {
alert('Error: ' + data.message);
}
} catch (error) {
console.error('Error:', error);
alert('Terjadi kesalahan saat klasifikasi');
}
});
function displayResults(data) {
const resultDiv = document.getElementById('result');
resultDiv.innerHTML = `
<h3>Hasil Klasifikasi</h3>
<p><strong>Diagnosis:</strong> ${data.disease_info.name}</p>
<p><strong>Confidence:</strong> ${data.confidence}</p>
<p><strong>Severity:</strong> ${data.disease_info.severity}</p>
<h4>Gejala:</h4>
<ul>
${data.disease_info.symptoms.map(s => `<li>${s}</li>`).join('')}
</ul>
<h4>Penanganan:</h4>
<ul>
${data.disease_info.treatment.map(t => `<li>${t}</li>`).join('')}
</ul>
<img src="${data.image_path}" style="max-width: 300px; margin-top: 20px;">
`;
}
</script>
JavaScript Fetch (Modern)
async function classifyImage(imageFile) {
const formData = new FormData();
formData.append('image', imageFile);
formData.append('notes', 'Upload manual');
const response = await fetch('/api/classification/classify-and-save', {
method: 'POST',
body: formData,
headers: {
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').content
}
});
return await response.json();
}
// Penggunaan
const fileInput = document.getElementById('imageInput');
fileInput.addEventListener('change', async (e) => {
const file = e.target.files[0];
const result = await classifyImage(file);
console.log(result);
});
🔧 Troubleshooting
Problem: "Tidak dapat menghubungi model API"
Solusi:
-
Pastikan Python API server berjalan
# Cek apakah port 5000 aktif netstat -ano | findstr :5000 # Windows -
Test API Python secara langsung:
curl http://127.0.0.1:5000/health -
Jika perlu ganti port, edit di:
api_server.py: ubahport=5000ClassificationController.php: ubah$pythonApiUrl
Problem: "Model tidak ditemukan"
Solusi:
-
Pastikan file model ada di folder
rice leaf diseases dataset/ -
Nama file harus tepat:
rice_leaf_disease_model.keras✅rice_leaf_disease_model.h5rice_leaf_disease_model.json
-
Cek output API server:
# Lihat log saat startup untuk tahu file mana yang digunakan python api_server.py
Problem: "Memory Error" saat prediksi
Solusi:
- Model cukup besar, pastikan sistem memiliki cukup RAM
- Jika Windows, tutup aplikasi lain yang menggunakan banyak memory
- Atau gunakan
model.quantize()untuk kompresi model
Problem: CORS Error di Frontend
Solusi:
- Python API sudah dikonfigurasi dengan CORS
- Pastikan request header benar dari Laravel
📊 Database (Opsional)
Jika ingin menyimpan riwayat klasifikasi:
cd "d:\PROJECT TA\web_TA"
# Create migration
php artisan make:migration create_classifications_table
# Run migrations
php artisan migrate
Migration File (database/migrations/XXXX_create_classifications_table.php):
Schema::create('classifications', function (Blueprint $table) {
$table->id();
$table->string('image_path');
$table->string('predicted_class');
$table->float('confidence');
$table->json('all_predictions');
$table->text('notes')->nullable();
$table->timestamps();
});
📝 Catatan Penting
- API Server Harus Berjalan: Pastikan
api_server.pytetap berjalan saat menggunakan API - CSRF Token: Jika ada error CSRF, pastikan
X-CSRF-TOKENdikirim di request header - File Upload Size: Default batas 5MB, bisa diubah di
ClassificationController.php - Model Update: Jika model diupdate, hanya perlu restart API server
🎯 Next Steps
- ✅ Setup Python API
- ✅ Setup Laravel
- ✅ Test endpoints
- Create UI - Buat halaman upload gambar
- Add Database - Simpan riwayat klasifikasi
- Mobile App - Integrasi dengan Flutter app
Created: March 9, 2026
Author: AI Assistant
Version: 1.0