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.