dada8173 commited on
Commit
bfdeb40
·
verified ·
1 Parent(s): f740f7f

Upload folder using huggingface_hub

Browse files
README.md CHANGED
@@ -39,9 +39,9 @@ pinned: false
39
  | 🚀 **Web 部署** | Flask、Gunicorn 與 Docker,可部署至 Hugging Face Spaces。 |
40
  | 🎨 **介面設計** | 暗色 Glassmorphism 儀表板,顯示模型輸出機率與架構資訊。 |
41
 
42
- ## 🧠 Model & Dataset
43
 
44
- ### Dataset
45
 
46
  - 圖片由開發者自行拍攝,使用 OpenCV 依輪廓裁切成單顆咖啡豆。
47
  - 裁切圖片由開發者人工標示為 `good`、`bad`、`back` 或 `idontknow`。
@@ -49,60 +49,60 @@ pinned: false
49
  - Dataset 為私人資料,**不隨 GitHub repository 或 Hugging Face Model repository 發布**。
50
  - Ethiopia Washed 與 Honduras Natural 已完成訓練;Kenya Natural 仍在資料整理與標註階段,暫不發布模型。
51
 
52
- ### Model
53
 
54
  | 項目 | 設定 |
55
  |---|---|
56
- | Framework | PyTorch |
57
- | Architecture | Custom CNN:3 個 Conv/BatchNorm/ReLU/MaxPool blocks + 256-unit fully connected layer |
58
- | Task | Binary classification (`bad`, `good`) |
59
- | Input | RGB, 128 × 128 |
60
- | Preprocessing | Pad to square, resize, tensor conversion, normalize with mean/std 0.5 |
61
- | Optimizer | Adam, learning rate `5e-5` |
62
- | Loss | Class-weighted cross entropy based on the training subset |
63
- | Training | Up to 40 epochs, early stopping patience 10 |
64
- | Split | Existing 80/20 random train/validation split |
65
-
66
- ### Data augmentation
67
 
68
  離線資料增強由 `data_augment.ipynb` 執行,每張來源 crop 產生兩個版本,包含 color jitter、random grayscale、Gaussian blur、sharpness adjustment 與 Gaussian noise。
69
 
70
- ## 📊 Validation Results
71
 
72
  以下結果由修正後的 best-checkpoint 保存流程重新訓練取得。數值來自現有 augmented dataset 的 80/20 random validation split。
73
 
74
- | Bean type | Validation samples | Accuracy | Macro precision | Macro recall | Macro F1 | Weighted F1 |
75
  |---|---:|---:|---:|---:|---:|---:|
76
  | Ethiopia Washed | 143 | 79.02% | 78.57% | 79.16% | 78.72% | 79.13% |
77
  | Honduras Natural | 114 | 78.07% | 69.30% | 73.89% | 70.76% | 79.22% |
78
 
79
- ### Per-class results
80
 
81
- | Bean type | Class | Precision | Recall | F1 | Support |
82
  |---|---|---:|---:|---:|---:|
83
  | Ethiopia Washed | bad | 84.42% | 78.31% | 81.25% | 83 |
84
  | Ethiopia Washed | good | 72.73% | 80.00% | 76.19% | 60 |
85
  | Honduras Natural | bad | 48.48% | 66.67% | 56.14% | 24 |
86
  | Honduras Natural | good | 90.12% | 81.11% | 85.38% | 90 |
87
 
88
- Confusion matrices use rows as actual labels and columns as predicted labels in `[bad, good]` order:
89
 
90
  ```text
91
  Ethiopia Washed: [[65, 18], [12, 48]]
92
  Honduras Natural: [[16, 8], [17, 73]]
93
  ```
94
 
95
- > **Evaluation limitation:** To preserve the current project workflow, the split is performed after offline augmentation. Augmented variants of the same source crop may therefore appear in both training and validation sets. The validation set is also used for early stopping, and no independent test set is reported. These figures describe the current validation run and should not be treated as a leakage-free benchmark.
96
 
97
- Honduras Natural remains weaker on the `bad` class, particularly precision. Accuracy alone would hide this behavior, so macro and per-class metrics are reported together.
98
 
99
- Machine-readable results are available in `models/*_metrics.json`; epoch histories are stored in `models/*_history.json`.
100
 
101
- ## 🚀 Quick Start
102
 
103
- ### Web application
104
 
105
- Python 3.10 or 3.11 is recommended.
106
 
107
  ```bash
108
  conda create -n coffee-beans-env python=3.10
@@ -111,43 +111,43 @@ pip install -r requirements.txt
111
  python app.py
112
  ```
113
 
114
- Open <http://localhost:5000> after the service starts.
115
 
116
- At startup, the application downloads its weights from `dada8173/coffee-bean-classifier-models` at pinned revision `c859bc6049e24649ca86bf4f5d2600d0fbec6198`. Hugging Face's cache prevents unchanged weights from being downloaded again. If the Hub is unavailable, the application falls back to matching local `models/*.pth` files. Set `USE_LOCAL_MODELS=1` for explicitly local development, or set `HF_MODEL_REVISION` only when intentionally testing another published revision. Public model downloads do not require an access token.
117
 
118
- ### Training and notebooks
119
 
120
  ```bash
121
  pip install -r requirements-dev.txt
122
  python train_all.py
123
  ```
124
 
125
- By default, `train_all.py` trains Ethiopia Washed and Honduras Natural only. Kenya Natural remains work in progress.
126
 
127
- ## 📖 Usage
128
 
129
- 1. Select an available bean-specific model.
130
- 2. Open the browser camera or upload a supported image.
131
- 3. Enable live detection when using the camera.
132
- 4. Review the predicted label and model output scores.
133
 
134
- Browser camera access requires HTTPS or localhost and user permission.
135
 
136
- ## 📂 Project Structure
137
 
138
  ```text
139
  Good-or-Bad-CoffeeBeans/
140
- ├── models/ # Model metadata, logs, histories and validation metrics
141
- ├── static/ # CSS, JavaScript and example assets
142
- ├── templates/ # Flask HTML template
143
- ├── app.py # Web inference and model loading
144
- ├── train_all.py # Ethiopia/Honduras training and evaluation
145
- ├── requirements.txt # Web inference dependencies
146
- ├── requirements-dev.txt# Training/notebook dependencies
147
- └── coffee_beans_data/ # Private local dataset; ignored by Git
148
  ```
149
 
150
- ## ⚠️ Limitations
151
 
152
  - Labels are manually assigned and are not a professional coffee-grading certification.
153
  - Each deployed model is specific to one bean type.
@@ -155,11 +155,11 @@ Good-or-Bad-CoffeeBeans/
155
  - Softmax output scores are not calibrated confidence intervals.
156
  - Kenya Natural is under development and has no published model.
157
 
158
- ## 👨‍💻 Developer & License
159
 
160
  - Author: dachen8173
161
  - Stack: Python / PyTorch / Flask / OpenCV / JavaScript
162
  - Contact: op.dada.op@gmail.com
