hanya70999's picture
Upload 13 files
72b9a21 verified

Python API untuk Klasifikasi Bibit Kelapa Sawit

API server Python ini menggunakan model Hybrid DenseNet-SVM untuk mengklasifikasikan umur bibit kelapa sawit (3 Bulan, 6 Bulan, 9 Bulan).

πŸ“‹ Struktur File

python-api/
β”œβ”€β”€ app.py                          # Main Flask application
β”œβ”€β”€ requirements.txt                # Python dependencies
β”œβ”€β”€ Dockerfile                      # Docker configuration
β”œβ”€β”€ .dockerignore                  # Docker ignore rules
└── models/                         # Folder untuk model files
    β”œβ”€β”€ svm_densenet201_rbf.joblib # Model SVM (ANDA LETAKKAN DI SINI)
    β”œβ”€β”€ metadata.json              # Model metadata (ANDA LETAKKAN DI SINI)
    └── metadata.json.example      # Contoh format metadata

πŸ”§ Persiapan

1. Letakkan File Model Anda

Setelah training model Anda di Google Colab, letakkan file-file berikut ke folder models/:

File yang diperlukan:

  • svm_densenet201_rbf.joblib - File model SVM hasil training
  • metadata.json - File metadata dengan format:
{
  "class_names": ["3 Bulan", "6 Bulan", "9 Bulan"],
  "img_size": 224,
  "model_type": "DenseNet201 + SVM",
  "description": "Klasifikasi perkembangan bibit kelapa sawit berdasarkan umur"
}

2. Setup Koneksi Supabase (Optional tapi Recommended)

Python API bisa menyimpan hasil prediksi langsung ke database.

Set environment variables:

SUPABASE_URL=https://xyddxrfiacdcnipdclas.supabase.co
SUPABASE_ANON_KEY=your-anon-key

πŸ“– Detail lengkap: Lihat SUPABASE_SETUP.md

3. Verifikasi File

Pastikan struktur folder seperti ini:

python-api/
β”œβ”€β”€ app.py
β”œβ”€β”€ requirements.txt
β”œβ”€β”€ Dockerfile
β”œβ”€β”€ .env (optional untuk local)
└── models/
    β”œβ”€β”€ svm_densenet201_rbf.joblib  ← File model Anda
    └── metadata.json                ← Metadata Anda

πŸš€ Cara Deploy

Opsi 1: Deploy ke Hugging Face Spaces (RECOMMENDED - Gratis)

  1. Buat Account di Hugging Face

  2. Upload Files

    • Upload semua file dari folder python-api/
    • Pastikan file model sudah ada di folder models/
  3. Setting Environment Variables

    • Go to Settings β†’ Variables and secrets
    • Add secrets:
      • SUPABASE_URL
      • SUPABASE_ANON_KEY
  4. Dapatkan URL API

    • Setelah deploy, Anda akan mendapat URL seperti: https://username-spacename.hf.space

Opsi 2: Deploy ke Railway.app

  1. Install Railway CLI

    npm install -g @railway/cli
    
  2. Login ke Railway

    railway login
    
  3. Deploy dari folder python-api

    cd python-api
    railway init
    railway up
    
  4. Set Environment Variables

    railway variables set SUPABASE_URL=https://xyddxrfiacdcnipdclas.supabase.co
    railway variables set SUPABASE_ANON_KEY=your-key
    
  5. Generate Domain

    railway domain
    

Opsi 3: Deploy ke Google Cloud Run

  1. Install Google Cloud SDK

  2. Build dan Push Docker Image

    cd python-api
    
    # Build image
    gcloud builds submit --tag gcr.io/PROJECT_ID/palm-classifier
    
    # Deploy to Cloud Run
    gcloud run deploy palm-classifier \
      --image gcr.io/PROJECT_ID/palm-classifier \
      --platform managed \
      --region asia-southeast2 \
      --allow-unauthenticated \
      --set-env-vars SUPABASE_URL=https://xyddxrfiacdcnipdclas.supabase.co,SUPABASE_ANON_KEY=your-key
    

Opsi 4: Local Testing (Development)

cd python-api

# Install dependencies
pip install -r requirements.txt

