Mif_E31230483_KlasifikasiTomat/API_README.md

186 lines
3.7 KiB
Markdown

# Tomat Classification API
API Flask untuk klasifikasi tingkat kematangan tomat menggunakan Random Forest dan Color Histogram RGB.
## Fitur
- **Preprocessing**: Resize gambar ke 256x256
- **Ekstraksi Fitur**: Color Histogram RGB (8x8x8 bins)
- **Klasifikasi**: Random Forest dengan 3 kelas
- **Format Output**: JSON dengan probabilitas dan confidence score
## Kelas Output
- `matang` - Tomat sudah matang
- `mentah` - Tomat masih mentah
- `setengah_matang` - Tomat setengah matang
## Endpoint
### 1. Health Check
```
GET /health
```
Response:
```json
{
"status": "healthy",
"model_loaded": true,
"service": "Tomat Classification API"
}
```
### 2. Prediksi
```
POST /predict
Content-Type: multipart/form-data
```
**Request**: Upload file gambar dengan key `image`
**Response**:
```json
{
"success": true,
"prediction": {
"class": "matang",
"confidence": 0.85,
"confidence_percentage": 85.0,
"probabilities": {
"matang": {"probability": 0.85, "percentage": 85.0},
"mentah": {"probability": 0.10, "percentage": 10.0},
"setengah_matang": {"probability": 0.05, "percentage": 5.0}
}
},
"metadata": {
"model_type": "RandomForest",
"features_used": 24,
"image_processed": "tomat.jpg"
}
}
```
### 3. Informasi Model
```
GET /info
```
Response:
```json
{
"success": true,
"model_info": {
"type": "RandomForestClassifier",
"classes": ["matang", "mentah", "setengah_matang"],
"n_features": 24,
"n_estimators": 100
},
"api_info": {
"version": "1.0.0",
"endpoints": {
"health": "/health",
"predict": "/predict (POST)",
"info": "/info"
},
"supported_formats": ["PNG", "JPG", "JPEG"],
"max_file_size": "16MB"
}
}
```
## Cara Menjalankan
### 1. Install Dependencies
```bash
pip install flask opencv-python numpy scikit-learn joblib
```
### 2. Training Model (Opsional)
```bash
python main.py
```
Ini akan membuat folder `models/` dengan file model yang sudah trained.
### 3. Jalankan API
```bash
python app.py
```
Server akan berjalan di: `http://127.0.0.1:5000`
## Cara Testing API
### Menggunakan curl
```bash
# Health check
curl http://127.0.0.1:5000/health
# Prediksi gambar
curl -X POST -F "image=@path/to/gambar.jpg" http://127.0.0.1:5000/predict
# Info model
curl http://127.0.0.1:5000/info
```
### Menggunakan Python
```python
import requests
# Health check
response = requests.get('http://127.0.0.1:5000/health')
print(response.json())
# Prediksi gambar
with open('gambar_tomat.jpg', 'rb') as f:
files = {'image': f}
response = requests.post('http://127.0.0.1:5000/predict', files=files)
print(response.json())
```
## Struktur File
```
data_tomat/
app.py # Flask API
main.py # Training model
models/ # Folder model
tomat_classifier.pkl # Model Random Forest
label_encoder.pkl # Label encoder
metadata.pkl # Metadata model
matang/ # Folder gambar matang
mentah/ # Folder gambar mentah
setengah_matang/ # Folder gambar setengah matang
```
## Error Handling
API mengembalikan error response dengan format:
```json
{
"success": false,
"error": "Error type",
"message": "Detailed error message"
}
```
### Common Errors
- **400**: File tidak ada, format tidak didukung, processing gagal
- **413**: File terlalu besar (>16MB)
- **500**: Internal server error
## Notes
- API akan otomatis membuat model dummy jika file model belum ada
- Untuk hasil prediksi yang akurat, jalankan `python main.py` terlebih dahulu
- File temporary akan otomatis dihapus setelah processing
- Gambar akan di-resize ke 256x256 sebelum ekstraksi fitur
## Dependencies
- Flask 2.0+
- OpenCV 4.0+
- NumPy 1.19+
- Scikit-learn 1.0+
- Joblib 1.0+