163
  - Instagram: [da_chen_527](https://www.instagram.com/da_chen_527) / [cofe_log](https://www.instagram.com/cofe_log)
164
 
165
- The source code is released under the MIT License. The dataset is private and is not distributed with this project.
 
39
  | 🚀 **Web 部署** | Flask、Gunicorn 與 Docker,可部署至 Hugging Face Spaces。 |
40
  | 🎨 **介面設計** | 暗色 Glassmorphism 儀表板,顯示模型輸出機率與架構資訊。 |
41
 
42
+ ## 🧠 模型與資料集
43
 
44
+ ### 資料集
45
 
46
  - 圖片由開發者自行拍攝,使用 OpenCV 依輪廓裁切成單顆咖啡豆。
47
  - 裁切圖片由開發者人工標示為 `good`、`bad`、`back` 或 `idontknow`。
 
49
  - Dataset 為私人資料,**不隨 GitHub repository 或 Hugging Face Model repository 發布**。
50
  - Ethiopia Washed 與 Honduras Natural 已完成訓練;Kenya Natural 仍在資料整理與標註階段,暫不發布模型。
51
 
52
+ ### 模型
53
 
54
  | 項目 | 設定 |
55
  |---|---|
56
+ | 框架 | PyTorch |
57
+ | 架構 | Custom CNN:3 個 Conv/BatchNorm/ReLU/MaxPool 區塊,加上 256-unit 全連接層 |
58
+ | 任務 | 二元分類(`bad`、`good`) |
59
+ | 輸入 | RGB,128 × 128 |
60
+ | 前處理 | 補邊成正方形、縮放、轉換為 tensor,並以 mean/std 0.5 標準化 |
61
+ | 最佳化器 | Adam,learning rate `5e-5` |
62
+ | 損失函數 | 依訓練子集計算權重的交叉熵 |
63
+ | 訓練 | 最多 40 epochs,early stopping patience 10 |
64
+ | 切分 | 沿用既有 80/20 隨機訓練/驗證切分 |
65
+
66
+ ### 資料增強
67
 
68
  離線資料增強由 `data_augment.ipynb` 執行,每張來源 crop 產生兩個版本,包含 color jitter、random grayscale、Gaussian blur、sharpness adjustment 與 Gaussian noise。
69
 
70
+ ## 📊 驗證結果
71
 
72
  以下結果由修正後的 best-checkpoint 保存流程重新訓練取得。數值來自現有 augmented dataset 的 80/20 random validation split。
73
 
74
+ | 咖啡豆類型 | 驗證樣本數 | Accuracy | Macro precision | Macro recall | Macro F1 | Weighted F1 |
75
  |---|---:|---:|---:|---:|---:|---:|
76
  | Ethiopia Washed | 143 | 79.02% | 78.57% | 79.16% | 78.72% | 79.13% |
77
  | Honduras Natural | 114 | 78.07% | 69.30% | 73.89% | 70.76% | 79.22% |
78
 
79
+ ### 各類別結果
80
 
81
+ | 咖啡豆類型 | 類別 | Precision | Recall | F1 | 樣本數 |
82
  |---|---|---:|---:|---:|---:|
83
  | Ethiopia Washed | bad | 84.42% | 78.31% | 81.25% | 83 |
84
  | Ethiopia Washed | good | 72.73% | 80.00% | 76.19% | 60 |
85
  | Honduras Natural | bad | 48.48% | 66.67% | 56.14% | 24 |
86
  | Honduras Natural | good | 90.12% | 81.11% | 85.38% | 90 |
87
 
88
+ 混淆矩陣以實際標籤為列、預測標籤為欄,順序皆為 `[bad, good]`:
89
 
90
  ```text
91
  Ethiopia Washed: [[65, 18], [12, 48]]
92
  Honduras Natural: [[16, 8], [17, 73]]
93
  ```
94
 
95
+ > **評估限制:** 為保留目前專案流程,資料是在離線增強後才進行切分,因此同一來源 crop 的增強版本可能同時出現在訓練集與驗證集。驗證集也用於 early stopping,目前沒有獨立測試集。這些數字只代表本次驗證結果,不應視為完全排除資料洩漏的 benchmark。
96
 
97
+ Honduras Natural 對 `bad` 類別的表現仍較弱,尤其是 precision。單看 accuracy 會掩蓋此問題,因此同時呈現 macro 與各類別指標。
98
 
99
+ 機器可讀的結果位於 `models/*_metrics.json`,各 epoch 紀錄位於 `models/*_history.json`。
100
 
101
+ ## 🚀 快速開始
102
 
103
+ ### Web 應用程式
104
 
105
+ 建議使用 Python 3.10 或 3.11。
106
 
107
  ```bash
108
  conda create -n coffee-beans-env python=3.10
 
111
  python app.py
112
  ```
113
 
114
+ 服務啟動後,開啟 <http://localhost:5000>。
115
 
116
+ 應用程式啟動時,會從 `dada8173/coffee-bean-classifier-models` 的固定 revision `efc47d2ec57916c5ea152333bd801a07a6977f59` 下載權重。Hugging Face cache 會避免重複下載未變更的檔案;若 Hub 暫時無法使用,程式才會改用本機 `models/*.pth` 備援。需要強制使用本機模型時可設定 `USE_LOCAL_MODELS=1`;只有在刻意測試其他已發布版本時才應設定 `HF_MODEL_REVISION`。下載公開模型不需要 access token。
117
 
118
+ ### 訓練與 notebooks
119
 
120
  ```bash
121
  pip install -r requirements-dev.txt
122
  python train_all.py
123
  ```
124
 
125
+ `train_all.py` 預設只訓練 Ethiopia Washed 與 Honduras Natural;Kenya Natural 仍在開發中。
126
 
127
+ ## 📖 使用方式
128
 
129
+ 1. 選擇對應咖啡豆類型的可用模型。
130
+ 2. 開啟瀏覽器相機,或上傳支援格式的圖片。
131
+ 3. 使用相機時可開啟即時辨識。
132
+ 4. 查看預測標籤與模型輸出分數。
133
 
134
+ 瀏覽器相機功能需要 HTTPS 或 localhost,並須取得使用者授權。
135
 
136
+ ## 📂 專案結構
137
 
138
  ```text
139
  Good-or-Bad-CoffeeBeans/
140
+ ├── models/ # 模型設定、訓練紀錄與驗證指標
141
+ ├── static/ # CSS、JavaScript 與範例圖片
142
+ ├── templates/ # Flask HTML 模板
143
+ ├── app.py # Web 推論與模型載入
144
+ ├── train_all.py # Ethiopia/Honduras 訓練與評估
145
+ ├── requirements.txt # Web 推論相依套件
146
+ ├── requirements-dev.txt# 訓練與 notebook 相依套件
147
+ └── coffee_beans_data/ # 私人本機資料集;Git 會忽略此目錄
148
  ```
149
 
150
+ ## ⚠️ 限制
151
 
152
  - Labels are manually assigned and are not a professional coffee-grading certification.
153
  - Each deployed model is specific to one bean type.
 
155
  - Softmax output scores are not calibrated confidence intervals.
156
  - Kenya Natural is under development and has no published model.
157
 
158
+ ## 👨‍💻 開發者與授權
159
 
160
  - Author: dachen8173
161
  - Stack: Python / PyTorch / Flask / OpenCV / JavaScript
162
  - Contact: op.dada.op@gmail.com
163
  - Instagram: [da_chen_527](https://www.instagram.com/da_chen_527) / [cofe_log](https://www.instagram.com/cofe_log)
164
 
165
+ 原始碼採用 MIT License;資料集維持私人狀態,不隨本專案發布。
app.py CHANGED
@@ -27,7 +27,7 @@ MODEL_REPO_ID = os.environ.get(
27
  "HF_MODEL_REPO_ID", "dada8173/coffee-bean-classifier-models"
28
  )
29
  MODEL_REPO_REVISION = os.environ.get(
30
- "HF_MODEL_REVISION", "c859bc6049e24649ca86bf4f5d2600d0fbec6198"
31
  )
32
  USE_LOCAL_MODELS = os.environ.get("USE_LOCAL_MODELS", "").lower() in {
33
  "1",
 
27
  "HF_MODEL_REPO_ID", "dada8173/coffee-bean-classifier-models"
28
  )
29
  MODEL_REPO_REVISION = os.environ.get(
30
+ "HF_MODEL_REVISION", "efc47d2ec57916c5ea152333bd801a07a6977f59"
31
  )
32
  USE_LOCAL_MODELS = os.environ.get("USE_LOCAL_MODELS", "").lower() in {
33
  "1",
models/README.md CHANGED
@@ -33,7 +33,7 @@ The class order must match the output order used during training.
33
 
34
  At startup, `app.py` downloads each matching `.pth` file from
35
  `dada8173/coffee-bean-classifier-models` using pinned commit
36
- `c859bc6049e24649ca86bf4f5d2600d0fbec6198`. `HF_MODEL_REVISION` can override
37
  the default when intentionally deploying another revision. Downloads use Hugging
38
  Face's version-aware local cache. If the Hub is unavailable, the application
39
  falls back to a matching local weight; set `USE_LOCAL_MODELS=1` to force that
 
33
 
34
  At startup, `app.py` downloads each matching `.pth` file from
35
  `dada8173/coffee-bean-classifier-models` using pinned commit
36
+ `efc47d2ec57916c5ea152333bd801a07a6977f59`. `HF_MODEL_REVISION` can override
37
  the default when intentionally deploying another revision. Downloads use Hugging
38
  Face's version-aware local cache. If the Hub is unavailable, the application
39
  falls back to a matching local weight; set `USE_LOCAL_MODELS=1` to force that
models/ethiopia_washed_custom_Noback_best_model.json CHANGED
@@ -1,12 +1,12 @@
1
- {
2
- "bean_type": "ethiopia_washed",
3
- "architecture": "custom",
4
- "img_size": 128,
5
- "classes": [
6
- "bad",
7
- "good"
8
- ],
9
- "model_file": "ethiopia_washed_custom_Noback_best_model.pth",
10
- "metrics_file": "ethiopia_washed_metrics.json",
11
- "display_name": "Ethiopia Washed - Custom CNN (Noback)"
12
  }
 
1
+ {
2
+ "bean_type": "ethiopia_washed",
3
+ "architecture": "custom",
4
+ "img_size": 128,
5
+ "classes": [
6
+ "bad",
7
+ "good"
8
+ ],
9
+ "model_file": "ethiopia_washed_custom_Noback_best_model.pth",
10
+ "metrics_file": "ethiopia_washed_metrics.json",
11
+ "display_name": "Ethiopia Washed - Custom CNN (Noback)"
12
  }
models/ethiopia_washed_history.json CHANGED
@@ -1,282 +1,282 @@
1
- [
2
- {
3
- "epoch": 1,
4
- "train_loss": 1.263219588565491,
5
- "train_accuracy": 0.5061511423550088,
6
- "validation_loss": 0.6918301582336426,
7
- "validation_accuracy": 0.6013986013986014
8
- },
9
- {
10
- "epoch": 2,
11
- "train_loss": 0.8212373721788135,
12
- "train_accuracy": 0.4253075571177504,
13
- "validation_loss": 0.691796600818634,
14
- "validation_accuracy": 0.4195804195804196
15
- },
16
- {
17
- "epoch": 3,
18
- "train_loss": 0.7085306173049712,
19
- "train_accuracy": 0.4446397188049209,
20
- "validation_loss": 0.6918022632598877,
21
- "validation_accuracy": 0.5874125874125874
22
- },
23
- {
24
- "epoch": 4,
25
- "train_loss": 0.6629954662390041,
26
- "train_accuracy": 0.6186291739894552,
27
- "validation_loss": 0.692229688167572,
28
- "validation_accuracy": 0.5804195804195804
29
- },
30
- {
31
- "epoch": 5,
32
- "train_loss": 0.6709411046835995,
33
- "train_accuracy": 0.6010544815465729,
34
- "validation_loss": 0.6913071274757385,
35
- "validation_accuracy": 0.5804195804195804
36
- },
37
- {
38
- "epoch": 6,
39
- "train_loss": 0.653107622700542,
40
- "train_accuracy": 0.6449912126537786,
41
- "validation_loss": 0.6869645714759827,
42
- "validation_accuracy": 0.6853146853146853
43
- },
44
- {
45
- "epoch": 7,
46
- "train_loss": 0.6359432273673676,
47
- "train_accuracy": 0.6783831282952548,
48
- "validation_loss": 0.6831109523773193,
49
- "validation_accuracy": 0.44755244755244755
50
- },
51
- {
52
- "epoch": 8,
53
- "train_loss": 0.6215834828168939,
54
- "train_accuracy": 0.6309314586994728,
55
- "validation_loss": 0.6756449937820435,
56
- "validation_accuracy": 0.4825174825174825
57
- },
58
- {
59
- "epoch": 9,
60
- "train_loss": 0.6095518141932563,
61
- "train_accuracy": 0.6678383128295254,
62
- "validation_loss": 0.6631787419319153,
63
- "validation_accuracy": 0.5664335664335665
64
- },
65
- {
66
- "epoch": 10,
67
- "train_loss": 0.5977175910359737,
68
- "train_accuracy": 0.6889279437609842,
69
- "validation_loss": 0.6542237997055054,
70
- "validation_accuracy": 0.5524475524475524
71
- },
72
- {
73
- "epoch": 11,
74
- "train_loss": 0.5923221924183448,
75
- "train_accuracy": 0.6731107205623902,
76
- "validation_loss": 0.6427598595619202,
77
- "validation_accuracy": 0.5594405594405595
78
- },
79
- {
80
- "epoch": 12,
81
- "train_loss": 0.5688371189554043,
82
- "train_accuracy": 0.7082601054481547,
83
- "validation_loss": 0.6323626637458801,
84
- "validation_accuracy": 0.5734265734265734
85
- },
86
- {
87
- "epoch": 13,
88
- "train_loss": 0.5543311771483329,
89
- "train_accuracy": 0.687170474516696,
90
- "validation_loss": 0.6157304644584656,
91
- "validation_accuracy": 0.6013986013986014
92
- },
93
- {
94
- "epoch": 14,
95
- "train_loss": 0.5415435294065828,
96
- "train_accuracy": 0.7100175746924429,
97
- "validation_loss": 0.5983814597129822,
98
- "validation_accuracy": 0.6293706293706294
99
- },
100
- {
101
- "epoch": 15,
102
- "train_loss": 0.5299581497750508,
103
- "train_accuracy": 0.7486818980667839,
104
- "validation_loss": 0.5866342186927795,
105
- "validation_accuracy": 0.6503496503496503
106
- },
107
- {
108
- "epoch": 16,
109
- "train_loss": 0.5125179690929205,
110
- "train_accuracy": 0.7750439367311072,
111
- "validation_loss": 0.5797297954559326,
112
- "validation_accuracy": 0.6713286713286714
113
- },
114
- {
115
- "epoch": 17,
116
- "train_loss": 0.5040009153224463,
117
- "train_accuracy": 0.7680140597539543,
118
- "validation_loss": 0.5703222155570984,
119
- "validation_accuracy": 0.6783216783216783
120
- },
121
- {
122
- "epoch": 18,
123
- "train_loss": 0.48477853936763554,
124
- "train_accuracy": 0.7926186291739895,
125
- "validation_loss": 0.5559291243553162,
126
- "validation_accuracy": 0.6923076923076923
127
- },
128
- {
129
- "epoch": 19,
130
- "train_loss": 0.4833677645726866,
131
- "train_accuracy": 0.7627416520210897,
132
- "validation_loss": 0.5410254597663879,
133
- "validation_accuracy": 0.7062937062937062
134
- },
135
- {
136
- "epoch": 20,
137
- "train_loss": 0.47811686002726295,
138
- "train_accuracy": 0.7908611599297012,
139
- "validation_loss": 0.5338454246520996,
140
- "validation_accuracy": 0.7342657342657343
141
- },
142
- {
143
- "epoch": 21,
144
- "train_loss": 0.4612063278422833,
145
- "train_accuracy": 0.7961335676625659,
146
- "validation_loss": 0.523646891117096,
147
- "validation_accuracy": 0.7202797202797203
148
- },
149
- {
150
- "epoch": 22,
151
- "train_loss": 0.4396921342307528,
152
- "train_accuracy": 0.8014059753954306,
153
- "validation_loss": 0.5196635723114014,
154
- "validation_accuracy": 0.7272727272727273
155
- },
156
- {
157
- "epoch": 23,
158
- "train_loss": 0.4363301542500829,
159
- "train_accuracy": 0.8330404217926186,
160
- "validation_loss": 0.5153874754905701,
161
- "validation_accuracy": 0.7622377622377622
162
- },
163
- {
164
- "epoch": 24,
165
- "train_loss": 0.4275727884840672,
166
- "train_accuracy": 0.8330404217926186,
167
- "validation_loss": 0.5052497386932373,
168
- "validation_accuracy": 0.7622377622377622
169
- },
170
- {
171
- "epoch": 25,
172
- "train_loss": 0.40649927757117366,
173
- "train_accuracy": 0.8418277680140598,
174
- "validation_loss": 0.49567562341690063,
175
- "validation_accuracy": 0.7552447552447552
176
- },
177
- {
178
- "epoch": 26,
179
- "train_loss": 0.39746694819369927,
180
- "train_accuracy": 0.8400702987697716,
181
- "validation_loss": 0.4961770474910736,
182
- "validation_accuracy": 0.7832167832167832
183
- },
184
- {
185
- "epoch": 27,
186
- "train_loss": 0.404211174310406,
187
- "train_accuracy": 0.8224956063268892,
188
- "validation_loss": 0.4945208430290222,
189
- "validation_accuracy": 0.7902097902097902
190
- },
191
- {
192
- "epoch": 28,
193
- "train_loss": 0.4025125237466581,
194
- "train_accuracy": 0.8137082601054482,
195
- "validation_loss": 0.48422667384147644,
196
- "validation_accuracy": 0.7692307692307693
197
- },
198
- {
199
- "epoch": 29,
200
- "train_loss": 0.3945070078796159,
201
- "train_accuracy": 0.8523725834797891,
202
- "validation_loss": 0.48792701959609985,
203
- "validation_accuracy": 0.7762237762237763
204
- },
205
- {
206
- "epoch": 30,
207
- "train_loss": 0.3658155489889725,
208
- "train_accuracy": 0.859402460456942,
209
- "validation_loss": 0.4910583794116974,
210
- "validation_accuracy": 0.7762237762237763
211
- },
212
- {
213
- "epoch": 31,
214
- "train_loss": 0.3633354866127557,
215
- "train_accuracy": 0.8576449912126538,
216
- "validation_loss": 0.4889949858188629,
217
- "validation_accuracy": 0.7762237762237763
218
- },
219
- {
220
- "epoch": 32,
221
- "train_loss": 0.3688585237061412,
222
- "train_accuracy": 0.8506151142355008,
223
- "validation_loss": 0.4916982650756836,
224
- "validation_accuracy": 0.7762237762237763
225
- },
226
- {
227
- "epoch": 33,
228
- "train_loss": 0.3571993312642947,
229
- "train_accuracy": 0.859402460456942,
230
- "validation_loss": 0.4797869026660919,
231
- "validation_accuracy": 0.7832167832167832
232
- },
233
- {
234
- "epoch": 34,
235
- "train_loss": 0.33788761585584215,
236
- "train_accuracy": 0.8787346221441125,
237
- "validation_loss": 0.4810600280761719,
238
- "validation_accuracy": 0.7832167832167832
239
- },
240
- {
241
- "epoch": 35,
242
- "train_loss": 0.3369285811544093,
243
- "train_accuracy": 0.8664323374340949,
244
- "validation_loss": 0.47964662313461304,
245
- "validation_accuracy": 0.7902097902097902
246
- },
247
- {
248
- "epoch": 36,
249
- "train_loss": 0.3247136227485375,
250
- "train_accuracy": 0.9015817223198594,
251
- "validation_loss": 0.4613395631313324,
252
- "validation_accuracy": 0.7622377622377622
253
- },
254
- {
255
- "epoch": 37,
256
- "train_loss": 0.3240959414907834,
257
- "train_accuracy": 0.8769771528998243,
258
- "validation_loss": 0.4582526981830597,
259
- "validation_accuracy": 0.7692307692307693
260
- },
261
- {
262
- "epoch": 38,
263
- "train_loss": 0.31223150668747607,
264
- "train_accuracy": 0.8857644991212654,
265
- "validation_loss": 0.4926481544971466,
266
- "validation_accuracy": 0.7972027972027972
267
- },
268
- {
269
- "epoch": 39,
270
- "train_loss": 0.3200714421083722,
271
- "train_accuracy": 0.8857644991212654,
272
- "validation_loss": 0.48017311096191406,
273
- "validation_accuracy": 0.8041958041958042
274
- },
275
- {
276
- "epoch": 40,
277
- "train_loss": 0.29528005837556137,
278
- "train_accuracy": 0.8998242530755711,
279
- "validation_loss": 0.4451611042022705,
280
- "validation_accuracy": 0.7902097902097902
281
- }
282
  ]
 
1
+ [
2
+ {
3
+ "epoch": 1,
4
+ "train_loss": 1.263219588565491,
5
+ "train_accuracy": 0.5061511423550088,
6
+ "validation_loss": 0.6918301582336426,
7
+ "validation_accuracy": 0.6013986013986014
8
+ },
9
+ {
10
+ "epoch": 2,
11
+ "train_loss": 0.8212373721788135,
12
+ "train_accuracy": 0.4253075571177504,
13
+ "validation_loss": 0.691796600818634,
14
+ "validation_accuracy": 0.4195804195804196
15
+ },
16
+ {
17
+ "epoch": 3,
18
+ "train_loss": 0.7085306173049712,
19
+ "train_accuracy": 0.4446397188049209,
20
+ "validation_loss": 0.6918022632598877,
21
+ "validation_accuracy": 0.5874125874125874
22
+ },
23
+ {
24
+ "epoch": 4,
25
+ "train_loss": 0.6629954662390041,
26
+ "train_accuracy": 0.6186291739894552,
27
+ "validation_loss": 0.692229688167572,
28
+ "validation_accuracy": 0.5804195804195804
29
+ },
30
+ {
31
+ "epoch": 5,
32
+ "train_loss": 0.6709411046835995,
33
+ "train_accuracy": 0.6010544815465729,
34
+ "validation_loss": 0.6913071274757385,
35
+ "validation_accuracy": 0.5804195804195804
36
+ },
37
+ {
38
+ "epoch": 6,
39
+ "train_loss": 0.653107622700542,
40
+ "train_accuracy": 0.6449912126537786,
41
+ "validation_loss": 0.6869645714759827,
42
+ "validation_accuracy": 0.6853146853146853
43
+ },
44
+ {
45
+ "epoch": 7,
46
+ "train_loss": 0.6359432273673676,
47
+ "train_accuracy": 0.6783831282952548,
48
+ "validation_loss": 0.6831109523773193,
49
+ "validation_accuracy": 0.44755244755244755
50
+ },
51
+ {
52
+ "epoch": 8,
53
+ "train_loss": 0.6215834828168939,
54
+ "train_accuracy": 0.6309314586994728,
55
+ "validation_loss": 0.6756449937820435,
56
+ "validation_accuracy": 0.4825174825174825
57
+ },
58
+ {
59
+ "epoch": 9,
60
+ "train_loss": 0.6095518141932563,
61
+ "train_accuracy": 0.6678383128295254,
62
+ "validation_loss": 0.6631787419319153,
63
+ "validation_accuracy": 0.5664335664335665
64
+ },
65
+ {
66
+ "epoch": 10,
67
+ "train_loss": 0.5977175910359737,
68
+ "train_accuracy": 0.6889279437609842,
69
+ "validation_loss": 0.6542237997055054,
70
+ "validation_accuracy": 0.5524475524475524
71
+ },
72
+ {
73
+ "epoch": 11,
74
+ "train_loss": 0.5923221924183448,
75
+ "train_accuracy": 0.6731107205623902,
76
+ "validation_loss": 0.6427598595619202,
77
+ "validation_accuracy": 0.5594405594405595
78
+ },
79
+ {
80
+ "epoch": 12,
81
+ "train_loss": 0.5688371189554043,
82
+ "train_accuracy": 0.7082601054481547,
83
+ "validation_loss": 0.6323626637458801,
84
+ "validation_accuracy": 0.5734265734265734
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.5543311771483329,
89
+ "train_accuracy": 0.687170474516696,
90
+ "validation_loss": 0.6157304644584656,
91
+ "validation_accuracy": 0.6013986013986014
92
+ },
93
+ {
94
+ "epoch": 14,
95
+ "train_loss": 0.5415435294065828,
96
+ "train_accuracy": 0.7100175746924429,
97
+ "validation_loss": 0.5983814597129822,
98
+ "validation_accuracy": 0.6293706293706294
99
+ },
100
+ {
101
+ "epoch": 15,
102
+ "train_loss": 0.5299581497750508,
103
+ "train_accuracy": 0.7486818980667839,
104
+ "validation_loss": 0.5866342186927795,
105
+ "validation_accuracy": 0.6503496503496503
106
+ },
107
+ {
108
+ "epoch": 16,
109
+ "train_loss": 0.5125179690929205,
110
+ "train_accuracy": 0.7750439367311072,
111
+ "validation_loss": 0.5797297954559326,
112
+ "validation_accuracy": 0.6713286713286714
113
+ },
114
+ {
115
+ "epoch": 17,
116
+ "train_loss": 0.5040009153224463,
117
+ "train_accuracy": 0.7680140597539543,
118
+ "validation_loss": 0.5703222155570984,
119
+ "validation_accuracy": 0.6783216783216783
120
+ },
121
+ {
122
+ "epoch": 18,
123
+ "train_loss": 0.48477853936763554,
124
+ "train_accuracy": 0.7926186291739895,
125
+ "validation_loss": 0.5559291243553162,
126
+ "validation_accuracy": 0.6923076923076923
127
+ },
128
+ {
129
+ "epoch": 19,
130
+ "train_loss": 0.4833677645726866,
131
+ "train_accuracy": 0.7627416520210897,
132
+ "validation_loss": 0.5410254597663879,
133
+ "validation_accuracy": 0.7062937062937062
134
+ },
135
+ {
136
+ "epoch": 20,
137
+ "train_loss": 0.47811686002726295,
138
+ "train_accuracy": 0.7908611599297012,
139
+ "validation_loss": 0.5338454246520996,
140
+ "validation_accuracy": 0.7342657342657343
141
+ },
142
+ {
143
+ "epoch": 21,
144
+ "train_loss": 0.4612063278422833,
145
+ "train_accuracy": 0.7961335676625659,
146
+ "validation_loss": 0.523646891117096,
147
+ "validation_accuracy": 0.7202797202797203
148
+ },
149
+ {
150
+ "epoch": 22,
151
+ "train_loss": 0.4396921342307528,
152
+ "train_accuracy": 0.8014059753954306,
153
+ "validation_loss": 0.5196635723114014,
154
+ "validation_accuracy": 0.7272727272727273
155
+ },
156
+ {
157
+ "epoch": 23,
158
+ "train_loss": 0.4363301542500829,
159
+ "train_accuracy": 0.8330404217926186,
160
+ "validation_loss": 0.5153874754905701,
161
+ "validation_accuracy": 0.7622377622377622
162
+ },
163
+ {
164
+ "epoch": 24,
165
+ "train_loss": 0.4275727884840672,
166
+ "train_accuracy": 0.8330404217926186,
167
+ "validation_loss": 0.5052497386932373,
168
+ "validation_accuracy": 0.7622377622377622
169
+ },
170
+ {
171
+ "epoch": 25,
172
+ "train_loss": 0.40649927757117366,
173
+ "train_accuracy": 0.8418277680140598,
174
+ "validation_loss": 0.49567562341690063,
175
+ "validation_accuracy": 0.7552447552447552
176
+ },
177
+ {
178
+ "epoch": 26,
179
+ "train_loss": 0.39746694819369927,
180
+ "train_accuracy": 0.8400702987697716,
181
+ "validation_loss": 0.4961770474910736,
182
+ "validation_accuracy": 0.7832167832167832
183
+ },
184
+ {
185
+ "epoch": 27,
186
+ "train_loss": 0.404211174310406,
187
+ "train_accuracy": 0.8224956063268892,
188
+ "validation_loss": 0.4945208430290222,
189
+ "validation_accuracy": 0.7902097902097902
190
+ },
191
+ {
192
+ "epoch": 28,
193
+ "train_loss": 0.4025125237466581,
194
+ "train_accuracy": 0.8137082601054482,
195
+ "validation_loss": 0.48422667384147644,
196
+ "validation_accuracy": 0.7692307692307693
197
+ },
198
+ {
199
+ "epoch": 29,
200
+ "train_loss": 0.3945070078796159,
201
+ "train_accuracy": 0.8523725834797891,
202
+ "validation_loss": 0.48792701959609985,
203
+ "validation_accuracy": 0.7762237762237763
204
+ },
205
+ {
206
+ "epoch": 30,
207
+ "train_loss": 0.3658155489889725,
208
+ "train_accuracy": 0.859402460456942,
209
+ "validation_loss": 0.4910583794116974,
210
+ "validation_accuracy": 0.7762237762237763
211
+ },
212
+ {
213
+ "epoch": 31,
214
+ "train_loss": 0.3633354866127557,
215
+ "train_accuracy": 0.8576449912126538,
216
+ "validation_loss": 0.4889949858188629,
217
+ "validation_accuracy": 0.7762237762237763
218
+ },
219
+ {
220
+ "epoch": 32,
221
+ "train_loss": 0.3688585237061412,
222
+ "train_accuracy": 0.8506151142355008,
223
+ "validation_loss": 0.4916982650756836,
224
+ "validation_accuracy": 0.7762237762237763
225
+ },
226
+ {
227
+ "epoch": 33,
228
+ "train_loss": 0.3571993312642947,
229
+ "train_accuracy": 0.859402460456942,
230
+ "validation_loss": 0.4797869026660919,
231
+ "validation_accuracy": 0.7832167832167832
232
+ },
233
+ {
234
+ "epoch": 34,
235
+ "train_loss": 0.33788761585584215,
236
+ "train_accuracy": 0.8787346221441125,
237
+ "validation_loss": 0.4810600280761719,
238
+ "validation_accuracy": 0.7832167832167832
239
+ },
240
+ {
241
+ "epoch": 35,
242
+ "train_loss": 0.3369285811544093,
243
+ "train_accuracy": 0.8664323374340949,
244
+ "validation_loss": 0.47964662313461304,
245
+ "validation_accuracy": 0.7902097902097902
246
+ },
247
+ {
248
+ "epoch": 36,
249
+ "train_loss": 0.3247136227485375,
250
+ "train_accuracy": 0.9015817223198594,
251
+ "validation_loss": 0.4613395631313324,
252
+ "validation_accuracy": 0.7622377622377622
253
+ },
254
+ {
255
+ "epoch": 37,
256
+ "train_loss": 0.3240959414907834,
257
+ "train_accuracy": 0.8769771528998243,
258
+ "validation_loss": 0.4582526981830597,
259
+ "validation_accuracy": 0.7692307692307693
260
+ },
261
+ {
262
+ "epoch": 38,
263
+ "train_loss": 0.31223150668747607,
264
+ "train_accuracy": 0.8857644991212654,
265
+ "validation_loss": 0.4926481544971466,
266
+ "validation_accuracy": 0.7972027972027972
267
+ },
268
+ {
269
+ "epoch": 39,
270
+ "train_loss": 0.3200714421083722,
271
+ "train_accuracy": 0.8857644991212654,
272
+ "validation_loss": 0.48017311096191406,
273
+ "validation_accuracy": 0.8041958041958042
274
+ },
275
+ {
276
+ "epoch": 40,
277
+ "train_loss": 0.29528005837556137,
278
+ "train_accuracy": 0.8998242530755711,
279
+ "validation_loss": 0.4451611042022705,
280
+ "validation_accuracy": 0.7902097902097902
281
+ }
282
  ]
models/ethiopia_washed_metrics.json CHANGED
@@ -1,68 +1,68 @@
1
- {
2
- "accuracy": 0.7902097902097902,
3
- "macro_avg": {
4
- "precision": 0.7857142857142857,
5
- "recall": 0.791566265060241,
6
- "f1": 0.7872023809523809
7
- },
8
- "weighted_avg": {
9
- "precision": 0.7951139769321587,
10
- "recall": 0.7902097902097902,
11
- "f1": 0.7912712287712286
12
- },
13
- "per_class": {
14
- "bad": {
15
- "precision": 0.8441558441558441,
16
- "recall": 0.7831325301204819,
17
- "f1": 0.8124999999999999,
18
- "support": 83
19
- },
20
- "good": {
21
- "precision": 0.7272727272727273,
22
- "recall": 0.8,
23
- "f1": 0.761904761904762,
24
- "support": 60
25
- }
26
- },
27
- "confusion_matrix": [
28
- [
29
- 65,
30
- 18
31
- ],
32
- [
33
- 12,
34
- 48
35
- ]
36
- ],
37
- "confusion_matrix_labels": [
38
- "bad",
39
- "good"
40
- ],
41
- "samples": 143,
42
- "bean_type": "ethiopia_washed",
43
- "architecture": "custom",
44
- "input_size": 128,
45
- "classes": [
46
- "bad",
47
- "good"
48
- ],
49
- "dataset_path": "coffee_beans_data/ethiopia_washed/corp_augmented_dataNoback",
50
- "split": "80/20 random split of the augmented dataset",
51
- "split_limitations": "The existing project split was preserved. Augmented variants may cross the train/validation boundary, and no independent test set is used.",
52
- "total_samples": 712,
53
- "train_samples": 569,
54
- "validation_samples": 143,
55
- "training_class_counts": {
56
- "bad": 333,
57
- "good": 236
58
- },
59
- "class_weights": {
60
- "bad": 0.8543543543543544,
61
- "good": 1.2055084745762712
62
- },
63
- "epochs_completed": 40,
64
- "best_epoch": 40,
65
- "best_validation_loss": 0.4451611042022705,
66
- "generated_at": "2026-09-08T14:27:10.375571+00:00",
67
- "torch_version": "2.11.0+cu128"
68
  }
 
1
+ {
2
+ "accuracy": 0.7902097902097902,
3
+ "macro_avg": {
4
+ "precision": 0.7857142857142857,
5
+ "recall": 0.791566265060241,
6
+ "f1": 0.7872023809523809
7
+ },
8
+ "weighted_avg": {
9
+ "precision": 0.7951139769321587,
10
+ "recall": 0.7902097902097902,
11
+ "f1": 0.7912712287712286
12
+ },
13
+ "per_class": {
14
+ "bad": {
15
+ "precision": 0.8441558441558441,
16
+ "recall": 0.7831325301204819,
17
+ "f1": 0.8124999999999999,
18
+ "support": 83
19
+ },
20
+ "good": {
21
+ "precision": 0.7272727272727273,
22
+ "recall": 0.8,
23
+ "f1": 0.761904761904762,
24
+ "support": 60
25
+ }
26
+ },
27
+ "confusion_matrix": [
28
+ [
29
+ 65,
30
+ 18
31
+ ],
32
+ [
33
+ 12,
34
+ 48
35
+ ]
36
+ ],
37
+ "confusion_matrix_labels": [
38
+ "bad",
39
+ "good"
40
+ ],
41
+ "samples": 143,
42
+ "bean_type": "ethiopia_washed",
43
+ "architecture": "custom",
44
+ "input_size": 128,
45
+ "classes": [
46
+ "bad",
47
+ "good"
48
+ ],
49
+ "dataset_path": "coffee_beans_data/ethiopia_washed/corp_augmented_dataNoback",
50
+ "split": "80/20 random split of the augmented dataset",
51
+ "split_limitations": "The existing project split was preserved. Augmented variants may cross the train/validation boundary, and no independent test set is used.",
52
+ "total_samples": 712,
53
+ "train_samples": 569,
54
+ "validation_samples": 143,
55
+ "training_class_counts": {
56
+ "bad": 333,
57
+ "good": 236
58
+ },
59
+ "class_weights": {
60
+ "bad": 0.8543543543543544,
61
+ "good": 1.2055084745762712
62
+ },
63
+ "epochs_completed": 40,
64
+ "best_epoch": 40,
65
+ "best_validation_loss": 0.4451611042022705,
66
+ "generated_at": "2026-09-08T14:27:10.375571+00:00",
67
+ "torch_version": "2.11.0+cu128"
68
  }
models/honduras_natural_custom_Noback_best_model.json CHANGED
@@ -1,12 +1,12 @@
1
- {
2
- "bean_type": "honduras_natural",
3
- "architecture": "custom",
4
- "img_size": 128,
5
- "classes": [
6
- "bad",
7
- "good"
8
- ],
9
- "model_file": "honduras_natural_custom_Noback_best_model.pth",
10
- "metrics_file": "honduras_natural_metrics.json",
11
- "display_name": "Honduras Natural - Custom CNN (Noback)"
12
  }
 
1
+ {
2
+ "bean_type": "honduras_natural",
3
+ "architecture": "custom",
4
+ "img_size": 128,
5
+ "classes": [
6
+ "bad",
7
+ "good"
8
+ ],
9
+ "model_file": "honduras_natural_custom_Noback_best_model.pth",
10
+ "metrics_file": "honduras_natural_metrics.json",
11
+ "display_name": "Honduras Natural - Custom CNN (Noback)"
12
  }
models/honduras_natural_history.json CHANGED
@@ -1,282 +1,282 @@
1
- [
2
- {
3
- "epoch": 1,
4
- "train_loss": 0.9765957467323911,
5
- "train_accuracy": 0.5066371681415929,
6
- "validation_loss": 0.6960582733154297,
7
- "validation_accuracy": 0.2543859649122807
8
- },
9
- {
10
- "epoch": 2,
11
- "train_loss": 0.7218032943463959,
12
- "train_accuracy": 0.4557522123893805,
13
- "validation_loss": 0.7038145661354065,
14
- "validation_accuracy": 0.21052631578947367
15
- },
16
- {
17
- "epoch": 3,
18
- "train_loss": 0.6724163009002145,
19
- "train_accuracy": 0.40486725663716816,
20
- "validation_loss": 0.6928611993789673,
21
- "validation_accuracy": 0.41228070175438597
22
- },
23
- {
24
- "epoch": 4,
25
- "train_loss": 0.6250287700543361,
26
- "train_accuracy": 0.7146017699115044,
27
- "validation_loss": 0.6836850047111511,
28
- "validation_accuracy": 0.7894736842105263
29
- },
30
- {
31
- "epoch": 5,
32
- "train_loss": 0.6430877056796994,
33
- "train_accuracy": 0.7278761061946902,
34
- "validation_loss": 0.6853227615356445,
35
- "validation_accuracy": 0.7807017543859649
36
- },
37
- {
38
- "epoch": 6,
39
- "train_loss": 0.5932178455116475,
40
- "train_accuracy": 0.7278761061946902,
41
- "validation_loss": 0.6959421038627625,
42
- "validation_accuracy": 0.2982456140350877
43
- },
44
- {
45
- "epoch": 7,
46
- "train_loss": 0.5798883195471974,
47
- "train_accuracy": 0.6747787610619469,
48
- "validation_loss": 0.6998635530471802,
49
- "validation_accuracy": 0.2631578947368421
50
- },
51
- {
52
- "epoch": 8,
53
- "train_loss": 0.5659138755460756,
54
- "train_accuracy": 0.665929203539823,
55
- "validation_loss": 0.6864909529685974,
56
- "validation_accuracy": 0.5526315789473685
57
- },
58
- {
59
- "epoch": 9,
60
- "train_loss": 0.5397921431381091,
61
- "train_accuracy": 0.7676991150442478,
62
- "validation_loss": 0.677666425704956,
63
- "validation_accuracy": 0.6666666666666666
64
- },
65
- {
66
- "epoch": 10,
67
- "train_loss": 0.5219969121755752,
68
- "train_accuracy": 0.7920353982300885,
69
- "validation_loss": 0.6777678728103638,
70
- "validation_accuracy": 0.5964912280701754
71
- },
72
- {
73
- "epoch": 11,
74
- "train_loss": 0.5135227531458424,
75
- "train_accuracy": 0.745575221238938,
76
- "validation_loss": 0.6844081282615662,
77
- "validation_accuracy": 0.5263157894736842
78
- },
79
- {
80
- "epoch": 12,
81
- "train_loss": 0.4908704122083377,
82
- "train_accuracy": 0.7477876106194691,
83
- "validation_loss": 0.6718830466270447,
84
- "validation_accuracy": 0.6140350877192983
85
- },
86
- {
87
- "epoch": 13,
88
- "train_loss": 0.4826051550628865,
89
- "train_accuracy": 0.7765486725663717,
90
- "validation_loss": 0.6624081134796143,
91
- "validation_accuracy": 0.6842105263157895
92
- },
93
- {
94
- "epoch": 14,
95
- "train_loss": 0.46433306056841284,
96
- "train_accuracy": 0.7986725663716814,
97
- "validation_loss": 0.6589961051940918,
98
- "validation_accuracy": 0.6578947368421053
99
- },
100
- {
101
- "epoch": 15,
102
- "train_loss": 0.4400974667705266,
103
- "train_accuracy": 0.8008849557522124,
104
- "validation_loss": 0.6533895134925842,
105
- "validation_accuracy": 0.6666666666666666
106
- },
107
- {
108
- "epoch": 16,
109
- "train_loss": 0.4371070521595204,
110
- "train_accuracy": 0.8075221238938053,
111
- "validation_loss": 0.6499096751213074,
112
- "validation_accuracy": 0.6842105263157895
113
- },
114
- {
115
- "epoch": 17,
116
- "train_loss": 0.4170592013186058,
117
- "train_accuracy": 0.8053097345132744,
118
- "validation_loss": 0.6416586637496948,
119
- "validation_accuracy": 0.7105263157894737
120
- },
121
- {
122
- "epoch": 18,
123
- "train_loss": 0.41721887240367656,
124
- "train_accuracy": 0.8207964601769911,
125
- "validation_loss": 0.6355786323547363,
126
- "validation_accuracy": 0.7192982456140351
127
- },
128
- {
129
- "epoch": 19,
130
- "train_loss": 0.3968231345699952,
131
- "train_accuracy": 0.8473451327433629,
132
- "validation_loss": 0.6301834583282471,
133
- "validation_accuracy": 0.7368421052631579
134
- },
135
- {
136
- "epoch": 20,
137
- "train_loss": 0.3726621565565599,
138
- "train_accuracy": 0.8473451327433629,
139
- "validation_loss": 0.6239787340164185,
140
- "validation_accuracy": 0.7368421052631579
141
- },
142
- {
143
- "epoch": 21,
144
- "train_loss": 0.3750708812633447,
145
- "train_accuracy": 0.8473451327433629,
146
- "validation_loss": 0.615045964717865,
147
- "validation_accuracy": 0.7368421052631579
148
- },
149
- {
150
- "epoch": 22,
151
- "train_loss": 0.35499391249850787,
152
- "train_accuracy": 0.8539823008849557,
153
- "validation_loss": 0.6041514277458191,
154
- "validation_accuracy": 0.7631578947368421
155
- },
156
- {
157
- "epoch": 23,
158
- "train_loss": 0.331090675518576,
159
- "train_accuracy": 0.8606194690265486,
160
- "validation_loss": 0.5928549766540527,
161
- "validation_accuracy": 0.7719298245614035
162
- },
163
- {
164
- "epoch": 24,
165
- "train_loss": 0.32689084284073483,
166
- "train_accuracy": 0.9026548672566371,
167
- "validation_loss": 0.5795340538024902,
168
- "validation_accuracy": 0.7719298245614035
169
- },
170
- {
171
- "epoch": 25,
172
- "train_loss": 0.3171025345810747,
173
- "train_accuracy": 0.8606194690265486,
174
- "validation_loss": 0.5708882212638855,
175
- "validation_accuracy": 0.7719298245614035
176
- },
177
- {
178
- "epoch": 26,
179
- "train_loss": 0.30806970596313477,
180
- "train_accuracy": 0.8761061946902655,
181
- "validation_loss": 0.564824640750885,
182
- "validation_accuracy": 0.7894736842105263
183
- },
184
- {
185
- "epoch": 27,
186
- "train_loss": 0.2851240487225288,
187
- "train_accuracy": 0.9092920353982301,
188
- "validation_loss": 0.5641254186630249,
189
- "validation_accuracy": 0.7982456140350878
190
- },
191
- {
192
- "epoch": 28,
193
- "train_loss": 0.30291247684343725,
194
- "train_accuracy": 0.8849557522123894,
195
- "validation_loss": 0.557503342628479,
196
- "validation_accuracy": 0.7894736842105263
197
- },
198
- {
199
- "epoch": 29,
200
- "train_loss": 0.2793961090851674,
201
- "train_accuracy": 0.9203539823008849,
202
- "validation_loss": 0.5570541024208069,
203
- "validation_accuracy": 0.7719298245614035
204
- },
205
- {
206
- "epoch": 30,
207
- "train_loss": 0.2735133843611827,
208
- "train_accuracy": 0.8893805309734514,
209
- "validation_loss": 0.555424153804779,
210
- "validation_accuracy": 0.7719298245614035
211
- },
212
- {
213
- "epoch": 31,
214
- "train_loss": 0.25710611665143374,
215
- "train_accuracy": 0.9137168141592921,
216
- "validation_loss": 0.5596690773963928,
217
- "validation_accuracy": 0.8333333333333334
218
- },
219
- {
220
- "epoch": 32,
221
- "train_loss": 0.26409966940373447,
222
- "train_accuracy": 0.9336283185840708,
223
- "validation_loss": 0.5455154180526733,
224
- "validation_accuracy": 0.8333333333333334
225
- },
226
- {
227
- "epoch": 33,
228
- "train_loss": 0.2337114705448657,
229
- "train_accuracy": 0.9269911504424779,
230
- "validation_loss": 0.5335549116134644,
231
- "validation_accuracy": 0.8070175438596491
232
- },
233
- {
234
- "epoch": 34,
235
- "train_loss": 0.23032094828322924,
236
- "train_accuracy": 0.9380530973451328,
237
- "validation_loss": 0.5321564674377441,
238
- "validation_accuracy": 0.8333333333333334
239
- },
240
- {
241
- "epoch": 35,
242
- "train_loss": 0.22375348513632748,
243
- "train_accuracy": 0.9513274336283186,
244
- "validation_loss": 0.5280061960220337,
245
- "validation_accuracy": 0.8333333333333334
246
- },
247
- {
248
- "epoch": 36,
249
- "train_loss": 0.20337354794012763,
250
- "train_accuracy": 0.9668141592920354,
251
- "validation_loss": 0.518876314163208,
252
- "validation_accuracy": 0.8245614035087719
253
- },
254
- {
255
- "epoch": 37,
256
- "train_loss": 0.2041399356274478,
257
- "train_accuracy": 0.9513274336283186,
258
- "validation_loss": 0.5181131362915039,
259
- "validation_accuracy": 0.7807017543859649
260
- },
261
- {
262
- "epoch": 38,
263
- "train_loss": 0.20407535913771233,
264
- "train_accuracy": 0.9491150442477876,
265
- "validation_loss": 0.5212715864181519,
266
- "validation_accuracy": 0.7894736842105263
267
- },
268
- {
269
- "epoch": 39,
270
- "train_loss": 0.1843387596638857,
271
- "train_accuracy": 0.9557522123893806,
272
- "validation_loss": 0.5455327033996582,
273
- "validation_accuracy": 0.8596491228070176
274
- },
275
- {
276
- "epoch": 40,
277
- "train_loss": 0.18404048206531895,
278
- "train_accuracy": 0.9668141592920354,
279
- "validation_loss": 0.5410023331642151,
280
- "validation_accuracy": 0.8508771929824561
281
- }
282
  ]
 
1
+ [
2
+ {
3
+ "epoch": 1,
4
+ "train_loss": 0.9765957467323911,
5
+ "train_accuracy": 0.5066371681415929,
6
+ "validation_loss": 0.6960582733154297,
7
+ "validation_accuracy": 0.2543859649122807
8
+ },
9
+ {
10
+ "epoch": 2,
11
+ "train_loss": 0.7218032943463959,
12
+ "train_accuracy": 0.4557522123893805,
13
+ "validation_loss": 0.7038145661354065,
14
+ "validation_accuracy": 0.21052631578947367
15
+ },
16
+ {
17
+ "epoch": 3,
18
+ "train_loss": 0.6724163009002145,
19
+ "train_accuracy": 0.40486725663716816,
20
+ "validation_loss": 0.6928611993789673,
21
+ "validation_accuracy": 0.41228070175438597
22
+ },
23
+ {
24
+ "epoch": 4,
25
+ "train_loss": 0.6250287700543361,
26
+ "train_accuracy": 0.7146017699115044,
27
+ "validation_loss": 0.6836850047111511,
28
+ "validation_accuracy": 0.7894736842105263
29
+ },
30
+ {
31
+ "epoch": 5,
32
+ "train_loss": 0.6430877056796994,
33
+ "train_accuracy": 0.7278761061946902,
34
+ "validation_loss": 0.6853227615356445,
35
+ "validation_accuracy": 0.7807017543859649
36
+ },
37
+ {
38
+ "epoch": 6,
39
+ "train_loss": 0.5932178455116475,
40
+ "train_accuracy": 0.7278761061946902,
41
+ "validation_loss": 0.6959421038627625,
42
+ "validation_accuracy": 0.2982456140350877
43
+ },
44
+ {
45
+ "epoch": 7,
46
+ "train_loss": 0.5798883195471974,
47
+ "train_accuracy": 0.6747787610619469,
48
+ "validation_loss": 0.6998635530471802,
49
+ "validation_accuracy": 0.2631578947368421
50
+ },
51
+ {
52
+ "epoch": 8,
53
+ "train_loss": 0.5659138755460756,
54
+ "train_accuracy": 0.665929203539823,
55
+ "validation_loss": 0.6864909529685974,
56
+ "validation_accuracy": 0.5526315789473685
57
+ },
58
+ {
59
+ "epoch": 9,
60
+ "train_loss": 0.5397921431381091,
61
+ "train_accuracy": 0.7676991150442478,
62
+ "validation_loss": 0.677666425704956,
63
+ "validation_accuracy": 0.6666666666666666
64
+ },
65
+ {
66
+ "epoch": 10,
67
+ "train_loss": 0.5219969121755752,
68
+ "train_accuracy": 0.7920353982300885,
69
+ "validation_loss": 0.6777678728103638,
70
+ "validation_accuracy": 0.5964912280701754
71
+ },
72
+ {
73
+ "epoch": 11,
74
+ "train_loss": 0.5135227531458424,
75
+ "train_accuracy": 0.745575221238938,
76
+ "validation_loss": 0.6844081282615662,
77
+ "validation_accuracy": 0.5263157894736842
78
+ },
79
+ {
80
+ "epoch": 12,
81
+ "train_loss": 0.4908704122083377,
82
+ "train_accuracy": 0.7477876106194691,
83
+ "validation_loss": 0.6718830466270447,
84
+ "validation_accuracy": 0.6140350877192983
85
+ },
86
+ {
87
+ "epoch": 13,
88
+ "train_loss": 0.4826051550628865,
89
+ "train_accuracy": 0.7765486725663717,
90
+ "validation_loss": 0.6624081134796143,
91
+ "validation_accuracy": 0.6842105263157895
92
+ },
93
+ {
94
+ "epoch": 14,
95
+ "train_loss": 0.46433306056841284,
96
+ "train_accuracy": 0.7986725663716814,
97
+ "validation_loss": 0.6589961051940918,
98
+ "validation_accuracy": 0.6578947368421053
99
+ },
100
+ {
101
+ "epoch": 15,
102
+ "train_loss": 0.4400974667705266,
103
+ "train_accuracy": 0.8008849557522124,
104
+ "validation_loss": 0.6533895134925842,
105
+ "validation_accuracy": 0.6666666666666666
106
+ },
107
+ {
108
+ "epoch": 16,
109
+ "train_loss": 0.4371070521595204,
110
+ "train_accuracy": 0.8075221238938053,
111
+ "validation_loss": 0.6499096751213074,
112
+ "validation_accuracy": 0.6842105263157895
113
+ },
114
+ {
115
+ "epoch": 17,
116
+ "train_loss": 0.4170592013186058,
117
+ "train_accuracy": 0.8053097345132744,
118
+ "validation_loss": 0.6416586637496948,
119
+ "validation_accuracy": 0.7105263157894737
120
+ },
121
+ {
122
+ "epoch": 18,
123
+ "train_loss": 0.41721887240367656,
124
+ "train_accuracy": 0.8207964601769911,
125
+ "validation_loss": 0.6355786323547363,
126
+ "validation_accuracy": 0.7192982456140351
127
+ },
128
+ {
129
+ "epoch": 19,
130
+ "train_loss": 0.3968231345699952,
131
+ "train_accuracy": 0.8473451327433629,
132
+ "validation_loss": 0.6301834583282471,
133
+ "validation_accuracy": 0.7368421052631579
134
+ },
135
+ {
136
+ "epoch": 20,
137
+ "train_loss": 0.3726621565565599,
138
+ "train_accuracy": 0.8473451327433629,
139
+ "validation_loss": 0.6239787340164185,
140
+ "validation_accuracy": 0.7368421052631579
141
+ },
142
+ {
143
+ "epoch": 21,
144
+ "train_loss": 0.3750708812633447,
145
+ "train_accuracy": 0.8473451327433629,
146
+ "validation_loss": 0.615045964717865,
147
+ "validation_accuracy": 0.7368421052631579
148
+ },
149
+ {
150
+ "epoch": 22,
151
+ "train_loss": 0.35499391249850787,
152
+ "train_accuracy": 0.8539823008849557,
153
+ "validation_loss": 0.6041514277458191,
154
+ "validation_accuracy": 0.7631578947368421
155
+ },
156
+ {
157
+ "epoch": 23,
158
+ "train_loss": 0.331090675518576,
159
+ "train_accuracy": 0.8606194690265486,
160
+ "validation_loss": 0.5928549766540527,
161
+ "validation_accuracy": 0.7719298245614035
162
+ },
163
+ {
164
+ "epoch": 24,
165
+ "train_loss": 0.32689084284073483,
166
+ "train_accuracy": 0.9026548672566371,
167
+ "validation_loss": 0.5795340538024902,
168
+ "validation_accuracy": 0.7719298245614035
169
+ },
170
+ {
171
+ "epoch": 25,
172
+ "train_loss": 0.3171025345810747,
173
+ "train_accuracy": 0.8606194690265486,
174
+ "validation_loss": 0.5708882212638855,
175
+ "validation_accuracy": 0.7719298245614035
176
+ },
177
+ {
178
+ "epoch": 26,
179
+ "train_loss": 0.30806970596313477,
180
+ "train_accuracy": 0.8761061946902655,
181
+ "validation_loss": 0.564824640750885,
182
+ "validation_accuracy": 0.7894736842105263
183
+ },
184
+ {
185
+ "epoch": 27,
186
+ "train_loss": 0.2851240487225288,
187
+ "train_accuracy": 0.9092920353982301,
188
+ "validation_loss": 0.5641254186630249,
189
+ "validation_accuracy": 0.7982456140350878
190
+ },
191
+ {
192
+ "epoch": 28,
193
+ "train_loss": 0.30291247684343725,
194
+ "train_accuracy": 0.8849557522123894,
195
+ "validation_loss": 0.557503342628479,
196
+ "validation_accuracy": 0.7894736842105263
197
+ },
198
+ {
199
+ "epoch": 29,
200
+ "train_loss": 0.2793961090851674,
201
+ "train_accuracy": 0.9203539823008849,
202
+ "validation_loss": 0.5570541024208069,
203
+ "validation_accuracy": 0.7719298245614035
204
+ },
205
+ {
206
+ "epoch": 30,
207
+ "train_loss": 0.2735133843611827,
208
+ "train_accuracy": 0.8893805309734514,
209
+ "validation_loss": 0.555424153804779,
210
+ "validation_accuracy": 0.7719298245614035
211
+ },
212
+ {
213
+ "epoch": 31,
214
+ "train_loss": 0.25710611665143374,
215
+ "train_accuracy": 0.9137168141592921,
216
+ "validation_loss": 0.5596690773963928,
217
+ "validation_accuracy": 0.8333333333333334
218
+ },
219
+ {
220
+ "epoch": 32,
221
+ "train_loss": 0.26409966940373447,
222
+ "train_accuracy": 0.9336283185840708,
223
+ "validation_loss": 0.5455154180526733,
224
+ "validation_accuracy": 0.8333333333333334
225
+ },
226
+ {
227
+ "epoch": 33,
228
+ "train_loss": 0.2337114705448657,
229
+ "train_accuracy": 0.9269911504424779,
230
+ "validation_loss": 0.5335549116134644,
231
+ "validation_accuracy": 0.8070175438596491
232
+ },
233
+ {
234
+ "epoch": 34,
235
+ "train_loss": 0.23032094828322924,
236
+ "train_accuracy": 0.9380530973451328,
237
+ "validation_loss": 0.5321564674377441,
238
+ "validation_accuracy": 0.8333333333333334
239
+ },
240
+ {
241
+ "epoch": 35,
242
+ "train_loss": 0.22375348513632748,
243
+ "train_accuracy": 0.9513274336283186,
244
+ "validation_loss": 0.5280061960220337,
245
+ "validation_accuracy": 0.8333333333333334
246
+ },
247
+ {
248
+ "epoch": 36,
249
+ "train_loss": 0.20337354794012763,
250
+ "train_accuracy": 0.9668141592920354,
251
+ "validation_loss": 0.518876314163208,
252
+ "validation_accuracy": 0.8245614035087719
253
+ },
254
+ {
255
+ "epoch": 37,
256
+ "train_loss": 0.2041399356274478,
257
+ "train_accuracy": 0.9513274336283186,
258
+ "validation_loss": 0.5181131362915039,
259
+ "validation_accuracy": 0.7807017543859649
260
+ },
261
+ {
262
+ "epoch": 38,
263
+ "train_loss": 0.20407535913771233,
264
+ "train_accuracy": 0.9491150442477876,
265
+ "validation_loss": 0.5212715864181519,
266
+ "validation_accuracy": 0.7894736842105263
267
+ },
268
+ {
269
+ "epoch": 39,
270
+ "train_loss": 0.1843387596638857,
271
+ "train_accuracy": 0.9557522123893806,
272
+ "validation_loss": 0.5455327033996582,
273
+ "validation_accuracy": 0.8596491228070176
274
+ },
275
+ {
276
+ "epoch": 40,
277
+ "train_loss": 0.18404048206531895,
278
+ "train_accuracy": 0.9668141592920354,
279
+ "validation_loss": 0.5410023331642151,
280
+ "validation_accuracy": 0.8508771929824561
281
+ }
282
  ]
models/honduras_natural_metrics.json CHANGED
@@ -1,68 +1,68 @@
1
- {
2
- "accuracy": 0.7807017543859649,
3
- "macro_avg": {
4
- "precision": 0.6930415263748597,
5
- "recall": 0.7388888888888889,
6
- "f1": 0.7076023391812865
7
- },
8
- "weighted_avg": {
9
- "precision": 0.8135743398901294,
10
- "recall": 0.7807017543859649,
11
- "f1": 0.7922437673130194
12
- },
13
- "per_class": {
14
- "bad": {
15
- "precision": 0.48484848484848486,
16
- "recall": 0.6666666666666666,
17
- "f1": 0.5614035087719298,
18
- "support": 24
19
- },
20
- "good": {
21
- "precision": 0.9012345679012346,
22
- "recall": 0.8111111111111111,
23
- "f1": 0.8538011695906432,
24
- "support": 90
25
- }
26
- },
27
- "confusion_matrix": [
28
- [
29
- 16,
30
- 8
31
- ],
32
- [
33
- 17,
34
- 73
35
- ]
36
- ],
37
- "confusion_matrix_labels": [
38
- "bad",
39
- "good"
40
- ],
41
- "samples": 114,
42
- "bean_type": "honduras_natural",
43
- "architecture": "custom",
44
- "input_size": 128,
45
- "classes": [
46
- "bad",
47
- "good"
48
- ],
49
- "dataset_path": "coffee_beans_data/honduras_natural/corp_augmented_dataNoback",
50
- "split": "80/20 random split of the augmented dataset",
51
- "split_limitations": "The existing project split was preserved. Augmented variants may cross the train/validation boundary, and no independent test set is used.",
52
- "total_samples": 566,
53
- "train_samples": 452,
54
- "validation_samples": 114,
55
- "training_class_counts": {
56
- "bad": 136,
57
- "good": 316
58
- },
59
- "class_weights": {
60
- "bad": 1.661764705882353,
61
- "good": 0.7151898734177216
62
- },
63
- "epochs_completed": 40,
64
- "best_epoch": 37,
65
- "best_validation_loss": 0.5181131362915039,
66
- "generated_at": "2026-09-08T14:27:32.126468+00:00",
67
- "torch_version": "2.11.0+cu128"
68
  }
 
1
+ {
2
+ "accuracy": 0.7807017543859649,
3
+ "macro_avg": {
4
+ "precision": 0.6930415263748597,
5
+ "recall": 0.7388888888888889,
6
+ "f1": 0.7076023391812865
7
+ },
8
+ "weighted_avg": {
9
+ "precision": 0.8135743398901294,
10
+ "recall": 0.7807017543859649,
11
+ "f1": 0.7922437673130194
12
+ },
13
+ "per_class": {
14
+ "bad": {
15
+ "precision": 0.48484848484848486,
16
+ "recall": 0.6666666666666666,
17
+ "f1": 0.5614035087719298,
18
+ "support": 24
19
+ },
20
+ "good": {
21
+ "precision": 0.9012345679012346,
22
+ "recall": 0.8111111111111111,
23
+ "f1": 0.8538011695906432,
24
+ "support": 90
25
+ }
26
+ },
27
+ "confusion_matrix": [
28
+ [
29
+ 16,
30
+ 8
31
+ ],
32
+ [
33
+ 17,
34
+ 73
35
+ ]
36
+ ],
37
+ "confusion_matrix_labels": [
38
+ "bad",
39
+ "good"
40
+ ],
41
+ "samples": 114,
42
+ "bean_type": "honduras_natural",
43
+ "architecture": "custom",
44
+ "input_size": 128,
45
+ "classes": [
46
+ "bad",
47
+ "good"
48
+ ],
49
+ "dataset_path": "coffee_beans_data/honduras_natural/corp_augmented_dataNoback",
50
+ "split": "80/20 random split of the augmented dataset",
51
+ "split_limitations": "The existing project split was preserved. Augmented variants may cross the train/validation boundary, and no independent test set is used.",
52
+ "total_samples": 566,
53
+ "train_samples": 452,
54
+ "validation_samples": 114,
55
+ "training_class_counts": {
56
+ "bad": 136,
57
+ "good": 316
58
+ },
59
+ "class_weights": {
60
+ "bad": 1.661764705882353,
61
+ "good": 0.7151898734177216
62
+ },
63
+ "epochs_completed": 40,
64
+ "best_epoch": 37,
65
+ "best_validation_loss": 0.5181131362915039,
66
+ "generated_at": "2026-09-08T14:27:32.126468+00:00",
67
+ "torch_version": "2.11.0+cu128"
68
  }