# Run server
python app.py

Server akan berjalan di http://localhost:5000

πŸ”— Integrasi dengan Aplikasi Web

Setelah API ter-deploy, tambahkan URL API ke Supabase Edge Function:

Via Supabase Dashboard:

  1. Buka Supabase Dashboard
  2. Pilih Project Anda
  3. Pergi ke Edge Functions β†’ classify-seedling
  4. Klik Secrets/Environment Variables
  5. Tambahkan secret baru:
    • Name: PYTHON_API_URL
    • Value: https://your-api-url.com (URL API yang sudah di-deploy)

Via CLI (jika menggunakan Supabase CLI):

supabase secrets set PYTHON_API_URL=https://your-api-url.com

πŸ“‘ API Endpoints

1. Health Check

GET /health

Response:

{
  "status": "healthy",
  "model_loaded": true,
  "device": "cpu",
  "classes": ["3 Bulan", "6 Bulan", "9 Bulan"]
}

2. Classify Image

POST /classify
Content-Type: application/json

{
  "image": "data:image/jpeg;base64,/9j/4AAQ..."
}

Response:

{
  "predicted_class": "6 Bulan",
  "confidence": 0.8543,
  "probabilities": {
    "3 Bulan": 0.0812,
    "6 Bulan": 0.8543,
    "9 Bulan": 0.0645
  },
  "mode": "real",
  "saved_to_db": true,
  "id": "uuid-here"
}

3. Reload Model

POST /reload-model

Digunakan jika Anda mengupdate model tanpa restart server.

πŸ§ͺ Testing API

Test dengan cURL:

# Health check
curl https://your-api-url.com/health

# Classify (dengan base64 image)
curl -X POST https://your-api-url.com/classify \
  -H "Content-Type: application/json" \
  -d '{"image": "data:image/jpeg;base64,YOUR_BASE64_IMAGE_HERE"}'

Test dengan Python:

import requests
import base64

# Read image
with open('bibit.jpg', 'rb') as f:
    img_data = base64.b64encode(f.read()).decode()

# Send request
response = requests.post(
    'https://your-api-url.com/classify',
    json={'image': f'data:image/jpeg;base64,{img_data}'}
)

print(response.json())

πŸ› Troubleshooting

Model tidak ditemukan

⚠ Model file not found at models/svm_densenet201_rbf.joblib
Using simulation mode until model is uploaded

Solusi: Pastikan file svm_densenet201_rbf.joblib ada di folder models/

Error saat load model

Error loading model: ...

Solusi:

  • Pastikan versi scikit-learn sama dengan yang digunakan saat training
  • Cek apakah file model tidak corrupt
  • Pastikan format file adalah .joblib

API timeout

Solusi:

  • Tingkatkan timeout di Dockerfile (sudah diset 120 detik)
  • Untuk Cloud Run, set --timeout 300

Memory error

Solusi:

  • Upgrade instance ke memory lebih besar
  • Untuk Cloud Run: --memory 2Gi
  • Untuk Hugging Face: Upgrade ke Space berbayar

πŸ“Š Mode Operasi

API memiliki 2 mode:

  1. Real Mode - Menggunakan model asli Anda

    • Response: "mode": "real"
    • Memerlukan file model di folder models/
  2. Simulation Mode - Menggunakan random prediction

    • Response: "mode": "simulation"
    • Aktif jika model belum diupload
    • Berguna untuk testing integrasi

πŸ” Security Notes

  • API ini tidak memerlukan authentication (sesuai design untuk demo)
  • Jika ingin menambah security, tambahkan API key di header
  • Untuk production, pertimbangkan rate limiting

πŸ’‘ Tips

  1. Monitoring: Cek logs untuk melihat performa model
  2. Update Model: Upload model baru dan panggil /reload-model
  3. Scaling: Gunakan multiple workers di gunicorn untuk handle traffic tinggi
  4. Caching: Pertimbangkan caching untuk request yang sama

πŸ“ž Support

Jika ada masalah, cek:

  1. Logs dari platform deployment Anda
  2. Response dari /health endpoint
  3. Pastikan semua dependencies terinstall dengan benar