File size: 4,386 Bytes
a5c4128 78aefa8 7a536c1 78aefa8 8f4a33a 78aefa8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | ---
license: mit
library_name: scikit-learn
tags:
- computer-vision
- image-processing
- unsupervised-learning
- bag-of-visual-words
- sift
- surf
- kmeans
- meat-quality
- beef-grading
---
# Pipeline Beef Research BIMA: Deteksi Mutu Kesegaran Daging Sapi Multidomain
Pipeline **unsupervised** (SIFT/SURF -> Bags of Visual Words -> Clustering) untuk
dataset citra daging sapi multidomain (RPH & UMKM), seluruh proses klasifikasi mutu dilakukan tanpa pelatihan supervised
(tanpa SVM/KNN), murni berbasis unsupervised learning.
## 1. Setup Environment (uv, Python 3.7, OpenCV 3.4.2.16)
```bash
# Install python 3.7 lewat uv (jika belum ada di mesin)
uv python install 3.7
# Buat & sync environment sesuai pyproject.toml
uv sync
# (opsional) verifikasi SIFT & SURF tersedia (harus tercetak True True)
uv run python -c "import cv2; s=cv2.xfeatures2d.SIFT_create(); f=cv2.xfeatures2d.SURF_create(); print(True, True)"
```
> Catatan: jika `uv python install 3.7` gagal karena python-build-standalone tidak
> lagi menyediakan build 3.7 di platform Anda, gunakan pyenv/conda untuk
> menyediakan interpreter 3.7, lalu arahkan uv ke sana dengan
> `uv venv --python /path/to/python3.7` sebelum `uv sync`.
## 2. Siapkan Data
Susun dataset mentah sesuai struktur pada README dataset (folder `DAY-1/`, `DAY-2/`,
penamaan `[HARI]_[DOMAIN]_[KODE]_[NOMOR].JPG`). Atur path pada `config.py`
(`RAW_DATA_DIR`).
Jika Anda sudah punya sebagian label ground truth (dari pelabelan awal tim
peneliti / Peternakan), siapkan file CSV opsional `labels.csv` dengan kolom
`filename,label` (label: `segar` / `tidak_segar`) β dipakai HANYA untuk
validasi eksternal klaster (ARI/NMI/Purity), bukan untuk training.
## 3. Menjalankan Pipeline
Pipeline terbagi menjadi 5 tahap, masing-masing bisa dijalankan terpisah
(hasil antara di-cache di `outputs/interim/`) atau sekaligus dengan `all`.
```bash
uv run python run_pipeline.py --step preprocess
uv run python run_pipeline.py --step extract
uv run python run_pipeline.py --step bovw
uv run python run_pipeline.py --step cluster
uv run python run_pipeline.py --step evaluate
# atau jalankan semua tahap sekaligus
uv run python run_pipeline.py --step all
```
## 4. Struktur Output
```
outputs/
βββ interim/ # cache pickle antar tahap (boleh dihapus & rerun)
β βββ manifest.pkl # metadata semua citra (hari/domain/kode/label)
β βββ masks/ # mask ROI hasil segmentasi (npz per citra)
β βββ descriptors_sift.pkl
β βββ descriptors_surf.pkl
β βββ codebook_sift.pkl
β βββ codebook_surf.pkl
β βββ histograms_sift.npy
β βββ histograms_surf.npy
βββ figures/ # semua grafik (PCA/TSNE, perbandingan metrik, dsb.)
βββ tables/ # semua tabel hasil (CSV) siap ditempel ke laporan
βββ logs/
βββ pipeline.log
```
## 5. Tahapan Pipeline (ringkas)
1. **Preprocessing & Segmentasi ROI** (`src/preprocessing.py`, `src/segmentation.py`)
Resize, denoising, konversi HSV, dan **segmentasi latar belakang berbasis
flood-fill dari tepi citra** (bekerja untuk backdrop hitam Day-1 maupun
karton biru muda Day-2 tanpa perlu aturan warna berbeda per hari) sehingga
fitur yang diekstraksi terfokus pada permukaan daging, bukan latar
belakang yang kebetulan berkorelasi dengan hari/tahap kesegaran.
2. **Ekstraksi Fitur Lokal** (`src/feature_extraction.py`)
SIFT dan SURF dijalankan terpisah, keypoint dibatasi hanya pada area mask
ROI daging (parameter `mask` di `detectAndCompute`).
3. **Bags of Visual Words** (`src/bovw.py`)
Codebook dibangun dengan `MiniBatchKMeans` (beberapa ukuran cluster diuji:
50/100/150/200 sesuai indikator capaian proposal), setiap citra direpresentasikan
sebagai histogram fitur ternormalisasi.
4. **Clustering Unsupervised** (`src/clustering.py`)
K-Means (k=2) dan Gaussian Mixture dibandingkan
untuk membagi citra ke 2 klaster akhir (Segar/Tidak Segar).
5. **Evaluasi & Komparasi SIFT vs SURF** (`src/evaluation.py`, `src/visualization.py`)
Validasi internal (Silhouette, Davies-Bouldin, Calinski-Harabasz), validasi
eksternal opsional (ARI/NMI/Purity bila ada `labels.csv`), efisiensi
komputasi (waktu ekstraksi & jumlah keypoint rata-rata), serta visualisasi
PCA/t-SNE dari histogram BoVW.
|