Beef Inspection & Meat Analysis — klasifikasi kesegaran daging sapi berbasis Computer Vision menggunakan Fusi Fitur SURF-BoVW & Momen Warna HSV dengan Support Vector Machine.
Penulis: Abrar Wahid
Institusi: Program Studi Informatika, Fakultas Teknik, Universitas Majalengka
Tahun: 2026
- Tentang Proyek
- Arsitektur Sistem
- Hasil Penelitian
- Struktur Direktori
- Persyaratan Sistem
- Instalasi
- Dataset
- Penggunaan
- Pipeline Teknis
- Evaluasi Model
- Referensi
Inspeksi visual kesegaran daging sapi secara manual di industri pangan sangat rentan terhadap subjektivitas dan kesulitan mendeteksi fase transisi pembusukan secara akurat. Berdasarkan Laporan Tahunan BPOM RI (2024), agen mikrobiologi mendominasi penyebab KLB Keracunan Pangan di Indonesia dengan total 98 kejadian.
Penelitian ini mengusulkan sistem klasifikasi otomatis berbasis Computer Vision yang mengintegrasikan dua sumber informasi visual secara komplementer:
| Fitur | Algoritma | Dimensi | Keunggulan |
|---|---|---|---|
| Tekstur Lokal | SURF → Bag of Visual Words | 100D | Tahan rotasi & skala |
| Warna Global | HSV Color Moments + Histogram 1D | 57D | Tahan variasi iluminasi |
| Fusi Hibrida | Early Feature Fusion | 157D | Komplementer & diskriminatif |
Kelas Klasifikasi: 🟢 Segar · 🟡 Setengah Segar · 🔴 Busuk
Citra Input (JPG/PNG)
│
▼
┌─────────────────────────────┐
│ Pra-pemrosesan Citra │
│ • Resize → 512×512 px │ │
│ • Adaptive Background │
│ Removal (HSV Saturation │
│ + GrabCut + Morphology) │
└──────────────┬──────────────┘
│ ROI Daging
┌───────┴───────┐
▼ ▼
┌────────────┐ ┌──────────────────────┐
│ Ekstraksi │ │ Ekstraksi Tekstur │
│ Warna │ │ │
│ │ │ SURF Keypoints │
│ HSV Color │ │ (Hessian Threshold │
│ Moments │ │ = 300) │
│ (Mean/Std/ │ │ │ │
│ Skewness) │ │ MiniBatch K-Means │
│ + Hist 1D │ │ Clustering (K=100) │
│ (16 bins │ │ │ │
│ per kanal)│ │ Bag of Visual Words │
│ │ │ Histogram │
│ 57 Dim │ │ 100 Dim │
└─────┬──────┘ └──────────┬───────────┘
│ │
└─────────┬──────────┘
▼
Konkatenasi → 157 Dimensi
│
▼
┌───────────────────────────────────┐
│ Scikit-Learn Pipeline │
│ │
│ [1] StandardScaler │
│ (Z-score normalization) │
│ │
│ [2] FeatureWeighter │
│ (hsv_weight × 57 Dim HSV) │
│ → mengatasi Curse of │
│ Dimensionality │
│ │
│ [3] SVM (Kernel RBF) │
│ + class_weight='balanced' │
│ + GridSearchCV (C, γ, w) │
└───────────────┬───────────────────┘
│
▼
Prediksi Kelas Kesegaran
🟢 Segar | 🟡 Setengah Segar | 🔴 Busuk
| Skenario Pemodelan | Akurasi | Presisi (Macro) | Recall (Macro) | F1-Score (Macro) |
|---|---|---|---|---|
| Skenario 1 — Tekstur SURF saja | 65.25% | 0.66 | 0.65 | 0.65 |
| Skenario 2 — Warna HSV saja | 84.50% | 0.85 | 0.85 | 0.84 |
| Skenario 3 — Fusi Fitur (Diusulkan) | 89.00% | 0.89 | 0.89 | 0.89 |
| Kelas | Precision | Recall | F1-Score | Jumlah Sampel |
|---|---|---|---|---|
| 🟢 Segar | 0.92 | 0.88 | 0.90 | 138 |
| 🟡 Setengah Segar | 0.83 | 0.85 | 0.84 | 130 |
| 🔴 Busuk | 0.92 | 0.95 | 0.93 | 132 |
| Macro Average | 0.89 | 0.89 | 0.89 | 400 |
- Kernel SVM: Radial Basis Function (RBF)
- hsv_weight (Feature Balancing): 3.0
- Validasi: Stratified 5-Fold Cross Validation
- Dataset: 400 citra (138 Segar · 130 Setengah Segar · 132 Busuk)
bsurf/
│
├── app.py # Aplikasi web Streamlit (Interface untuk uji prediksi)
├── base-experiment.ipynb # Notebook pelatihan & evaluasi model
├── experiment-v2.ipynb # Notebook pelatihan & evaluasi model versi 2 (update data leakage)
├── README.md # Dokumentasi proyek ini
├── requirements.txt # Dependensi Python
│
├── models/ # Model terlatih
│ ├── fusi_model.pkl # Pipeline SVM + StandardScaler + FeatureWeighter
│ └── kmeans_vocab.pkl # Visual Vocabulary MiniBatch K-Means (K=100)
│
├── output-img/ # Visualisasi hasil training & evaluasi
│
└── dataset/ # Dataset citra daging sapi (tidak disertakan)
├── Segar/ # 138 citra daging segar
├── SetengahSegar/ # 130 citra daging setengah segar
└── Busuk/ # 132 citra daging busuk
Catatan: Folder
dataset/tidak disertakan dalam repositori. Unduh dataset secara terpisah (lihat bagian Dataset) dan letakkan di direktori root proyek.
- Processor: Intel Core i5/i7 generasi ke-10 ke atas
- RAM: Minimum 8 GB (16 GB+ direkomendasikan untuk training)
- Storage: Minimum 2 GB ruang kosong
- OS: Windows 10/11, Ubuntu 20.04+, atau macOS 12+
- Python: 3.7.x (wajib — SURF hanya tersedia di OpenCV versi lama)
Pastikan Anda sudah menginstal Miniconda atau Anaconda di komputer Anda sebelum memulai langkah-langkah berikut.
git clone https://github.com/abrarwahidd/bsurf.git
cd bsurf# Membuat environment baru bernama "surf_env" dengan Python 3.7
conda create -n surf_env python=3.7 -y
# Mengaktifkan environment
conda activate surf_envpip install -r requirements.txt
⚠️ PENTING — Versi OpenCV: Algoritma SURF dipatenkan dan hanya tersedia diopencv-contrib-pythonversi3.4.2.16. Versi lebih baru (4.x) tidak menyertakan SURF. Pastikan menggunakan versi yang tepat.
Verifikasi instalasi SURF:
import cv2
surf = cv2.xfeatures2d.SURF_create(300)
print("SURF tersedia dan siap digunakan!")python -c "import cv2; print(cv2.__version__)"
# Output yang diharapkan: 3.4.2Dataset menggunakan citra daging sapi sekunder dari repositori publik:
| Sumber | Nama Dataset | Publisher |
|---|---|---|
| Roboflow | meat freshness Computer Vision Model | University of Southeastern Philippines |
| Kaggle | Meat Freshness Image Dataset | Vinayak Shanawad |
dataset/
├── Segar/ → 138 citra (.jpg) — daging merah cerah, oxymyoglobin dominan
├── SetengahSegar/ → 130 citra (.jpg) — transisi oksidasi, warna mulai berubah
└── Busuk/ → 132 citra (.jpg) — metmyoglobin dominan, kecokelatan/kehitaman
Letakkan folder dataset/ di direktori root proyek (sejajar dengan app.py dan base-experiment.ipynb).
Jalankan seluruh sel notebook secara berurutan:
jupyter notebook base-experiment.ipynbNotebook akan melakukan:
- Verifikasi ketersediaan SURF
- Pembangunan Kamus Visual (MiniBatch K-Means, K=100)
- Ekstraksi fitur HSV (57D) dan SURF-BoVW (100D) untuk seluruh dataset
- Training Scikit-Learn Pipeline dengan GridSearchCV
- Evaluasi Ablation Study (3 skenario)
- Menyimpan model ke
models/fusi_model.pkldanmodels/kmeans_vocab.pkl
Proses training memerlukan waktu 15–45 menit tergantung spesifikasi hardware.
Setelah model tersedia di folder models/:
streamlit run app.pyBuka browser dan akses http://localhost:8501
Cara penggunaan antarmuka:
- Unggah foto daging sapi (JPG, PNG, atau WEBP) melalui tombol upload
- Klik 🔬 Analisis Kesegaran Daging
- Sistem akan menampilkan:
- Prediksi kelas (Segar / Setengah Segar / Busuk)
- Persentase keyakinan model
- Jumlah titik SURF yang terdeteksi
- Grafik distribusi probabilitas kelas
- Histogram Visual Words (BoVW)
- Histogram fitur warna HSV per kanal
- Tabel Momen Warna (Mean, Std, Skewness)
- Visualisasi proses segmentasi GrabCut & deteksi keypoints
def remove_background(image):
# 1. Analisis saturasi rata-rata piksel tepi (10px border)
# 2. Jika avg_sat > 55 → gambar full daging, skip GrabCut
# 3. Jika ada background → jalankan GrabCut (5 iterasi)
# 4. Safety Net: jika ROI < 15% frame → kembalikan asli
# 5. Morphological Closing (5×5 kernel) untuk menutup lubangKanal H, S, V masing-masing:
• Mean → distribusi intensitas rata-rata
• Std Dev → dispersi / variansi warna
• Skewness → kecondongan distribusi warna
= 3 kanal × 3 momen = 9 dimensi
Histogram 1D per kanal (16 bins, dinormalisasi):
= 3 kanal × 16 bins = 48 dimensi
Total: 9 + 48 = 57 dimensi
1. SURF Keypoint Detection (Hessian Threshold = 300)
→ Setiap keypoint: deskriptor 64 dimensi
2. MiniBatch K-Means Clustering (K=100)
→ Membangun kamus visual dari seluruh deskriptor latih
3. Bag of Visual Words Histogram
→ Frekuensi kemunculan setiap visual word
→ Output: 100 dimensi per citra
Pipeline([
('scaler', StandardScaler()), # Z-score normalization
('weighter', FeatureWeighter( # Feature Balancing
hsv_weight=3.0, # Parameter optimal
num_hsv_features=57
)),
('svm', SVC(
kernel='rbf',
class_weight='balanced',
probability=True
))
])param_grid = {
'svm__C': [0.1, 1, 10, 100],
'svm__gamma': ['scale', 'auto', 0.001, 0.01, 0.1],
'svm__kernel': ['linear', 'rbf'],
'weighter__hsv_weight': np.arange(0.1, 3.1, 0.5)
}
# Evaluasi internal: Stratified 5-Fold Cross Validation Prediksi
Segar ½Segar Busuk
Aktual Segar [ 121 16 1 ] Precision: 0.92
½Segar [ 10 110 10 ] Precision: 0.83
Busuk [ 0 7 125 ] Precision: 0.92
| hsv_weight | Akurasi Validasi |
|---|---|
| 0.1 | 59.2% |
| 0.5 | 80.5% |
| 1.0 | 84.7% |
| 1.5 | 87.2% |
| 2.0 | 86.5% |
| 3.0 | 89.0% ✓ Optimal |
Parameter hsv_weight = 3.0 mengamplifikasi 57 dimensi fitur warna untuk menyeimbangkan dominasi 100 dimensi fitur tekstur, mengatasi Curse of Dimensionality.
Kelas "Setengah Segar" mencatat Recall terendah (0.85) karena:
- Oksidasi mikrobiologi terjadi heterogen (tidak merata pada permukaan daging)
- Sebagian sampel memiliki tepi jaringan yang sudah menghitam namun area tengah masih segar
- Ini adalah ambiguitas fisik benda organik, bukan kelemahan arsitektur algoritma
- Bay, H., Tuytelaars, T., and Gool, L.V. (2008). SURF: Speeded Up Robust Features.
- Arsalane, A., Klilou, A., and El Barbri, N. (2024). Performance evaluation of machine learning algorithms for meat freshness assessment. International Journal of Electrical and Computer Engineering, 14(5).
- Kapoor, S. and Narayanan, A. (2023). Leakage and the reproducibility crisis in machine-learning-based science. Patterns, 4(9).
- Shehzad, K., Ali, U., and Munir, A. (2025). Computer Vision for Food Quality Assessment: Advances and Challenges. Global Journal of Machine Learning and Computing, 1(1).
- Laporan Tahunan Badan Pengawas Obat dan Makanan (BPOM RI). (2024).
Proyek ini dikembangkan sebagai bagian dari penelitian Tugas Akhir pada Program Studi Informatika, Fakultas Teknik, Universitas Majalengka. Penggunaan kode untuk keperluan akademis dan non-komersial diperbolehkan dengan mencantumkan atribusi yang sesuai.
Dikembangkan oleh Abrar Wahid · Universitas Majalengka · 2026
